programing

Symfony2에서 양식 필드의 기본값을 설정하는 방법

minecode 2023. 1. 4. 20:20
반응형

Symfony2에서 양식 필드의 기본값을 설정하는 방법

텍스트 양식 필드의 기본값을 쉽게 설정할 수 있는 방법이 있습니까?

할 수 .empty_data

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

를 사용하여 작성 중에 쉽게 사용할 수 있습니다.

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

과거에 몇 번 생각해 본 적이 있기 때문에, 지금까지의 다양한 아이디어를 적어 두려고 생각하고 있습니다.유용하게 쓰일 수도 있지만, "완벽한" Symfony2 솔루션은 없습니다.

컨스트럭터 엔티티에서는 $this->setBar('default value')를 실행할 수 있지만 엔티티를 로드할 때마다 호출되며(db 또는 not) 조금 복잡합니다.그러나 모든 필드 유형에 대해 사용할 수 있습니다. 날짜 또는 기타 필요한 항목을 작성할 수 있습니다.

진술이 맞다면 안 맞겠지만 넌 할 수 있어

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

공장/인스턴스데이터가 미리 채워진 기본 엔티티를 제공하는 정적 함수/보조 클래스를 호출합니다.예.

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

   return $obj;
}

필드를 추가할 경우 이 함수를 유지해야 한다는 점을 고려할 때 그다지 이상적이지 않지만, 이는 데이터 세터 / 기본값과 DB에서 생성된 데이터를 분리해야 함을 의미합니다.마찬가지로 다른 기본 데이터를 원하는 경우 getFactories를 여러 개 가질 수 있습니다.

확장/반영 도면요소 작성 시(생성자를 통해) 기본 데이터를 제공하는 확장 도면요소(예: FooCreate extensions Foo)를 작성합니다.공장/인스턴스 아이디어와 마찬가지로 다른 접근법일 뿐입니다.개인적으로는 정적 방법을 선호합니다.

빌드데이터 설정 생성자/서비스에서 새 엔티티가 있는지 또는 DB에서 입력되었는지 여부를 알 수 있습니다.따라서 새 엔티티를 잡을 때 다른 필드의 세트 데이터를 호출할 수 있습니다.예.

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

양식 이벤트 양식을 만들 때 필드를 만들 때 기본 데이터를 설정합니다.이 설정은 PreSetData 이벤트청취자를 사용하여 덮어씁니다.이 문제의 문제는 양식 워크로드/코드의 중복으로 유지 보수/이해가 어려워진다는 것입니다.

확장 양식 - 양식 이벤트와 유사하지만 DB/새 도면요소인지 여부에 따라 다른 유형을 호출합니다.즉, 편집 폼을 정의하는 FooType이 있으며 BarType은 FooType을 확장하고 모든 데이터를 필드로 설정합니다.그런 다음 컨트롤러에서 실행할 양식 유형을 선택합니다.커스텀 테마를 가지고 있고 이벤트를 좋아하는 경우, 너무 많은 유지보수를 할 수 있습니다.

트위그 필드 단위로 수행하는 경우에도 value 옵션을 사용하여 자신만의 테마를 만들고 데이터를 기본화할 수 있습니다.폼테마로 포장하는 것은 막을 수 없습니다.템플릿을 깔끔하게 유지하고 폼을 재사용할 필요가 있습니다.

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

필드가 비어 있는 경우 JS 함수로 폼을 채우는 것은 간단해집니다.예를 들어 자리 표시자를 사용하여 작업을 수행할 수 있습니다.하지만 이건 좋지 않은 생각이야.

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

결론 제가 보기엔 몇 번이고 같은 문제에 직면하게 될 것입니다. 기본 데이터는 어디에 저장됩니까?

  • 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엔티티에서 값을 가져오는 대신 항상 기본값으로 설정됩니다.

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

또한 Form Builder는 setData() 메서드를 사용하여 초기값을 설정할 수 있습니다.폼빌더는 폼클래스의 createForm() 메서드로 전달됩니다.

또, 다음의 링크도 확인해 주세요.http://symfony.com/doc/current/book/forms.html#using-a-form-without-a-class

양식이 엔티티에 바인드되어 있는 경우는, 다음의 구성 방법을 사용해 엔티티 자체에 디폴트치를 설정합니다.

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의 답변에서 수정된 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'
        )
    );
}

주로 클래스 없이 폼을 사용하거나 기본값을 설정하기 위해 서비스에 액세스해야 할 때 사용하는 모든 케이스/접근에 대한 일반적인 솔루션:

// src/Form/Extension/DefaultFormTypeExtension.php

class DefaultFormTypeExtension extends AbstractTypeExtension
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        if (null !== $options['default']) {
            $builder->addEventListener(
                FormEvents::PRE_SET_DATA,
                function (FormEvent $event) use ($options) {
                    if (null === $event->getData()) {
                        $event->setData($options['default']);
                    }
                }
            );
        }
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefault('default', null);
    }

    public function getExtendedType()
    {
        return FormType::class;
    }
}

폼 확장자를 등록합니다.

app.form_type_extension:
    class: App\Form\Extension\DefaultFormTypeExtension
    tags:
        - { name: form.type_extension, extended_type: Symfony\Component\Form\Extension\Core\Type\FormType }

다음에는 '아까', '아까', '아까' 이렇게 쓰면 돼요.default옵션을 선택합니다.

$formBuilder->add('user', null, array('default' => $this->getUser()));
$formBuilder->add('foo', null, array('default' => 'bar'));

할 수 있습니다.message 이렇게요.

$defaultData = array('message' => 'Type your message here');
$form = $this->createFormBuilder($defaultData)
    ->add('name', 'text')
    ->add('email', 'email')
    ->add('message', 'textarea')
    ->add('send', 'submit')
    ->getForm();

양식이 엔티티에 매핑된 경우 다음과 같이 할 수 있습니다(기본 사용자 이름 등).

$user = new User();
$user->setUsername('John Doe');

$form = $this->createFormBuilder($user)
    ->add('username')
    ->getForm();

사용하지 않음:

'data' => 'Default value'

여기: https://symfony.com/doc/current/reference/forms/types/form.html#data

"데이터 옵션은 렌더링 시 도메인 데이터(개체)에서 가져온 값을 항상 덮어씁니다.즉, 폼이 이미 지속된 오브젝트를 편집할 때 오브젝트 값도 덮어쓰기되므로 폼이 전송될 때 지속된 값이 손실됩니다."


다음을 사용합니다.

이 예에서는 엔티티 Foo가 있고 기본적으로 체크할 필드 "active"(이 예에서는 CheckBoxType이지만 프로세스는 다른 모든 유형과 동일)가 있다고 가정합니다.

FooFormType 클래스에서 다음을 추가합니다.

...
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
...
public function buildForm( FormBuilderInterface $builder, array $options )
{
    ...

    $builder->add('active', CheckboxType::class, array(
        'label' => 'Active',
    ));

    $builder->addEventListener(
        FormEvents::PRE_SET_DATA,
        function(FormEvent $event){                 
            $foo = $event->getData();
            // Set Active to true (checked) if form is "create new" ($foo->active = null)
            if(is_null($foo->getActive())) $foo->setActive(true);
        }
   );
}
public function configureOptions( OptionsResolver $resolver )
{
    $resolver->setDefaults(array(
        'data_class' => 'AppBundle:Foo',
    ));
}
->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
     $form = $event->getForm(); 
     $data = $event->getData(); 

     if ($data == null) {
         $form->add('position', IntegerType::class, array('data' => 0));
     }

});

솔루션:

$defaultvalue = $options['data']->getMyField();
$builder->add('myField', 'number', array(
            'data' => !empty($defaultvalue) ? $options['data']->getMyField() : 0
        )) ;

그냥 내가 문제를 이해하도록.

도면요소의 데이터를 기반으로 양식 작성 방법을 조정하려고 합니다.엔티티를 작성하는 경우 기본값을 사용합니다.엔티티가 존재하는 경우 데이터베이스 값을 사용합니다.

개인적으로는 @Molecular Mans의 솔루션이 최선이라고 생각합니다.컨스트럭터 또는 속성 스테이트먼트에서 기본값을 설정할 수 있습니다.하지만 당신은 그 접근법을 좋아하지 않는 것 같군요.

대신, http://symfony.com/doc/current/cookbook/form/dynamic_form_modification.html 를 참조해 주세요.

청취자를 폼타입에 걸어두면 엔티티를 검사하고 신규 엔티티 또는 기존 엔티티를 기반으로 해당 엔티티를 적절히 추가 스테이트먼트를 조정할 수 있습니다.수신기로 코딩할 수도 있지만 기본값을 지정해야 합니다.또는 양식 유형으로 전달합니다.

일이 많은 것 같은데.엔티티를 기본값이 이미 설정된 양식에 전달하는 것이 좋습니다.

를 사용하고 있는 경우FormBuilder양식을 생성하는 symfony 2.7에서는 초기 데이터를createFormBuilder컨트롤러의 방법

$values = array(
    'name' => "Bob"
);

$formBuilder = $this->createFormBuilder($values);
$formBuilder->add('name', 'text');

작성 양식에서 '데이터'를 설정한 경우 엔티티를 편집할 때 이 값은 수정되지 않습니다.

솔루션은 다음과 같습니다.

public function buildForm(FormBuilderInterface $builder, array $options) {
    // In my example, data is an associated array
    $data = $builder->getData();

    $builder->add('myfield', 'text', array(
     'label' => 'Field',
     'data' => array_key_exits('myfield', $data) ? $data['myfield'] : 'Default value',
    ));
}

안녕.

종종 양식 i의 초기 기본값에 고정장치를 사용합니다.물론 이 방법이 쉽지는 않지만, 매우 편안합니다.

예:

class LoadSurgeonPlanData implements FixtureInterface
{
    public function load(ObjectManager $manager)
    {
        $surgeonPlan = new SurgeonPlan();

        $surgeonPlan->setName('Free trial');
        $surgeonPlan->setPrice(0);
        $surgeonPlan->setDelayWorkHours(0);
        $surgeonPlan->setSlug('free');

        $manager->persist($surgeonPlan);
        $manager->flush();        
    }   
}

그러나 Symfony 유형 필드에는 옵션 데이터가 있습니다.

$builder->add('token', 'hidden', array(
    'data' => 'abcdef',
));

매우 간단한 방법이 있습니다.기본값은 다음과 같이 설정할 수 있습니다.

$defaults = array('sortby' => $sortby,'category' => $category,'page' => 1);

$form = $this->formfactory->createBuilder('form', $defaults)
->add('sortby','choice')
->add('category','choice')
->add('page','hidden')
->getForm();

기본값은 대응하는 엔티티를 설정함으로써 설정됩니다.엔티티를 폼으로 바인드하기 전에 색상 필드를 "#0000"으로 설정합니다.FF":

// controller action
$project = new Project();
$project->setColor('#0000FF');
$form = $this->createForm(new ProjectType(), $project);

해당 필드가 엔티티에 바인딩되어 있는 경우(그 엔티티의 속성) 해당 필드에 기본값을 설정할 수 있습니다.

예:

public function getMyField() {
    if (is_null($this->MyField)) {
        $this->setMyField('my default value');
    }
    return $this->MyField;
}

보통 엔티티에서 특정 필드의 기본값을 설정합니다.

/**
 * @var int
 * @ORM\Column(type="integer", nullable=true)
 */
protected $development_time = 0;

이것은 새 레코드에 적용되거나 기존 레코드에만 업데이트될 수 있습니다.

Brian이 질문한 대로:

empty_data는 값을 지정하지 않고 전송될 때만 필드를 1로 설정하는 것으로 나타납니다.값이 존재하지 않을 때 입력에 1이 기본적으로 표시되도록 양식을 설정할 때는 어떻게 합니까?

할 수 .empty_value

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

이 문제를 해결하기 위해 attr:에 가치를 추가했습니다.

->add('projectDeliveringInDays', null, [
    'attr' => [
          'min'=>'1',
          'value'=>'1'
          ]
     ])

언급URL : https://stackoverflow.com/questions/7913086/how-to-set-default-value-for-form-field-in-symfony2

반응형