Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将占位符或空值添加到Symfony中multiple=true的实体类型_Symfony_Symfony Forms_Placeholder - Fatal编程技术网

将占位符或空值添加到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做这件事怎么样()方法?我很难找到关于它的文档,但描述了如何使用它在选项末尾添加新选项。