0

此问题相关,DataObject扩展的 withonBeforeWrite方法不会在 DB 上写入特定的属性值。详细地:

数据对象:

[...] 
/**
 * 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经过几次编辑,这里是我的数据库的摘录:

DB画面

目前,我不知道是什么原因造成的。任何形式的帮助将不胜感激。

提前谢谢大家。

4

2 回答 2

4

您必须在 SilverStripe 中观看二传手。SilverStripe 使用该__set功能。

当你调用$this->PrezzoIva它时,它会搜索一个名为setPrezzoIva. 如果找不到具有该名称的方法,它将调用该方法setField。这实际上会像你想要的那样设置字段。

所以你遇到的问题是因为你的方法被调用了setPrezzoIva。它不是设置值,而是执行您的方法。

要解决此问题,请更改

$this->PrezzoIva = $prezzoIva;

$this->setField('PrezzoIva', $prezzoIva);

顺便说一句,我认为罗比是对的,你的条件太严格了。

于 2018-04-19T08:59:07.820 回答
0

由于某些未知原因,用不同的名称重命名所涉及的属性,解决了这个问题。我可以假设好的唯一原因是,它可能是由于DataObject具有许多具有相同前缀名称的属性(PrezzoIva、PrezzoScontato、PrezzoUnitario 等),并且以某种神秘的方式混淆了值/正确的字段关联。

于 2018-04-19T08:19:40.990 回答