7

私は以下のシナリオを試しています:

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.

日付型フィールドを非表示にするにはどうすればよいですか!??

4

6 に答える 6

11

$builder
    ->add('day','hidden')
    ->add('date',null,array( 'attr'=>array('style'=>'display:none;')) )
... 
于 2012-05-22T20:59:20.037 に答える
8

DateTimeオブジェクトから文字列への単純なDataTransformerと、新しいDataTransformerを使用し、親として非表示のフォームタイプを持つ'hidden_​​datetime'という名前の新しいフォームタイプを作成します。

<?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')
    ;
}
于 2014-01-13T13:14:32.803 に答える
4

以前のソリューションはどれもSymfony3.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

于 2018-02-06T09:29:41.750 に答える
3

さらに簡単。marttiソリューションに基づく

DateTimeTypeを拡張し、親を「hidden」として定義するだけです。

<?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
        ));
于 2014-02-11T10:12:32.087 に答える
1

これよりも直接フォーム出力を制御できます。特定のフィールドにテーマを設定するのは非常に簡単です。2つのステップがあります。フォームフィールドが日付の単一の文字列表現を期待していることを確認する必要があります。したがって、日付ウィジェットをに設定します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を参照してください

于 2013-11-25T09:55:46.510 に答える
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>
于 2012-05-22T20:56:09.710 に答える