SIlverStripe - 没有数据写在BeforeWrite

时间:2018-04-18 15:16:05

标签: php silverstripe silverstripe-4

this issue相关,使用DataObject方法扩展的onBeforeWrite不会在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 screen

目前,我还没弄清楚造成这种情况的原因。任何形式的帮助都将受到赞赏。

先谢谢大家。

2 个答案:

答案 0 :(得分:4)

您必须在SilverStripe中观看制定者。 SilverStripe使用__set函数。

当您致电$this->PrezzoIva时,它会搜索名为setPrezzoIva的方法。如果找不到具有该名称的方法,则会调用方法setField。这将实际设置你想要的字段。

所以您遇到的问题是因为您的方法被称为setPrezzoIva。它不是设置值,而是超出你的方法。

要解决此问题,请更改

$this->PrezzoIva = $prezzoIva;

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

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

答案 1 :(得分:0)

由于某些未知原因,重命名涉及不同名称的属性,解决了这个问题。 我可以假装的唯一原因是,它可能是由DataObject具有许多具有相同前缀名称的属性(PrezzoIva,PrezzoScontato,PrezzoUnitario等)以及某些神秘的事实引起的。方式,是值得/正确的字段关联。