Я создал модель, которая имеет свою собственную таблицу базы данных. Для настройки мне нужно вызвать save_before
событие этой модели.
Если одно значение поля не соответствует, то данные не должны быть сохранены.
Моя главная цель - предотвратить сохранение данных с помощью события «before save»
Мой код 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 */
}
}
}
источник
$_dataSaveAllowed
собственности.protected
. Я думал, что вы можете сделать что-то вроде$observer->getDataObject()->setDataSaveAllowed(false)
, но нет соответствующего сеттера. Следовательно, вы можете использовать этот подход только с пользовательской моделью, где вы можете добавить установщик для поля. Для Magento или других моделей, которые вы не контролируете, используйте подход исключения.В случае, если вам нужно запретить выполнение метода save для базовой модели (например, Catalog / Product), вы можете использовать отражение, чтобы установить для "$ _dataSaveAllowed" значение false:
источник
Вы должны сначала попробовать ответ @Simon. Но если вам все еще нужно сохранить данные в обоих условиях, вы можете использовать эту концепцию
Этот метод сначала собирает данные, соответствующие объекту, который будет сохранен, а затем устанавливает текущие данные с этим значением. Это приводит к сохранению самого предыдущего значения в базе данных. Если идентификатор сущности отсутствует, это означает, что это новая сущность. Так что сохраните нулевые значения для этого поля
РЕДАКТИРОВАТЬ
Мои друзья Саймон и АмитБера запутались в этой части
Так что было бы хорошо немного объяснить эту часть. Предположим, что в таблице есть два поля
field_one
иfield_two
. В этом случае для новой сущности (означает, что у нее нет записи в базе данных), мы можем установить эти значения следующим образом.Это удалит переданное значение и установит нулевое значение. Таким образом, во время действия сохранения эти пустые значения будут сохранены в базе данных.
Возьмите идею, что я пытаюсь передать, и, пожалуйста, не судите по предоставленному мной демонстрационному коду :)
источник
before_save
действие. Средстваsave
иaftersave
действия должны иметь место. Таким образом, отредактированный объект может быть уже существующим в базе данных или новым. Если отредактированная сущность имеет запись в базе данных, мы получим эти значения и установим эти значения вместо измененных значений, которые в данный момент хранятся в сущности / объекте. поэтому, когда происходит действие сохранения, значение, установленное сейчас, является самим предыдущим значением. Это не делает обновление значения таблицы. Значит предыдущие значения сохраняются.setData(null)
не работает, я думаю,setData(array())
может работать (нулевой массив). Это просто логикаЭто может повлиять не только на объект клиента, который вы пытаетесь запретить сохранение , но вы можете сделать это в обозревателе, чтобы предотвратить применение сохранения в базе данных.
Одно только выброшенное исключение не сделает этого, поэтому вы должны попытаться откатить транзакцию с InnoDB. Однако в этой транзакции может быть что-то большее, чем просто изменение / создание этой учетной записи клиента, поэтому используйте это с осторожностью.
источник