2012-12-21 15 views
15

Ho bisogno di aiuto per familiarizzare con gli helper, i loro metodi e gli attributi del prodotto. In particolare: $_helper->productAttribute($product, $attributeHtml, $attributeName)Serve aiuto Informazioni sul metodo productAttribute() per le pagine prodotto

Qui ci sono i file che sto usando/revisione:

app\code\core\Mage\catalog\helper\output.php 
app\design\frontend\[theme name]\template\catalog\product\view\media.phtml 

La seguente riga di codice genera il codice HTML per l'immagine del prodotto.

echo $_helper->productAttribute($_product, $_img, 'image'); 

Il codice classe helper descrive il metodo nelle seguenti parti di codice. Cosa viene restituito, quali sono i passaggi e perché dovrei utilizzare questo metodo invece di fare semplicemente eco all'img html descritto in una riga precedente del file modello?

public function getHandlers($method) 
{ 
    $method = strtolower($method); 
    return isset($this->_handlers[$method]) ? $this->_handlers[$method] : array(); 
} 

public function process($method, $result, $params) 
{ 
    foreach ($this->getHandlers($method) as $handler) { 
     if (method_exists($handler, $method)) { 
      $result = $handler->$method($this, $result, $params); 
     } 
    } 
    return $result; 
} 

public function productAttribute($product, $attributeHtml, $attributeName) 
{ 
    /* Code that is not relevant to this example */ 

    $attributeHtml = $this->process('productAttribute', $attributeHtml, array(
     'product' => $product, 
     'attribute' => $attributeName 
    )); 

    return $attributeHtml; 
} 

Qualsiasi aiuto è apprezzato.

+0

È possibile aggiungere gestori e questi gestori vengono eseguiti. Non puoi eseguire il debug per vedere cosa succede di più? Potrebbe essere un modo astratto che potrebbe essere più utile per altri elementi :) – EricG

+0

Eccellente suggerimento. Sto ancora cercando un modo efficace per eseguire il debug di Magento e sono aperto ai suggerimenti. Per quanto riguarda il modo astratto, questo ha senso. Anche i passaggi per ciò che sta accadendo sarebbero apprezzati. :) – MSD

+0

Google Chrome ha un debugger eccellente. Apri l'ispettore (Ctrl-Shift-J) e vai a Sorgenti. Puoi usare Ctrl-Shift-F per cercare in tutte le fonti lì. Oppure apri lo src manualmente e inserisci un punto di interruzione. Quindi attraversalo :) – EricG

risposta

27

Bella domanda!

Quindi in realtà un po 'sullo scopo di questo aiutante. Dal suo nome è già possibile concludere che viene utilizzato per l'output dei dati. Anche il nome del metodo è auto esplicativo, esso emette solo il valore di attributo del prodotto che dipende dai gestori. Esistono attualmente due metodi, productAttribute(), che vengono utilizzati per l'output dei valori degli attributi del prodotto e categoryAttribute(), che viene utilizzato per quelli di categoria. Tutti i dati nei modelli core della categoria e del prodotto vengono emessi con questo metodo (ad eccezione dell'attributo price), a quanto ricordo è stato aggiunto in una versione 1.4.x, ma non sono sicuro. L'idea principale era di rendere possibile il filtraggio dei dati dell'attributo. Ad esempio è possibile utilizzare le costruzioni {{widget ... }} nella descrizione della categoria, è realizzato tramite metodi speciali.

Entrambi questi metodi fanno effettivamente la stessa funzionalità, ma per entità diverse. Entrambi ricezione 3 argomenti

  • entità (categoria o prodotto, dipende dal nome del metodo)
  • valore di attributo - valore che viene filtrato
  • attributo code - codice che viene utilizzata per recuperare attributo modello

Prima all'interno di questo metodo, Magento verifica la tolleranza del markup html nel valore, in caso contrario, esegue il escape del testo con il metodo escapeHtml(). Inoltre, se l'attributo ha un'area di testo come input nell'amministratore, tutti i nuovi caratteri di riga vengono sostituiti con il tag <br />.

Se html è consentito, Magento verifica la presenza di costruzioni speciali come {{widget ...}} in configurazione (il nome ufficiale di questa costruzione è direttiva). Se le direttive sono consentite, il processore speciale della direttiva viene istanziato e il valore viene elaborato.

Al termine dell'elaborazione del core, Magento invoca i gestori.

Questi gestori sono funzionalità aggiuntive che non vengono utilizzate dai moduli principali, ma è possibile utilizzare la personalizzazione per ottenere alcune personalizzazioni. Ecco un esempio: desideri rendere tutto il risultato del nome del prodotto in maiuscolo.Quindi è possibile aggiungere il proprio gestore, per questo scopo seguire questa semplice procedura:

  1. Definire un osservatore per catalog_helper_output_construct

    <config> 
        <frontend> 
         <events> 
          <catalog_helper_output_construct> 
           <observers> 
            <your_module> 
             <class>your_module/observer</class> 
             <method>handleHelperOutputInitialization</method> 
            </your_module> 
           </observers> 
          </catalog_helper_output_construct> 
         </events> 
        </frontend> 
    </config> 
    
  2. Creare la classe di osservatore, anche lo farò come gestore pure . Il codice è molto semplice:

    class Your_Module_Model_Observer 
    { 
        public function handleHelperOutputInitialization($observer) 
        { 
         $helper = $observer->getEvent()->getHelper(); 
         $helper->addHandler('productAttribute', $this); 
        } 
    
        public function productAttribute($helper, $value, $parameters) 
        { 
         $attribute = $parameters['attribute']; 
         if ($attribute->getAttributeCode() == 'name') { 
          return strtoupper($value); 
         } 
         return $value; 
        } 
    } 
    
  3. Assicurarsi che il nome del metodo nella classe del gestore è assolutamente lo stesso nome del metodo di processore valore, in questo esempio è productAttribute().

Divertiti imparando Magento!

+0

Grazie mille per la tua risposta completa. Assolutamente imparato un sacco. Vorrei poter sopravvivere questo. – MSD

+2

@MSD puoi sempre accettare una risposta anche se non puoi invitarla. Considera di accettare le risposte se ti ha aiutato a risolvere la domanda. – Kalpesh

+1

Questa soluzione è obsoleta da Magento 2.0.0.0-dev47 (l'evento è stato rimosso). Un plugin dovrebbe essere usato ora. – Quisse

Problemi correlati