7

我想为我的自定义产品类型添加新的自定义选项卡,例如图像“价格 - 尺寸”

我已尝试来自此链接 1链接 2的代码,但它在所有产品类型添加/编辑上显示选项卡

我的问题与此相同,但想使用编码来做到这一点

在此处输入图像描述

mysql4-install-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

4 回答 4

10

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

这里可以推荐两种方法。选择取决于所需功能的技术细节,在最初的问题中没有说明:

  1. 自定义选项卡将仅包含基本字段,用于输入产品数据
  2. 自定义选项卡将包含高级字段和/或 javascript 和/或其他自定义 HTML 标记

让我们看看这两种情况的解决方案。

 

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

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

这就是脚本的样子。

<module_dir>/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');

 
随意下载此方法的简单模块示例:“attribute_tab.zip”

 
 

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

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

自定义选项卡块<module_dir>/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将呈现在选项卡中。

您可以下载此方法的简单模块示例:“custom_tab.zip”


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

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

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

祝你的商店好运:)

于 2013-01-08T11:16:30.853 回答
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);
于 2012-12-31T08:10:37.773 回答
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 来检查产品类型。因此,请检查您的属性的特定组名称和您的产品类型,如果它与您想要的方式匹配,则仅添加相应的选项卡。

于 2013-01-03T09:41:26.290 回答
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. 所有特殊产品(您希望包含此选项卡)都应使用此新属性集

让定制产品在购物车中工作

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

这是他们模块(和文章)的链接:

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

于 2013-01-02T20:00:27.243 回答