Advanced search in un multistore con attributi personali

Problema:

La gestione degli attributi personali (creati cioè dall’utente per affiancare quelli di sistema presenti di base in Magento) è un’ottima potenzialità di questo CMS.
Purtroppo però mostra qualche limite nella gestione multistore, in particolar modo nella pagina di ‘Ricerca avanzata’, dove tutti gli attributi salvati come visibili nell’advanced search, vengono indistintamente mostrati al cliente. Possiamo perciò trovarci dinanzi a questa increscioso esempio: un negozio di auto ed uno di maglioni, gestito multistore tramite Magento, possiederanno una ricerca avanzata uguale, con richiesta di taglia e tessuto associata a cromatura e dimensione cerchi in lega. Decisamente fastidioso.

Soluzione:

Per sopperire alla mancanza di distinzione tra gli attributi di un negozio e l’altro, si può procedere in questo modo. Aprire il percorso /app/design/frontend/default/f003/template/catalogsearch/advanced/form.phtml e inserire il seguente codice:

<form action="<?php echo $this->getSearchPostUrl() ?>" method="get" id="form-validate">
<fieldset>
    <h4><?php echo $this->__('Search Settings') ?></h4>

<?

    $attribute_array = array();
    $attributesInfo = Mage::getResourceModel('eav/entity_attribute_collection')
      ->setEntityTypeFilter('4')
      ->addSetInfo()
      ->getData();    $store_categories = $this->getStoreCategories();
    foreach ($store_categories as $_category){
      $category = Mage::getModel('catalog/category')->load($_category->getId());
      $collection = $category->getProductCollection();
      foreach ($collection as $product){
        $product = Mage::getModel('catalog/product')->load($product->getId());
        foreach ($attributesInfo AS $attribute){
          if ($attribute['is_user_defined']){
            if (isset($product->_data[''.$attribute['attribute_code'].'']) && ($product->_data[''.$attribute['attribute_code'].'']!='')){
              $attribute_array[] = $attribute['attribute_code'];
            }
          }
        }
      }
    }
?>
    <ul id="advanced-search-list">
        <?php foreach ($this->getSearchableAttributes() as $_attribute): ?>

        <?php $_code = $_attribute->getAttributeCode();
              if (in_array($_code, $attribute_array)):
        ?>  
        <li>
            <label for="<?php echo $_code ?>"><?php echo $this->getAttributeLabel($_attribute) ?></label>
            <?php switch($this->getAttributeInputType($_attribute)):
                case 'number': ?>
                <div>
                    <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)) ?>"  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)) ?>"  type="text" />
                </div>
                <?php break;
                case 'price': ?>
                <div>
                    <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)) ?>"  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)) ?>"  type="text" />
                    (<?php echo $this->getCurrency($_attribute); ?>)
                </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)) ?>"  type="text" />
            <?php endswitch; ?>
        </li>
        <?php endif;?>
        <?php endforeach; ?>
    </ul>
</form>

La procedura è molto semplice: estraggo solo gli attributi personali associati ai prodotti del singolo store, salvandoli in un array apposito; poi cerco una corrispondenza tra l’attributo che Magento sta per inserire nella ricerca avanzata e gli elementi di questo array: in caso positivo, procedo, altrimenti passo all’attributo successivo.

In questo modo otteniamo la presenza nell’Advanced search solamente di quegli attributi da noi creati e coerenti con i prodotti presenti nello store in uso. Per inserire manualmente altri tipi di attributo, compresi quelli di sistema, è sufficiente aggiungere all’array l’indicazione corretta.
Ad esempio:

$attribute_array[] = 'description';

per aggiungere nella ricerca il campo Descrizione.

0 commenti

Lascia un Commento

Vuoi partecipare alla discussione?
Sentitevi liberi di contribuire!

Lascia un commento