'All Pages', App_SideBlock_Obj::PAGE_CUSTOM => 'Custom Pages', ]; public static $linkTypeTitles = [ App_SideBlock_Obj::LINK_NONE => 'None', App_SideBlock_Obj::LINK_URL => 'Url', App_SideBlock_Obj::LINK_PAGE => 'Site Page', ]; public static $blockTypeTitles = [ App_SideBlock_Obj::TYPE_HTML => 'Html Content', App_SideBlock_Obj::TYPE_TESTIMONIAL => 'Testimonials', App_SideBlock_Obj::TYPE_SUBSCRIPTION => 'Newsletters Subscription', App_SideBlock_Obj::TYPE_RECENT_NEWS => 'Recent News', App_SideBlock_Obj::TYPE_FEATURED_NEWS => 'Featured News', App_SideBlock_Obj::TYPE_FEATURED_POSTS => 'Featured Blog Posts', App_SideBlock_Obj::TYPE_NEWSLETTERS => 'Newsletters', App_SideBlock_Obj::TYPE_CONTACT_FORM => 'Contact Form', App_SideBlock_Obj::TYPE_FEATURED_PRODUCTS => 'Featured Products', App_SideBlock_Obj::TYPE_UPCOMING_EVENTS => 'Upcoming Events', App_SideBlock_Obj::TYPE_SITEMAP => 'Submenu', ]; /** * Additional block handlers should implement App_SideBlock_Item_Interface * @var array Type Title => Class Name */ public static $blockTypes = [ App_SideBlock_Obj::TYPE_TESTIMONIAL => 'App_Testimonial_SideBlock', App_SideBlock_Obj::TYPE_SUBSCRIPTION => 'App_Form_Newsletter_View', App_SideBlock_Obj::TYPE_RECENT_NEWS => 'App_News_View', App_SideBlock_Obj::TYPE_FEATURED_NEWS => 'App_News_View', App_SideBlock_Obj::TYPE_FEATURED_POSTS => '\\App\\Blog\\View', App_SideBlock_Obj::TYPE_NEWSLETTERS => 'App_Newsletter_View', App_SideBlock_Obj::TYPE_CONTACT_FORM => 'App_Form_Contact_View', App_SideBlock_Obj::TYPE_FEATURED_PRODUCTS => 'App_ECommerce_Product_FeaturedBlock_View', App_SideBlock_Obj::TYPE_UPCOMING_EVENTS => '\\App\\Event\\Upcoming\\View', App_SideBlock_Obj::TYPE_SITEMAP => 'App_Sitemap_View', ]; protected $_actions = ['list']; protected $_listOptions = ['defaultOrderBy' => 'id', 'isDisabledLimit' => true]; protected $_externalItems = []; protected $_itemsGroup = self::RIGHT_COLUMN; public function exec() { /** * Перевірка необхідності ініціалізації блоків - початок. * * Не на всіх сторінках потрібні бокові блоки. Зробив відключення через темлату "bodyTemplate". Якщо в сторінки * не стандартна темплати і її ім'я містись слова "left" або "right", то робимо перевірки чи блоки взагалі * треба виводити. Зараз для деяких сторінок задано темплату "left-main-columns.tpl", на них бокові блоки не * виводяться. * * Просто не виводити колонку не виходить, бо ініціалізуються джаваскрипти і відповідно виникають помилки. * * Наразі це тимчасове рішення, для цієї проблеми треба буде придумати якесь комплексніше рішення. */ $template = basename($this->_doc->getBodyTemplate()); $rightPos = strpos($template, 'right'); $leftPos = strpos($template, 'left'); if (false !== $rightPos || false !== $leftPos) { if ($this->_itemsGroup == self::RIGHT_COLUMN && false === $rightPos || $this->_itemsGroup == self::LEFT_COLUMN && false === $leftPos ) { return $this; } } /** Перевірка необхідності ініціалізації блоків - кінець. */ $this->_getDataObj()->setIdPage($this->_doc->getOption('id')); return parent::exec(); } protected function _doList() { $this->_addListItem(); $this->_postList(); return $this; } protected function _getListItem() { $item = parent::_getListItem(); $this->_prepareExternalItems($item); if (Qs_Constant::get('DEBUG')) { Zend_Registry::set('_pageSideBlocks', $item['list']); } return ($item['list']) ? $item : null; } protected function _addListItem() { if (($item = $this->_getListItem())) { $this->_doc->addItem($item, $this->_itemsGroup); } return $this; } public function setIdPage($id) { $this->_getDataObj()->setIdPage($id); return $this; } public function getItem() { return $this->_getListItem(); } protected function _prepareExternalItems(&$item) { foreach ($item['list'] as &$block) { $blockType = $block['blockType']; if (App_SideBlock_Obj::TYPE_HTML !== $blockType && array_key_exists($blockType, App_SideBlock_View::$blockTypes) ) { $block['externalItem'] = $this->_getExternalItem($block); if ($block['externalItem']) { $this->_doc->addItemResources($block['externalItem']); } } } unset($block); foreach ($item['list'] as $key => $block) { if (array_key_exists('externalItem', $block) && empty($block['externalItem'])) { unset($item['list'][$key]); } } return $this; } protected function _getExternalItem($block) { $blockType = $block['blockType']; $cacheId = $blockType; if (App_SideBlock_Obj::TYPE_SITEMAP == $blockType) { $cacheId .= $block['id']; } if (!isset($this->_externalItems[$cacheId])) { $itemClass = App_SideBlock_View::$blockTypes[$blockType]; $options = $this->_getExternalItemOptions($blockType); /** @var $view Qs_ViewController|App_Doc_SideBlockItemInterface */ $view = new $itemClass($options); if (!method_exists($view, 'getSideBlockItem')) { throw new Qs_Exception('Method ' . $itemClass . '::getSideBlockItem() is undefined'); } $view->setDoc($this->_doc); $item = $view->getSideBlockItem($block); if (!empty($item)) { $this->_externalItems[$cacheId] = new Qs_Doc_Item($item); } else { $this->_externalItems[$cacheId] = null; } } return $this->_externalItems[$cacheId]; } protected function _getExternalItemOptions($blockType) { $options = []; switch ($blockType) { case App_SideBlock_Obj::TYPE_RECENT_NEWS: $options['config'] = ['type' => 'small']; break; case App_SideBlock_Obj::TYPE_FEATURED_NEWS: $options['config'] = ['type' => 'featured']; break; case App_SideBlock_Obj::TYPE_NEWSLETTERS: $options['config'] = ['type' => 'small']; break; } return $options; } }