Динамический Топменю с полным кэшированием страницы


Я потратил слишком много часов, копаясь в SO и остальной сети в поисках решения этой проблемы, и после того, как я попробовал почти все предложения, я все еще в недоумении.

Проблема в том, что нам нужен динамический контент в верхней панели. В настоящее время это выглядит так...
Home | Categories | <LoggedInBlock> <LoggedOutBlock> <EveryoneBlock>
...где три блока являются статическими блоками, редактируемыми администратором, а блоки входа в систему и выхода из системы добавляются в макет через <customer_logged_in/out>.

В конечном счете цель состоит в том, чтобы просто иметь ссылки в верхнем меню доступны для редактирования в администраторе, а некоторые ссылки скрыты при входе или выходе из системы (в то время как некоторые ссылки всегда отображаются). Это работает нормально до тех пор, пока не будет включено полное кэширование страницы, после чего либо вошедшая версия, либо вышедшая из системы, будут кэшироваться для всех пользователей, независимо от их статуса.

Большинство рекомендаций вращаются вокруг значений блоков, таких как cache_lifetime/cache_tags/и т.д., Но возня с любым из них на уровне макета или блока кажется неуместной в отношении полной страницы Кэш. Контейнер FPC Catalognavigation не сравнивает идентификаторы кэша и выполняет свою работу до загрузки макета. Я могу только представить, что Enterprise_PageCache_Model_Container_Catalognavigation необходимо перезаписать, чтобы в нем каким-то образом работал статус пользователя, но я не могу сказать, что знаю, как возиться с этими сумасшедшими функциями кэширования.

Я подумал о том, чтобы отказаться от пробивания отверстий в верхнем меню althg и просто полностью удалить стандартное, настроив простой блок ядра/шаблона для создания меню внутри. Единственная проблема с этим заключается в том, что меню категорий в блоке Topmenu_Renderer запутанно вплетено в код topmenu до такой степени, что попытка разделить его кажется невозможной при уже истекшем бюджете времени.

Magento EE 1.14.1

Author: Robert S, 2015-03-01

2 answers

Если вы полностью удалите их из макета, сделав что-то вроде приведенного ниже в тегах по умолчанию в вашем local.xml

<reference name="header">
  <action method="unsetChild"><name>top.links</name></action>
</reference>

Или на страницу, например

<remove name="top.links" />

Затем создайте мини-модуль с одним методом контроллера, таким как

public function indexAction()
{   
    $this->loadLayout();
  $this->renderLayout();
}

Добавьте это в свой local.xml

<dynamicblocks_index_index>

    <reference name="root">
        <action method="setTemplate"><template>dynamicblocks/index.phtml</template></action>
    </reference>   


</dynamicblocks_index_index>

Затем в вашем dynamicblocks/index.phtml

<?php echo $this->getLayout()->getBlock('top.links')->toHtml() ?>

Вся эта страница должна просто отображать ваши ссылки на топ, и, загрузив ее с веб-сайта с помощью вызова ajax, она не будет кэшироваться.

 0
Author: develophper, 2015-03-02 14:43:41

Наконец-то я смог решить эту проблему надлежащим образом. Решение состояло в том, чтобы полностью отказаться от сумасшедшего кэширования каталогнавигации, заключив его в новый блок. Мы даже можем использовать тип блока page/html_wrapper, чтобы ограничить наши изменения просто нашей темой local.xml и шаблоном page/html/topmenu.phtml.

/app/design/frontend/INTERFACE/THEME/template/page/html/topmenu.phtml:
<?php if($this->getHtml('level-top')) echo $this->getChildHtml();

Мы просто удаляем topmenu.phtml до самого необходимого, удаляя <nav> и <ol> html-контейнеры. Мы могли бы переместить их в новый файл шаблона, но еще лучше мы можем воссоздать их в нашем макете...

/app/design/frontend/INTERFACE/THEME/layout/local.xml:

<reference name="header">
    <action method="unsetChild"><name>top.menu</name></action>
    <block type="page/html_wrapper" name="top.menu.nav" as="topMenu" before="top.container" translate="label">
        <action method="setHtmlTagName"><value>nav</value></action>
        <action method="setElementId"><value>nav</value></action>

        <block type="page/html_wrapper" name="top.menu.list">
            <action method="setHtmlTagName"><value>ol</value></action>
            <action method="setElementClass"><value>nav-primary</value></action>

            <block type="core/text_list" name="top.menu" translate="label">
                <label>Navigation Bar</label>
                <block type="page/html_topmenu" name="catalog.topnav" template="page/html/topmenu.phtml">
                    <block type="page/html_topmenu_renderer" name="catalog.topnav.renderer" template="page/html/topmenu/renderer.phtml"/>
                </block>
            </block>

            <block type="cms/block" name="my_custom_nav_block">
                <action method="setBlockId"><block_id>my_custom_nav_block</block_id></action>
            </block>
        </block>
    </block>
</reference>

Два блока html_wrapper воссоздают элементы <nav> и <ol>. as="topMenu" необходимо переместить в верхнюю оболочку, чтобы навигация печатала все целиком, а не только часть top.menu.

Теперь я могу создать my_custom_nav_block в статических блоках CMS, и он будет в списке, но за пределами кошмарного кэширования topnav. Это здорово, потому что выпадающий список категорий по-прежнему кэшируется, но теперь любой блок можно легко добавить в список по желанию, сославшись на top.menu.list (или как вы хотите назвать свой самый верхний блок-оболочку), в том числе с такими вещами, как <customer_logged_in>.

Единственное предостережение, которое я заметил до сих пор, заключается в том, что в раскрывающемся списке категорий всегда будут классы CSS first и last, думая, что это единственный элемент в списке. Для нашей темы, по крайней мере, это не проблема в том, что мы не используем эти классы, и вместо этого можно легко использовать селекторы CSS.

 0
Author: Robert S, 2015-03-04 20:03:13