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();
        }

关于无数据写入问题,我在这里新开一个: