Выбор формы Symfony ChoiceType сопоставляет поле связанной сущности - PullRequest
1 голос
/ 21 марта 2019

Не уверен, если это возможно, но я хочу отобразить два варианта моего ChoiceType из двух разных полей Announcement.

Вот ChoiceType в EditAnnouncementType, который я сделал

->add('audience', ChoiceType::class,
        [
            'choices' =>
            [
                'Students: anybody with a student level field populated' => 'students',
                'Employees: anybody with an employee ID number' => 'employees'
            ],
                'expanded' => true,
                'required' => true,
                'multiple' => true
            ])

Вот два поля, которые я хочу, чтобы форма автоматически обновляла для существующей Announcement сущности.

class Announcement
{
    /**
     * @param bool $employees
     *
     * @return $this
     */
    public function setEmployees(bool $employees)
    {
        $this->employees = $employees;
        return $this;
    }

    /**
     * @param bool $students
     *
     * @return $this
     */
    public function setStudents(bool $students)
    {
        $this->students = $students;
        return $this;
    }
}

Вместо этого я работаю с двумя отдельными формами CheckBoxType, однако мне нужно потребовать, чтобы пользователь выбрал хотя бы одну опций, что невозможно (насколько мне известно) как две отдельные формы .

1 Ответ

1 голос
/ 21 марта 2019

Не уверен, правильно ли я понимаю, о чем вы спрашиваете, поэтому позвольте мне перефразировать.
Вы бы хотели, чтобы в вашем поле audience было установлено employees на false и students на true в одном случае, а employees на true и students на false в другом случае?

Если я прав, то вот возможный путь:

class Announcement
{
    public const AUDIENCE_EMPLOYEES = 'employees';
    public const AUDIENCE_STUDENTS = 'students';

    public function getAudience(): array
    {
        $audience = [];

        if($this->employees()) { 
            $audience[] = self::AUDIENCE_EMPLOYEES;
        }
        if($this->employees()) { 
            $audience[] = self::AUDIENCE_STUDENTS;
        }

        return $audience;
    }

    public function setAudience(array $audience): Announcement
    {
        $this->employees = in_array(self::AUDIENCE_EMPLOYEES, $audience);
        $this->students = in_array(self::AUDIENCE_STUDENTS, $audience);

        return $this;
    }
}

Ваш EditAnnouncementType класс уже должен правильно обрабатывать это.
Но может быть улучшено за счет использования констант класса

->add('audience', ChoiceType::class,
    [
        'choices' =>
        [
            'Students: anybody with a student level field populated' => Announcement::AUDIENCE_STUDENTS,
            'Employees: anybody with an employee ID number' => Announcement::AUDIENCE_EMPLOYEES,
        ],
        'expanded' => true,
        'required' => true,
        'multiple' => true,
    ]
)
...