我想在Magento中自动生成产品名称。
当我要添加产品时,我会为产品名称键入一些字符串。保存产品时,我希望自动生成产品名称,使产品名称成为项目。"productId">。
假设OP希望将实体表中的自动增量值合并到业务数据中进行回答。这通常不是一个好主意。
这是一项有趣的任务,使用Magento的EAV实现可以很容易地完成,尤其是在目录模块中工作时。首先,一些背景。
保存EAV实体时,它有一个漂亮、整洁的键值对数组,表示该实体的属性和属性值:
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)
保存产品时,将实例化price属性的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;
}
如果您在管理面板产品编辑屏幕上执行此操作,则必须从"名称"字段中删除"必需"类,这样您就可以在没有名称的情况下保存它。这意味着覆盖"编辑"窗体以专门替换该字段。然后,您将不得不在产品模型上重载与保存相关的方法(或者您可以从控制器中执行此操作),但子级必须在保存时生成名称,然后才能将其放入数据库。
例如:
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()方法进行第二次保存。或者,再一次,您可以从控制器中执行此操作。
我会用一个Magento事件来做这件事:
由于Magento中的模型有一个事件前缀(只需查看Mage_Catalog_Model_Product
并查找$_eventPrefix
,对于我们当前的模型,eventPrefix设置为catalog_product
。
如果您现在查看Mage_Core_Model_Abstract
并搜索_eventPrefix
。您可以在_beforeLoad、_afterLoad、_beforeSave、_afterSave和其他一些文件中找到eventPrefix。在这些方法中,您可以看到使用以下内容调度事件:
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
首先,我要感谢所有撰写该主题的用户。谢谢大家!
我做到了,但我让它变得更容易。(因为我在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);
});
}
再次感谢您的帮助。
谨致问候,乔丹!