Magento で製品名を自動生成したい。
製品を追加するときは、製品名に文字列を入力します。商品を保存する際、商品名がItem."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()
メソッドが呼び出されます。ちなみに、この方法は、Webサイトを対象とした料金設定のコンバージョン率で料金を更新するものです。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;
}
まず、トピックを書いているすべてのユーザーに感謝します。たくさんの人に感謝します!
私はそれをしました、しかし私はそれをより簡単にします。(私はMagentoの非常に基本的な知識を持っているので、もっと時間がかかるでしょう)
だから...私の同僚と一緒にphp/jquery/ajaxでそれを作ることにしました。
最初に、最後のIDを返す単一のphpファイルを作成します。
<?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;
}
?>
ステップ1の後、入力の値を設定します(つまり、名前を自動生成します)。
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);
});
}
助けてくれてありがとう。
よろしく、ジョーダン!
管理パネルの製品編集画面からこれを行っている場合は、名前なしで保存できるように、「名前」フィールドから「必須」クラスを削除する必要があります。これは、編集フォームをオーバーライドして、そのフィールドを明確に置き換えることを意味します。次に、製品モデルで保存関連のメソッドをオーバーロードする必要があります (またはコントローラーから行うことができます) が、子はデータベースに移動する前に保存時に名前を生成する必要があります。
例えば:
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);
}
}
}
これに関する唯一の問題は、2 回のセーブが必要なことです。その場で動作させたい場合は、_afterSave() メソッドを使用して 2 回目の保存を行う必要があります。または、もう一度、コントローラーから行うこともできます。
これを行うには、Magento Event を使用します。
Magento のモデルにはイベント プレフィックスがあるため (現在のモデルでは、eventPrefix が に設定されていMage_Catalog_Model_Product
ます。$_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