Добавление фильтрации по производителю в магазине

Модератор
#
Добавление фильтрации по производителю в магазине
Используются стандартная типовая динамическая страница "Интернет - магазин" и XSL-шаблон "МагазинКаталогТоваров".

1. В ТДС магазина перед блоком:

$Shop_Controller_Show
->xsl(
Core_Entity::factory('Xsl')->getByName($xslName)
)
->itemsProperties(TRUE)
->show();


добавляется:

$oShop = $Shop_Controller_Show->getEntity();

// XML-сущность, к которй будут добавляться производители
$oProducersXmlEntity = Core::factory('Core_Xml_Entity')->name('producers');
// Добавляем XML-сущность контроллеру показа
$Shop_Controller_Show->addEntity($oProducersXmlEntity);

// Список производителей
$oShop_Producers = $oShop->Shop_Producers;
$oShop_Producers->queryBuilder()
->select('shop_producers.*')
->distinct()
->join('shop_items', 'shop_items.shop_producer_id', '=', 'shop_producers.id')
->where('shop_items.shop_group_id', '=', $Shop_Controller_Show->group)
->where('shop_items.deleted', '=', 0);

$aShop_Producers = $oShop_Producers->findAll();
foreach ($aShop_Producers as $oShop_Producer)
{
// Добавляем производителя потомком XML-сущности
$oProducersXmlEntity->addEntity(
$oShop_Producer->clearEntities()
);
}


2. В той же ТДС магазина перед:

// Prices
$price_from = intval(Core_Array::getGet('price_from'));


добавляется:

//Producers
if (Core_Array::getGet('producer_id'))
{
   $iProducerId = intval(Core_Array::getGet('producer_id'));
   $Shop_Controller_Show->addEntity(
      Core::factory('Core_Xml_Entity')
         ->name('producer_id')->value($iProducerId)
   );

   $Shop_Controller_Show->shopItems()
      ->queryBuilder()
      ->select('shop_items.*')
      ->where('shop_items.shop_producer_id', '=', $iProducerId);

   $Shop_Controller_Show->addCacheSignature('producer_id=' . $iProducerId);
}


3. В XSL-шаблоне после:

<div class="sorting">
<select name="sorting" onchange="$(this).parents('form:first').submit()">
<option disabled="disabled">Сортировать</option>
<option value="1">
<xsl:if test="/shop/sorting = 1"><xsl:attribute name="selected">selected</xsl:attribute></xsl:if>
По цене (сначала дешевые)
</option>
<option value="2">
<xsl:if test="/shop/sorting = 2"><xsl:attribute name="selected">selected</xsl:attribute></xsl:if>
По цене (сначала дорогие)
</option>
<option value="3">
<xsl:if test="/shop/sorting = 3"><xsl:attribute name="selected">selected</xsl:attribute></xsl:if>
По названию
</option>
</select>
</div>


добавляется:

<div class="sorting">
<!-- Если есть доступные производители -->
<xsl:if test="count(producers/shop_producer) > 0">
Производитель: 
<select name="producer_id">
<option value="0">…</option>
<xsl:apply-templates select="producers/shop_producer"/>
</select> 
</xsl:if>
</div>

4. В том же XSL-шаблоне перед </xsl:stylesheet> добавляется:

<!-- Шаблон для фильтра производителей -->
<xsl:template match="producers/shop_producer">

<xsl:param name="id_prod" select="@id"/>
<option value="{@id}">
<xsl:if test="@id = /shop/producer_id">
<xsl:attribute name="selected"> </xsl:attribute>
</xsl:if>
<xsl:value-of disable-output-escaping="yes" select="name"/>
</option>
</xsl:template>


После чего получим фильтр по производителям как в 5й версии.
Вы только что начали читать предложение, чтение которого вы уже заканчиваете.
#
Re: Добавление фильтрации по производителю в магазине
Это очень круто))))) спасибо)))) но почему это не идёт стандартом?былобы намного проще)
Модератор
#
Re: Добавление фильтрации по производителю в магазине
Потому что в стандартный макет внести все возможности просто невозможно.
#
Re: Добавление фильтрации по производителю в магазине
Подскажите

в api есть метод producer
отличается ли такой способ
$Shop_Controller_Show->shopItems()
->queryBuilder()
->select('shop_items.*')
->where('shop_items.shop_producer_id', '=', $iProducerId);

от
$Shop_Controller_Show->producer($iProducerId);
?
Модератор
#
Re: Добавление фильтрации по производителю в магазине
В данном случае отличается тем, что внутренний producer может быть установлен контроллером при анализе URI и обработан фактически аналогичным образом:
            $this->_Shop_Items
               ->queryBuilder()
               ->where('shop_items.shop_producer_id', '=', $this->producer);

            // В корне при фильтрации по меткам вывод идет из всех групп
            $this->group == 0 && $this->group = FALSE;
#
Re: Добавление фильтрации по производителю в магазине
Автору огромный респект!!!
Даже я понял как это сделать
А то иногда модераторы так выражаются, что мне можно не задавать вопросов
Модератор
#
Re: Добавление фильтрации по производителю в магазине
Всегда пожалуйста
Вы только что начали читать предложение, чтение которого вы уже заканчиваете.
#
Re: Добавление фильтрации по производителю в магазине
Добрый День.
Подскажите пожалуйста как реализовать такую задачу:
1) Список производителей должен выводиться на каждой странице сайта(т.е. в основном макете)
С логотипом(картинкой).
2) При переходе на производителя должны отображаться все товары связанные с этим производителем.
3) Еще вопрос как в разных меню сайта, вывести определенный список производителей?
Вопрос в том какой код вставить в макет, и какой xls шаблон править?
Если данный вопрос поднимался, прошу извинить, и дать ссылку.
Спасибо.
#
Re: Добавление фильтрации по производителю в магазине
С 1 вопросом разобрался, со вторым проблема...
Можно ли формировать url страницы производителя так как хочешь?
Например нужно http://www.site.ru/shop/panasonic/ и переходя по ссылки выводился бы полный список товаров по этому производителю. Сейчас url выглядит так http://www.site.ru/shop/producer-9/,
Что не есть хорошо для тех кто серьезно относится к сео (предпочтительней указывать в урле ключевое слово на транслите).
Модератор
#
Re: Добавление фильтрации по производителю в магазине
предпочтительней то предпочтительно, только вот что делать системе, когда у вас в корне группа panasonic и производитель такой же? Что прикажете показывать?!
Авторизация