diff --git a/Classes/Domain/Index/TcaIndexer/TcaTableService.php b/Classes/Domain/Index/TcaIndexer/TcaTableService.php
index b5f48ab..70bb52d 100644
--- a/Classes/Domain/Index/TcaIndexer/TcaTableService.php
+++ b/Classes/Domain/Index/TcaIndexer/TcaTableService.php
@@ -24,6 +24,8 @@ use Codappix\SearchCore\Configuration\ConfigurationContainerInterface;
use Codappix\SearchCore\Domain\Index\IndexingException;
use TYPO3\CMS\Backend\Utility\BackendUtility;
use TYPO3\CMS\Core\Utility\GeneralUtility;
+use TYPO3\CMS\Core\Utility\RootlineUtility;
+use TYPO3\CMS\Extbase\Object\ObjectManagerInterface;
/**
* Encapsulate logik related to TCA configuration.
@@ -47,15 +49,20 @@ class TcaTableService
*/
protected $configuration;
+ /**
+ * @var RelationResolver
+ */
+ protected $relationResolver;
+
/**
* @var \TYPO3\CMS\Core\Log\Logger
*/
protected $logger;
/**
- * @var RelationResolver
+ * @var ObjectManagerInterface
*/
- protected $relationResolver;
+ protected $objectManager;
/**
* Inject log manager to get concrete logger from it.
@@ -67,6 +74,14 @@ class TcaTableService
$this->logger = $logManager->getLogger(__CLASS__);
}
+ /**
+ * @param ObjectManagerInterface $objectManager
+ */
+ public function injectObjectManager(ObjectManagerInterface $objectManager)
+ {
+ $this->objectManager = $objectManager;
+ }
+
/**
* @param string $tableName
* @param ConfigurationContainerInterface $configuration
@@ -243,26 +258,59 @@ class TcaTableService
* Checks whether the given record was blacklisted by root line.
* This can be configured by typoscript as whole root lines can be black listed.
*
- * NOTE: Does not support pages yet. We have to add a switch once we
- * support them to use uid instead.
+ * Also further TYPO3 mechanics are taken into account. Does a valid root
+ * line exist, is page inside a recycler, is inherited start- endtime
+ * excluded, etc.
*
* @param array &$record
* @return bool
*/
protected function isRecordBlacklistedByRootline(array &$record)
{
- // If no rootline exists, the record is on a unreachable page and therefore blacklisted.
- $rootline = BackendUtility::BEgetRootLine($record['pid']);
- if (!isset($rootline[0])) {
+ $pageUid = $record['pid'];
+ if ($this->tableName === 'pages') {
+ $pageUid = $record['uid'];
+ }
+
+ try {
+ $rootline = $this->objectManager->get(RootlineUtility::class, $pageUid)->get();
+ } catch (\RuntimeException $e) {
+ $this->logger->notice(
+ sprintf('Could not fetch rootline for page %u, because: %s', $pageUid, $e->getMessage()),
+ [$record, $e]
+ );
return true;
}
- // Check configured black list if present.
- if ($this->isBlackListedRootLineConfigured()) {
- foreach ($rootline as $pageInRootLine) {
- if (in_array($pageInRootLine['uid'], $this->getBlackListedRootLine())) {
- return true;
- }
+ foreach ($rootline as $pageInRootLine) {
+ // Check configured black list if present.
+ if ($this->isBlackListedRootLineConfigured()
+ && in_array($pageInRootLine['uid'], $this->getBlackListedRootLine())
+ ) {
+ $this->logger->info(
+ sprintf(
+ 'Record %u is black listed due to configured root line configuration of page %u.',
+ $record['uid'],
+ $pageInRootLine['uid']
+ ),
+ [$record, $pageInRootLine]
+ );
+ return true;
+ }
+
+ if ($pageInRootLine['extendToSubpages'] && (
+ ($pageInRootLine['endtime'] > 0 && $pageInRootLine['endtime'] <= time())
+ || ($pageInRootLine['starttime'] > 0 && $pageInRootLine['starttime'] >= time())
+ )) {
+ $this->logger->info(
+ sprintf(
+ 'Record %u is black listed due to configured timing of parent page %u.',
+ $record['uid'],
+ $pageInRootLine['uid']
+ ),
+ [$record, $pageInRootLine]
+ );
+ return true;
}
}
diff --git a/Tests/Functional/Fixtures/Indexing/PagesIndexer/BrokenRootLine.xml b/Tests/Functional/Fixtures/Indexing/PagesIndexer/BrokenRootLine.xml
new file mode 100644
index 0000000..81f2316
--- /dev/null
+++ b/Tests/Functional/Fixtures/Indexing/PagesIndexer/BrokenRootLine.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ 3
+ 2
+ Some disabled page due broken root line
+
+
+ 4
+ 3
+ Some disabled page due to parent pages root line being broken
+
+
+
+ 6
+ 1
+ Some enabled page due valid root line
+
+
diff --git a/Tests/Functional/Fixtures/Indexing/PagesIndexer/InheritedTiming.xml b/Tests/Functional/Fixtures/Indexing/PagesIndexer/InheritedTiming.xml
new file mode 100644
index 0000000..552ba74
--- /dev/null
+++ b/Tests/Functional/Fixtures/Indexing/PagesIndexer/InheritedTiming.xml
@@ -0,0 +1,34 @@
+
+
+
+
+ 2
+ 1
+ Some disabled page due to timing
+ 1502186635
+ 1
+
+
+ 3
+ 2
+ Some disabled page due to inherited timing
+
+
+ 4
+ 1
+ Some disabled page due to timing
+ 2147483647
+ 1
+
+
+ 5
+ 4
+ Some disabled page due to inherited timing
+
+
+
+ 6
+ 1
+ Some enabled page due to no be below inherited disabled timing
+
+
diff --git a/Tests/Functional/Fixtures/Indexing/PagesIndexer/Recycler.xml b/Tests/Functional/Fixtures/Indexing/PagesIndexer/Recycler.xml
new file mode 100644
index 0000000..1421ad5
--- /dev/null
+++ b/Tests/Functional/Fixtures/Indexing/PagesIndexer/Recycler.xml
@@ -0,0 +1,21 @@
+
+
+
+
+ 2
+ 1
+ Some disabled page due being recycler
+ 255
+
+
+ 3
+ 2
+ Some disabled page due to parent page being recycler
+
+
+
+ 6
+ 1
+ Some enabled page due to no be below recycler
+
+
diff --git a/Tests/Functional/Indexing/PagesIndexerTest.php b/Tests/Functional/Indexing/PagesIndexerTest.php
index d0440ba..244413d 100644
--- a/Tests/Functional/Indexing/PagesIndexerTest.php
+++ b/Tests/Functional/Indexing/PagesIndexerTest.php
@@ -61,4 +61,44 @@ class PagesIndexerTest extends AbstractFunctionalTestCase
$this->inject($indexer, 'connection', $connection);
$indexer->indexAllDocuments();
}
+
+ /**
+ * @test
+ * @dataProvider rootLineDataSets
+ * @param string $dataSetPath
+ */
+ public function rootLineIsRespectedDuringIndexing($dataSetPath)
+ {
+ $this->importDataSet($dataSetPath);
+
+ $objectManager = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(ObjectManager::class);
+ $tableName = 'pages';
+
+ $connection = $this->getMockBuilder(Elasticsearch::class)
+ ->setMethods(['addDocuments'])
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ $connection->expects($this->once())
+ ->method('addDocuments')
+ ->with(
+ $this->stringContains($tableName),
+ $this->callback(function ($documents) {
+ return count($documents) === 2;
+ })
+ );
+
+ $indexer = $objectManager->get(IndexerFactory::class)->getIndexer($tableName);
+ $this->inject($indexer, 'connection', $connection);
+ $indexer->indexAllDocuments();
+ }
+
+ public function rootLineDataSets()
+ {
+ return [
+ 'Broken root line' => ['Tests/Functional/Fixtures/Indexing/PagesIndexer/BrokenRootLine.xml'],
+ 'Recycler doktype' => ['Tests/Functional/Fixtures/Indexing/PagesIndexer/Recycler.xml'],
+ 'Extended timing to sub pages' => ['Tests/Functional/Fixtures/Indexing/PagesIndexer/InheritedTiming.xml'],
+ ];
+ }
}