Saya telah membuat model yang memiliki tabel database sendiri. Untuk penyesuaian saya perlu memicu save_before
acara model ini.
Jika satu nilai bidang tidak cocok, maka data tidak boleh disimpan.
Target utama saya adalah mencegah penyimpanan data menggunakan acara "sebelum menyimpan"
Kode config.xml saya:
<?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 */
}
}
}
sumber
$_dataSaveAllowed
properti.protected
. Saya pikir Anda dapat melakukan sesuatu seperti$observer->getDataObject()->setDataSaveAllowed(false)
, tetapi tidak ada setter masing-masing. Karenanya, Anda hanya dapat menggunakan pendekatan ini dengan model khusus tempat Anda dapat menambahkan setter untuk bidang tersebut. Untuk Magento atau model lain yang tidak Anda kontrol, gunakan pendekatan pengecualian.Jika Anda perlu mencegah metode penyimpanan untuk mengeksekusi untuk model inti (yaitu Katalog / Produk), Anda dapat menggunakan refleksi untuk menetapkan "$ _dataSaveAllowed" menjadi false:
sumber
Anda harus mencoba jawaban @Simon terlebih dahulu. Tetapi jika Anda masih harus menyimpan untuk kedua kondisi, maka Anda dapat menggunakan cocept ini
Apa metode ini adalah, pertama-tama akan mengumpulkan data yang sesuai dengan entitas yang akan menyimpan dan kemudian mengatur data saat ini dengan nilai itu. Hasil ini menyimpan nilai sebelumnya sendiri ke dalam database. Jika tidak ada id entitas sekarang, itu berarti entitas baru. Jadi simpan nilai null untuk bidang itu
EDIT
Teman saya Simon dan AmitBera bingung pada bagian ini
Jadi akan lebih baik untuk menjelaskan bagian ini sedikit. Misalkan tabel memiliki dua fiels
field_one
danfield_two
. Dalam hal itu, untuk entitas baru (berarti ini tidak memiliki entri dalam database), kita dapat mengatur nilai-nilai seperti ini.Ini akan menghapus nilai yang berlalu dan menetapkan nilai nol. Jadi selama tindakan simpanan, nilai kosong ini akan disimpan dalam database.
Anggaplah bahwa saya mencoba untuk menyampaikan dan tolong jangan menilai berdasarkan kode demo yang saya berikan :)
sumber
before_save
tindakan. Saranasave
danaftersave
tindakan harus dilakukan. Jadi entitas yang diedit mungkin sudah ada dalam database atau yang baru. Jika entitas yang diedit memiliki entri dalam database, kita akan mendapatkan nilai-nilai itu dan mengatur nilai-nilai itu alih-alih nilai-nilai yang berubah saat ini dimiliki oleh entitas / objek. jadi ketika tindakan save terjadi, nilai yang ditetapkan sekarang adalah nilai sebelumnya itu sendiri. Ini tidak membuat pembaruan nilai tabel. Berarti nilai sebelumnya bisa disimpan.setData(null)
tidak berhasil, saya kirasetData(array())
mungkin berfungsi (null array). Ini hanya logikaIni mungkin memengaruhi lebih dari sekadar objek pelanggan yang Anda coba cegah untuk tidak ditabung, tetapi Anda bisa melakukan ini di pengamat Anda untuk mencegah penyimpanan dari diterapkan dalam basis data.
Pengecualian yang dilemparkan saja tidak akan melakukannya, jadi Anda harus mencoba untuk mengembalikan transaksi dengan InnoDB. Namun, mungkin ada lebih dari sekedar akun pelanggan ini yang dimodifikasi / dibuat dalam transaksi itu, jadi gunakan ini dengan hati-hati.
sumber