Alterando o layout da navegação em camadas

14

Eu tenho uma navegação em camadas e o cliente deseja ter <select/>campos em vez de uma longa lista de links.

Pensei apenas em mudar o modelo com um observador se o nome / id do filtro corresponder.

Alguma idéia ou recomendação melhor? Alternativas para alterar o modelo, talvez substituir / reescrever o bloco ou alterar apenas a classe do bloco para os dois filtros?

Qual evento usar para alterar o modelo?

Tenho o mesmo problema aqui /programming/14524791/magento-enable-or-disable-a-module-in-code/14529629 porque tenho um observador que altera as coisas do layout. Este é apenas um tema relevante. Então, analisar o tema antes de executar as atualizações pode ser uma boa ideia?

Fabian Blechschmidt
fonte
"o cliente deseja ter campos em vez de uma longa lista de links" Não faço ideia do que você quer dizer com isso.
26613 Rick Kipers
droga, stackexchange comeu meu <select> #
Fabian Blechschmidt 26/01
1
Eu diria que apenas sobrescreva o catalog/layer/filter.phtmlmodelo e mude o que você precisa, será também específico do tema. A única coisa com a qual você precisa lidar é com o bit de filtros selecionado. Suponho que você queira mostrar todo o filtro selecionado no <select>que possa exigir a adição de algumas funções de bloco, porque uma vez que um filtro é selecionado, as outras opções desaparecem.
26613 Rick Kipers
não, o cliente deseja ter as categorias e "subcategorias" (atributo) como caixas de seleção, tudo o mais com caixas de seleção (trabalho a ser feito) e filtrar adicionalmente por classificação :-) Mas depois implementarei tudo no modelo.
Fabian Blechschmidt
1
Este comentário serve como uma nota para mim. Eu tenho uma resposta para isso, mas estou no meu telefone. Adoro trabalhar no Nav em camadas. Eu estendi-lo para apoiar selecionando vários campos em um projeto anterior (pense caixas)
Tim Reynolds

Respostas:

6

Ok, o que você precisa fazer: 1. Substitua o bloco 'catalog / layer_view' para definir seu próprio modelo. Coloquei minha navegação em camadas na área do cabeçalho como parte de um layout de 1 coluna

<layout>
    <catalog_category_layered>        
        <reference name="header">
            <block type="catalog/layer_view" name="mylayered"  template="mymodule/catalog/layer/view.phtml"/>
        </reference>    
    </catalog_category_layered>
</layout>

Nesse arquivo de modelo, você precisa especificar o modelo substituído para seus elementos individuais.

<?php if($this->canShowBlock()): ?>
<div class="block block-layered-nav">
    <div class="block-title">
        <strong><span><?php echo $this->__('Shop By') ?></span></strong>
    </div>
    <div class="block-content">
        <?php echo $this->getStateHtml() ?>
        <?php if ($this->getLayer()->getState()->getFilters()): ?>
            <div class="actions"><a href="<?php echo $this->getClearUrl() ?>"><?php echo $this->__('Clear All') ?></a></div>
        <?php endif; ?>
        <?php if($this->canShowOptions()): ?>
            <p class="block-subtitle"><?php echo $this->__('Shopping Options') ?></p>
            <dl id="narrow-by-list">
                <?php $_filters = $this->getFilters() ?>
                <?php foreach ($_filters as $_filter): ?>
                <?php /* !!! HERE !!! */ ?>
                <?php if(some_condition == true){ $_filter->setTemplate('path/to/your/new/filter.phtml'); } ?>
                <?php if($_filter->getItemsCount()): ?>
                    <dt><?php echo $this->__($_filter->getName()) ?></dt>
                    <dd><?php echo $_filter->getHtml() ?></dd>
                <?php endif; ?>
                <?php endforeach; ?>
            </dl>
            <script type="text/javascript">decorateDataList('narrow-by-list')</script>
        <?php endif; ?>
    </div>
</div>
<?php endif; ?>

Por fim, você precisa criar o menu suspenso filter.phtml. Isso deve ser direto. Isso está mal formatado, pois estou tendo problemas com este editor, mas a ideia geral está aqui. Também será necessário algum Javascript.

<ol>

    <li><select>
    <?php foreach ($this->getItems() as $_item): ?>
        <option value="<?php echo $this->urlEscape($_item->getUrl()); ?>">
        <?php if ($_item->getCount() > 0): ?>
        <a href="<?php echo $this->urlEscape($_item->getUrl()) ?>"><?php echo $_item->getLabel() ?></a>
        <?php else: echo $_item->getLabel() ?>
        <?php endif; ?>
        <?php if ($this->shouldDisplayProductCount()): ?>
        (<?php echo $_item->getCount() ?>)
        <?php endif; ?>
    </option>
<?php endforeach ?>
</select></li>
</ol>
Tim Reynolds
fonte
por que se preocupar em reescrever o layout? Por que não copiar o modelo base para a pasta de temas dos sites? Estou faltando alguma coisa aqui (um pouco cansado, passado a noite com a minha filha recém-nascida doente)
ProxiBlue
@dedmeet parabéns pela sua filha e eu tenho a mesma pergunta. Uma substituição simples de modelo de tema serviria.
Rick Kuipers
@ Tim: Minha postagem para celular parecia ter engolido o [at] Tim, então isso apenas para Tim receber uma notificação.
precisa saber é o seguinte
@dedmeet Quando você comentar, o pôster original da postagem sempre será notificado, mesmo que você não o mencione :)
mpaepper
Desculpe, sim, a reescrita do modelo funcionaria. Mencionei que movi minha navegação em camadas para o centro da página abaixo do menu. Isso era irrelevante para a resposta, então eu deveria ter deixado de fora.
Tim Reynolds
10

Você pode usar o core_block_abstract_prepare_layout_afterevento no Mage_Catalog_Block_Layer_Viewbloco para alterar o modelo do seu filtro de atributo específico.

Pode ser algo assim:

public function yourObserver($observer) 
{
    $block = $observer->getBlock();
    if ($block instanceof Mage_Catalog_Block_Layer_View) {
        $block->getChild($yourAttributeCodeGoesHere . '_filter')
           ->setTemplate('your/template.phtml');
    }
}

Resumo:

Todo bloco de filtro filho tem um alias no bloco de navegação em camadas como [attribute_code]_filter, e todos eles são criados no _prepareLayout()método para que você possa modificar facilmente seu modelo no core_block_abstract_prepare_layout_afterevento.

Além disso, você pode verificar dentro do seu observador se o tema atual é o mesmo do esperado, chamando:

$design = Mage::getSingleton('core/design_package')
$design->getPackageName(); // Returns current design package
$design->getTheme('layout'); // Returns current design layout

Atenciosamente, Ivan

Ivan Chepurnyi
fonte
Se o bloco de filtro filho recebe um attribute_code_filteralias atribuído , por que você não pode simplesmente definir o modelo em um layout xml?
Pspahn 28/01
1
@pspahn Porque você não pode acessá-lo por alias, apesar do layout. Se você verificar a saída getNameInLayout(), verá que cada um desses blocos tem um nome exclusivo como ANNONYMOUS_30, ANNONYMOUS_23, etc. Portanto, você não pode confiar nele.
Ivan Chepurnyi