Symfony2,如何在表单中添加隐藏日期类型字段?

PMo*_*bed 3 php symfony

我正在尝试下面的场景:

myclassType

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

myclass

class myclass
{
    //.. Other stuff

    /**
     * @ORM\Column(type="date")
     *
     * @var date $date
     */
    protected $date;
}
Run Code Online (Sandbox Code Playgroud)

渲染时我收到此错误:

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.
Run Code Online (Sandbox Code Playgroud)

知道我怎么能隐藏日期类型字段!??

a.a*_*dad 9

形成

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

  • 注意:如果设置了`display:none`,某些浏览器(例如IE8)将不会提交该字段.使用`visibility:hidden`代替. (11认同)

mar*_*tti 8

从DateTime对象到string创建一个简单的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;
    }
} 
Run Code Online (Sandbox Code Playgroud)

..

<?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(
        ));
    }    
}
Run Code Online (Sandbox Code Playgroud)

将新的'hidden_​​datetime'表单类型注册为services.yml中的服务

yourproject.hidden_datetime.form.type:
    class: YourProject\YourBundle\Form\Type\HiddenDateTimeType
    tags:
        - { name: form.type, alias: hidden_datetime } 
Run Code Online (Sandbox Code Playgroud)

然后可以在表单中使用新的hidden_​​datetime类型:

// IN myclassType

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

  • 为此目的已经存在DateTimeTransformer:`Symfony\Component\Form\Extension\Core\DataTransformer\DateTimeToStringTransformer` (4认同)