Inserting a Hidden Date Field in a Symfony Form

From Littledamien Wiki
Jump to navigation Jump to search

Overview[edit]

This demonstrates creating and using a data transformation class in Symfony forms.[1]

DataTransformer class[edit]

// src/YourBundle/Form/DataTransformer/DateTimeToStringTransformer

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;
    }
}

Form type class for the new "hidden date" field type[edit]

// src/YourBundle/Form/Type/HiddenDateTimeType.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(
        ));
    }    
}

Register the new field type as a service[edit]

# app/config.services.yml
# ...
yourproject.hidden_datetime.form.type:
    class: YourProject\YourBundle\Form\Type\HiddenDateTimeType
    tags:
        - { name: form.type, alias: hidden_datetime }

Usage in forms[edit]

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

Notes[edit]