0

按照官方 SS 扩展指南DataObject我遇到了这个异常:

PHP 通知:未定义索引:PrezzoIva

DataObject项目全景:在主write()执行之前,必须计算一个值并与其他属性成对保存。这是情况(在 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. 其他字段被正确保存。这里有一个例子:

DB画面

4

1 回答 1

0

为这个特定案例在正确的条件下工作解决了这个问题。在第一个之后write(),如果没有this->record['PrezzoIva']设置或者这个等于零(根据Currency数据类型默认值),则调用该方法:

        // Controllo Record
        if (!$this->isInDb()) {
            $this->setPrezzoIva();
        }
        if ((!isset($this->record['PrezzoIva'])) || ($this->record['PrezzoIva'] == 0)) {
            $this->setPrezzoIva();
        }

关于无数据写入的问题,我这里开了一个新的:SilverStripe - No datawritten onBeforeWrite

于 2018-04-18T14:22:15.893 回答