SIlverStripe - 没有数据写入 onBeforeWrite
SIlverStripe - No data written onBeforeWrite
与 相关,使用 onBeforeWrite
方法扩展的 DataObject
不会在数据库上写入特定的 属性 值。详细:
数据对象:
[...]
/**
* 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
编辑后我的数据库的摘录:
目前,我还不知道是什么原因造成的。我们将不胜感激。
提前谢谢大家。
由于某些未知原因,将涉及的 属性 重命名为不同的名称,问题解决了。
我可以假设的唯一原因是,它可能是由于 DataObject
具有许多具有相同前缀名称的属性(PrezzoIva、PrezzoScontato、PrezzoUnitario 等),并且在一些神秘的情况下方式,混淆了 value/proper 领域协会。
你必须看 SilverStripe 中的二传手。 SilverStripe 使用 __set
函数。
当您调用 $this->PrezzoIva
时,它将搜索名为 setPrezzoIva
的方法。如果找不到具有该名称的方法,它将调用方法 setField
。这实际上会按照您的意愿设置字段。
所以您遇到的问题是因为您的方法被调用 setPrezzoIva
。它不是设置值,而是执行您的方法。
要解决此问题,请更改
$this->PrezzoIva = $prezzoIva;
到
$this->setField('PrezzoIva', $prezzoIva);
旁注,我认为罗比是对的,你的条件太严格了。
与 onBeforeWrite
方法扩展的 DataObject
不会在数据库上写入特定的 属性 值。详细:
数据对象:
[...]
/**
* 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
编辑后我的数据库的摘录:
目前,我还不知道是什么原因造成的。我们将不胜感激。
提前谢谢大家。
由于某些未知原因,将涉及的 属性 重命名为不同的名称,问题解决了。
我可以假设的唯一原因是,它可能是由于 DataObject
具有许多具有相同前缀名称的属性(PrezzoIva、PrezzoScontato、PrezzoUnitario 等),并且在一些神秘的情况下方式,混淆了 value/proper 领域协会。
你必须看 SilverStripe 中的二传手。 SilverStripe 使用 __set
函数。
当您调用 $this->PrezzoIva
时,它将搜索名为 setPrezzoIva
的方法。如果找不到具有该名称的方法,它将调用方法 setField
。这实际上会按照您的意愿设置字段。
所以您遇到的问题是因为您的方法被调用 setPrezzoIva
。它不是设置值,而是执行您的方法。
要解决此问题,请更改
$this->PrezzoIva = $prezzoIva;
到
$this->setField('PrezzoIva', $prezzoIva);
旁注,我认为罗比是对的,你的条件太严格了。