Question

J'ai une navigation en couches, et le client veut avoir des champs de <select/> au lieu d'une longue liste de liens.

Je pensais à juste changer le modèle avec un observateur si le nom / id des correspondances de filtre.

Les meilleures idées ou recommandations? Alternatives à changer le modèle, peut-être Ecraser / réécrire le bloc ou seulement changer la classe de bloc pour les deux filtres?

Quel est l'événement à utiliser pour changer le modèle?

J'ai alors le même problème que ici https: / /stackoverflow.com/questions/14524791/magento-enable-or-disable-a-module-in-code/14529629 parce que j'ai un observateur qui change les choses de mise en page. Ceci est seul thème pertinent. Alors chechking le thème avant de lancer les mises à jour pourrait être une bonne idée?

Était-ce utile?

La solution

Ok, les choses que vous devez faire: 1. Remplacer le bloc « catalogue / layer_view » pour définir votre propre modèle. Je mets ma nav couches dans la zone d'en-tête dans le cadre d'une mise en page colonne 1

<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>

Dans ce fichier modèle que vous devez spécifier le modèle surchargée pour vos éléments individuels.

<?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; ?>

Enfin, vous devez créer le menu déroulant filter.phtml. Cela devrait être simple. Ce mal est formaté comme j'ai des problèmes avec cet éditeur, mais l'idée générale est ici. Certains Javascript est nécessaire aussi bien.

<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>

Autres conseils

Vous pouvez utiliser événement core_block_abstract_prepare_layout_after sur le bloc Mage_Catalog_Block_Layer_View pour changer le modèle de votre filtre d'attribut particulier.

Il pourrait être quelque chose comme ceci:

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

Résumé:

Chaque bloc de filtre enfant alias dans le bloc de navigation en couches comme [attribute_code]_filter, et tous les a créés dans la méthode de _prepareLayout() de sorte que vous pouvez facilement modifier son modèle sur événement core_block_abstract_prepare_layout_after.

Vous pouvez également vérifier au sein de votre observateur ce thème en cours est le même que celui attendu en appelant:

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

Cordialement, Ivan

Licencié sous: CC-BY-SA avec attribution
Non affilié à magento.stackexchange
scroll top