【问题标题】:SIlverStripe - No data written onBeforeWriteSIlverStripe - 没有数据写入 onBeforeWrite
【发布时间】:2018-04-18 15:16:04
【问题描述】:

this issue 相关,使用onBeforeWrite 方法扩展的DataObject 不会在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 编辑后,这里是我的数据库的摘录:

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

提前谢谢大家。

【问题讨论】:

  • 你不能把它简化为if (!$this->PrezzoIva) { $this->PrezzoIva = {your value}; } return parent::onBeforeWrite();吗?你的情况可能有点过分了
  • 嗨@robert,我尝试了你的建议,结果相同。似乎该特定属性有问题。例如,我尝试与同一 DataObject 中的其他人一起尝试,并且它们已正确初始化。以及从关联字段中删除setDisabled(true),或更改数据类型,但没有。即使是直接分配也不起作用(例如$this->PrezzoIva = 10;

标签: php silverstripe silverstripe-4


【解决方案1】:

您必须在 SilverStripe 中观看二传手。 SilverStripe 使用__set 函数。

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

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

要解决这个问题,请更改

$this->PrezzoIva = $prezzoIva;

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

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

【讨论】:

  • 感谢罗伯特和@fatal。我重构了我的方法的逻辑。这些都是有用的提示,我一定会记住它们以备将来使用。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-26
    • 1970-01-01
    • 1970-01-01
    • 2014-10-10
    • 1970-01-01
    相关资源
    最近更新 更多