2013-03-15 3 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. Также упоминается, что одно и то же прекрасно работает для текстовых полей.

Любые идеи о том, как я могу остановить symfony от установки значения, если установлен параметр read_only?

+3

вы хотите установить «сопоставленный» в false, если его просто для показа. Если я правильно вас пойму. В противном случае, отправьте некоторый код (больше, чем просто фрагмент твига) – Prisoner

+1

Настройка, сопоставленная с false, делает многое, это также вызывает остановку symfony от чтения значения. – BetaRide

+0

Добавлена ​​форма tyoe и обработка конструктора форм. Пожалуйста, не то, что то же самое отлично работает для текстовых полей. – BetaRide

ответ

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

+0

@thelem Я согласен с тем, что знающий пользователь может изменить значение в скрытом поле. Приложение, в котором появляется ответ, находится за брандмауэром для небольшой некоммерческой организации, чьи пользователи недостаточно осведомлены в этом отношении. У вас есть альтернативное решение? – geoB

+0

Из чтения документов я считаю, что отключенный должен работать так, как вы этого хотите (как описано в другом ответе). Поле, которое имеет значение в базе данных, которое помечено как отключенное, не должно терять это значение при сохранении формы. Для моего варианта использования я в настоящее время передаю информацию в форму отдельно, поэтому форма никогда не обрабатывает это поле. – thelem