我需要特定产品类型的自定义选项卡,而不是所有产品类型

时间:2012-12-31 07:47:39

标签: php magento magento-1.6

我想为我的自定义产品类型添加新的自定义标签,如图片“价格 - 尺寸”

我已尝试使用此link-1link-2中的代码,但它会显示所有产品类型添加/修改的标签

我的问题与this相同,但希望使用编码

执行此操作

enter image description here

mysql4安装-0.1.0.php

$installer = $this;
$installer->startSetup();
$installer->addAttribute('catalog_product', 'limits', array(
    'group'             => 'Price - Size',
    'type'              => 'varchar',
    'frontend'          => '',
            'backend'           => 'custproduct/entity_attribute_backend_limit',
    'label'             => 'Limit',
    'input'             => 'text',
    'class'             => '',
    'source'            => '',
    'global'            => Mage_Catalog_Model_Resource_Eav_Attribute::SCOPE_GLOBAL,
    'visible'           => true,
    'required'          => false,
    'user_defined'      => true,
    'default'           => '1',
    'searchable'        => false,
    'filterable'        => false,
    'comparable'        => false,
    'visible_on_front'  => true,
    'unique'            => false,
    'apply_to'          => My_Custproduct_Model_Product_Type::TYPE_CustomProduct_PRODUCT, //also try 'custproduct'
    'is_configurable'   => false
));
$installer->addAttributeGroup('catalog_product', 'Default','Price - Size', 40);
$installer->addAttributeToSet('catalog_product','Default', 'Price - Size', 'limits');

$fieldList = array('price','special_price','special_from_date','special_to_date',
    'minimal_price','cost','tier_price','weight','tax_class_id');

 foreach ($fieldList as $field) {
    $applyTo = explode(',', $installer->getAttribute('catalog_product', $field, 'apply_to'));
    if (!in_array('custproduct', $applyTo)) {
        $applyTo[] = 'custproduct';
        $installer->updateAttribute('catalog_product', $field, 'apply_to', join(',', $applyTo));
    }
}
$installer->endSetup();
添加了

属性'限制',但它仅在我的定制产品类型(custproduct)上显示在我需要的所有产品类型上。

感谢您的回复,我的问题现已解决

刚刚向$fieldList数组添加了“限制”

$fieldList = array('price','special_price','special_from_date','special_to_date',
    'minimal_price','cost','tier_price','weight','tax_class_id', 'limits');

感谢!!!

4 个答案:

答案 0 :(得分:10)

Magento非常灵活,因此有很多方法可以达到预期的效果。唯一的问题是确定最佳方式,即找到最可靠有效的方法。

这里可以提出两种方法。选择取决于所需功能的技术细节,这些细节未在初始问题中说明:

  1. 自定义标签将仅包含用于输入数据的基本字段 对于产品
  2. 自定义标签将包含高级字段和/或javascript,和/或其他自定义HTML 标记
  3. 让我们看看两种情况的解决方案。


    #1。该选项卡仅包含用于输入产品数据的基本字段

    在这种情况下,使用Magento的属性机制就足够了。它允许为产品创建属性(字段),仅将它们应用于某些产品类型,并将字段分成组(选项卡)。

    这是脚本的样子。

    <强>&LT; module_dir&GT; /sql/install-1.0.0.0.php

    <?php
    /* @var $installer Mage_Catalog_Model_Resource_Setup */
    $installer = $this;
    
    // Add attribute
    $allowedProductTypes = array(
        Mage_Catalog_Model_Product_Type_Grouped::TYPE_CODE,
        Mage_Downloadable_Model_Product_Type::TYPE_DOWNLOADABLE,
    );
    
    $installer->addAttribute(Mage_Catalog_Model_Product::ENTITY, 'attribute_for_tab', array(
        'label'             => 'Attribute For Tab',
        'apply_to'          => implode(',', $allowedProductTypes),
        'type'              => 'varchar',
        'input'             => 'text',
        'default'           => '',
        'global'            => Mage_Catalog_Model_Resource_Eav_Attribute::SCOPE_GLOBAL,
        'user_defined'      => true,
        'visible'           => true,
        'required'          => false,
        'searchable'        => false,
        'filterable'        => false,
        'comparable'        => false,
        'visible_on_front'  => false,
        'unique'            => false,
        'is_configurable'   => false
    ));
    
    // Add group
    $installer->addAttributeGroup(Mage_Catalog_Model_Product::ENTITY, 'Default', 'My Attribute Tab');
    
    // Add attribute to set and group
    $installer->addAttributeToSet(Mage_Catalog_Model_Product::ENTITY, 'Default', 'My Attribute Tab', 'attribute_for_tab');
    


    随意download simple module example for this approach: "attribute_tab.zip"



    #2。自定义选项卡将包含高级字段和/或javascript,和/或其他自定义HTML标记

    在这种情况下,应将选项卡创建为通常的Magento块。并通过布局注入Tabs渲染器。

    自定义标签块&lt; module_dir&gt; /Block/Adminhtml/Catalog/Product/Edit/Tab/Custom.php

    <?php
    class Zerkella_CustomTab_Block_Adminhtml_Catalog_Product_Edit_Tab_Custom
        extends Mage_Adminhtml_Block_Widget implements Mage_Adminhtml_Block_Widget_Tab_Interface
    {
        /**
         * Class constructor
         *
         */
        public function __construct()
        {
            parent::__construct();
            $this->setTemplate('zerkella_customtab/catalog/product/edit/tab/custom.phtml');
        }
    
        /**
         * Get tab label
         *
         * @return string
         */
        public function getTabLabel()
        {
            return Mage::helper('zerkella_customtab')->__('My Custom Tab');
        }
    
        /**
         * Get tab title
         *
         * @return string
         */
        public function getTabTitle()
        {
            return Mage::helper('zerkella_customtab')->__('My Custom Tab');
        }
    
        /**
         * Check if tab can be displayed
         *
         * @return boolean
         */
        public function canShowTab()
        {
            $allowedProductTypes = array(
                Mage_Catalog_Model_Product_Type_Grouped::TYPE_CODE,
                Mage_Downloadable_Model_Product_Type::TYPE_DOWNLOADABLE,
            );
            $productType = $this->_getProduct()->getTypeId();
    
            return in_array($productType, $allowedProductTypes);
        }
    
        /**
         * Retrieve product
         *
         * @return Mage_Catalog_Model_Product
         */
        protected function _getProduct()
        {
            return Mage::registry('current_product');
        }
    
        /**
         * Check if tab is hidden
         *
         * @return boolean
         */
        public function isHidden()
        {
            return false;
        }
    }
    


    布局文件 app / design / adminhtml / default / default / layout / zerkella_customtab.xml:

    <?xml version="1.0"?>
    <layout>
        <adminhtml_catalog_product_new>
            <reference name="product_tabs">
                <action method="addTab">
                    <name>my_custom_tab</name>
                    <block>zerkella_customtab/adminhtml_catalog_product_edit_tab_custom</block>
                </action>
            </reference>
        </adminhtml_catalog_product_new>
        <adminhtml_catalog_product_edit>
            <reference name="product_tabs">
                <action method="addTab">
                    <name>my_custom_tab</name>
                    <block>zerkella_customtab/adminhtml_catalog_product_edit_tab_custom</block>
                </action>
            </reference>
        </adminhtml_catalog_product_edit>
    </layout>
    


    注意:如果具有自定义标签的产品类型已修复,则您可以将它们静态地放在布局文件中,而不是在块的canShowTab()方法中动态检查它们。

    以下是此类示例案例的布局文件,当修复了包含自定义标签的产品类型并且仅包含可下载内容时, app / design / adminhtml / default / default / layout / zerkella_customtab.xml

    <?xml version="1.0"?>
    <layout>
        <adminhtml_catalog_product_downloadable>
            <reference name="product_tabs">
                <action method="addTab">
                    <name>my_custom_tab</name>
                    <block>zerkella_customtab/adminhtml_catalog_product_edit_tab_custom</block>
                </action>
            </reference>
        </adminhtml_catalog_product_downloadable>
    </layout>
    


    其余的很简单 - 您放入zerkella_customtab/catalog/product/edit/tab/custom.phtml的所有内容都将在标签中呈现。

    你可以download simple module example for this approach: "custom_tab.zip"


    此外,我不建议使用类重写来实现任务。上述方法涵盖了开发人员的所有需求。利用重写是没有意义的。虽然重写是一个强大的功能,允许在Magento中做任何事情,但它有两个限制:

    • 一个类只能由一个模块重写
    • 如果您的系统中有重写的类,那么将需要更多的工作 将Magento升级到更新版本

    建议的方法遵循在Magento中自定义产品标签的自然方式,因此最好选择其中一种。

    祝你的商店好运:)

答案 1 :(得分:2)

您应该使用参数apply_to

$productTypes = array(
    Mage_Catalog_Model_Product_Type::TYPE_SIMPLE,
    Mage_Catalog_Model_Product_Type::TYPE_BUNDLE,
    Mage_Catalog_Model_Product_Type::TYPE_CONFIGURABLE,
    Mage_Catalog_Model_Product_Type::TYPE_VIRTUAL
);

$productTypes = join(',', $productTypes);
$globalScope = Mage_Catalog_Model_Resource_Eav_Attribute::SCOPE_GLOBAL;
$installer->addAttribute(
Mage_Catalog_Model_Product::ENTITY, 'artist_id',
array(
     'global'                  => $globalScope,
     'visible'                 => false,
     'required'                => false,
     'user_defined'            => true,
     'default'                 => '',
     'apply_to'                => $productTypes, // <-- apply_to
     'visible_on_front'        => false,
     'used_in_product_listing' => false,
     'type'                    => 'int', //backend_type

)
);

..并将属性添加到属性集

$setup->addAttributeToSet(
    'product_catalog',
    %ATTRIBUTE_SET%,
    %ATTRIBUTE_GROUP%,
    'testing_attribute'
);

获取产品的默认属性集使用此代码:

$productDefaultAttributeSet = $installer->getDefaultAttributeSetId(Mage_Catalog_Model_Product::ENTITY);

答案 2 :(得分:0)

后端新组

以下是在后端创建新“组”标签的代码:

$installer = $this;
$productAttributesSetup = new Mage_Eav_Model_Entity_Setup('core_setup');
$installer->startSetup();

// this is the line you need 
$productAttributesSetup->addAttributeGroup('catalog_product', 'Attribute Set', 'Name of Group');
$installer->endSetup();

仅限特殊产品

要仅在某些产品上出现,请按以下步骤操作:

  1. 创建新的属性集(基于您已使用的属性集)
  2. 将自定义标签/组添加到此新属性集
  3. 所有特殊产品(您希望此选项卡都在其中)应使用此新属性集
  4. 让自定义产品在购物车中运作

    Inchoo创建了一个“自定义产品”模块,我建议您将代码与他们的代码进行比较。

    以下是其模块(和文章)的链接:

    http://inchoo.net/ecommerce/magento/how-to-create-a-new-product-type-in-magento/

答案 3 :(得分:0)

我认为要获得你想要的行为,你需要重写类Mage_Adminhtml_Block_Catalog_Product_Edit_Tabs

在那里,方法_prepareLayout()创建所有选项卡,即:

    foreach ($groupCollection as $group) {
    ...
    $this->addTab('group_'.$group->getId(), array(
        'label' => Mage::helper('catalog')->__($group->getAttributeGroupName()),
        'content'   => $this->_translateHtml(
                          $this->getLayout()
                               ->createBlock($this->getAttributeTabBlock(),
                                   'adminhtml.catalog.product.edit.tab.attributes')
                               ->setGroup($group)
                               ->setGroupAttributes($attributes)
                               ->toHtml()),
            ));
    }

在方法内部,您有变量$ product,可用于检查产品类型。因此,请检查属性的特定组名称和产品类型,并添加相应的选项卡(如果它符合您的需要)。