Ich habe ein Modell erstellt, das eine eigene Datenbanktabelle hat. Für eine Anpassung muss ich ein save_before
Ereignis dieses Modells auslösen .
Wenn ein Feldwert nicht übereinstimmt, sollten die Daten nicht gespeichert werden.
Mein Hauptziel ist das Verhindern des Speicherns von Daten mithilfe des Ereignisses "vor dem Speichern"
Mein config.xml-Code:
<?xml version="1.0" ?>
<config>
<modules>
<Amit_Custommodule>
<version>1.0.0</version>
</Amit_Custommodule>
</modules>
<global>
<models>
<custommodule>
<class>Amit_Custommodule_Model</class>
<resourceModel>custommodule_resource</resourceModel>
</custommodule>
<custommodule_resource>
<class>Amit_Custommodule_Model_Resource</class>
<entities>
<custommodule>
<table>custommodule</table>
</custommodule>
</entities>
</custommodule_resource>
</models>
<resources>
<custommodule_setup>
<setup>
<module>Amit_Custommodule</module>
</setup>
<connection>
<use>core_setup</use>
</connection>
</custommodule_setup>
<custommoule_read>
<connection>
<use>core_read</use>
</connection>
</custommoule_read>
<custommodule_write>
<connection>
<use>core_write</use>
</connection>
</custommodule_write>
</resources>
<events>
<custommodule_save_before>
<observers>
<custommodule>
<type>singleton</type>
<class>custommodule/observer</class>
<method>customerSaveAfter</method>
</custommodule>
</observers>
</custommodule_save_before>
</global>
</config>
Observer.php
<?php
class Amit_Custommodule_Model_Observer
{
public function customerSaveAfter($observer){
if($observer->getEvent()->getMyfield()==MatchWithMyLogic){
}
else
{
/* i want prevent data base if my business logic is not match here */
}
}
}
quelle
$_dataSaveAllowed
Eigentum.protected
. Ich dachte, dass Sie so etwas tun können$observer->getDataObject()->setDataSaveAllowed(false)
, aber es gibt keinen entsprechenden Setter. Daher können Sie diesen Ansatz nur mit einem benutzerdefinierten Modell verwenden, bei dem Sie einen Setter für das Feld hinzufügen können. Verwenden Sie für Magento oder andere Modelle, die Sie nicht steuern, den Ausnahmeansatz.Falls Sie verhindern müssen, dass die Speichermethode für ein Kernmodell (z. B. Katalog / Produkt) ausgeführt wird, können Sie mithilfe von Reflection "$ _dataSaveAllowed" auf false setzen:
quelle
Sie sollten zuerst versuchen, @ Simon zu antworten. Wenn Sie jedoch in beiden Fällen noch speichern müssen, können Sie dieses Konzept verwenden
Bei dieser Methode werden zunächst Daten erfasst, die der zu speichernden Entität entsprechen, und anschließend die aktuellen Daten mit diesem Wert festgelegt. Dies führt dazu, dass der vorherige Wert selbst in der Datenbank gespeichert wird. Wenn keine Entitäts-ID vorhanden ist, bedeutet dies, dass es sich um eine neue Entität handelt. Speichern Sie also Nullwerte für dieses Feld
BEARBEITEN
Meine Freunde Simon und AmitBera waren in diesem Punkt verwirrt
Es wäre also gut, diesen Teil ein wenig zu erklären. Angenommen, die Tabelle hat zwei Felder
field_one
undfield_two
. In diesem Fall können wir für eine neue Entität (dh dies hat keinen Eintrag in der Datenbank) diese Werte wie folgt festlegen.Dadurch wird der übergebene Wert gelöscht und der Nullwert festgelegt. Während der Speicheraktion werden diese leeren Werte in der Datenbank gespeichert.
Nehmen Sie an, dass ich versuche zu vermitteln und beurteilen Sie bitte nicht anhand des von mir bereitgestellten Demo-Codes :)
quelle
before_save
Aktion. Mittelsave
undaftersave
Handlungen müssen stattfinden. Die bearbeitete Entität ist möglicherweise bereits in der Datenbank vorhanden oder eine neue. Wenn die bearbeitete Entität einen Eintrag in der Datenbank hat, erhalten wir diese Werte und legen diese Werte anstelle der geänderten Werte fest, die derzeit von der Entität / dem Objekt gehalten werden. Wenn also eine Speicheraktion stattfindet, ist der jetzt festgelegte Wert der vorherige Wert. Dies führt keine Aktualisierung des Tabellenwerts durch. Bedeutet, dass vorherige Werte gespeichert werden.setData(null)
nicht funktioniert hat,setData(array())
kann es funktionieren (Null-Array). Es ist nur eine LogikDies kann mehr als nur das Kundenobjekt betreffen, dessen Speicherung Sie verhindern möchten . Sie können dies jedoch in Ihrem Beobachter tun, um zu verhindern, dass die Speicherung in der Datenbank angewendet wird.
Die ausgelöste Ausnahme allein reicht nicht aus. Sie müssen daher versuchen, die Transaktion mit InnoDB zurückzusetzen. Möglicherweise wird in dieser Transaktion jedoch mehr als nur dieses Kundenkonto geändert / erstellt. Verwenden Sie dieses Konto daher mit Vorsicht.
quelle