将占位符或空值添加到Symfony中multiple=true的实体类型
我想这样做:将占位符或空值添加到Symfony中multiple=true的实体类型,symfony,symfony-forms,placeholder,Symfony,Symfony Forms,Placeholder,我想这样做: $builder->add('participants', EntityType::class, array( 'label' => 'Teilnehmer', 'class' => SchoolUser::class, 'multiple' => true, 'choices' => $this->getParticipantsOfEntry($builder),
$builder->add('participants', EntityType::class, array(
'label' => 'Teilnehmer',
'class' => SchoolUser::class,
'multiple' => true,
'choices' => $this->getParticipantsOfEntry($builder),
'empty_value' => 'All',
'empty_data' => null,
'preferred_choices' => array(null)
));
但我根本没有选择“全部”字段。这应该不难,我不知道我的错误在哪里
'placeholder' = 'All',
也不适合我
我怎样才能做到这一点?我知道这个问题是4个月前提出的,但我遇到了类似的问题,所以我想我会分享我的解决方案,以防它对其他人有帮助 首先在表单对象中:
class MealFormType extends AbstractType {
public function buildForm( FormBuilderInterface $builder, array $options ) {
$builder->add( 'courses', EntityType::class, array(
'class' => MealCourse::class,
'multiple' => true,
) );
$builder->addEventListener( FormEvents::PRE_SUBMIT, function( FormEvent $event ) {
// Remove added entries here... maybe something like
$data = $event->getData();
if( ($key = array_search( 'all', $data['courses'] ) ) !== false ) {
unset( $data['courses'][$key] );
$event->setData( $data );
}
} );
}
public function configureOptions( OptionsResolver $resolver ) {
$resolver->setDefaults( ['data_class' => Meal::class] );
}
public function finishView( FormView $view, FormInterface $form, array $options) {
$newChoice = new ChoiceView( null, 'all', 'I want them all!' );
array_unshift( $view->children['courses']->vars['choices'], $newChoice );
}
}
这就创造了一种可以选择多种膳食的形式,如开胃菜、汤、沙拉、主菜、咖啡、沙漠等等。。。使用buildForm()
方法。此外,在这种方法中,添加了PRE_SUBMIT事件的事件侦听器,其工作是删除我们添加的任何选项,因为它们可能不是真实的(如果是,我们就不必以这种痛苦的方式添加它们)
它在configureOptions()
中像往常一样设置数据类
最后,它提供了finishView()
方法,该方法创建一个值为'all'的新选项,该选项将在选择中显示为'I want all',然后将其添加到“courses”表单条目的“choices”数组的开头(这将是$view->children['courses']->vars['choices'[]=$newChoice;
将其放在末尾)
好的,这很好,但是它除了有一个额外的选项来单击或取消单击之外,实际上没有做任何事情。要使用它,我们需要一些Javascript来管理表单。我只是把这个Javascript放在我的小树枝文件的底部,然后使用jQuery
细枝文件:
{% block body %}
{{ form_start(mealForm) }}
{{ form_row(mealForm.courses,
{'attr': {'class': 'js-meal_course-select'}}) }}
<button type="submit">Save</button>
{{ form_end(mealForm) }}
{% endblock %}
{% block javascripts %}
{{ parent() }}
<script>
var mealCourseAllSelected = false;
jQuery(document).ready( function() {
// This will be called whenever an entry is selected or deselected
$('.js-meal_course-select').change( function() {
var selectedSet = $(this).val();
if( mealCourseAllSelected &&
(selectedSet.length != $(this).get(0).options.length - 1 ||
selectedSet.includes( 'all' )) ) {
var opts = $(this).get(0).options;
var len = opts.length;
for( var i = 0; i < len; ++i ) {
if( opts[i].value == 'all' ) opts[i].selected = false;
}
mealCourseAllSelected = false;
} else if( selectedSet.includes( "all" ) ||
selectedSet.length == $(this).get(0).options.length - 1 ) {
$('.js-meal_course-select option').prop( 'selected', true );
mealCourseAllSelected = true;
}
}
);
</script>
{% endblock %}
{%block body%}
{{form_start(mealForm)}}
{{form_row(mealForm.courses,
{'attr':{'class':'js-mean_course-select'}}}
拯救
{{form_end(mealForm)}}
{%endblock%}
{%block javascripts%}
{{parent()}}
var mealCourseAllSelected=false;
jQuery(文档).ready(函数(){
//无论何时选择或取消选择条目,都将调用此函数
$('.js-fine_course-select').change(函数(){
var selectedSet=$(this.val();
如果(mealCourseAllSelected&&
(selectedSet.length!=$(this.get(0).options.length-1||
selectedSet.includes('all')){
var opts=$(this).get(0).options;
var len=选择长度;
对于(变量i=0;i
JavaScript响应对所选内容的更改。如果值为'all'的选择选项在所选集合中,则所有选择选项都标记为已选,并设置一个标记表示已选。如果除'all'项外的所有选项都已选中,也会执行此操作,因为这是一种定义首先
如果设置了“全部选中”标志并且有更改,则必须至少取消选择一个更改,除非该更改是值为'all'的选择选项,否则它将取消选择值为'all'的选择选项,并清除“全部选中”标志。如果全部选中且用户尝试不选择o仅取消选择值为“全部”的选择选项,它只是被重新选择。遗憾的是,没有!
占位符
选项仅在多个
选项设置为假
时才适用。操,这样做是不可能的吗?无法相信:通过finishView做这件事怎么样()方法?我很难找到关于它的文档,但描述了如何使用它在选项末尾添加新选项。