[php] Symfony2에서 양식 필드의 기본값을 설정하는 방법은 무엇입니까?

텍스트 양식 필드의 기본값을 설정하는 쉬운 방법이 있습니까?



답변

다음과 같이 생성하는 동안 쉽게 사용할 수 있습니다.

->add('myfield', 'text', array(
     'label' => 'Field',
     'empty_data' => 'Default value'
))


답변

당신은 기본값을 설정할 수 있습니다 empty_data

$builder->add('myField', 'number', ['empty_data' => 'Default value'])


답변

나는 과거에 이것을 몇 번 생각 했으므로 내가 가지고 / 사용했던 다른 아이디어를 적어 놓을 것이라고 생각했습니다. 사용중인 것이있을 수 있지만 “완벽한”Symfony2 솔루션은 없습니다.

생성자
엔티티에서 $ this-> setBar ( ‘default value’); 그러나 이것은 엔티티를로드 할 때마다 호출되며 (db 또는 not) 약간 지저분합니다. 그러나 날짜 또는 기타 필요한 것을 만들 수 있으므로 모든 필드 유형에 대해 작동합니다.

get 내의 문장
이 아니라면 당신은 할 수 있습니다.

return ( ! $this->hasFoo() ) ? 'default' : $this->foo;

팩토리 / 인스턴스 . 데이터로 미리 채워진 기본 엔티티를 제공하는 정적 함수 / 보조 클래스를 호출하십시오. 예 :

function getFactory() {
    $obj = new static();
    $obj->setBar('foo');
    $obj->setFoo('bar');

   return $obj;
}

추가 필드를 추가하면이 기능을 유지해야한다는 것이 실제로 이상적인 것은 아니지만 데이터 세트 / 기본값과 db에서 생성 된 데이터 세트를 분리한다는 의미입니다. 마찬가지로 다른 기본 데이터를 원할 경우 여러 getFactories를 가질 수 있습니다.

확장 / 반사 엔티티
생성시 (생성자를 통해) 기본 데이터를 제공하는 확장 엔티티 (예 : FooCreate extends Foo)를 만듭니다. 팩토리 / 인스턴스 아이디어와 비슷한 다른 접근법-정적 메서드를 개인적으로 선호합니다.

빌드 폼 전에 데이터 설정
생성자 / 서비스에서 새 엔터티가 있는지 또는 데이터베이스에서 데이터가 채워 졌는지 알 수 있습니다. 따라서 새로운 엔터티를 가져올 때 다른 필드에서 집합 데이터를 호출하는 것이 그럴듯합니다. 예 :

if( ! $entity->isFromDB() ) {
     $entity->setBar('default');
     $entity->setDate( date('Y-m-d');
     ...
}
$form = $this->createForm(...)

양식 이벤트
을 만들 때 필드를 만들 때 기본 데이터를 설정합니다. 이 PreSetData 이벤트 리스너를 대체합니다. 이것의 문제는 폼 워크로드 / 코드 복제와 유지 관리 / 이해가 어렵다는 것입니다.

확장 폼
폼 이벤트와 비슷하지만 db / new 엔티티인지에 따라 다른 유형을 호출합니다. 즉, 편집 양식을 정의하는 FooType이 있고 BarType은 FooType을 확장하고 모든 데이터를 필드로 설정합니다. 그런 다음 컨트롤러에서 간단히 어떤 양식 유형을 선택해야하는지 선택하십시오. 그래도 이벤트와 같은 사용자 정의 테마가 있으면 짜증이납니다.

나뭇 가지
필드별로 수행 할 때 고유 한 테마를 만들고 값 옵션을 사용하여 데이터를 기본값으로 지정할 수 있습니다. 템플릿을 깨끗하게 유지하고 재사용 할 수있게하려면 양식 테마로 래핑하지 마십시오. 예 :

form_widget(form.foo, {attr: { value : default } });

JS
필드가 비어 있으면 JS 함수로 양식을 채우는 것이 쉽지 않습니다. 예를 들어 자리 표시 자로 무언가를 할 수 있습니다. 이것은 좋지 않은 아이디어입니다.

서비스로서의 폼
제가 수행 한 큰 폼 기반 프로젝트 중 하나를 위해 모든 폼을 생성하고 모든 처리 등을 수행하는 서비스를 만들었습니다. 이는 폼이 여러 환경에서 여러 컨트롤러에 걸쳐 폼을 사용되기 때문입니다. 같은 방식으로 생성 / 처리되었으며, 서로 다르게 표시 / 상호 작용되었습니다 (예 : 오류 처리, 리디렉션 등). 이 방법의 장점은 데이터를 기본 설정하고 필요한 모든 작업을 수행하며 일반적으로 오류를 처리하는 등 모든 작업을 한 곳에서 캡슐화 할 수 있다는 것입니다.

결론
내가 본 것처럼, 당신은 같은 문제를 반복해서 겪게 될 것입니다. 기본 데이터는 어디에 있습니까?

  • db / doctrine 수준에서 저장하면 매번 기본값을 저장하지 않으려면 어떻게됩니까?
  • 엔터티 수준에서 저장하면 데이터가없는 다른 곳에서 해당 엔터티를 재사용하려는 경우 어떻게됩니까?
  • 엔티티 레벨에 저장하고 새 필드를 추가하는 경우 편집시 이전 버전이 해당 기본값을 갖도록 하시겠습니까? DB의 기본값도 마찬가지입니다 …
  • 양식 수준에서 저장하면 나중에 코드를 유지 관리 할 때 분명합니까?
  • 생성자에있는 경우 여러 장소에서 양식을 사용하면 어떻게됩니까?
  • JS 수준으로 푸시하면 너무 멀어졌습니다. 데이터는 JS에 신경 쓰지 않아야합니다 (우리는 호환성, 렌더링 오류 등을 무시하고 있습니다)
  • 이 서비스는 여러 곳에서 사용하는 경우 훌륭하지만 한 사이트에서 간단한 추가 / 편집 양식을 사용하면 과도합니다 …

이를 위해 매번 문제에 다르게 접근했습니다. 예를 들어 가입 양식 “뉴스 레터”옵션은 양식을 만들기 직전에 생성자에서 쉽고 논리적으로 설정됩니다. 서로 연결된 양식 모음을 만들 때 (예 : 서로 다른 양식 유형의 라디오 단추가 서로 연결됨) 이벤트 리스너를 사용했습니다. 더 복잡한 엔터티 (예 : 자식 또는 많은 기본 데이터가 필요한 엔터티)를 만들 때 필요에 따라 요소 (예 : ‘getFactory’)를 사용하여 요소를 만들었습니다.

이 요구 사항이있을 때마다 약간 다른 방식으로 “올바른”접근 방식이 있다고 생각하지 않습니다.

행운을 빕니다! 나는 당신에게 어떤 식 으로든 생각할 음식을 주었고 너무 많이 흔들리지 않았기를 바랍니다.)


답변

기본값을 설정해야하고 양식이 엔터티와 관련이 있으면 다음 방법을 사용해야합니다.

// buildForm() method
public function buildForm(FormBuilderInterface $builder, array $options) {
    $builder
    ...
    ->add(
        'myField',
        'text',
        array(
            'data' => isset($options['data']) ? $options['data']->getMyField() : 'my default value'
        )
    );
}

그렇지 않으면 myField엔터티에서 값을 가져 오는 대신 항상 기본값으로 설정됩니다.


답변

모델 클래스에서 관련 필드의 기본값을 설정할 수 있습니다 (매핑 정의 또는 직접 값 설정).

또한 FormBuilder는 setData () 메소드를 사용 하여 초기 값을 설정할 수있는 기회를 제공합니다 . 양식 빌더는 양식 클래스 의 createForm () 메소드로 전달됩니다 .

또한 다음 링크를 확인하십시오. http://symfony.com/doc/current/book/forms.html#using-a-form-without-a-class


답변

양식이 엔터티에 바인딩 된 경우 construct 메소드를 사용하여 엔터티 자체의 기본값을 설정하십시오.

public function __construct()
{
    $this->field = 'default value';
}


답변

접근법 1 ( http://www.cranespud.com/blog/dead-simple-default-values-on-symfony2-forms/ )

변수 선언 또는 생성자에서 엔티티의 기본값을 간단히 설정하십시오.

class Entity {
    private $color = '#0000FF';
    ...
}

또는

class Entity {
    private $color;

    public function __construct(){
         $this->color = '#0000FF';
         ...
    }
    ...
}

위 링크의 주석에서 접근법 2와 Symfony2에서 양식 필드의 기본값을 설정하는 방법 에서 Dmitriy의 답변 (허용되지 않음) ?

Dmitriy의 답변에 맞게 FormBuilder로 필드를 추가 할 때 데이터 속성에 기본값을 추가하십시오.

이 속성 속성 기존 엔터티가 아닌 새로운 엔터티 인 경우 에만 null 값을 습니다.

public function buildForm(FormBuilderInterface $builder, array $options) {
    $builder->add('color', 'text', array(
            'label' => 'Color:',
            'data' => (isset($options['data']) && $options['data']->getColor() !== null) ? $options['data']->getColor() : '#0000FF'
        )
    );
}