Modification de la disposition de la navigation en couches

14

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

J'ai pensé à changer simplement le modèle avec un observateur si le nom / id du filtre correspond.

De meilleures idées ou recommandations? Des alternatives à la modification du modèle, peut-être écraser / réécrire le bloc ou seulement changer la classe de bloc pour les deux filtres?

Quel événement utiliser pour changer le modèle?

J'ai alors le même problème qu'ici /programming/14524791/magento-enable-or-disable-a-module-in-code/14529629 car j'ai un observateur qui change les choses de mise en page. Ce n'est qu'un thème pertinent. Donc, vérifier le thème avant d'exécuter les mises à jour pourrait être une bonne idée?

Fabian Blechschmidt
la source
"le client veut avoir des champs au lieu d'une longue liste de liens" Je n'ai aucune idée de ce que vous entendez par là.
Rick Kuipers
putain, stackexchange a mangé mon <select>
Fabian Blechschmidt
1
Je dirais simplement écraser le catalog/layer/filter.phtmlmodèle et changer ce dont vous avez besoin, il sera également spécifique au thème. La seule chose à laquelle vous devez faire face est le bit de filtres sélectionné. Je suppose que vous souhaitez afficher tous les filtres sélectionnés dans le <select>qui pourraient nécessiter l'ajout de certaines fonctions de bloc, car une fois qu'un filtre est sélectionné, les autres options disparaissent.
Rick Kuipers
non, le client souhaite avoir les catégories et les "sous-catégories" (attribut) en tant que cases de sélection, tout le reste avec des cases à cocher (travail à faire) et filtrer en outre par note :-) Mais ensuite, je vais tout implémenter dans le modèle.
Fabian Blechschmidt
1
Ce commentaire me sert de note. J'ai une réponse à cela, mais je suis sur mon téléphone. J'adore travailler dans le Nav en couches. Je l'ai étendu pour prendre en charge la sélection de plusieurs champs dans un projet précédent (pensez aux cases à cocher)
Tim Reynolds

Réponses:

6

Ok, ce que vous devez faire: 1. Remplacez le bloc 'catalog / layer_view' pour définir votre propre modèle. Je mets ma navigation en couches dans la zone d'en-tête dans le cadre d'une disposition à 1 colonne

<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 de modèle, vous devez spécifier le modèle remplacé 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. Ceci est mal formaté car j'ai des problèmes avec cet éditeur, mais l'idée générale est là. Un peu de Javascript sera également nécessaire.

<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
la source
pourquoi s'embêter à réécrire la mise en page? Pourquoi ne pas simplement copier le modèle de base dans le dossier de thème des sites? Suis-je en
train de
@dedmeet congratz sur votre fille et j'ai la même question. Une simple substitution de modèle de thème ferait l'affaire.
Rick Kuipers
@Tim: Mon message mobile semblait avoir avalé le [at] Tim, donc juste pour que Tim reçoive une notification.
ProxiBlue
@dedmeet Lorsque vous commentez, l'affiche originale du message sera toujours notifiée même si vous ne le mentionnez pas :)
mpaepper
Désolé, oui, la réécriture du modèle fonctionnerait. J'ai mentionné que j'avais déplacé ma navigation en couches au centre de la page sous le menu. Cela n'était pas pertinent pour la réponse, donc j'aurais dû l'omettre.
Tim Reynolds
10

Vous pouvez utiliser l' core_block_abstract_prepare_layout_afterévénement sur Mage_Catalog_Block_Layer_Viewbloc pour modifier le modèle de votre filtre d'attribut particulier.

Cela pourrait être quelque chose comme ça:

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

Sommaire:

Chaque bloc de filtre enfant possède un alias dans le bloc de navigation en couches as [attribute_code]_filter, et tous créés dans la _prepareLayout()méthode afin que vous puissiez facilement modifier son modèle lors d'un core_block_abstract_prepare_layout_afterévénement.

Vous pouvez également vérifier auprès de votre observateur que le thème actuel 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

Ivan Chepurnyi
la source
Si le bloc de filtrage enfant reçoit un attribute_code_filteralias attribué , pourquoi ne pouvez-vous pas simplement définir le modèle dans un XML de mise en page?
pspahn
1
@pspahn Parce que vous ne pouvez pas y accéder par alias via la mise en page. Si vous vérifiez la sortie de, getNameInLayout()vous verrez que chacun de ces blocs a un nom unique comme ANNONYMOUS_30, ANNONYMOUS_23, etc. Vous ne pouvez donc pas vous y fier.
Ivan Chepurnyi