2013-03-15 77 views
1

我将日期时间表单字段标记为read_only。由于这种接缝没有效果,我推翻了默认的树枝模板。这工作正常。Symfony:使日期时间表单字段真正只读

{% block datetime_widget %} 
    {% if read_only %} 
     {{ value.date.year }}-{{ value.date.month }}-{{ value.date.day }} {{ value.time.hour }}:{{ value.time.minute }} 
    {% else %} 
     {{ parent() }} 
    {% endif %} 
{% endblock %} 

这是我使用的表单类型:

/** 
* @ORM\Entity 
*/ 
abstract class BusinessClass 
{ 

    /** 
    * @ORM\Column(type="datetime") 
    * @var \DateTime 
    */ 
    private $created; 

    /** 
    * @return \DateTime 
    */ 
    public function getCreated() 
    { 
     return $this->created; 
    } 

} 

这是日期时间字段是如何加入到表单生成器:

$formBuilder->add('created', 'datetime', array('read_only' => true)); 

然而,symfony中仍然尝试将未更改的值设置回我的表单类型。由于它是只读的,我只实现了get方法,但没有设置方法。这就是为什么我得到这个错误信息:

InvalidPropertyException: Neither element "created" nor method "setCreated()" exists in class "Cinergy\ShopBundle\Tests\Functional\TestBundle\Entity\RecurringProduct" 

    in /Users/ernst/Source/php/cinergy/shop/vendor/symfony/symfony/src/Symfony/Component/Form/Util/PropertyPath.php line 552 
    at PropertyPath->writeProperty(object(RecurringProduct), 'created', null, false, null) in /Users/ernst/Source/php/cinergy/shop/vendor/symfony/symfony/src/Symfony/Component/Form/Util/PropertyPath.php line 318 
    at PropertyPath->setValue(object(RecurringProduct), null) in /Users/ernst/Source/php/cinergy/shop/vendor/symfony/symfony/src/Symfony/Component/Form/Extension/Core/DataMapper/PropertyPathMapper.php line 74 
    at PropertyPathMapper->mapFormsToData(array('created' => object(Form), 'duration' => object(Form), 'id' => object(Form), 'name' => object(Form), 'price' => object(Form), 'sku' => object(Form), 'updated' => object(Form), '__entity' => object(Form), '__id' => object(Form)), object(RecurringProduct)) in /Users/ernst/Source/php/cinergy/shop/vendor/symfony/symfony/src/Symfony/Component/Form/Form.php line 569 
    at Form->bind(object(Request)) in /Users/ernst/Source/php/cinergy/shop/src/Cinergy/DaylightBundle/Controller/BrowserController.php line 123 
    at BrowserController->updateAction(object(Request)) 
    at call_user_func_array(array(object(BrowserController), 'updateAction'), array(object(Request))) in /Users/ernst/Source/php/cinergy/shop/src/Cinergy/CommonBundle/EventListener/TransactionWrapper.php line 34 
    at TransactionWrapper->wrappedExecution(object(Request)) 
    at call_user_func_array(array(object(TransactionWrapper), 'wrappedExecution'), array(object(Request))) in /Users/ernst/Source/php/cinergy/shop/app/bootstrap.php.cache line 1426 
    at HttpKernel->handleRaw(object(Request), '1') in /Users/ernst/Source/php/cinergy/shop/app/bootstrap.php.cache line 1390 
    at HttpKernel->handle(object(Request), '1', true) in /Users/ernst/Source/php/cinergy/shop/app/bootstrap.php.cache line 1566 
    at HttpKernel->handle(object(Request), '1', true) in /Users/ernst/Source/php/cinergy/shop/app/bootstrap.php.cache line 617 
    at Kernel->handle(object(Request)) in /Users/ernst/Source/php/cinergy/shop/web/app_dev.php line 28 

因为这是我的业务逻辑的一部分,我不想实现一个setCreate方法。同样值得一提的是,对于文本字段来说,同样的事情效果很好。

任何关于如何设置read_only选项来阻止symfony设置的想法?

+3

如果您希望将'mapped'设置为false,则只需显示它。如果我正确理解你的话。否则,发布一些代码(不仅仅是枝条片段) – Prisoner 2013-03-15 16:46:30

+1

将映射为false的设置做得太多了,它也会从读取值的过程中解释symfony。 – BetaRide 2013-03-18 06:43:54

+0

添加了表单tyoe和表单生成器处理。请不要说,同样的事情对文本字段工作正常。 – BetaRide 2013-03-18 06:44:58

回答

2

简短的回答是:使用disabled而不是read_only

找到relevant part in the docs后,我认为read_only的日期时间呈现不正确。只有设置read_only没有改变。根据文档,它应该被改为只读HTML。

-1

不幸的是,如果映射字段被设置为禁用,那么它不会被保留。它的值变为空,这可能不是OP正在寻找的东西。另一种解决方案是做这样的事情在你的模板如下:

{% if household.dateAdded is not null %}{{ household.dateAdded|date('m/d/Y') }} 
<input type="hidden" name="household[dateAdded]" value="{{ household.dateAdded|date('m/d/Y') }}"> 
{% endif %} 

其中家庭是窗体名称,dateAdded是映射的字段名。

+0

这是潜在的危险,你让字段显示为只读,但实际上有知识的用户可以更改隐藏字段的值,保存表单并因此更改您不希望它们的数据。除非您信任他们提供该数据,否则绝不应接受用户的数据。 – thelem 2016-10-02 21:34:18

+0

@thelem我会接受一个有知识的用户可以更改隐藏字段中的值。出现答案的应用程序位于一个小型非营利组织的防火墙后面,该组织的用户缺乏这方面的知识。你有替代解决方案吗? – geoB 2016-10-02 22:53:19

+0

从阅读文档我认为残疾人应该按照你的意愿工作(如其他答案中所述)。在数据库中具有值的字段被标记为禁用,在保存表格时不应丢失该值。对于我的用例,我目前正在将信息单独传递给表单,所以表单从不处理该字段。 – thelem 2016-10-03 09:17:37

相关问题