Indexer.php 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. <?php
  2. namespace Opentalent\OtRouter\Routing;
  3. use Opentalent\OtCore\Page\OtPageRepository;
  4. use Opentalent\OtRouter\Utility\RouteNormalizer;
  5. use TYPO3\CMS\Core\Database\ConnectionPool;
  6. /**
  7. * Provides methods to index the Typo3 pages and populate the routing db table
  8. *
  9. * @package Opentalent\OtRouter\Routing
  10. */
  11. class Indexer
  12. {
  13. const INDEX_TABLENAME = 'tx_opentalent_router';
  14. /**
  15. * @var ConnectionPool
  16. */
  17. private ConnectionPool $connectionPool;
  18. public function injectConnectionPool(ConnectionPool $connectionPool)
  19. {
  20. $this->connectionPool = $connectionPool;
  21. }
  22. /**
  23. * @var OtPageRepository
  24. */
  25. protected OtPageRepository $otPageRepository;
  26. public function injectOtPageRepository(OtPageRepository $otPageRepository) {
  27. $this->otPageRepository = $otPageRepository;
  28. }
  29. /**
  30. * Clear then repopulate the whole index
  31. */
  32. public function indexAllRoutes() {
  33. $queryBuilder = $this->connectionPool->getQueryBuilderForTable('pages');
  34. $rootPages = $queryBuilder
  35. ->select('uid')
  36. ->from('pages')
  37. ->where($queryBuilder->expr()->eq('is_siteroot', 1))
  38. ->execute()
  39. ->fetchAll();
  40. foreach ($rootPages as $rootPage) {
  41. $this->indexRoutesForWebsite($rootPage);
  42. }
  43. }
  44. /**
  45. * Clear and recreate the index entry for the target website
  46. *
  47. * @param int $rootUid
  48. */
  49. public function indexRoutesForWebsite(int $rootUid) {
  50. foreach ($this->otPageRepository->getAllSitePages($rootUid) as $page) {
  51. $this->registerIndexEntry(
  52. $page['uid'],
  53. $page['tx_opentalent_structure_domain'],
  54. $page['slug'],
  55. $rootUid
  56. );
  57. }
  58. }
  59. public function indexRouteForPage(int $pageUid) {
  60. $page = $this->otPageRepository->getPage($pageUid);
  61. $rootPage = $this->otPageRepository->getRootPageFor($pageUid);
  62. $this->registerIndexEntry(
  63. $page['uid'],
  64. $page['tx_opentalent_structure_domain'],
  65. $page['slug'],
  66. $rootPage['uid']
  67. );
  68. }
  69. private function registerIndexEntry(int $pageUid,
  70. string $domain,
  71. string $slug,
  72. ?int $rootUid = null) {
  73. $queryBuilder = $this->connectionPool->getQueryBuilderForTable(self::INDEX_TABLENAME);
  74. $queryBuilder
  75. ->delete(self::INDEX_TABLENAME)
  76. ->where($queryBuilder->expr()->eq('page_uid', $pageUid))
  77. ->execute();
  78. $entry = [
  79. 'domain' => RouteNormalizer::normalizeDomain($domain),
  80. 'root_uid' => $rootUid,
  81. 'slug' => RouteNormalizer::normalizeSlug($slug),
  82. 'page_uid' => $pageUid,
  83. 'last_update' => date('Y-m-d H:i:s')
  84. ];
  85. $queryBuilder = $this->connectionPool->getQueryBuilderForTable(self::INDEX_TABLENAME);
  86. $queryBuilder
  87. ->insert(self::INDEX_TABLENAME)
  88. ->values($entry)
  89. ->execute();
  90. }
  91. }