2012-05-10 3 views
2

Heyo, работающий над магической темой на некоторое время (... и мое понимание системы медленно, но неуклонно растет). Мне нужно начать работу над некоторыми пользовательскими модулями в ближайшее время, и поэтому я начинаю с этого небольшого проекта, чтобы получить мои ориентиры:Magento - структура пользовательского модуля

Я нашел немного кода для управления конкретной задачей, которую я копировал и вставлял в файлы шаблонов:

<?php   
    $ids = $_product->getCategoryIds(); 
    $cat = Mage::getModel('catalog/category')->load($ids[0]);  
    $isFF = false; 
    foreach ($ids as $key=>$val) { 
     $cat = Mage::getModel('catalog/category')->load($val); 
     $name = $cat->getName(); 
     if ($name === 'Fast Fulfillment') { 
      $isFF = true; 
     } 
    } 
    if ($isFF) { echo '<span class="ff-logo"></span>'; } 
?> 

Очень простой. Я просто проверяю, есть ли продукт в определенной категории и создает элемент, если он есть. (Я знаю, что есть около 5 твердых способов сделать это ... это та, с которой я пошел).

Мне нужно проверить это каждый раз, когда отображается блок продукта, и до сих пор он копировал этот код, чтобы он работал. Он работает, но работает обратно (я не должен вводить логику в слой представления).

Ok - так, давайте создадим простой модуль для обмена функциональность:

местные/WACI/ProductFlag/и т.д./config.xml

<config> 
    <modules> 
     <WACI_ProductFlag> 
      <version>0.1.0</version> 
     </WACI_ProductFlag> 
    </modules> 
    <global> 
     <blocks> 
      <WACI_ProductFlag> 
       <class>WACI_ProductFlag_Block_View</class> 
      </WACI_ProductFlag> 
     </blocks> 
    </global> 
</config> 

и т.д./модули/WACI_All.xml

<config> 
    <modules> 
     <WACI_CustomPageLayouts> 
      <codePool>local</codePool> 
      <active>true</active> 
     </WACI_CustomPageLayouts> 
    </modules> 
    <modules> 
     <WACI_ProductFlag> 
      <codePool>local</codePool> 
      <active>true</active> 
     </WACI_ProductFlag> 
    </modules> 
</config> 

Теперь, для класса ... Я не совсем уверен, что если Block о r a Helper подходит. Я пошел с Block, но - idk ... Я, вероятно, ошибаюсь (учебники для этого материала сильно отличаются).

местный/WACI/ProductFlag/Block/view.php

<?php 

    /** 
    * WACI 
    * 
    * @codepool Local 
    * @category View 
    * @package WACI 
    * @module  ProductFlag 
    */ 

    class WACI_ProductFlag_Block_View extends Mage_Core_Block_Template 
    { 
     private $_focus; 
     private $_isFF = false; 

     public function getIsFF($product){ 
      $this->_focus = "FF"; 
      $isFF = false; 
      $ids = $product->getCategoryIds(); 
      $cat = Mage::getModel('catalog/category')->load($ids[0]); 

      foreach ($ids as $key=>$val) { 
       $cat = Mage::getModel('catalog/category')->load($val); 
       $name = $cat->getName(); 

       if ($name === 'Fast Fulfillment') { 
        $isFF = true; 
       } 
      } 
     } 

     protected function _toHtml(){ 
      $html = parent::_toHtml(); 

      if ($this->_focus === "FF") { 
       if ($this->_isFF){ 
        $html .= '<span class="ff-logo"></span>'; 
       } 
      } 

      return $html; 
     } 
    } 
?> 

Надеюсь, ее ясно, что я только хочу, чтобы вывести строку на основе ввода любого данного продукта. Должен ли я переопределять _toHtml(), чтобы доставить строку? Еще раз. Наверное, нет ...

в моем local.xml я ссылаться на блок:

<catalog_product_view> 
<reference name="content"> 
      <reference name="product.info"> 
<block type="WACI/ProductFlag" name="product.flag" as="productFlag" output="toHtml" />... 

... Я не ясно, если это конкретизирует этот класс? Я так не думаю. Я не уверен, как обращаться к нему в моем продукте/view/media.phtml в любом случае, учитывая, что мне нужно вызвать метод с параметром.

Я не думаю, что мне нужен файл шаблона, учитывая, что я просто выводил строку, но я не думаю, что видел блок-модули без связанного шаблона. Может быть, тогда класс помощников подходит?

В любом случае, это не workin.
Я либо получил фатальную ошибку, заявив, что мой медиакласс не имеет метода getIsFF() (неудивительно), или просто ничего не появляется. Мои конфигурационные файлы верны, но я думаю об этом.

Jebus. Я все обернулся.

Может ли кто-то с умением Мага прояснить эту простую проблему и указать мне в правильном направлении?

Cheers!

+0

Пожалуйста, сообщите точную ошибку, если вы не возражаете, сэр. (С stacktrace) –

+0

Привет там - спасибо за ответ. Я, наконец, получил этот вид работы вчера вечером, прежде чем я оставил работу. сделал простой вспомогательный класс, который я (в конечном итоге) смог получить. Не знаю, правильная ли моя архитектура - немного взломана. Будет опубликовать то, что я придумал в понедельник. ... проходя через видеомагнитофоны и видео. может помочь ускорить этот процесс. – Bosworth99

ответ

3

Нет рекомендаций? Ну = Я разузнал это слегка модифицированный и рабочий раствор:

местного/WACI/ProductFlag/и т.д./config.xml

<config> 
    <modules> 
     <WACI_ProductFlag> 
      <version>0.1.0</version> 
     </WACI_ProductFlag> 
    </modules> 
    <global> 
     <blocks> 
      <productflag> 
       <class>WACI_ProductFlag_Block</class> 
      </productflag> 
     </blocks> 
     <helpers> 
      <productflag> 
       <class>WACI_ProductFlag_Helper</class> 
      </productflag> 
     </helpers> 
    </global> 
</config> 

местного/WACI/ProductFlag/Helper/Flag.php

class WACI_ProductFlag_Helper_Flag extends Mage_Core_Helper_Abstract 
    { 
     private $_isFF = false; 

     public function getIsFF($product){ 

      $html = ''; 
      $ids  = $product->getCategoryIds(); 
      $cat  = Mage::getModel('catalog/category')->load($ids[0]); 

      foreach ($ids as $key=>$val) { 
       $cat = Mage::getModel('catalog/category')->load($val); 
       $name = $cat->getName(); 

       if ($name === 'Fast Fulfillment') { 
        $this->_isFF = true; 
       } 
      } 

      if($this->_isFF) { 
       $html = '<span class="ff-logo"></span>'; 
      } 

      return $html; 
     } 

    } 

и вызвать его в любом файле шаблона через простой:

<?php echo $this->helper('productflag/flag')->getIsFF($_product); ?> 

Я все еще не уверен, что это точно соответствует пурпуровому способу делать вещи - то есть, вызовы модели, Я думаю,, должен быть отнесен к их собственному классу и упаден в папку Модели.

В любом случае - и для тех, кто пытается понять этот материал - я с ним обезьяны медленно понял, что целью файла config.xml является добавление доступных фабричных классов в пулы блоков/помощников/моделей - и что путь к содержащему директорию. Затем вспомогательный вызов в файле шаблона идентифицирует «короткое имя» каталога, а затем фактическое имя класса.

т.е. - Вы могли бы иметь несколько классов помощников:

<?php echo $this->helper('productflag/class_one')->someMethod($_product); ?> 
<?php echo $this->helper('productflag/class_two')->someOtherMethod($_product); ?> 
<?php echo $this->helper('productflag/class_three')->yetAnotherMethod($_product); ?> 

Итак ... Один шаг ближе.