텍스트 양식 필드의 기본값을 설정하는 쉬운 방법이 있습니까?
텍스트 양식 필드의 기본값을 설정하는 쉬운 방법이 있습니까?
답변:
다음과 같이 생성하는 동안 쉽게 사용할 수 있습니다.
->add('myfield', 'text', array(
'label' => 'Field',
'empty_data' => 'Default value'
))
'data'
키를 다음과 같이 변경해야 했습니다.'value'
empty_data
data
쓸모가 없습니다-저장된 값을 덮어 씁니다. empty_data
값을 표시하지 않고 빈 값 제출시 값을 사용하며 선택하지 않은 선택 사항을 저장할 수 없습니다.
당신은 기본값을 설정할 수 있습니다 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 함수로 양식을 채우는 것이 쉽지 않습니다. 예를 들어 자리 표시 자로 무언가를 할 수 있습니다. 이것은 좋지 않은 아이디어입니다.
서비스로서의 폼 제가 수행 한 큰 폼 기반 프로젝트 중 하나를 위해 모든 폼을 생성하고 모든 처리 등을 수행하는 서비스를 만들었습니다. 이는 폼이 여러 환경에서 여러 컨트롤러에 걸쳐 폼을 사용되기 때문입니다. 같은 방식으로 생성 / 처리되었으며, 서로 다르게 표시 / 상호 작용되었습니다 (예 : 오류 처리, 리디렉션 등). 이 방법의 장점은 데이터를 기본 설정하고 필요한 모든 작업을 수행하며 일반적으로 오류를 처리하는 등 모든 작업을 한 곳에서 캡슐화 할 수 있다는 것입니다.
결론 내가 본 것처럼, 당신은 같은 문제를 반복해서 겪게 될 것입니다. 기본 데이터는 어디에 있습니까?
이를 위해 매번 문제에 다르게 접근했습니다. 예를 들어 가입 양식 "뉴스 레터"옵션은 양식을 만들기 직전에 생성자에서 쉽고 논리적으로 설정됩니다. 서로 연결된 양식 모음을 만들 때 (예 : 서로 다른 양식 유형의 라디오 단추가 서로 연결됨) 이벤트 리스너를 사용했습니다. 더 복잡한 엔터티 (예 : 자식 또는 많은 기본 데이터가 필요한 엔터티)를 만들 때 필요에 따라 요소 (예 : '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
엔터티에서 값을 가져 오는 대신 항상 기본값으로 설정됩니다.
$options['data']->getMyField()
와 함께$option['data']['myField']
empty_data
:이 옵션은 제출 된 값이 비어있을 때 필드가 반환 할 값을 결정합니다. 초기 값을 설정하지 않습니다
모델 클래스에서 관련 필드의 기본값을 설정할 수 있습니다 (매핑 정의 또는 직접 값 설정).
또한 FormBuilder는 setData () 메소드를 사용 하여 초기 값을 설정할 수있는 기회를 제공합니다 . 양식 빌더는 양식 클래스 의 createForm () 메소드로 전달됩니다 .
또한 다음 링크를 확인하십시오. http://symfony.com/doc/current/book/forms.html#using-a-form-without-a-class
접근법 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'
)
);
}
예를 들어 form 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();
주로 클래스가없는 양식을 사용하거나 기본값을 설정하기 위해 서비스에 액세스해야 할 때 모든 사례 / 접근 방식에 대한 일반적인 솔루션 :
// 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'));
사용하지 마십시오 :
'data' => 'Default value'
여기를 읽으십시오 : https://symfony.com/doc/current/reference/forms/types/form.html#data
"데이터 옵션은 렌더링 할 때 항상 도메인 데이터 (객체)에서 가져온 값을 재정의합니다. 이는 양식이 이미 지속 된 객체를 편집 할 때 객체 값도 무시되므로 양식을 제출할 때 지속 된 값이 손실됩니다."
다음을 사용하십시오.
이 예에서는 Entity 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',
));
}
'data' => $data['myfield'] ?? 'Default value'
->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));
}
});
$event->setData()
필드를 읽는 대신 호출 하면 더 나아질 수 있습니다.
그냥 문제를 이해합니다.
엔터티의 데이터를 기반으로 폼이 작성되는 방식을 조정하려고합니다. 엔티티가 작성되는 경우 일부 기본값을 사용하십시오. 엔티티가 존재하면 데이터베이스 값을 사용하십시오.
개인적으로 @MolecularMans의 솔루션은 갈 길이라고 생각합니다. 실제로 생성자 또는 속성 문에서 기본값을 설정합니다. 그러나 당신은 그 접근법을 좋아하지 않는 것 같습니다.
대신 다음을 수행 할 수 있습니다. http://symfony.com/doc/current/cookbook/form/dynamic_form_modification.html
양식 유형에 리스너를 매달면 엔티티를 검사하고 새 엔티티 또는 기존 엔티티를 기반으로 빌더-> 추가 명령문을 조정할 수 있습니다. 청취자에서 기본값을 코딩 할 수는 있지만 여전히 기본값을 어딘가에 지정해야합니다. 또는 양식 유형으로 전달하십시오.
그래도 많은 일처럼 보입니다. 기본값이 이미 설정된 상태로 엔터티를 양식에 전달하는 것이 좋습니다.
종종, 양식 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();
}
}
그러나 심포니 유형 필드에는 data 옵션이 있습니다 .
예
$builder->add('token', 'hidden', array(
'data' => 'abcdef',
));
작성 양식에서 '데이터'를 설정하면 엔티티를 편집 할 때이 값이 수정되지 않습니다.
내 해결책은 다음과 같습니다
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',
));
}
안녕.
'data' => $data['myfield'] ?? 'Default value',
해당 엔티티를 구성하여 기본값을 설정합니다. 양식에 엔티티를 바인딩하기 전에 색상 필드를 "# 0000FF"로 설정하십시오.
// 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;
}