Zend framework 2: доступ к классу формы из добавленных элементов

Вопрос: Можно ли получить доступ к классу 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).

...тогда...?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
55
1

Ответы 1

Простой ответ: нет, нельзя. Элементы также могут быть частью набора полей, поэтому они не связаны напрямую с элементом формы.

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

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

Gwen Hufschmid 06.04.2018 20:53

Другие вопросы по теме