Вопрос: Можно ли получить доступ к классу Form из добавленного элемента?
Примечание: Этот пример сам по себе не имеет смысла, но это не совсем то, что я пытаюсь сделать: просто для простоты
Предположим, у вас есть настраиваемый помощник представления, который обертывает элемент в div. Что-то вроде:
public function render(ElementInterface $element = NULL) {
return '<div class = "myclass">'.$this->view->formElement($element).'<div>';
}
Я хотел бы получить класс myclass из самого элемента и добавить его в div, только если форма была отправлена. Что-то вроде:
public function render(ElementInterface $element = NULL) {
$class='default';
if (isset($_POST['submit'])){
$class=$element->getOption('wrapper_class');
}
return'<div class = "'.$class.'">'.$this->view->formElement($element).'<div>';
}
Это работает (если «отправить» - это имя кнопки отправки), но если у меня есть две формы на одной странице, вторая отправка формы вызовет указанное выше условие, и класс будет применен.
Возможный обходной путь:
class MyForm extends Form {
public function __construct($name = null){
parent::__construct($name);
$this->add([
'name' => 'myElement',
'type' => MyCustomElement::class,
'options' => [
'triggered_by' => $this->getName(),
'wrapper_class'=>'myClass',
],
]);
$this->add([
'name' => $this->getName(),
'type' => 'submit',
'attributes' => [
'value' => 'Go',
'id' => 'submitbutton',
'class'=>'btn btn-success',
],
]);
}
}
а затем: if (isset($_POST[$element->getOption('triggered_by')])){ ... }
Но это работает только в том случае, если настраиваемый элемент добавляется непосредственно в форму. Если он добавлен в набор полей, $this->getName() вернет имя набора полей. Очевидно, что имя можно добавить в виде строки, но я бы хотел избежать этого (опечатки).
Лучшим решением было бы иметь доступ к параметрам / атрибутам основной формы из всех подэлементов, но элементы не расширяют форму (myElement-> extension Element, Form-> extend Fieldset-> extend Element).
...тогда...?






Простой ответ: нет, нельзя. Элементы также могут быть частью набора полей, поэтому они не связаны напрямую с элементом формы.
Вы можете использовать другой подход со своим помощником просмотра. Например: $myHelper::__invoke(Form $form) или $myHelper::setForm(Form $form), который устанавливает форму. Из этого метода вы можете проверить, была ли форма $form::hasValidated(), потому что это говорит нам о том, что форма была опубликована. Затем с помощью $myHelper::render(ElementInterface $element) вы можете добавить некоторую логику для добавления класса-оболочки, как в вашем примере. И в вашем примере объедините классы, чтобы оболочка не заменяла все классы элементов формы (css).
Ваш ответ звучит как хорошее решение, но я немного смущен функцией
__invoke, потому что (насколько я знаю), если вы вызываете помощник просмотра для элемента (текст, флажок, ...), аргумент__invokeдолжен быть экземпляромElementInterface. Кроме того, я не нашел ссылок на функциюsetForm. Единственный способ заставить его работать - это вызвать вспомогательную функцию настраиваемого представления для всей формы, напримерecho $this->myHelper($form);. Можете ли вы опубликовать пример? Спасибо.