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

旁注,我认为罗比是对的,你的条件太严格了。