Symfony2, Как добавить поле типа скрытой даты в форму?

Я пробую сценарий ниже:

В myclassType

 public function buildForm(FormBuilder $builder, array $options) { $builder ->add('day','hidden') ->add('date', 'hidden' ) ->add('hours') ->add('comment','textarea') ; } 

В myclass

 class myclass { //.. Other stuff /** * @ORM\Column(type="date") * * @var date $date */ protected $date; } 

Во время рендеринга я получаю эту ошибку:

 An exception has been thrown during the rendering of a template ("Catchable Fatal Error: Object of class DateTime could not be converted to string in C:\wamp\www\PMI_sf2\app\cache\dev\twig\fb\40\8957f80f2358a6f4112c3427b387.php line 684") in form_div_layout.html.twig at line 171. 

Любая идея, как я могу сделать поле типа даты скрытым! ??

форма

 $builder ->add('day','hidden') ->add('date',null,array( 'attr'=>array('style'=>'display:none;')) ) ... 

Создайте простой DataTransformer из объекта DateTime в строку и новый тип формы с именем ie hidden_datetime, который использует новый DataTransformer и имеет скрытый тип формы как родительский.

 <?php namespace YourProject\YourBundle\Form\DataTransformer; use Symfony\Component\Form\DataTransformerInterface; class DateTimeToStringTransformer implements DataTransformerInterface { public function __construct() { } /** * @param \DateTime|null $datetime * @return string */ public function transform($datetime) { if (null === $datetime) { return ''; } return $datetime->format('Ymd H:i:s'); } /** * @param string $datetimeString * @return \DateTime */ public function reverseTransform($datetimeString) { $datetime = new \DateTime($datetimeString); return $datetime; } } 

..

 <?php namespace YourProject\YourBundle\Form\Type; use Symfony\Component\Form\AbstractType; use Symfony\Component\OptionsResolver\OptionsResolverInterface; use Symfony\Component\Form\FormBuilderInterface; use YourProject\YourBundle\Form\DataTransformer\DateTimeToStringTransformer; class HiddenDateTimeType extends AbstractType { public function __construct() { } public function getName() { return 'hidden_datetime'; } public function getParent() { return 'hidden'; } public function buildForm(FormBuilderInterface $builder, array $options) { $transformer = new DateTimeToStringTransformer(); $builder->addModelTransformer($transformer); } public function setDefaultOptions(OptionsResolverInterface $resolver) { parent::setDefaultOptions($resolver); $resolver->setDefaults(array( )); } } 

зарегистрируйте новый тип формы 'hidden_datetime' как службу в services.yml

 yourproject.hidden_datetime.form.type: class: YourProject\YourBundle\Form\Type\HiddenDateTimeType tags: - { name: form.type, alias: hidden_datetime } 

Новый тип hidden_datetime может быть использован в вашей форме:

// IN myclassType

 public function buildForm(FormBuilder $builder, array $options) { $builder ->add('createdAt','hidden_datetime') ->add('comment','textarea') ; } 

Еще проще. На основе решения martti

Просто расширяет DateTimeType и определяет родителя как «скрытый».

 <?php namespace YourProject\YourBundle\Form\Type\HiddenDateTimeType use Symfony\Component\Form\Extension\Core\Type\DateTimeType; class HiddenDateTimeType extends DateTimeType { public function getName() { return 'hidden_datetime'; } public function getParent(array $options) { return 'hidden'; } } 

Тип формы регистра в качестве услуги:

 yourproject.hidden_datetime.form.type: class: YourProject\YourBundle\Form\Type\HiddenDateTimeType tags: - { name: form.type, alias: hidden_datetime } 

И у вас будет полный доступ ко всем определенным параметрам DateTimeType

 public function buildForm(FormBuilder $builder, array $options) { $builder ->add('from' , 'hidden_date', array( 'widget' => 'single_text', 'format' => 'Ym-d', 'label' => 'popin.from', 'required' => true )); 

форма

 public function buildForm(FormBuilder $builder, array $options){ $builder ->add('day','hidden') ->add('date') ->add('hours') ->add('comment','textarea'); } 

Посмотреть:

 <form action="{{ path('some-save-action') }}" method="post" {{ form_enctype(form) }}> <div style="display: none"> {{ form_row(form.date) }} </div> {{ form_errors(form) }} {{ form_rest(form) }} <input type="submit" value="Save" class="button confirm big"/> </form> 

Вы можете контролировать вывод формы более непосредственно, чем это. Это довольно просто для конкретных областей. Есть два шага. Вы должны убедиться, что поле формы ожидает однострочное представление даты. Поэтому установите виджет даты в single_text . Затем переопределите поле даты, чтобы вывести скрытое поле вместо текстового поля.

форма

 $builder->add('date', 'date', array('widget' => 'single_text')); 

прут

 {% form_theme form _self %} {# Makes all dates hidden, you can also name your field specifically #} {% block date_row %} {{ block('hidden_widget') }} {# This is normally 'field_widget' #} {% endblock %} 

См. http://symfony.com/doc/current/cookbook/form/form_customization.html#form-theming.