2012-12-21 14 views
15

Potrzebuję pomocy w zapoznaniu się z pomocnikami, ich metodami i atrybutami produktu. Konkretnie: $_helper->productAttribute($product, $attributeHtml, $attributeName)Potrzebujesz pomocy Zrozumienie metody productAttribute() dla stron produktów

Oto pliki używam/Oceniasz:

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

Poniższy wiersz kodu generuje HTML dla wizerunku produktu.

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

Kod klasy pomocnika opisuje metodę z następujących fragmentów kodu. Co jest zwracane, jakie są kroki i dlaczego powinienem użyć tej metody zamiast po prostu echo haseł img opisanych w poprzedniej linii pliku szablonu?

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

Każda pomoc jest doceniana.

+0

Możliwe jest dodawanie procedur obsługi, a te procedury obsługi są wykonywane. Nie możesz debugować, aby zobaczyć, co więcej się dzieje? Może to być abstrakcyjny sposób, który może być bardziej przydatny dla innych elementów :) – EricG

+0

Doskonała sugestia. Wciąż szukam skutecznego sposobu debugowania dla Magento i jestem otwarty na sugestie. Co do abstrakcyjnego sposobu, ma to sens. Kroki w tym, co się dzieje, również zostaną docenione. :) – MSD

+0

Google Chrome ma doskonały debugger. Otwórz inspektora (Ctrl-Shift-J) i przejdź do Źródła. Możesz użyć Ctrl-Shift-F, aby wyszukać we wszystkich źródłach. Lub otwórz ręcznie src i ustaw punkt przerwania. Następnie przejdź przez to :) – EricG

Odpowiedz

27

Bardzo ładne pytanie!

Tak naprawdę trochę o celu tego pomocnika. Od jego nazwy już można wyciągnąć wniosek, że jest on używany do wyprowadzania danych. Nazwa metody jest również oczywista, po prostu wyprowadza wartość atrybutu produktu w zależności od procedur obsługi. Istnieją obecnie dwie metody: productAttribute(), która służy do wyprowadzania wartości atrybutów produktu i categoryAttribute(), które są używane do kategorii wartości. Wszystkie dane w szablonach rdzenia z kategorii i produktu są wyprowadzane za pomocą tej metody (z wyjątkiem atrybutu price), o ile pamiętam, dodano ją w jednej z wersji 1.4.x, ale nie jestem pewien. Główną ideą było umożliwienie filtrowania danych atrybutu. Na przykład można użyć konstrukcji {{widget ... }} w opisie kategorii, jest to realizowane za pomocą specjalnych metod.

Obie te metody faktycznie mają tę samą funkcjonalność, ale dla różnych podmiotów. Obaj otrzymaniu 3 argumenty:

  • podmiot (kategoria lub produktu, zależy od nazwy metody)
  • wartości atrybut - wartość, która zostanie przefiltrowanej
  • kod atrybutu - kod, który jest używany do pobierania atrybutów modelu

Po pierwsze w obrębie tej metody Magento sprawdza naddatek znaczników html w wartości, jeśli nie, usuwa tekst za pomocą metody escapeHtml(). Również jeśli atrybut ma obszar tekstowy jako dane wejściowe w administratorze, wszystkie nowe znaki linii są zastępowane znacznikiem <br />.

Jeśli HTML jest dozwolony, Magento sprawdza, czy w konfiguracji znajdują się specjalne konstrukcje, takie jak {{widget ...}} (oficjalna nazwa tej konstrukcji to dyrektywa). Jeśli dyrektywy są dozwolone, uruchamiany jest specjalny procesor dyrektywy i przetwarzana jest wartość.

Po zakończeniu wszystkich podstawowych operacji, Magento wywołuje procedury obsługi.

Ten moduł obsługi jest dodatkową funkcjonalnością, która nie jest używana przez moduły podstawowe, ale można użyć własnych dostosowań w celu uzyskania kilku ładnych dostosowań. Oto przykład: chciałbyś, aby wszystkie dane wyjściowe nazwy produktu były pisane wielkimi literami.Następnie można dodać własny program obsługi, w tym celu po tej czynności:

  1. zdefiniować obserwatora dla 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. Stwórz swoją klasę obserwatora, również będę uczynić go jako przewodnika, a także . Kod jest bardzo prosty:

    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. Upewnij się, że nazwa metody w klasie obsługi jest całkowicie taka sama jak nazwa metody procesor wartości, w tym przykładzie jest to productAttribute().

Ciesz się nauką Magento!

+0

Dziękuję bardzo za dokładną odpowiedź. Absolutnie nauczyłem się tony. Chciałbym móc to zrobić. – MSD

+2

@MSD zawsze możesz zaakceptować odpowiedź, jeśli nie możesz jej odebrać. Rozważ zaakceptowanie odpowiedzi, jeśli pomogłoby ci to rozwiązać pytanie. – Kalpesh

+1

To rozwiązanie jest nieaktualne od wersji Magento 2.0.0.0-dev47 (zdarzenie zostało usunięte). Wtyczka powinna być teraz używana. – Quisse

Powiązane problemy