J'ai créé un modèle qui a sa propre table de base de données. Pour une personnalisation, je dois déclencher un save_before
événement de ce modèle.
Si une valeur de champ ne correspond pas, les données ne doivent pas être enregistrées.
Mon objectif principal est d'empêcher l'enregistrement des données à l'aide de l'événement "avant l'enregistrement"
Mon code config.xml:
<?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 */
}
}
}
la source
$_dataSaveAllowed
propriété.protected
. Je pensais que vous pouvez faire quelque chose comme ça$observer->getDataObject()->setDataSaveAllowed(false)
, mais il n'y a pas de setter respectif. Par conséquent, vous ne pouvez utiliser cette approche qu'avec un modèle personnalisé dans lequel vous pouvez ajouter un setter pour le champ. Pour Magento ou d'autres modèles que vous ne contrôlez pas, utilisez l'approche d'exception.Dans le cas où vous devez empêcher l'exécution de la méthode de sauvegarde pour un modèle principal (c.-à-d. Catalogue / produit), vous pouvez utiliser la réflexion pour définir "$ _dataSaveAllowed" sur false:
la source
Vous devez d'abord essayer la réponse @Simon. Mais si vous devez continuer à économiser dans les deux conditions, vous pouvez utiliser ce cocept
Ce que fait cette méthode, c'est qu'elle va d'abord collecter des données qui correspondent à l'entité qui va enregistrer, puis définir les données actuelles avec cette valeur. Cela se traduit par enregistrer la valeur précédente elle-même dans la base de données. Si aucun identifiant d'entité n'est présent, cela signifie que c'est une nouvelle entité. Enregistrez donc les valeurs nulles pour ce champ
ÉDITER
Mes amis Simon et AmitBera se sont trompés sur cette partie
Il serait donc bon d'expliquer cette partie un peu. Supposons que la table ait deux champs
field_one
etfield_two
. Dans ce cas, pour une nouvelle entité (cela signifie qu'elle n'a pas d'entrée dans la base de données), nous pouvons définir ces valeurs comme ceci.Cela effacera la valeur transmise et définira la valeur nulle. Ainsi, pendant l'action d'enregistrement, ces valeurs vides seront stockées dans la base de données.
Prenez l'idée que j'essaie de transmettre et s'il vous plaît ne jugez pas sur la base du code de démonstration que j'ai fourni :)
la source
before_save
action. Des moyenssave
et desaftersave
actions doivent avoir lieu. L'entité éditée peut donc être déjà existante dans la base de données ou une nouvelle. Si l'entité modifiée a une entrée dans la base de données, nous obtiendrons ces valeurs et définirons ces valeurs au lieu des valeurs modifiées qui sont actuellement détenues par l'entité / l'objet. donc quand une action de sauvegarde a lieu, la valeur définie maintenant est la valeur précédente elle-même. Cela ne fait aucune mise à jour de la valeur de la table. Signifie que les valeurs précédentes sont enregistrées.setData(null)
n'a pas fonctionné, je suppose que celasetData(array())
peut fonctionner (tableau nul). C'est juste une logiqueCela peut affecter plus que l'objet client que vous essayez d'empêcher d'enregistrer , mais vous pouvez le faire dans votre observateur pour empêcher l'application de l'enregistrement dans la base de données.
L'exception levée seule ne le fera pas, vous devez donc essayer d'annuler la transaction avec InnoDB. Cependant, il peut y avoir plus que ce compte client en cours de modification / création dans cette transaction, alors utilisez-le avec prudence.
la source