3

我有一些关于修改 Magento 管理部分的一般性问题,希望能得到解答。我是 Magento 的新手,所以请多多包涵。

我的目标是在该部分的“类别产品”表中添加一个带有产品属性(例如“尺寸”)的新列Catalog -> Manage Cateories(参见下面的屏幕截图)。

没有一点 Magento 开发经验,我不太确定从哪里开始。Grid.php我查看了目录下的一些文件adminhtml,虽然我看到了一堆类似的语句addColumn(...),但我不确定在我的新属性列中的位置。

另外,我假设不是直接修改任何核心文件,而是将它们复制到local文件夹下的相同路径并在那里编辑或以某种方式扩展它们?我是否必须编辑任何配置文件或执行其他任何操作才能反映更改?我 - 通过这样做 - 实际上是在创建自己的模块吗?

我还读到我应该在进行任何更改之前禁用“编译”。为什么是这样?还有什么要考虑的吗?

我再次非常感谢任何帮助,并感谢我的问题必须看起来很基本。您可以指出我的任何补充资源将不胜感激。谢谢。

在此处输入图像描述

4

3 回答 3

5

实际上,您应该首先了解要编辑的文件以及如何编辑它。在这种情况下,您想要修改app/code/core/Mage/Adminhtml/Block/Catalog/Category/Tab/Product.php,但正如您所说,您不应该修改当前位置的文件。有两种方法可以以“正确”的方式修改文件。

  1. (更难但更可扩展)在其中创建一个新模块local并告诉 Magentoetc/config.xml您正在用这个新模块中的不同块覆盖该块(这只是一个 php 类),并使新类extend成为核心 Block 类。然后你只需要覆盖一个函数(_prepareColumns)。
  2. (更容易)将文件复制app/code/core/Mage/Adminhtml/Block/Catalog/Category/Tab/Product.phpapp/code/local/Mage/Adminhtml/Block/Catalog/Category/Tab/Product.php并修改您想要的功能(_prepareColumns

如果您是 Magento 的新手,我建议您使用第二种选择,因为它更容易。Magento 将始终在加载文件local之前加载文件,因此将不再使用core文件 in并且将使用您的版本。要了解更多信息,请阅读Alan Storm 的这篇文章corelocal

现在为了添加你想要的列,做一些类似于 SKU 字段的事情

$this->addColumn('size', array(
    'header'    => Mage::helper('catalog')->__('Size'),
    'index'     => 'size'
));

按照您想要的顺序(在产品名称和 SKU 之间)。我假设您的产品有一个名为size您可以检索的字段$product->getSize()

于 2012-09-30T08:18:48.870 回答
2

Max 解决方案非常到位,但缺少一些重要步骤,我将详细说明他的原始方法

  1. 通过将 app/code/core/Mage/Adminhtml/Block/Catalog/Category/Tab/Product.php 复制到 app/code/local/Mage/Adminhtml/Block/Catalog/Category/Tab 来创建产品选项卡的新本地覆盖/产品.php

  2. 修改网格视图涉及 2 个函数。_prepareCollection 和 _prepareColumns

  3. _prepareColumns 通过添加对 addColumn 函数的调用,就像:

    $this->addColumn('size', array(
        'header'    => Mage::helper('catalog')->__('Size'),
        'width'     => '80',
        'index'     => 'size'
    ));
    
  4. _prepareCollection,默认情况下,网格中加载的产品集合只有几个属性(名称,sku,价格)如果您只使用文本字段,您需要做的添加我们的 now 属性 ->addAttributeToSelect('size') now属性,那么这是您必须做的修改的扩展,但是如果您的属性是例如下拉列表,您将需要对准备集合进行进一步的更改:

  5. (可选)下拉属性仅存储选择的选项的值,因此我们需要为 addColumns 调用提供一个选项数组,以便 Magento 可以正确显示值,我们可以通过以下方式做到这一点:

在产品的本地副本上,将以下内容添加到 _prepareColumns 函数

    $attribute = Mage::getModel('eav/config')->getAttribute('catalog_product', 'colour');
    $options = array();
    foreach( $attribute->getSource()->getAllOptions(true, true) as $option ) {
       $options[$option['value']] = $option['label'];
    }
    $this->addColumn('colour', array(
        'header'    => Mage::helper('catalog')->__('Colour'),
        'width'     => '80',
        'index'     => 'colour',
        'type'      => 'options',
        'options'   =>  $options
    ));
于 2012-09-30T11:53:39.750 回答
1

虽然这些是一些非常彻底的问题,我相信你会学到很多东西,但有一个现成的解决方案;增强的管理产品网格能够将任意属性添加为列。

于 2012-09-30T09:54:32.150 回答