He creado un modelo que tiene su propia tabla de base de datos. Para una personalización, necesito activar el save_before
evento de este modelo.
Si un valor de campo no coincide, los datos no deberían guardarse.
Mi objetivo principal es evitar el almacenamiento de datos mediante el evento "antes de guardar"
Mi código 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 */
}
}
}
fuente
$_dataSaveAllowed
propiedad.protected
. Pensé que puedes hacer algo como$observer->getDataObject()->setDataSaveAllowed(false)
, pero no hay un setter respectivo. Por lo tanto, solo puede usar este enfoque con un modelo personalizado en el que puede agregar un setter para el campo. Para Magento u otros modelos que no controle, use el enfoque de excepción.En caso de que necesite evitar que el método de guardar se ejecute para un modelo central (es decir, Catálogo / Producto), puede usar la reflexión para establecer "$ _dataSaveAllowed" en falso:
fuente
Deberías intentar @Simon responder primero. Pero si aún necesita ir a guardar en ambas condiciones, puede usar este cocept
Lo que hace este método es que primero recopilará los datos que corresponden a la entidad que va a guardar y luego establecerá los datos actuales con ese valor. Esto resulta en guardar el valor anterior en la base de datos. Si no hay una identificación de entidad presente, eso significa que es una nueva entidad. Así que guarde valores nulos para ese campo
EDITAR
Mis amigos Simon y AmitBera se confundieron en esta parte.
Por lo tanto, sería bueno explicar esta parte un poco. Supongamos que la mesa tiene dos campos
field_one
yfield_two
. En ese caso, para una nueva entidad (significa que no tiene entrada en la base de datos), podemos establecer esos valores de esta manera.Esto borrará el valor que pasó y establecerá un valor nulo. Entonces, durante la acción de guardar, estos valores vacíos se almacenarán en la base de datos.
Tome la idea de que estoy tratando de transmitir y por favor no juzgue sobre la base del código de demostración que he proporcionado :)
fuente
before_save
acción. Los mediossave
y lasaftersave
acciones tienen que tener lugar. Por lo tanto, la entidad editada puede ser una existente en la base de datos o una nueva. Si la entidad editada tiene una entrada en la base de datos, obtendremos esos valores y estableceremos esos valores en lugar de los valores modificados que actualmente posee la entidad / objeto. así que cuando se lleva a cabo la acción de guardar, el valor establecido ahora es el valor anterior en sí Esto no actualiza el valor de la tabla. Significa que los valores anteriores se guardan.setData(null)
funcionó, supongo quesetData(array())
puede funcionar (matriz nula). Es solo una lógicaEsto puede afectar más que solo el objeto del cliente que está tratando de evitar que guarde , pero puede hacerlo en su observador para evitar que el guardado se aplique en la base de datos.
La excepción lanzada por sí sola no lo hará, por lo que debe intentar deshacer la transacción con InnoDB. Sin embargo, puede haber algo más que esta cuenta de cliente modificada / creada en esa transacción, así que use esto con precaución.
fuente