2012-05-22 42 views
3

我想下面的场景: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. 

任何想法如何让日期类型字段隐藏!??

+0

出于兴趣,为什么要隐藏呢?什么是用例? – Flukey

回答

8

形式

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

注: 您还可以扩展默认的Symfony字段类型添加选项隐藏和扩展型块“form_row”,添加样式=“无显示”:有些浏览器(例如,IE8)获如果设置了“display:none”,则不提交该字段。改为使用'visibility:hidden'。 –

0

形式

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> 
+0

我喜欢这个主意,但是在Symfony2中对此有任何支持吗? – PMoubed

+0

不要这么想...... @ a.aitboudad有其他解决方案,但是如果包含DIV的样式,它仍然可见。在包含DIV - 如果你使用DIV布局 –

1

可以比这更直接的控制形式输出。主题特定的领域很容易。有两个步骤。您需要确保表单字段需要日期的单个字符串表示形式。因此,将日期小部件设置为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

+0

这仍然适用于Symfony 3.4,但您需要重写类型。 {% - set type ='hidden' - %} –

8

创建从DateTime对象的简单DataTransformer串并命名即 '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('Y-m-d 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') 
    ; 
} 
+3

已经存在一个用于此目的的DateTimeTransformer:'Symfony \ Component \ Form \ Extension \ Core \ DataTransformer \ DateTimeToStringTransformer' –

3

更简单。基于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' => 'Y-m-d', 
      'label' => 'popin.from', 
      'required' => true 
     )); 
1

无以前的解决方案与Symfony的3.3工作。我结束了创建一个简单类型:

<?php 

namespace <YourProject>\<YourBundle>\Form\Type; 

use Symfony\Component\Form\Extension\Core\Type\HiddenType; 
use Symfony\Component\Form\DataTransformerInterface; 
use Symfony\Component\Form\FormBuilderInterface; 
use Symfony\Component\Form\Exception\TransformationFailedException; 

class HiddenDateTimeType extends HiddenType implements DataTransformerInterface 
{ 
    /** 
    * {@inheritdoc} 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->addModelTransformer($this); 
    } 

    /** 
    * {@inheritdoc} 
    */ 
    public function transform($data) 
    { 
     return $data->format("Y-m-d H:i:s"); 
    } 

    /** 
    * {@inheritdoc} 
    */ 
    public function reverseTransform($data) 
    { 
     try { 
      return new \DateTime($data); 
     } catch (\Exception $e) { 
      throw new TransformationFailedException($e->getMessage()); 
     } 
    } 

    public function getName() 
    { 
     return 'hidden_datetime'; 
    } 
} 

用它在你的形式是这样的:

<?php 

namespace <YourProject>\<YourBundle>\Form; 

use <YourProject>\<YourBundle>\Form\Type\HiddenDateTimeType; 

class ReportType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('creationTime', HiddenDateTimeType::class, array(
       'required' => true, 
      )); 
    } 
} 

还有什么要补充的services.yml

+0

代码中的轻微错字应该是: '抛出新TransformationFailedException($ E->的getMessage());' – navitronic

+1

@navitronic感谢报告这个错误。这是在实际的代码,并没有被注意到:-) –

相关问题