Magento属性值 - 添加描述字段

时间:2014-05-14 10:42:03

标签: magento attributes entity-attribute-value

寻找一种在Magento中将描述字段添加到invididual属性的方法。请注意我指的是属性值选项,而不是实际的属性本身。

举个例子:

属性=颜色

属性值: 红色,绿色,蓝色

我想为3种颜色中的每种颜色添加一个描述字段(1表示红色,1表示绿色,1表示蓝色)。这样做的目的是在前端显示工具提示,以提供有关每种颜色选项的更多信息。

有谁知道怎么做?有许多解决方案可以应用于属性本身(颜色),但不适用于各个选项(红色,绿色,蓝色)。

可以在“管理”面板中编辑说明。我不想要一个依赖于在数据库中直接编辑这些内容的解决方案,例如,使用phpMyAdmin。

我了解这些值存储在' eav_attribute_option_value'表以及可能需要另一列来存储描述。不知道如何在管理面板中设置所有设置。想法?

Screenshot of where descriptions need adding 编辑:我已添加了描述文本需要添加的屏幕截图。因此,每种颜色旁边(截图:黑色,蓝色,绿色,灰色,红色,白色等) - 每个颜色都需要在它旁边有描述。

2 个答案:

答案 0 :(得分:3)

这可能已经过时了11个月,但对于其他有这个问题的人来说,也许这可以帮到你。我希望它可以帮助你免受像我和我的同事那样经历过一次撞墙的伤害。出于我的目的,我试图为Magento 1.9版创建一个图像URL 字段,以支持从旧平台迁移产品。

这个答案在这里得到了部分答案 - Creating new options for Magento attributes但是还有一些额外的事情需要弄清楚:

1。)这个答案假设你已经创建了自己的模块(如果你不知道如何从这里开始:http://www.smashingmagazine.com/2012/03/01/basics-creating-magento-module/

2。)它还允许您自己在 catalog / product / attribute / options.phtml 中创建额外的字段。但为了节省您的时间,我为了让它出现在管理员中而进行了修改。在 88

行创建新的表头选项
<th><?php echo Mage::helper('catalog')->__('YOUR_ATTRIBUTE_NAME_HERE') ?></th>

接下来在 101

上创建一个新的td
<td class="a-left"><input class="input-text" type="text" name="option[YOUR_ATTRIBUTE_NAME_HERE][{{id}}]" value="{{TABLE_COLUMN_NAME_HERE}}" <?php if ($this->getReadOnly()):?> disabled="disabled"<?php endif;?>/></td>

此外,大部分逻辑都是在Javascript中完成的,因此我们需要在此处复制字段 126

    '<td><input class="input-text" type="text" name="option[YOUR_ATTRIBUTE_NAME_HERE][{{id}}]" value="{{TABLE_COLUMN_NAME_HERE}}" <?php if ($this->getReadOnly()):?> disabled="disabled"<?php endif;?>/><\/td>'+

3。)对我来说,最长的部分是为 _saveOption 方法创建自定义逻辑。我覆盖了父类,但是为了省去你的麻烦,这是我的逻辑:

protected function _saveOption(Mage_Core_Model_Abstract $object)
{
    $option = $object->getOption();
    if (is_array($option)) {
        $adapter            = $this->_getWriteAdapter();
        $optionTable        = $this->getTable('eav/attribute_option');
        $optionValueTable   = $this->getTable('eav/attribute_option_value');

        $stores = Mage::app()->getStores(true);
        if (isset($option['value'])) {
            $attributeDefaultValue = array();
            if (!is_array($object->getDefault())) {
                $object->setDefault(array());
            }

            foreach ($option['value'] as $optionId => $values) {
                $intOptionId = (int) $optionId;
                if (!empty($option['delete'][$optionId])) {
                    if ($intOptionId) {
                        $adapter->delete($optionTable, array('option_id = ?' => $intOptionId));
                    }
                    continue;
                }

                $sortOrder = !empty($option['order'][$optionId]) ? $option['order'][$optionId] : 0;
                $imgUrl = !empty($option['image_url'][$optionId]) ? $option['image_url'][$optionId] : 0;
                if (!$intOptionId) {
                    $data = array(
                       'attribute_id'  => $object->getId(),
                       'sort_order'    => $sortOrder,
                       'image_url'     => $imgUrl
                    );
                    $adapter->insert($optionTable, $data);
                    $intOptionId = $adapter->lastInsertId($optionTable);
                } else {
                    $data  = array('sort_order' => $sortOrder, 'image_url' => $imgUrl);
                    $where = array('option_id =?' => $intOptionId);
                    $adapter->update($optionTable, $data, $where);
                }

                if (in_array($optionId, $object->getDefault())) {
                    if ($object->getFrontendInput() == 'multiselect') {
                        $attributeDefaultValue[] = $intOptionId;
                    } elseif ($object->getFrontendInput() == 'select') {
                        $attributeDefaultValue = array($intOptionId);
                    }
                }

                // Default value
                if (!isset($values[0])) {
                    Mage::throwException(Mage::helper('eav')->__('Default option value is not defined'));
                }

                $adapter->delete($optionValueTable, array('option_id =?' => $intOptionId));
                foreach ($stores as $store) {
                    if (isset($values[$store->getId()])
                        && (!empty($values[$store->getId()])
                        || $values[$store->getId()] == "0")
                    ) {
                        $data = array(
                            'option_id' => $intOptionId,
                            'store_id'  => $store->getId(),
                            'value'     => $values[$store->getId()]
                        );
                        $adapter->insert($optionValueTable, $data);
                    }
                }
            }
            $bind  = array('default_value' => implode(',', $attributeDefaultValue));
            $where = array('attribute_id =?' => $object->getId());
            $adapter->update($this->getMainTable(), $bind, $where);
        }
    }

    return $this;
}

我的自定义字段名为 image_url ,因此我将其添加到要插入的 $ data 变量中。这会将值插入到eav_attribute_option表的“image_url”列中,但您可以使用相同的方法对其进行操作以存储在eav_attribute_option_value中。

4.。)由于某种原因,堆栈溢出帖子声明这个 _saveOption 方法会在保存时被触发但是我没有,因此我也覆盖了 _afterSave 方法同一个类看起来像这样:

protected function _afterSave(Mage_Core_Model_Abstract $object)
{
    $this->_clearUselessAttributeValues($object);
    $this->_saveStoreLabels($object)
         ->_saveAdditionalAttributeData($object)
         ->saveInSetIncluding($object)
         ->_saveOption($object);

    return $this;
}

5.)现在它将尝试保存您的新值。但它会导致错误,因为您的自定义表列很可能尚不存在。如果适合您,欢迎您手动创建。不幸的是我需要以编程方式为我的情况创建这个,所以对于那些你在同一条船上的人(这是一个稍微不干净的方法)但是为了速度我重新路由 app / code / core / Mage / Core / Model /Resource/Setup.php 在此处创建本地修订: app / code / local / Mage / Core / Model / Resource / Setup.php 并将其添加到 154行在构造函数类中:

$installer = $this;
$installer->getConnection()->addColumn($installer->getTable('eav/attribute_option'), 'YOUR_COLUMN_NAME_HERE', 'VARCHAR(256) NULL');
$installer->endSetup();

6。)好的,现在一切都应该保存到数据库中了,但我们仍然需要将值读入&lt; td&gt; - 这让我感到困惑了一段时间,但想通了Javascript负责替换 230 行中HTML中的{{id}}和{{sort_order}}标记。因此,我们需要将新列添加到此 getOptionsValues()方法中。我在目录/产品/属性/ options.phtml 70 中添加了以下代码:

<?php foreach ($this->getOptionValues() as &$val) {
$imgUrl = $this->getImageUrl($val->id);
if ($imgUrl != "0") {
    $val->_data["YOUR_TABLE_COLUMN_NAME_HERE"] = $imgUrl;
}
} ?> 

然后,在 YOUR_MODULE_Block_Adminhtml_Options 类中添加上述调用的方法 getImageUrl()

/**
* Retrieve results from custom column
*
* @return Mage_Core_Model_Mysql4_Store_Collection
*/
public function getImageUrl($option_id)
{
    //Get the resource model
    $resource = Mage::getSingleton('core/resource');

    //Retrieve the read connection
    $readConnection = $resource->getConnection('core_read');

    //Retrieve our table name
    $table = $resource->getTableName('eav/attribute_option');
    $query = 'SELECT ' . $this->custom_col . ' FROM ' . $table . ' WHERE option_id = '
    . (int)$option_id . ' LIMIT 1';

    //Execute the query and store the result
    $imgUrl = $readConnection->fetchOne($query);
    return $imgUrl;
} 

你有它。我真的希望这可以帮助处于类似情况的任何人。

答案 1 :(得分:0)

试试这个

默认情况下,Magneto仅提供没有任何描述的自定义选项,如果您想使用说明进行自定义,则必须更改以下文件:

第1步: -

在档案中

app\design\adminhtml\default\default\template\catalog\product\edit\option\type\select.phtml

找到以下代码:

'<th class="type-sku"><?php echo Mage::helper('catalog')->__('SKU') ?></th>'+

之后添加这些
'<th class="type-description"><?php echo Mage::helper('catalog')->__('Description') ?></th>'+

找到以下代码:

'<td><input type="text" class="input-text" name="product[options][{{id}}][values][{{select_id}}][sku]" value="{{sku}}"></td>'+

之后添加这些
'<td><input type="text" class="input-text" name="product[options][{{id}}][values][{{select_id}}][description]" value="{{description}}"></td>'+

第2步: -

在档案中

 app\code\core\Mage\Adminhtml\Block\Catalog\Product\Edit\Tab\Options\Option.php

找到以下代码:

$value['sku'] = $this->htmlEscape($option->getSku());

之后添加这些代码
$value['description'] = $this->htmlEscape($option->getDescription());

找到以下代码:

'sku' => $this->htmlEscape($_value->getSku()),

之后添加这些代码
'description' => $this->htmlEscape($_value->getDescription()),

第3步: -

在“catalog_product_option_type_value”表description中添加字段。

如果您有疑问,请告诉我。