Возможно ли сделать 2 кнопки с разными событиями в одной форме?

Аватар пользователя natalikarn natalikarn 19 октября в 19:54

Я пишу модуль в котором есть форма, по событию в которую загружаются аналитические данные в виде сокращенной версии, так-как данных много, то загружать их полностью нет смысла, иногда достаточно и краткой версии для общего ознакомления. Но по логике мне нужна вторая кнопка, которая будет позволять загрузить полную версию... так-как это мой первый модуль, я не совсем поняла как можно внедрить в форму вторую кнопку, чтобы она так-же брала часть запрошенных данных из текущей формы но выполняла при этом свой сценарий.

Я так понимаю 2 формы сделать невозможно и одну в другую вложить тоже, куда копать, подскажите пожалуйста кто разбирается в этом...

Комментарии

Аватар пользователя vlucas vlucas 19 октября в 19:56

Можно. Сделайте также как и первую кнопку. В сабмите и валидации проверяйте ту, которую нажали

Аватар пользователя natalikarn natalikarn 19 октября в 21:07

Добавила в форму 2-ю кнопку

    $form['actions']['submit'] = [
        '#id' => 'button',
        '#type' => 'submit',
        '#value' => $this->t('Анализ данных'),
        '#ajax' => [
        'callback' => '::setCalcMessage',
      ],
    ];
   
   
    $form['actions']['submit_2'] = [
        '#id' => 'button_2',
        '#type' => 'submit',
        '#value' => $this->t('Загрузить полную версию анализа данных'),
        '#ajax' => [
        'callback' => '::setCalcMessage_2',
      ],
    ];

Но как обработку событий сделать по ним.. мне бы хоть пример какой.. или что почитать

Аватар пользователя vlucas vlucas 19 октября в 21:12

Бывалые друпалеры всегда советуют смотреть примеры прямо в ядре и в тестах. Я тоже такого же мнения придерживаюсь.
Посмотрите как такое сделано в модулях, где есть подобные формы с 2-мя кнопками. Например форма создания ноды: кнопки сохранить и предпросмотр. Кроме этого примера ещё вагон и маленькая тележка подобного...

Аватар пользователя natalikarn natalikarn 19 октября в 23:21

очень долго копалась в модулях друпал но ничего подобного не нашла, имею ввиду обработка событий кнопок с условием, сделала 2-ю функцию, в которой калбек прописала, работает но как-то я думаю это не правильно. Как можно вот это применить.. не пойму #submit' => array('submit_button_1_submit')

Аватар пользователя natalikarn natalikarn 19 октября в 23:15

Сделала таким образом

    $form['actions']['submit'] = array
    (
        '#id' => 'button',
        '#type' => 'submit',
        '#value' => $this->t('Анализ данных'),
        '#ajax' => [
        'callback' => '::setCalcMessage',
        ],
        '#submit' => array('submit_button_1_submit'),
    );
   
   
    $form['actions']['submit_2'] = array
    (
        '#id' => 'button_2',
        '#type' => 'submit',
        '#value' => $this->t('Полная версия'),
        '#ajax' => [
        'callback' => '::setCalcMessage_2',
        ],
        '#submit' => array('submit_button_2_submit'),
    );

Но теперь задача как 2-ю кнопку сделать скрытой и отображать, только после того, как сработает клик первой кнопки? Какие могут быть методы в таком случае?

Аватар пользователя vlucas vlucas 19 октября в 23:19

1. Можно обойтись 1 сабмитом...
2. Что должно происходить после нажатия на 1 кнопку?

Аватар пользователя natalikarn natalikarn 19 октября в 23:25

Первая кнопка после заполнения формы загружает анализ данных в html-формате на страницу, 2-я кнопка нужна, чтобы догрузить больше данных, ну и там запросы в базу данных добавятся, это все из обработки одной формы происходит

Аватар пользователя ivan.petrovich ivan.petrovich 19 октября в 23:31

Возможно вам нужна "многошаговая форма".
Прям так и гуглится или "drupal multistep form".

upd: спасибо, поправил.