2012-07-11 1 views
0

문자열이나 DateTime 개체를 입력으로 사용할 수있는 사용자 지정 필드가 필요합니다. 토론을 한 후 DataTransformers가 갈 길이라고 결정했습니다. 나는 Cookbook의 지시에 따라,하지만 난 follwing을 오류를 받고 있어요 :DataTransformer를 사용자 지정 필드 형식없이 사용하면 FormFieldType이 예상됩니다.

Catchable Fatal Error: Argument 1 passed to Symfony\Component\Form\FormFactory::loadTypeExtensions() must implement interface Symfony\Component\Form\FormTypeInterface, instance of Yanic\HomeBundle\Form\DataTransformer\DateToStringTransformer given, called in /Applications/MAMP/htdocs/symfony-standard-2.1/vendor/symfony/symfony/src/Symfony/Component/Form/FormFactory.php on line 320 and defined in /Applications/MAMP/htdocs/symfony-standard-2.1/vendor/symfony/symfony/src/Symfony/Component/Form/FormFactory.php line 332

그것이 FormType를 기대하고 있지만, 워드 프로세서가 그 필요는 없습니다 말했다 것으로 보인다. 내가 사용하고 코드의

:

UsersType.php이

public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $transformer = new \Yanic\HomeBundle\Form\DataTransformer\DateToStringTransformer(); 

     $builder 
      ->add('username') 
      ->add('password','password', 
      array(
       'required' => false 
      )) 
      ->add('email') 
      ->addViewTransformer($transformer) 
      ->add('created', 'datetimeToString', array(
       'disabled' => true, 
      )) 
      ->add('modified', 'datetimeToString', array(
       'disabled' => true, 
      )) 
      ->add('isActive', null, array(
       'label' => 'Is active?', 
       'required' => false 
      )) 
      ->add('lastLogin', null, array(
       'empty_data' => 'never', 
       'widget' => 'single_text', 
       'read_only' => true, 
       'label' => 'Last login' 
      )) 
      ->add('modifiedBy', null, array(
       'label' => 'Modified by', 
       'read_only' => true 
      )) 
      ->add('groups') 
     ; 
    } 

DateToStringTransformer.php

namespace Yanic\HomeBundle\Form\DataTransformer; 

use Symfony\Component\Form\DataTransformerInterface; 
use Symfony\Component\Form\Exception\TransformationFailedException; 

class DateToStringTransformer implements DataTransformerInterface 
{ 
    /** 
    * Transforms an DateTime object to a string. 
    * 
    * @param \DateTime|null $issue 
    * @return string 
    */ 
    public function transform($date) 
    { 
     if (null === $date) { 
      return "never"; 
     } 

     return $date->format('d-m-Y H:i'); 
    } 

    /** 
    * Transforms a string (date formatted) to an object (\DateTime). 
    * 
    * @param string $date 
    * @return \DateTime|null 
    * @throws TransformationFailedException 
    */ 
    public function reverseTransform($number) 
    { 
     return $number; 
    } 
} 

services.yml

services: 
    form.dataTransformer.datetimeToString: 
     class: Yanic\HomeBundle\Form\DataTransformer\DateToStringTransformer 
     tags: 
      - { name: form.type, alias: datetimeToString } 

내가 뭘 잘못된?

아, 내가 심포니 2.1 베타를 사용하고 documentation에서

답변

0

그것에 대해 힌트 :

<?php 

use Symfony\Component\Form\FormBuilderInterface; 
use Acme\TaskBundle\Form\DataTransformer\IssueToNumberTransformer; 

class TaskType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     // ... 

     // this assumes that the entity manager was passed in as an option 
     $entityManager = $options['em']; 
     $transformer = new IssueToNumberTransformer($entityManager); 

     // use a normal text field, but transform the text into an issue object 
     $builder 
      ->add('issue', 'text') 
      ->addViewTransformer($transformer) 
     ; 
    } 

    // ... 
} 

"는 일반 텍스트 필드를 사용하지만, 문제의 객체로 텍스트를 변환"* *

서비스에 양식 유형으로 데이터 변환기를 등록했습니다. Symfony는 데이터 변압기를 양식 유형으로 취급합니다.

양식 유형을 작성하고 거기에 데이터 변환기 (예 : doc)를 넣거나 서비스 정의를 제거하려면 datetimeToString 대신 일반 날짜 필드를 사용해야합니다.

하지만이 경우 더 나은 방법이 될 것이라고 생각합니다.

+0

그랬습니다 ... 나는 계속해서 문서를 다시 읽었지만 그 세부 사항을 얻지 못했습니다 .-(고마워요. – Michi

+0

아직 현상금을 수여 할 수는 없지만 최대한 빨리 처리 할 것입니다. 19 개의 누락 된 시간은 끝났습니다 :-) – Michi

+0

symfony-docs에 대한 PR을 통해 몇 가지 내용을 명확히 알 수 있습니다 : https://github.com/symfony/symfony-docs/pull/1488 – l3l0