2012-05-10 56 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); ?> 

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