Я в ситуации, когда хочу иметь возможность динамически устанавливать опцию required=true/false
или поле формы array(...other stuff..., 'class' => ' hidden')
.Symfony2 динамически назначает attr в поле формы
Контекст следующий: существует сущность «Проект» с некоторыми полями. Когда я создаю другие объекты с формами, я хочу проверить некоторые атрибуты объекта Project и принять решения о видимости/необходимости определенных полей создаваемого объекта.
Например, если проект имеет атрибут «timePressure = high», тогда поле данной сущности не требуется (но является видимым). Если есть другие условия, он становится невидимым и т. Д.
Так что в основном я надеялся вызвать функцию внутри каждого конструктора форм, чтобы выплюнуть соответствующие части (например, эта функция вернет строку с обязательным = true "или другой, относящийся к скрытому классу). Дело в том, что функция должна принимать в качестве аргументов: projectID (ok, это может быть передано как параметры конструктора форм), класс и поле, о котором мы говорим, чтобы решить. Я предполагая что-то вроде:
->add('background', 'textarea', array('attr' => array('rows' => 4, functionToDecideIfInvisible($projectId)), functionToDecideRequiredness($projectId)))
Обе функции возвратит строку 'class' => ' hidden'
и required=true
(или ложные)
Я хотел бы, чтобы избегать того, чтобы указать имя поля (в данном случае background
) чтобы избежать повторения кода.
Можно ли это сделать?
Другие предложения о том, как решить эту проблему?
Спасибо!
SN
Это интересная особенность, которую я не знаю ... но я мог бы достичь того же без слушателя событий, если я хочу, чтобы вставить логика там. Я мог бы просто проверить поле проекта и добавить поле так или иначе. Но то, что я искал, - это способ запросить БД, где у меня есть список всех возможных полей и всех полей проекта. Я бы хотел вызвать функцию внутри «add», и функция: 1) получить форму поля, которую она вызвала, 2) проверить DB, вернуть желаемый атрибут/класс. Возможно ли это? –
@ Серхионегри, я думаю, что ваш подход неправильный. Вы не можете вызвать свою функцию внутри «добавить». Вместо этого вы должны вызывать функцию «добавить» внутри прослушивателя событий с разными атрибутами/классами. – SpartakusMd
Ок, спасибо, жаль, что этого не может быть сделано :(! –