Bienvenue, Invité
Merci de vous identifier ou de vous inscrire.    Mot de passe perdu?

Améliorer la recherche avancée
(1 lecteur(s)) (1) Invité(s)
Aller en basPage: 1234
SUJET:

Améliorer la recherche avancée

#9339
Gabriiiel
I love Magento.
Expert Magento
Messages: 4118
graph
Personne n'est hors ligne Cliquez ici pour voir le profil de cet utilisateur
Sexe: Masculin gabriel.bouhatous Formation Magento Audit Conseil gabriel.bouhatous Ask me :) Lieu: Paris

Améliorer la recherche avancée

Il y a 9 Années, 7 Mois
Karma: 112  
Titre complet : "Ajouter la recherche par catégorie à la recherche avancée".

Il peut être intéressant de proposer, sur la page de recherche avancée, une sélection de catégorie, pour permettre au visiteur d'affiner les critères de sa recherche. Ainsi, il accède plus rapidement au produit qu'il recherche ;o


1) Pour commencer, trouvez les fichiers suivants :

  • app/code/core/Mage/CatalogSearch/Block/Advanced/Form.php

  • app/code/core/Mage/CatalogSearch/Model/Advanced.php


2) Une duplication des fichiers et chemins dans app/local

Le travail va s'effectuer dans le répertoire app/code/local, ainsi, il n'y a pas de modification du noyau et notre code est protégé contre tout écrasement au cours d'une éventuelle mise à jour ;)

Dupliquez les chemins et fichiers dans le répertoire app/local. Concrètement, vous devez arriver à ceci :

  • app/code/local/Mage/CatalogSearch/Block/Advanced/Form.php

  • app/code/local/Mage/CatalogSearch/Model/Advanced.php


Ouvrez alors Form.php et ajoutez à la fin du fichier - et avant l'accolade de fermeture "}" :
Code :


public function getStoreCategories() 
 {
        $helper = Mage::helper('catalog/category');
        return $helper->getStoreCategories();
}



Puis dans Advanced.php, remplacez la fonction getProductCollection() par :

Code :

public function getProductCollection(){
        if (is_null($this->_productCollection)) {
            $this->_productCollection = Mage::getResourceModel('catalogsearch/advanced_collection')
                ->addAttributeToSelect(Mage::getSingleton('catalog/config')->getProductAttributes())
                ->addMinimalPrice()
                ->addStoreFilter();
                Mage::getSingleton('catalog/product_status')->addVisibleFilterToCollection($this->_productCollection);
                Mage::getSingleton('catalog/product_visibility')->addVisibleInSearchFilterToCollection($this->_productCollection);
            /* include category filtering */
            if(isset($_GET['category']) && is_numeric($_GET['category'])) $this->_productCollection->addCategoryFilter(Mage::getModel('catalog/category')->load($_GET['category']),true);
        }
        return $this->_productCollection;
    }



Enfin, remplacez la fonction getSearchCriterias() par :

Code :

public function getSearchCriterias()
          {
            $search = $this->_searchCriterias;
             /* display category filtering criteria */
             if(isset($_GET['category']) && is_numeric($_GET['category'])) {
                 $category = Mage::getModel('catalog/category')->load($_GET['category']);
                 $search[] = array('name'=>'Category','value'=>$category->getName());
              }
              return $search;
         }



3) Mise à jour du thème en conséquence

Repérez et ouvrez le fichier suivant :

  • app/design/yourdesign/{interface}/{theme}/catalogsearch/advanced/form.phtml


Si vous travaillez sur le thème par défaut, c'est à dire default/default, attention tout d'abord : si vous mettez à jour Magento, votre thème sera écrasé.

Préférez donc ceci : app/design/frontend/default/montheme/

Ou encore app/design/frontend/moninterface/montheme.

[Pour la prise en compte de votre thème ou de votre interface, modifiez les paramètres de l'administration en fonction, dans l'onglet design de la configuration système]

A la suite de :

Code :

<?php foreach ($this->getSearchableAttributes() as $_attribute): ?>
        <?php $_code = $_attribute->getAttributeCode() ?>
        <li>
            <label for="<?php echo $_code ?>"><?php echo $this->getAttributeLabel($_attribute) ?></label>
            <?php switch($this->getAttributeInputType($_attribute)):
                case 'number': ?>
                <div class="range field-row">
                    <input name="<?php echo $_code ?>[from]" value="<?php echo $this->htmlEscape($this->getAttributeValue($_attribute, 'from')) ?>" id="<?php echo $_code ?>" title="<?php echo $this->htmlEscape($this->getAttributeLabel($_attribute)) ?>"  class="input-text validate-number" type="text" />
                    <input name="<?php echo $_code ?>[to]" value="<?php echo $this->htmlEscape($this->getAttributeValue($_attribute, 'to')) ?>" id="<?php echo $_code ?>_to" title="<?php echo $this->htmlEscape($this->getAttributeLabel($_attribute)) ?>"  class="input-text validate-number" type="text"/>
                </div>
                <?php break;
                case 'select': ?>
                    <?php echo $this->getAttributeSelectElement($_attribute) ?>
                <?php break;
                case 'yesno': ?>
                    <?php echo $this->getAttributeYesNoElement($_attribute) ?>
                <?php break;
                case 'date': ?>
                    <?php echo $this->getDateInput($_attribute, 'from') ?>
                    -
                    <?php echo $this->getDateInput($_attribute, 'to') ?>
                <?php break;
                default: ?>
                <input name="<?php echo $_code ?>" id="<?php echo $_code ?>" value="<?php echo $this->htmlEscape($this->getAttributeValue($_attribute)) ?>" title="<?php echo $this->htmlEscape($this->getAttributeLabel($_attribute)) ?>"  class="input-text <?php echo $this->getAttributeValidationClass($_attribute) ?>" type="text" />
            <?php endswitch; ?>
        </li>
        <?php endforeach; ?>



Ajoutez :

Code :

<li>
            <label for="category_search_field">Recherche par catégorie :</label>
            <select name="category" id="category_search_field">
                <option value="">-- N'importe quelle catégorie --</option>
                <?php foreach ($this->getStoreCategories() as $_category): ?>
                <?php if($_category->hasChildren()): ?>
                <option class="parent-cat" value="<?php echo $_category->getId(); ?>"><?php echo $_category->getName();?></option>
                <?php foreach ($_category->getChildren() as $subcategory):
                if($subcategory->getIsActive()) : ?>
                    <option value="<?php echo $subcategory->getId(); ?>"<?php echo ($this->getRequest()->getQuery('category') == $subcategory->getId() ? ' selected="selected"': "") ?>><?php echo $subcategory->getName(); ?></option>
                <?php endif; endforeach; ?>
                <?php elseif($_category->getIsActive()): ?>
                <option value="<?php echo $_category->getId(); ?>"><?php echo $_category->getName();?></option>
                <?php endif; ?>
                <?php endforeach ?>
            </select>
</li>



Remarquez dans le code inséré dans le template ceci :

<option class="parent-cat" value="<?php echo $_category->getId(); ?>"><?php echo $_category->getName();?></option>
La classe css "parent-cat" vous permet de mettre en valeur, dans la liste de catégories, les catégories parentes. Associez donc la propriété font-weight:bold pour voir ;p

Rendez-vous sur la page de recherche avancée et vous devriez voir le changement. Si ce n'est pas le cas, vérifiez que le cache est vidé et désactivé ;)


  • Contributeur : Gabriel

  • La reproduction de cet article n'est pas permise, hors autorisation expresse de Fragento.
 
Dernière édition: 25/03/09 à  06:26 Par Gabriiiel.
Expert Magento @ The e-Commerce Academy

L'administrateur a désactivé l'accès public en écriture.
#11136
Olixelle
Platinum Boarder
Messages: 359
graphgraph
Personne n'est hors ligne Cliquez ici pour voir le profil de cet utilisateur

Re:Améliorer la recherche avancée

Il y a 9 Années, 6 Mois
Karma: 10  
pas mal le $_get dans un model
sinon c'est pas bete du tout, jvé l'ajouter demain
 
L'administrateur a désactivé l'accès public en écriture.
#11149
Gabriiiel
I love Magento.
Expert Magento
Messages: 4118
graph
Personne n'est hors ligne Cliquez ici pour voir le profil de cet utilisateur
Sexe: Masculin gabriel.bouhatous Formation Magento Audit Conseil gabriel.bouhatous Ask me :) Lieu: Paris

Re:Améliorer la recherche avancée

Il y a 9 Années, 6 Mois
Karma: 112  
Olixelle écrit:
pas mal le $_get dans un model
sinon c'est pas bete du tout, jvé l'ajouter demain


Hésite pas à trouver mieux... ;)
 
Expert Magento @ The e-Commerce Academy

L'administrateur a désactivé l'accès public en écriture.
#15945
Heriquet
Gold Boarder
Messages: 274
graphgraph
Personne n'est hors ligne Cliquez ici pour voir le profil de cet utilisateur

Re:Améliorer la recherche avancée

Il y a 9 Années, 3 Mois
Karma: 1  
Salut,

Juste une question, je suis en train de m'arracher les cheveux sur une recherche de ce type mais avec plusieurs catégories sélectionnables.

Je n'arrive pas à faire une sélection avec un OR (catégorie A OU B OU D). J'ai pu ajouter des critères pour filtrer sur plusieurs catégories, mais vu que ma condition portait sur l'ensemble des catégories, j'avais rien de sélectionné...

Quelqu'un aurait une idée ?

J'ai trouvé ce topic Mais je crois qu'il y a moyen de faire plus simple.

D'avance merci.
 
L'administrateur a désactivé l'accès public en écriture.
#18315
mehdovic
Fresh Boarder
Messages: 10
graphgraph
Personne n'est hors ligne Cliquez ici pour voir le profil de cet utilisateur

Re:Améliorer la recherche avancée

Il y a 9 Années, 2 Mois
Karma: -3  
je veux integrer ce bloc de recherche avancée au menu droit
comment faire ça?
 
L'administrateur a désactivé l'accès public en écriture.
#21830
simtic
Fresh Boarder
Messages: 9
graphgraph
Personne n'est hors ligne Cliquez ici pour voir le profil de cet utilisateur
Lieu: Pau

Re:Améliorer la recherche avancée

Il y a 8 Années, 11 Mois
Karma: 0  
Bonjour,

Alors là trop bon
En un post un seul j'ai appris qu'on pouvait surcharger le core sans perte lors des maj et en plus ça me fourni un truc dont j'aurais besoin pour la recherche avancée.

Merci !
 
L'administrateur a désactivé l'accès public en écriture.
#21855
Gabriiiel
I love Magento.
Expert Magento
Messages: 4118
graph
Personne n'est hors ligne Cliquez ici pour voir le profil de cet utilisateur
Sexe: Masculin gabriel.bouhatous Formation Magento Audit Conseil gabriel.bouhatous Ask me :) Lieu: Paris

Re:Améliorer la recherche avancée

Il y a 8 Années, 11 Mois
Karma: 112  
De rien !
 
Expert Magento @ The e-Commerce Academy

L'administrateur a désactivé l'accès public en écriture.
#24532
simtic
Fresh Boarder
Messages: 9
graphgraph
Personne n'est hors ligne Cliquez ici pour voir le profil de cet utilisateur
Lieu: Pau

Re:Améliorer la recherche avancée

Il y a 8 Années, 9 Mois
Karma: 0  
re,

apporté quelques retouches pour faire en sorte que la recherche se fasse de façon recursive dans la catégorie choisie.

ça A L'AIR DE MARCHER ^^
(mais j'ai viré une partie de code que je pigeais pas donc à prendre avec moultes précautions)

dans app/code/local/Mage/CatalogSearch/Model/Advanced.php, adapter la fonction getProductCollection() :

Code :

    public function getProductCollection(){
        if (is_null($this->_productCollection)) {
            $this->_productCollection = Mage::getResourceModel('catalogsearch/advanced_collection')
                ->addAttributeToSelect(Mage::getSingleton('catalog/config')->getProductAttributes())
                ->addMinimalPrice()
                ->addStoreFilter();
                Mage::getSingleton('catalog/product_status')->addVisibleFilterToCollection($this->_productCollection);
                Mage::getSingleton('catalog/product_visibility')->addVisibleInSearchFilterToCollection($this->_productCollection);
            /* include category filtering */
            if(isset($_GET['category']) && is_numeric($_GET['category'])) $this->_productCollection->addCategoriesFilter($this->getCategoriesIds($_GET['category']));
        }
        return $this->_productCollection;
    }



et ajouter la fonction :

Code :

    protected function getCategoriesIds($category_id)
    { $categoriesIds = $category_id;
      $category = Mage::getModel('catalog/category')->load($category_id);
      if($category->hasChildren()) foreach(explode(",", $category->getChildren()) as $sub_id) $categoriesIds .= ",".$this->getCategoriesIds($sub_id);
      return $categoriesIds;
    }



Ensuite, sorry, mais j'ai modifié le core.
Y'a sûrement moyen de surcharger ça comme il faut, mais pas eu le temps...
ça se passe dans le fichier
app/code/core/Mage/Catalog/Model/Resource/Eav/Mysql4/Product/Collection.php

ajouter la fonction :

Code :

    public function addCategoriesFilter($categories)
    {
        $this->_productLimitationFilters['category_id'] = $categories;
        $this->_applyProductLimitations();
        return $this;
    }



là, je me suis contenter de faire un copier / coller de la fonction addCategoryFilter et de l'adapter un peu... et c'est là que vous remarquerez que la fonction addCategoryFilter traite une histoire de "isAnchor" que j'ai zappé dans addCategoriesFilter.

Et donc jusqu'à maintenant, ça a l'air OK, mais j'avoue ne pas non plus avoir testé ça dans toutes les situations possibles et imaginables.

Si quelqu'un sait ce qu'est cette histoire de "Anchor"... ça m'interesse.
 
L'administrateur a désactivé l'accès public en écriture.
Revenir en hautPage: 1234
Modérateur: Gabriiiel, ILOA, zuiko