レコード作成でのみイベントをトリガーする方法は、更新ではありませんか?

magento.stackexchange https://magento.stackexchange.com/questions/10159

質問

カスタム管理グリッドモジュールがあります。そのグリッドにアイテムを追加すると、モジュールのコントローラーの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())メソッド、そしてセーブが完了した後にイベントを派遣したいので、アクセスできるはずです。

ライセンス: CC-BY-SA帰属
所属していません magento.stackexchange
scroll top