与this issue相关,使用DataObject
方法扩展的onBeforeWrite
不会在DB上写入特定的属性值。详细说明:
数据对象:
[...]
/**
* Classe Prodotto
*/
class Prodotto extends DataObject
{
// Dichiarazione Proprietà
private static $db = [
[...]
'PrezzoIva' => 'Currency',
[...]
onBeforeWrite
方法:
/**
* Metodo gestione azioni salvataggio
* Calcolo automatico prezzo lordo e scontato
* Setter
* @return void
*/
public function onBeforeWrite()
{
// Controllo Record
if (!$this->isInDb()) {
$this->setPrezzoIva();
}
if ((!isset($this->record['PrezzoIva'])) || ($this->record['PrezzoIva'] == 0)) {
$this->setPrezzoIva();
}
parent::onBeforeWrite();
}
上述方法调用的方法:
/**
* Metodo calcolo prezzo lordo IVA
* Setter
* @return void
*/
public function setPrezzoIva()
{
// Controllo IVA
if ((isset($this->PrezzoIva)) && ($this->PrezzoIva == 0)) {
$prezzoIva = ($this->PrezzoUnitario * $this->Iva) + $this->PrezzoUnitario;
// Salvataggio IVA
$this->PrezzoIva = $prezzoIva;
}
}
没有异常抛出。基本上,在第一个write()
以及其他保存中,PrezzoIva
都没有更新(它保留默认值)。
在经过少量DataObject
修改后,我的数据库中的摘录:
目前,我还没弄清楚造成这种情况的原因。任何形式的帮助都将受到赞赏。
先谢谢大家。
答案 0 :(得分:4)
您必须在SilverStripe中观看制定者。 SilverStripe使用__set
函数。
当您致电$this->PrezzoIva
时,它会搜索名为setPrezzoIva
的方法。如果找不到具有该名称的方法,则会调用方法setField
。这将实际设置你想要的字段。
所以您遇到的问题是因为您的方法被称为setPrezzoIva
。它不是设置值,而是超出你的方法。
要解决此问题,请更改
$this->PrezzoIva = $prezzoIva;
到
$this->setField('PrezzoIva', $prezzoIva);
在旁注中,我认为罗比是对的,你的条件太严格了。
答案 1 :(得分:0)
由于某些未知原因,重命名涉及不同名称的属性,解决了这个问题。
我可以假装的唯一原因是,它可能是由DataObject
具有许多具有相同前缀名称的属性(PrezzoIva,PrezzoScontato,PrezzoUnitario等)以及某些神秘的事实引起的。方式,是值得/正确的字段关联。