Настраиваемая многоуровневая навигация без атрибутов. Это единственный способ сделать это?

8

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

Для этого у меня есть:

  1. Создан модуль
  2. Переписал catalog_block_layer_view

    <blocks>        
      <catalog>
        <rewrite>
          <layer_view>Bob_Catalog_Block_Layer_View</layer_view>
         </rewrite>                
       </catalog>
    </blocks>
    
  3. Создан класс с именем Bob_Catalog_Block_Layer_View, который расширяет Mage_Catalog_Block_Layer_View

  4. Созданы _initBlocks (), getFilters () и _prepareLayout () для переопределения методов родительских классов. Все они в какой-то момент вызывают родительский класс, а затем либо добавляют, либо добавляют дополнительные данные к возвращаемому.
  5. Создайте блок фильтра Bob_Catalog_Block_Layer_Filter_Rating, который расширяет Mage_Catalog_Block_Layer_Filter_Abstract с помощью конструктора, который устанавливает filterModelName и вызывает его родителя, а затем устанавливает пользовательский шаблон, как кажется, что Mage_Catalog_Block_Layer_Filter_Abstract имеет имя шаблона hardco.
  6. Создайте модель Bob_Catalog_Model_Layer_Filter_Rating, которая расширяет Mage_Catalog_Model_Layer_Filter_Abstract и реализует apply (), getName (), _getItemsData ().

Это все отлично работает. Красивые блестящие звезды показывают в многослойной навигации.

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

Таким образом, вопрос есть какие - либо из вас есть какие - либо лучше предложения (или , возможно, блог подмигивание ) о том , как построить собственный не атрибут поддерживается многоуровневый навигационный фильтр?

Спасибо за чтение,

си

Си Гриффитс
источник
Я должен сделать это в следующие дни, и я подумал сделать это так.
Фабиан Блехшмидт

Ответы:

5

Есть еще один способ сделать это, вы можете добавить к своему товару обычный атрибут, который будет рейтингом. Затем используйте наблюдателя (я не знаю, как формируется этот рейтинг), чтобы обновить атрибут продукта. Или, если у наблюдателя нет выбора, возможно, используйте cronjob, который обновляет этот атрибут для каждого продукта каждые x минут в зависимости от того, насколько тяжелым является сценарий.

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

Конечно, вопрос в том, подходит ли вам это? Откуда берутся рейтинги?

РЕДАКТИРОВАТЬ Вы должны были бы стилизовать звезды, используя JavaScript или проверить имя атрибута в шаблоне.

Рик Кейперс
источник
Я думаю, что это охватывает почти все варианты. Предложение наблюдателя - интересная идея.
Си Гриффитс
Если я вспоминаю, стандартное моделирование в виде звездочек представляет собой просто ширину CSS, основанную на средней оценке из 5,1 / 5 = 20% ширины, 4,3 / 5 = 86% ширины и т. Д. Я сомневаюсь, что это нужно изменить ... но Обновление значения атрибута с помощью скрипта cron довольно умно. +1
pspahn
2

Я копался в коде и не нашел никакого события. Без добавления дополнительных атрибутов делать нечего<rewrite>

Вы должны добавить свой блок \Mage_Catalog_Block_Layer_View::_prepareLayout()до apply()(если не можете использовать core_block_abstract_prepare_layout_after.

И вам нужно добавить его, \Mage_Catalog_Block_Layer_View::getFilters()и нет никакого события тоже.

Фабиан Блехшмидт
источник
Это именно то, что я нашел. Также, похоже, нет способа обойти шаблон state.phtml. Кажется, условная ветвь необходима для изменения любого вывода.
Си Гриффитс
Я переписал catalog/layer_filter_category, catalog/layer_filter_attributeи catalog_resource/layer_filter_attributeпоказывать варианты все время без использования state.phtmlна данный момент нет возможности удалить фильтры: - /
Фабиан Блехшмидт
В моей работе был if ($ _filter-> getName () === 'what') {} Чтобы показать HTML-код пользовательского состояния. Это не очень хорошее решение, но, тем не менее, это решение. Ps. Надеюсь, вы в порядке, так как мы в последний раз встречались в MDP.
Си Гриффитс