レコード作成でのみイベントをトリガーする方法は、更新ではありませんか?
-
16-10-2019 - |
質問
カスタム管理グリッドモジュールがあります。そのグリッドにアイテムを追加すると、モジュールのコントローラーのSaveAction()を呼び出します(明らかに)。
レコードが保存された後、カスタムイベントをトリガーする必要があります(以下に示すように)。
public function saveAction() {
if ($data = $this->getRequest()->getPost('tendor')) {
try {
$tendor = $this->_initTendor();
$tendor->addData($data);
$products = $this->getRequest()->getPost('products', -1);
if ($products != -1) {
$tendor->setProductsData(Mage::helper('adminhtml/js')->decodeGridSerializedInput($products));
}
$tendor->save();
// custom event to save vendor code
$evtData = array('tendor_info' => $data, 'tendor_instance' => $tendor);
Mage::dispatchEvent('my_custom_tendor_save_after', $evtData);
これで、既存のレコードが編集されたときではなく、新しいレコードが追加された場合にのみ、このイベントをトリガーしたいと思います。
記録の作成とレコードの更新の違いを見つけるにはどうすればよいですか?
誰かがこれを理解するのを手伝ってくれますか?
解決
コントローラーにこの行があります:
$tendor = $this->_initTendor();
私はこれにかかると仮定することができます id
からのパラメーター _GET
DBから適切なエンティティをロードします。この行は、私が言及した行のすぐ下に追加できます。
$shouldDispatchEvent = !(bool)($tendor->getId());
$shouldDispatchEvent
の場合にのみ真です $tendor
オブジェクトにはIDがあります。
今あなたを包みます dispatchEvent
これで:
if ($shouldDispatchEvent){
$evtData = array('tendor_info' => $data, 'tendor_instance' => $tendor);
Mage::dispatchEvent('my_custom_tendor_save_after', $evtData);
}
編集.
あなたの場合、それを行う他の方法はこれかもしれません:
if ($tendor->isObjectNew()){
$evtData = array('tendor_info' => $data, 'tendor_instance' => $tendor);
Mage::dispatchEvent('my_custom_tendor_save_after', $evtData);
}
これは、モデルが拡張されると機能します Mage_Core_Model_Abstract
(そしてそれはすべきです)。
メンバー _isObjectNew
のモデルインスタンスに追加されます _beforeSave
(見る Mage_Core_Model_Abstract::_beforeSave()
)メソッド、そしてセーブが完了した後にイベントを派遣したいので、アクセスできるはずです。
所属していません magento.stackexchange