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


Тема очень лаконична: мне нужно показать все товары в заданных категориях на странице CMS.

Для этого я хочу изменить list.phtml, так как он легко реализуем и имеет классный внешний вид.

Чтобы быть более ясным, я хочу, чтобы мой блок был таким:

{{block type="catalog/product_list" name="product_list" category_id="12,13,26" column_count="5" mode="list" template="catalog/product/multiple_list.phtml"}}

Возможно ли это? Я пытаюсь несколькими способами, но просто не могу понять логику использования в list.phtml, которая соответствует моим потребностям.

Кстати, я пробовал эти решения, но они это не совсем то, что мне нужно:

Достопримечательности:

  • Версия Magento: 1.9.2
  • Уже показаны товары одной категории
  • Список продуктов данной корневой категории подошел бы, но не работает также (здесь показаны продукты всех других корневых категорий)

Редактировать 1: Я нашел ответ, который очень близок к тому, что мне нужно:

<?php
/**
* Displays multiple category view templates along with the product list for it
*/
/* @var $this Mage_Core_Block_Template */

$category_ids     = explode(',', $this->getData('category_ids'));
$current_category = Mage::registry('current_category');

if ($current_category) {
Mage::unregister('current_category');
}

foreach ($category_ids as $id) {

$category = Mage::getModel('catalog/category')->load(trim($id));

if (!$category->getId()) {
    continue;
}

Mage::register('current_category', $category);

$product_list = $this->getLayout()->createBlock('catalog/product_list', 'product_list_'.$id, array('template' => 'catalog/product/list.phtml'));

echo $this
    ->getLayout()
    ->createBlock('catalog/category_view', 'category_'.$id, array('template' => 'catalog/category/view.phtml'))
    ->append($product_list, 'product_list')
    ->toHtml();

Mage::unregister('current_category');
}

if ($current_category) {
Mage::register('current_category', $current_category);
}

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

Редактировать 2: Теперь у меня есть это:

<?php
/**
 * Displays multiple category view templates along with the product list for it
 */
/* @var $this Mage_Core_Block_Template */

$category_ids     = explode(',', $this->getData('category_ids'));
$current_category = Mage::registry('current_category');

if ($current_category) {
    Mage::unregister('current_category');
}

foreach ($category_ids as $it => $id) {

    $category = Mage::getModel('catalog/category')->load(trim($id));

    if (!$category->getId()) {
        continue;
    }

    Mage::register('current_category', $category);

    global ${"category_"$it} = $this->getLayout()->createBlock('catalog/product_list', 'product_list_'.$id, array('template' => 'catalog/product/list.phtml'));

    Mage::unregister('current_category');

}

foreach ($category_ids as $it => $id) {
        global array product_list ( array $product_list [, array ${"category_"$it}] );
}

Mage::register('current_category', 'category_1');

echo $this
    ->getLayout()
        ->createBlock('catalog/category_view', 'category_1', array('template' => 'catalog/category/view.phtml'))
        ->append($product_list, 'product_list')
        ->toHtml();

}

if ($current_category) {
    Mage::unregister('current_category');
}

Эта часть кода следует:

  • Создайте 3 массива продуктов
  • Объедините эти 3 массива в 1 "список продуктов"
  • Создайте 1 блок как "представление"
  • Эхо всех 3 массивов в один блок.

Но теперь он просто останавливает мою страницу CMS, нарушая все содержимое страницы.

Редактировать 3:

Я не уверен в том, как создать свой собственный блок или как вызвать определенный мной блок, но, следуя @fschmengler и @Wouter Steenmeijer, вот что у меня есть теперь:

XML Обновления макета:

<reference name="content">
    <block type="core/template" name="multiple_categories" template="catalog/category/list.phtml">
        <action method="setData"><key>category_ids</key><val>12,13,26</val></action>
     </block>
</reference>

файл: app/code/local/starscream/default/block/multiple.php

содержание:

<?php
 protected function _getProductCollection()
    {
    $category_ids = $this->getCategoryIds();
    $productCollection = Mage::getModel('catalog/product')
        ->getCollection()
        ->addStoreFilter()
        ->setVisibility(Mage::getSingleton('catalog/product_visibility')->getVisibleInCatalogIds());
        ->addMinimalPrice()
        ->addFinalPrice()
        ->addTaxPercents()
        ->addAttributeToSelect(Mage::getSingleton('catalog/config')->getProductAttributes())
        ->addUrlRewrite()
        ->joinField(
            'category_id', 'catalog/category_product', 'category_id',
            'product_id = entity_id', null, 'left'
        )
        ->addAttributeToFilter('category_id', array(
            array('in' => array($category_ids)),
        ));

        return $productCollection;
    }
?>

Я не нашел, как это назвать"multiple.php "блок, который я создал на своей странице CMS... Я что-то упускаю?

Любая помощь приветствуется.

Author: Community, 2015-12-17

2 answers

Хороший вопрос!

Хитрость здесь в том, чтобы расширить блок на основе каталога/списка продуктов.

Я думаю, что лучший способ здесь - добавить немного xml в раздел "Обновление XML макета".

<reference name="content">
    <block type="catalog/product_list" 
           name="multiple_categories" template="catalog/product/list.phtml">
        <action method="setCategoryIds"><category_ids>4,5,6,7</category_id></action>
    </block>
</reference>

Здесь вам нужно заменить каталог/список продуктов на созданный вами пользовательский модульный блок. SetCategoryIds задает идентификаторы категорий в этом блоке, чтобы вы могли фильтровать по ним.

В product/list.phtml это называется, чтобы получить коллекцию продуктов:

    $_productCollection=$this->getLoadedProductCollection();

Хитрость здесь в том, чтобы создать пользовательский модуль, который расширяется на catalog/product_list и заменяет функцию _getProductCollection.

Если вы хотите знать, как это сделать, пожалуйста, прочтите это: прочитайте эту тему

В этом новом блоке вы добавляете эту функцию:

    protected function _getProductCollection()
    {
    $category_ids = $this->getCategoryIds();
    $productCollection = Mage::getModel('catalog/product')
        ->getCollection()
        ->addStoreFilter()
        ->setVisibility(Mage::getSingleton('catalog/product_visibility')->getVisibleInCatalogIds());
        ->addMinimalPrice()
        ->addFinalPrice()
        ->addTaxPercents()
        ->addAttributeToSelect(Mage::getSingleton('catalog/config')->getProductAttributes())
        ->addUrlRewrite()
        ->joinField(
            'category_id', 'catalog/category_product', 'category_id',
            'product_id = entity_id', null, 'left'
        )
        ->addAttributeToFilter('category_id', array(
            array('in' => array($category_ids)),
        ));

        return $productCollection;
    }

РЕДАКТИРОВАТЬ:

Во-первых, забудьте о пользовательском модуле. Это лучшая практика magento, так как мы не хотим редактировать ядро. Мы вернемся к этому позже.

Теперь ваш тип блока - ядро/шаблон. Функция getProductCollection не существует в ядре/шаблоне блока. Загляните в эту папку: app/code/mage/core/block/template.php

Поэтому вам придется ссылаться на другой блок. В идеале вы хотите создать для этого пользовательский модуль, расширяющий каталог типов блоков/product_list. Но, как я уже говорил ранее, мы вернемся к этому позже.

В блоке catalog/product_list ( app/code/mage/catalog/product/list.php ) является функцией _getProductCollection(). Это функция, которую каждая страница каталога использует для получения коллекция продуктов. Это также функция, которую вы хотите использовать. Поэтому измените core/template с catalog/product_list.

Замените функцию _getProductCollection() функцией, которую я вставил выше. Вы увидите, что это работает!

Теперь, когда вы знаете, что созданная вами новая функция работает, вы хотите поместить этот код в новый пользовательский блок. Вы делаете это, чтобы создать модуль с блоком. Внимательно прочитайте эту тему, чтобы создать новый блок: Ссылка Stackexchange для создания пользовательского блока

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

Надеюсь, теперь вы лучше понимаете систему блоков magento!

 6
Author: Wouter Steenmeijer, 2017-04-13 12:54:56

Спасибо всем, кто помог мне в этом задании.

Я нашел уродливое решение, которое подходит лучше, чем мои первые мысли:

Я создал новую подкатегорию, смешав все продукты, которые я хотел из этих 3 категорий.

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

Я не мог найти лучшего или более простого способа, но он работает. Если у вас есть какие-либо идеи, пожалуйста, поделитесь ими!

Редактировать: @Woutersteenmeijer также работает и намного красивее, но требует более высокого уровня квалификации. Спасибо вам всем!

 0
Author: Carlos Eduardo Santos, 2016-02-08 18:04:03