Eu criei um modelo que possui sua própria tabela de banco de dados. Para uma personalização, eu preciso acionar um save_before
evento desse modelo.
Se um valor de campo não corresponder, os dados não deverão ser salvos.
Meu principal objetivo é impedir que os dados sejam salvos usando o evento "antes de salvar"
Meu 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 */
}
}
}
fonte
$_dataSaveAllowed
propriedade.protected
. Eu pensei que você pode fazer algo parecido$observer->getDataObject()->setDataSaveAllowed(false)
, mas não há nenhum levantador respectivo. Portanto, você só pode usar essa abordagem com um modelo personalizado no qual você pode adicionar um setter para o campo. Para Magento ou outros modelos que você não controla, use a abordagem de exceção.Caso você precise impedir que o método save seja executado para um modelo principal (por exemplo, Catálogo / Produto), você pode usar a reflexão para definir "$ _dataSaveAllowed" como false:
fonte
Você deve tentar a resposta do @Simon primeiro. Mas se você ainda precisar economizar nas duas condições, poderá usar este cocept
O que esse método faz é: ele primeiro coletará dados correspondentes à entidade que será salva e, em seguida, definirá os dados atuais com esse valor. Isso resulta em salvar o próprio valor anterior no banco de dados. Se não houver um ID de entidade presente, isso significa que é uma nova entidade. Portanto, salve valores nulos para esse campo
EDITAR
Meus amigos Simon e AmitBera ficaram confusos com essa parte
Portanto, seria bom explicar um pouco essa parte. Suponha que a tabela tenha dois campos
field_one
efield_two
. Nesse caso, para uma nova entidade (significa que isso não tem entrada no banco de dados), podemos definir esses valores dessa maneira.Isso apagará o valor que passou e definirá o valor nulo. Portanto, durante a ação de salvar, esses valores vazios serão armazenados no banco de dados.
Tome a idéia de que estou tentando transmitir e não julgue com base no código de demonstração que forneço :)
fonte
before_save
ação. Meiossave
eaftersave
ações devem ocorrer. Portanto, a entidade editada pode já existir uma no banco de dados ou uma nova. Se a entidade editada tiver uma entrada no banco de dados, obteremos esses valores e os definiremos em vez dos valores alterados atualmente mantidos pela entidade / objeto. portanto, quando a ação de salvar ocorre, o valor definido agora é o próprio valor anterior. Isso não faz a atualização do valor da tabela. Significa que os valores anteriores são salvos.setData(null)
não funcionou, acho quesetData(array())
pode funcionar (matriz nula). É apenas uma lógicaIsso pode afetar mais do que apenas o objeto do cliente que você está tentando impedir de salvar , mas você pode fazer isso no seu observador para impedir que a gravação seja aplicada no banco de dados.
A exceção lançada por si só não fará isso; portanto, você deve tentar reverter a transação com o InnoDB. No entanto, pode haver mais do que apenas essa conta de cliente sendo modificada / criada nessa transação, portanto, use isso com cuidado.
fonte