MoneyField isChanged总是返回true

时间:2016-03-22 15:34:02

标签: silverstripe

我有DataObject Confirmation,如下所示:

<?php

class Confirmation extends DataObject
{

    private static $db = array(
        'Reimbursement' => 'Money',
        'SomeText'      => 'Varchar(255)'
    );

    private static $has_one = array(
        'Page'  => 'Page'
    );

    public function getCMSFields()
    {

        $fields             = parent::getCMSFields();
        $reimbursementField = MoneyField::create('Reimbursement');
        $someTextField      = TextField::create('SomeText');

        $reimbursementField->setAllowedCurrencies(array('SEK'));

        $fields->addFieldsToTab(
            'Root.Main',
            array(
                $reimbursementField,
                $someTextField
            )
        );

        return $fields;

    }

    public function onBeforeWrite()
    {
        parent::onBeforeWrite();
        if($this->isChanged('Reimbursement')) SS_Log::log( print_r ( 'changed', true ), SS_Log::WARN );
    }

}
if($this->isChanged('Reimbursement'))函数中的

onBeforeWrite()将始终评估为true。无论改变什么。即使保存而不进行任何更改 - 它也会触发日志功能。

编辑:在SS_Backtrace::backtrace() Money.php函数中使用setValue()检查堆栈跟踪我发现每次保存Confirmation DataObject时,调用setValue()时不会将$markChanged参数设置为false DataObject.php line 1281,导致$isChanged标记设置为true,并且字段始终表现为DataObject好像它已经改变了。

在记录getChangedFields()&#39; before功能时,我会得到以下输出(保存时不做任何更改)。注意Reimbursement字段存在,[22-Mar-2016 16:28:07] Warning at framework/model/DataObject.php line 2597: Array ( [Reimbursement] => Array ( [before] => [after] => Money Object ( [currency:protected] => SEK [amount:protected] => 25000 [isChanged:protected] => 1 [locale:protected] => [currencyLib:protected] => Zend_Currency Object ( [_options:protected] => Array ( [position] => 8 [script] => [format] => [display] => 2 [precision] => 2 [name] => svensk krona [currency] => SEK [symbol] => kr [locale] => sv_SE [value] => 0 [service] => [tag] => Zend_Locale ) ) [allowedCurrencies:protected] => [value:protected] => [tableName:protected] => [name:protected] => Reimbursement [arrayValue:protected] => [defaultVal:protected] => [failover:protected] => [customisedObject:protected] => [objCache:ViewableData:private] => Array ( ) [class] => Money [extension_instances:protected] => Array ( ) [beforeExtendCallbacks:protected] => Array ( ) [afterExtendCallbacks:protected] => Array ( ) ) [level] => 2 ) ) 为空。我在这里缺少什么?

X1 := $(shell date)
X2 := $(shell cat Makefile)
X3 := $(shell dir p*)
X4 := $(shell ls p*)

example_1:
    @echo $(X1)

example_2:
    @echo $(X2)

example_3:
    @echo $(X3)

example_4:
    @echo $(X4)

0 个答案:

没有答案