【问题标题】:I need custom tab for specific product type only not for all product type我需要特定产品类型的自定义选项卡,而不是所有产品类型
【发布时间】:2012-12-31 07:47:38
【问题描述】:

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

我尝试了来自 link-1link-2 的代码,但它在所有产品类型添加/编辑上显示标签

我的问题与this 相同,但想使用编码来完成此操作

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

谢谢!!!

【问题讨论】:

  • 你必须有一个新标签吗?你可以只使用现有的标签吗?
  • 是的,我有新标签“价格 - 尺寸”,我只想为我的自定义产品类型显示它,目前它显示所有产品类型,如捆绑,简单,可下载我只想要 custproduct(我的自定义产品类型)仅限
  • Magento 不支持这个。它只支持设置自定义属性集(不支持选项卡)。您需要更改您的 AdminHTML 以实现此目的。
  • 问题已经解决了谢谢:)
  • 一切顺利!什么解决了这个问题?

标签: php magento magento-1.6


【解决方案1】:

Magento 非常灵活,因此您可以通过多种方式获得所需的结果。唯一的问题是确定最佳方式,即找到最可靠和最有效的方式。

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

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

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

 

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

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

这就是脚本的样子。

/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 渲染器中。

自定义标签块/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 中自定义产品选项卡的自然方式,因此最好选择其中一个。

祝你的商店好运:)

【讨论】:

  • ..感谢您以如此好的方式解释所有内容。
  • 我的问题已经解决了,但我接受你的解释谢谢
  • 很高兴知道,因为 Stack Overflow 旨在解决问题。所以它有效:)
  • 上面的选项 1 和您在 Zip 文件中的示例似乎不适用于 Magento 1.3.x
【解决方案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);

【讨论】:

  • 添加了属性,但是如何创建组“价格 - 大小”并将属性分配给该组,谢谢 :)
【解决方案3】:

后端的新组

这是在后端创建一个新的“组”标签的代码:

$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://inchoo.net/ecommerce/magento/how-to-create-a-new-product-type-in-magento/

【讨论】:

  • 我不想手动执行此操作,我只想使用编码来执行此操作
  • 你指的是哪一部分?创建自定义属性集?
  • 所有的东西,我已经创建了产品和属性集并分配了它,但我的问题是它显示所有产品类型我只需要我的自定义产品类型
  • 使用我发布的代码让属性只出现在新的属性集中(你可能必须从常规集中删除它,因为你已经把它放在那里了)
【解决方案4】:

我认为要获得您想要的行为,您需要重写 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 来检查产品类型。因此,请检查您的属性和产品类型的特定组名称,并仅添加相应的选项卡,如果它与您想要的方式匹配。

【讨论】:

    猜你喜欢
    • 2021-07-24
    • 2021-01-29
    • 2017-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-28
    • 2015-07-04
    • 1970-01-01
    相关资源
    最近更新 更多