SilverStripe - DataObject onBeforeWrite 上的未定义索引
SilverStripe - Undefined Index on DataObject onBeforeWrite
在 DataObject
扩展的 official SS guide 之后,我遇到了这个异常:
PHP Notice: Undefined index: PrezzoIva
项目全景图:在主要 write()
执行之前,必须计算一个值并与其他 DataObject
属性成对保存。
这是情况(在 SS 4.0.3 上):
[...]
/**
* 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 (!$this->record['PrezzoIva']) { // <--- This is the line involved
$this->setPrezzoIva();
}
[...]
parent::onBeforeWrite();
}
上面调用的方法:
/**
* Metodo calcolo prezzo lordo IVA
* Setter
* @return void
*/
public function setPrezzoIva()
{
// Controllo IVA
if (empty($this->PrezzoIva)) {
$prezzoIva = ($this->PrezzoUnitario * $this->Iva) + $this->PrezzoUnitario;
// Salvataggio IVA
$this->PrezzoIva = $prezzoIva;
}
}
无论把if (!$this->record['PrezzoIva'])
改成if (!isset($this->record['PrezzoIva']))
还是会抛出异常
在此先感谢您的支持。
更新
似乎通过在onBeforeWrite
中嵌套控件显然可以解决问题,但它不符合业务逻辑。在 onBeforeWrite
的第一次尝试中,系统没有看到任何 $this->record['PrezzoIva']
然后失败。另一方面,如果控件嵌套 elseif
,以防其他记录丢失,这些将被忽略。现在我还在努力。
同时,我注意到所涉及的字段在 write()
调用时都没有被初始化。这只发生在 $this->PrezzoIva
上。其他字段被正确保存。举个例子:
针对此特定案例在正确的条件下工作解决了问题。
在第一个write()
之后,如果没有设置this->record['PrezzoIva']
或者这个等于0(根据Currency
数据类型默认值),调用方法:
// Controllo Record
if (!$this->isInDb()) {
$this->setPrezzoIva();
}
if ((!isset($this->record['PrezzoIva'])) || ($this->record['PrezzoIva'] == 0)) {
$this->setPrezzoIva();
}
关于无数据写入问题,我在这里新开一个:
在 DataObject
扩展的 official SS guide 之后,我遇到了这个异常:
PHP Notice: Undefined index: PrezzoIva
项目全景图:在主要 write()
执行之前,必须计算一个值并与其他 DataObject
属性成对保存。
这是情况(在 SS 4.0.3 上):
[...]
/**
* 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 (!$this->record['PrezzoIva']) { // <--- This is the line involved
$this->setPrezzoIva();
}
[...]
parent::onBeforeWrite();
}
上面调用的方法:
/**
* Metodo calcolo prezzo lordo IVA
* Setter
* @return void
*/
public function setPrezzoIva()
{
// Controllo IVA
if (empty($this->PrezzoIva)) {
$prezzoIva = ($this->PrezzoUnitario * $this->Iva) + $this->PrezzoUnitario;
// Salvataggio IVA
$this->PrezzoIva = $prezzoIva;
}
}
无论把if (!$this->record['PrezzoIva'])
改成if (!isset($this->record['PrezzoIva']))
还是会抛出异常
在此先感谢您的支持。
更新
似乎通过在onBeforeWrite
中嵌套控件显然可以解决问题,但它不符合业务逻辑。在 onBeforeWrite
的第一次尝试中,系统没有看到任何 $this->record['PrezzoIva']
然后失败。另一方面,如果控件嵌套 elseif
,以防其他记录丢失,这些将被忽略。现在我还在努力。
同时,我注意到所涉及的字段在 write()
调用时都没有被初始化。这只发生在 $this->PrezzoIva
上。其他字段被正确保存。举个例子:
针对此特定案例在正确的条件下工作解决了问题。
在第一个write()
之后,如果没有设置this->record['PrezzoIva']
或者这个等于0(根据Currency
数据类型默认值),调用方法:
// Controllo Record
if (!$this->isInDb()) {
$this->setPrezzoIva();
}
if ((!isset($this->record['PrezzoIva'])) || ($this->record['PrezzoIva'] == 0)) {
$this->setPrezzoIva();
}
关于无数据写入问题,我在这里新开一个: