【问题标题】:SilverStripe - Undefined Index on DataObject onBeforeWriteSilverStripe - DataObject onBeforeWrite 上的未定义索引
【发布时间】:2018-04-18 11:09:16
【问题描述】:

在DataObject 扩展上的official SS guide 之后,我正在发生此异常:

PHP 注意:未定义索引: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-&gt;record['PrezzoIva']) 更改为if (!isset($this-&gt;record['PrezzoIva'])) 仍然会引发异常。

提前感谢您的支持。

更新

似乎通过将控件嵌套在onBeforeWrite 中显然可以解决问题,但这不符合业务逻辑。在第一次尝试onBeforeWrite 时,系统看不到任何$this-&gt;record['PrezzoIva'] 然后失败。另一方面,如果控件与elseif 嵌套,以防其他记录丢失,这些将被忽略。目前我仍在努力。 同时,我注意到在write() 调用时,所涉及的字段也没有被初始化。这只发生在$this-&gt;PrezzoIva 上。其他字段被正确保存。举个例子:

【问题讨论】:

    标签: php silverstripe silverstripe-4


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-17
      • 1970-01-01
      • 2019-12-09
      相关资源
      最近更新 更多