Перемещение панели инструментов категории из продукта / списка

8

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

Я нашел этот сайт, который работал для более старых версий Magento, но он не работает для CE 1.7 или EE 1.12.

В комментариях у кого-то был код, чтобы переместить его в корень, но это также не работает. Это был код для перемещения его в категорию / представление, которое поможет:

$toolbar = $this->getChild('product_list')->getToolbarBlock();
$toolbar->setCollection($this->getChild('product_list')->getLoadedProductCollection());
echo $toolbar->toHtml();

Если есть другой способ сгруппировать панировочные сухари, название категории и панель инструментов, дайте мне знать.

Кель
источник

Ответы:

13

Catalog/product_listи catalog/product_list_toolbarтак сильно связаны друг с другом, что вы застряли, используя их вместе. Если вы хотите отображать только панель инструментов, вам нужно создать (почти) пустой шаблон product_list.

Скажем, вы хотите, чтобы панель инструментов отображалась в блоке хлебных крошек, но на самом деле это должно работать с любым блоком.

Поместите следующее обновление где-нибудь в свой layout/local.xmlкаталог (он может понадобиться и для catalog_category_default):

<catalog_category_layered>
    <reference name="breadcrumbs">
        <block type="catalog/product_list" name="toolbar_only" template="catalog/product/list/toolbar_only.phtml">
            <block type="catalog/product_list_toolbar" name="product_list_toolbar_only" template="catalog/product/list/toolbar.phtml">
                <block type="page/html_pager" name="product_list_toolbar_pager"/> 
            </block>    
            <action method="setToolbarBlockName"><name>product_list_toolbar_only</name></action>
        </block>            
    </reference>            
</catalog_category_layered>

Создайте шаблон списка товаров в одну строку в template/catalog/product/list/toolbar_only.phtml:

<?php echo $this->getToolbarHtml() ?>

Затем вы можете вставить новый блок в любом месте в шаблоне хлебных крошек:

template/page/html/breadcrumbs.phtml:

<?php echo $this->getChildHtml('toolbar_only'); ?>
Ян Томка
источник
Это тоже довольно хороший метод - я полностью согласен с тем, чтобы хранить списки продуктов и панели инструментов вместе любой ценой. Мне было бы интересно услышать ваше мнение о методе javascript, который я опубликовал ранее.
jharrison.au
@ Ян Томка отличный ответ! Я боролся с попыткой вставить блок между панелью инструментов и самими продуктами, и ваше решение сделало это возможным. Спасибо!
Ронен Несс
Проблема с этим ответом состоит в том, что он запускает настраиваемый образец наблюдателя для повторного запуска, потому что catalog/product_listблок существует дважды, а catalog_block_product_list_collectionметод отправляется дважды (который наблюдает наблюдатель). Это резко увеличивает время загрузки страницы категории.
Робби Аверилл
Правда что. Первоначальный ответ был написан до того, как появились настраиваемые образцы (не то, чтобы в то время я проверял наличие нескольких наблюдателей). Лучше всего использовать отдельный тип блока, расширенный из catalog / product_list, с удалением события из _beforeToHtml ().
Ян Томка
4

После попытки переместить блок панели инструментов через макет XML и хаки шаблонов, я решил, что намного легче переместить его через javascript. Я думаю, что этот способ дает вам больше контроля без риска нарушения функциональности.

jQuery(document).ready(function($) {
     $(".breadcrumbs").after($(".category-products > .toolbar"));
});

Обратите внимание, что этот метод перемещает только первую панель инструментов, а не нижнюю, используя определенный селектор .category-products > .toolbar

Еще несколько рассуждений о том, почему этот метод лучше:

  1. Список продуктов и панель инструментов тесно связаны между собой, ссылаясь друг на друга в своих блоках, поэтому имеет смысл объединять их в единое целое с точки зрения кода - они идут рука об руку
  2. Меньшее количество кода и меньше изменений в блочной логике означает меньшую вероятность появления ошибок
  3. Используя JavaScript, вы можете легко переместить его в любое место на странице
  4. Используя макет XML, вы можете включать JavaScript только на страницах со списком продуктов.
  5. Перемещение с помощью javascript является расширяемым и ориентированным на будущее - если логика, лежащая в основе списка продуктов или панелей инструментов, изменится в новых версиях Magento, этот метод все равно будет работать.
jharrison.au
источник
Я бы полностью воспользовался этим методом, но я стараюсь сделать сайт как можно меньшим по размеру javascript, хотя я знаю, что Magento зависит от javascript.
Кел
4

Код LuFFy не за горами

Чтобы скопировать блок в другие части вашего сайта, вы можете получить основной объект макета, а затем просто получить блок контента по имени

      $layout = Mage::app()->getLayout();
      $content = $layout->getBlock('content');
      $categoryProducts = $content->getChild('category.products');
      $productList = $categoryProducts->getChild('product_list');
      $toolbar = $productList->getToolbarBlock();
      $toolbar->setCollection($productList->getLoadedProductCollection());
      echo $toolbar->toHtml();
вибрировать
источник
Где это использовать?
Пратик
@PratikCJoshi Я поместил этот код прямо в мой файл catalog / layer / view.phtml, и он отлично работал, поэтому вы можете просто разместить его в любом файле шаблона, где вы хотите, чтобы панель инструментов появлялась.
Грегдев
0

Попробуйте код:

getParentBlock();
$content = $parent->getChild(‘content’);
$categoryProducts = $content->getChild(‘category.products’);
$productList = $categoryProducts->getChild(‘product_list’);
$toolbar = $productList->getToolbarBlock();
$toolbar->setCollection($productList->getLoadedProductCollection());
echo $toolbar->toHtml();
Luffy
источник
Это был тот же код в комментариях, и он дает мне эту ошибку:Call to undefined function getParentBlock()
Кел
Ой...!! То же самое я нашел на другом сайте.
LuFFy