2012-05-10 58 views
2

Heyo,一直在magento主題工作了一段時間(...和我對系統的理解緩慢但穩步增長)。我需要儘快開始製作一些自定義模塊,所以我從這個小項目開始着手我的方向: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種可行的方式來做這件事......這是我一起去的)。

每次顯示產品塊時,我都需要測試它,到目前爲止,它一直在複製此代碼以使其正常工作。它確實有效,但是是回傳(我不應該將邏輯放入視圖層)。

好了 - 所以,讓我們做一個簡單的模塊共享功能:

本地/ WACI/ProductFlag的/ etc/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 /座/ 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" />... 

...我不太清楚,如果這實例化此類?我不這麼認爲。我不知道如何在我的product/view/media.phtml中解決它,因爲我需要使用參數調用方法。

我不認爲我需要一個模板文件,因爲我只是輸出一個字符串,但我不認爲我沒有看到沒有關聯模板的塊模塊。也許輔助班是適當的呢?

無論如何,這是不workin。
我得到一個致命的錯誤,說我的媒體類沒有getIsFF()方法(不奇怪),或者什麼都沒有出現。我的配置文件是正確的,但這就是它。

Jebus。 我都轉過身。

與法師技能的人可以澄清這個簡單的問題,並指出我在正確的方向嗎?

乾杯!

+0

如果您不介意,請發佈確切的錯誤,先生。 (With stacktrace) –

+0

您好 - 謝謝您的回覆。在我離開工作之前,我終於在昨晚得到了這份工作。做了一個簡單的幫手課,我(最終)能夠工作。不知道我的架構是否「正確」 - 感覺有點冒險。將在星期一發布我想出的內容。 ...還要通過magento U視頻。可能有助於加快這一進程。 – Bosworth99

回答

3

沒建議?好吧= I sussed出此略作修改和工作液:

本地/ WACI/ProductFlag的/ etc/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 /助手/ 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); ?> 

我仍然不確定這是否完全適合magento的做事方式 - 即模型調用應該被降級到他們自己的類並放入Model文件夾中。

不管怎麼樣 - 對於其他人試圖想出這些東西 - 當我叼着它時,我慢慢地意識到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); ?> 

所以......更近一步。