diff --git a/everblock.php b/everblock.php index 3510e1f..c20b5f3 100644 --- a/everblock.php +++ b/everblock.php @@ -65,6 +65,10 @@ class Everblock extends Module private $bypassedControllers = [ 'hookDisplayInvoiceLegalFreeText', ]; + /** @var Module|null */ + private $qcdBuilderModule; + /** @var bool */ + private $qcdBuilderModuleResolved = false; public function __construct() { @@ -1099,10 +1103,35 @@ public function hookFilterQcdPageBuilderDeclarativeBlocks(array $params) public function hookFilterQcdPageBuilderThirdPartyBlockFrontRender(array $params) { - $renderer = new QcdThirdPartyBlockRenderer($this, $this->context); + $renderer = new QcdThirdPartyBlockRenderer( + $this, + $this->context, + $this->getQcdBuilderModule() + ); $renderer->renderFromHookFilterQcdPageBuilderThirdPartyBlockFrontRender($params); } + private function getQcdBuilderModule(): ?Module + { + if ($this->qcdBuilderModuleResolved) { + return $this->qcdBuilderModule; + } + + static $cachedQcdBuilderModule; + static $cachedQcdBuilderModuleResolved = false; + + if (!$cachedQcdBuilderModuleResolved) { + $module = Module::getInstanceByName('qcdpagebuilder'); + $cachedQcdBuilderModule = ($module instanceof Module) ? $module : null; + $cachedQcdBuilderModuleResolved = true; + } + + $this->qcdBuilderModule = $cachedQcdBuilderModule; + $this->qcdBuilderModuleResolved = true; + + return $this->qcdBuilderModule; + } + public function getContent() { if ($this->isProductModalAjaxRequest()) { @@ -5129,7 +5158,7 @@ public function everHook($method, $args) ]); } /** @var Qcdpagebuilder|null $builder */ - $builder = \Module::getInstanceByName('qcdpagebuilder'); + $builder = $this->getQcdBuilderModule(); $block['content'] = $builder ? (string) $builder->renderTargetField( diff --git a/src/Service/QcdThirdPartyBlockRenderer.php b/src/Service/QcdThirdPartyBlockRenderer.php index c425931..72fec93 100644 --- a/src/Service/QcdThirdPartyBlockRenderer.php +++ b/src/Service/QcdThirdPartyBlockRenderer.php @@ -40,10 +40,14 @@ class QcdThirdPartyBlockRenderer /** @var Context */ private $context; - public function __construct(Everblock $module, Context $context) + /** @var Module|null */ + private $qcdBuilderModule; + + public function __construct(Everblock $module, Context $context, ?Module $qcdBuilderModule = null) { $this->module = $module; $this->context = $context; + $this->qcdBuilderModule = $qcdBuilderModule; } public function renderFromHookFilterQcdPageBuilderThirdPartyBlockFrontRender(array &$params): void @@ -109,7 +113,7 @@ public function renderEverblockSelectContext(array &$context, string $blockType) } /** @var Qcdpagebuilder|null $builder */ - $builder = Module::getInstanceByName('qcdpagebuilder'); + $builder = $this->qcdBuilderModule; $everblock->content = $builder ? (string) $builder->renderTargetField( 'everblock', @@ -153,14 +157,29 @@ public function renderLatestPagesContext(array &$context, string $blockType): bo $context['normalized']['attributes']['limit'] = $limit; $customerGroups = EverblockPage::getCustomerGroups($this->context); - $pages = EverblockPage::getPages( + $customerGroups = array_map('intval', (array) $customerGroups); + sort($customerGroups); + + static $latestPagesCache = []; + $cacheKey = implode(':', [ (int) $this->context->language->id, (int) $this->context->shop->id, - true, - $customerGroups, - 1, - $limit - ); + $limit, + implode(',', $customerGroups), + ]); + + if (!isset($latestPagesCache[$cacheKey])) { + $latestPagesCache[$cacheKey] = EverblockPage::getPages( + (int) $this->context->language->id, + (int) $this->context->shop->id, + true, + $customerGroups, + 1, + $limit + ); + } + + $pages = $latestPagesCache[$cacheKey]; $pageLinks = []; foreach ($pages as $page) {