0

我想在 Magento 中自动生成产品名称。

当我要添加产品时,我会为产品名称输入一些字符串。保存产品时,我希望自动生成产品名称,使产品名称变为Item."productId"

4

4 回答 4

4

假设 OP 想要将实体表中的自动增量值合并到业务数据中。这通常不是一个好主意。

这是一项有趣的任务,可以通过 Magento 的 EAV 实现轻松完成 - 特别是在目录模块中工作时。首先,一些背景。

保存 EAV 实体时,它有一个漂亮、整洁的 key => value 对数组,它们表示该实体的属性和属性值:

Mage_Catalog_Model_Product->_data['attribute_code'] = 'attribute value';

在保存过程中,EAV 资源模型获取此数组并对其进行迭代。对于每个属性,由其代码(attribute_code在上面的示例中)和它的实体(catalog_product在产品的情况下)标识,属性本身的配置被加载。特别重要的是属性的“后端模型”,因为它被调用来对值进行预处理和后处理。

在当前情况下,有一条信息在我们保存属性时不会出现,至少不会以我们可以使用的方式出现:新产品 ID。这可用于在保存过程中调整原始值。

有一个来自核心的示例总是很好,因此,请参考price属性及其后端模型,Mage_Catalog_Model_Product_Attribute_Backend_Price可以在eav_attribute表中看到:

SELECT `attribute_code`, `backend_model`
FROM `eav_attribute`
LEFT JOIN `eav_entity_type` USING (`entity_type_id`)
WHERE `attribute_code` = 'price';

#+----------------+-----------------------------------------+
#| attribute_code | backend_model                           |
#+----------------+-----------------------------------------+
#| price          | catalog/product_attribute_backend_price |
#+----------------+-----------------------------------------+
#1 row in set (0.00 sec)

保存产品时,价格属性的 backend_model 被实例化,并且(在这种情况下)该afterSave()方法被调用。顺便说一句,这种方法是根据网站范围定价的转化率更新定价的方法。可以使用相同的方法来修改name属性。

以下设置脚本将添加后端模型:

<?php

    $installer = Mage::getResourceModel('catalog/setup','default_setup');

    $installer->startSetup();

    $installer->updateAttribute(
        'catalog_product',
        'name',
        'backend_model',
        'custom/product_attribute_backend_name'
    );

    $installer->endSetup();

相应的afterSave()方法应该可以解决问题:

public function afterSave($object)
{
    $value = $object->getData($this->getAttribute()->getAttributeCode());
    $origData = $object->getOrigData();
    $origValueExist = $origData && array_key_exists($this->getAttribute()->getAttributeCode(), $origData);

    //don't do this in case of update
    if ($object->getStoreId() != 0 || !$value || $origValueExist) {
        return $this;
    }

    //append autoinc id
    $newValue = $value .'.'. $object->getId(); // or whatever

    //assume global store, otherwise the stated need is getting weird!
    $object->addAttributeUpdate($this->getAttribute()->getAttributeCode(), $newValue, 0);

    return $this;
 }
于 2012-09-24T02:57:06.263 回答
0

如果您是从管理面板产品编辑屏幕执行此操作,则必须从“名称”字段中删除“必需”类,以便可以在没有名称的情况下保存它。这意味着覆盖编辑表单以专门替换该字段。然后你必须在产品模型上重载与保存相关的方法(或者你可以从控制器中完成),但是孩子必须在保存之前生成名称,然后才能进入数据库。

例如:

class Module_Catalog_Model_Product extends Mage_Catalog_Model_Product
{
    protected function _beforeSave()
    {
        parent::_beforeSave();

        $productName = 'Item' . $this->getId();

        if (!$this->getId() && !$this->getName())
        {
            $this->setName('Item Unnamed');

        } elseif ($this->getId()) && strcasecmp($this->getName(), $productName) <> 0)
        {
            $this->setName($productName);
        }
    }
}

唯一的问题是它需要两次保存。如果你想让它运行起来,你必须使用 _afterSave() 方法进行第二次保存。或者,再一次,您可以从控制器中执行此操作。

于 2012-09-24T00:29:30.967 回答
0

我会使用 Magento 事件来做到这一点:

由于 Magento 中的模型具有事件前缀(只需查看Mage_Catalog_Model_Product并查找$_eventPrefix,对于我们当前的模型, eventPrefix 设置为catalog_product.

如果您现在查看Mage_Core_Model_Abstract并搜索_eventPrefix. 您会看到 eventPrefix 在 _beforeLoad、_afterLoad、_beforeSave、_afterSave 和其他一些中找到。在这些方法中,您可以看到使用以下内容调度事件:

Mage::dispatchEvent($this->_eventPrefix.'_save_before', $this->_getEventData());

这意味着您有一个可用的事件,称为catalog_product_save_before. 通过这个事件,您可以在那个时候连接到 Magento 并做您的事情,在这种情况下更改字段,然后由 Magento 处理其余的事情。

查看http://www.magentocommerce.com/wiki/5__-_modules_and_development/0__-_module_development_in_magento/customizing_magento_using_event-observer_method了解如何使用这些事件并将它们转换为模块的更多信息。如果您不知道如何为 Magento 构建模块并想学习,这里有一些很棒的免费点播视频:http: //www.magentocommerce.com/training/on-demand

于 2012-09-24T20:44:57.833 回答
0

首先,我要感谢所有在该主题中写作的用户。非常感谢你们!

我做到了,但我让它更容易。(因为我对 Magento 有非常基本的了解,而且需要更多时间)

所以......我的同事决定使用 php/jquery/ajax 来实现。

首先我们创建一个 php 文件,它返回最后一个 id

 <?php
 header('Access-Control-Allow-Origin: *');
 require_once 'app/Mage.php';
 umask(o);
 Mage::app('default');
 Mage::getSingleton('core/session', array('name'=>'frontend'));

$model = Mage::getModel('catalog/product'); //getting product model
$collection = $model->getCollection(); //products collection
foreach ($collection as $product) //loop for getting products
{                    
    $id=$product->getId();
}
if($id)echo $id+1; //id of product
else{
    echo 0;
}
?>

在第一步之后,我设置输入的值(即我自动生成名称):

if($j('#name').val()=='' &&  window.location.href.indexOf("admin/catalog_product/new/") > -1) {
    $j.post('http://www.website.com/file.php', function(data) {
        $j('#name').val('Item №'+data);
    }); 
}

再次感谢您的帮助。

最好的问候,乔丹!

于 2012-10-01T21:12:12.377 回答