Navegação em camadas personalizada, sem atributos. Essa é a única maneira de fazer isso?

8

Hoje, estou selecionando uma opção de navegação em camadas que não é baseada em um atributo. É para classificações, portanto, o front end pode mostrar boas estrelas brilhantes.

Para fazer isso eu tenho:

  1. Criou um módulo
  2. Reescrever catalog_block_layer_view

    <blocks>        
      <catalog>
        <rewrite>
          <layer_view>Bob_Catalog_Block_Layer_View</layer_view>
         </rewrite>                
       </catalog>
    </blocks>
  3. Criou uma classe chamada Bob_Catalog_Block_Layer_View que estende Mage_Catalog_Block_Layer_View

  4. Criou _initBlocks (), getFilters () e _prepareLayout () para substituir os métodos das classes pai. Todos eles chamam a classe pai em algum momento e, em seguida, acrescentam ou acrescentam dados extras ao que é retornado.
  5. Crie um bloco de filtro Bob_Catalog_Block_Layer_Filter_Rating que estenda Mage_Catalog_Block_Layer_Filter_Abstract com um construtor que define o filterModelName e chama seu pai e, em seguida, define um modelo personalizado, pois parece que Mage_Catalog_Block_Layer_Filter_Abstract tem o nome do modelo codificado no construtor.
  6. Crie um modelo Bob_Catalog_Model_Layer_Filter_Rating que estenda Mage_Catalog_Model_Layer_Filter_Abstract e implemente apply (), getName (), _getItemsData ().

Tudo isso funciona bem. As belas estrelas brilhantes aparecem na navegação em camadas.

Tenho a sensação de que estou perdendo alguma coisa porque, quando se trata de modelo de estado de camada, tive que colocar um condicional lá para pegar o filtro de classificação personalizado e alterar o layout. Além disso, algumas das coisas que eu precisava fazer (clonar a coleção de produtos para que o evento load não estragasse a contagem de coleções na paginação) me fizeram sentir como se estivesse nadando morro acima.

Portanto, a pergunta é: algum de vocês teve alguma sugestão melhor (ou talvez uma piscada no blog ) sobre como criar um filtro de navegação em camadas personalizado e sem atributos?

Obrigado pela leitura,

Si

Si Griffiths
fonte
Eu tenho que fazer isso nos próximos dias e pensei em fazer assim.
Fabian Blechschmidt

Respostas:

5

Há outra maneira de fazer isso: você pode adicionar um atributo normal ao seu produto, que seria a classificação. Em seguida, use um observador (não sei como essa classificação é formada) para atualizar o atributo do produto. Ou, se um observador não for uma opção, talvez use um cronjob que atualize esse atributo para cada produto a cada x minutos, dependendo da intensidade do script.

Dessa forma, não há reescrita e alteração do Magento envolvidas, todos os módulos de navegação ainda funcionarão e é mais fácil de manter.

Claro que a pergunta é: isso é uma opção para você? De onde vêm as classificações?

EDIT Você teria que estilizar as estrelas usando javascript ou verificar o nome do atributo no modelo.

Rick Kuipers
fonte
Eu acho que isso cobre praticamente todas as opções. A sugestão do observador é uma ideia interessante.
Si Griffiths
Se bem me lembro, o estilo de estrela padrão é apenas uma largura CSS com base na classificação média de 5. 1/5 = 20% de largura, 4,3 / 5 = 86% de largura, etc. Duvido que precise mudar ... mas atualizar o valor do atributo através de um script cron é bastante inteligente. 1
pspahn 31/01
2

Eu procurei no código e não encontrei nenhum evento. Sem adicionar atributos extras, não há nada a fazer sem<rewrite>

Você deve adicionar seu bloco \Mage_Catalog_Block_Layer_View::_prepareLayout()antes do apply()(se não, você poderia usá-lo core_block_abstract_prepare_layout_after.

E você precisa adicioná-lo \Mage_Catalog_Block_Layer_View::getFilters()e também não há eventos.

Fabian Blechschmidt
fonte
Foi exatamente isso que encontrei. Também parece não haver maneira de solucionar o modelo state.phtml. Parece que uma ramificação condicional é necessária para alterar qualquer saída.
Si Griffiths
Eu reescrevi catalog/layer_filter_category, catalog/layer_filter_attributee catalog_resource/layer_filter_attributepara mostrar as opções o tempo todo sem usar o state.phtmlno momento, não há como remover os filtros: - /
Fabian Blechschmidt
Meu trabalho tinha um if ($ _filter-> getName () === 'qualquer coisa') {} Para dar a volta mostrando o estado personalizado em html. Não é uma ótima solução, mas é uma solução. Ps. Espero que você esteja bem desde a última vez que nos encontramos no MDP.
Si Griffiths