формы symfony: получить второй атрибут в метке для элемента select - PullRequest
0 голосов
/ 15 ноября 2018

У меня есть сущность Institution. В форме пользователь может выбрать один или несколько. Я использую Select2 для конца шрифта. Учреждение имеет атрибут internationalName, который является атрибутом по умолчанию из-за:

Institution.php

public function __toString()
{
    return $this->internationalName;
}

Учреждение также может иметь сокращенное название в качестве атрибута abbreviation. Я хотел бы использовать этот второй атрибут для отображения (если он существует) в форме выбора. Еще лучше было бы то, что это не показано, но вы можете искать это, но я действительно не знаю, возможно ли это вообще.

Я мог бы изменить __toString() так, чтобы он включал abbreviation, но это нежелательно из-за других форм, поэтому я пытаюсь заставить его показываться только в этой форме через

LocationType.php

->add('Institutions', EntityType::class, [
    'class' => Institution::class,
    'label' => 'Connected Institution(s)',
    'multiple' => true,
    'attr' => ['data-select' => 'true', 'data-placeholder' => 'start typing to find your institution...'],
    'constraints' => array(
        new Count(array(
            'min' => 1,
            'minMessage' => "Select at least one institution."))),
    'query_builder' => function (EntityRepository $er) {
        return $er->createQueryBuilder('i')
            ->orderBy('i.internationalName', 'ASC');
    },

Я пытался использовать 'choice_label' => 'abbreviation' (просто в качестве теста), но это делает все метки пустыми , что я действительно не понимаю, почему. Я также попытался 'choice_label' => 'internationalName'.'abbreviation', но это не сработает, потому что нет свойства internationalNameabbreviation. Я думал о создании нового атрибута, где я объединяю два, но учитывая, что 'choice_label' => 'abbreviation' уже приводит к пустому списку, я не думаю, что это будет работать. Любые другие варианты или решения?

edit: по запросу соответствующая часть класса сущности, Institution.php

/**
 * @Assert\NotBlank(message="Please enter the international name.")
 * @ORM\Column(type="string")
 */
private $internationalName;

/**
 * @ORM\Column(type="string", nullable=true)
 */
private $abbreviation;

1 Ответ

0 голосов
/ 15 ноября 2018

Может быть что-то вроде:

https://symfony.com/doc/current/reference/forms/types/choice.html#choice-value

  ->add('Institutions', EntityType::class, [
    'class'         => Institution::class,
    'label'         => 'Connected Institution(s)',
    'query_builder' => function (EntityRepository $er) {
        return $er
          ->createQueryBuilder('i')
          ->orderBy('i.internationalName', 'ASC')
        ;
    },
    'choice_value' => function (Institution $institution = null) {
        return $institution ? $institution->getInternationalName() . '(' . $institution->getAbbreviation() . ')' : '';
    },
  ])
...