В Drupal действительно есть возможность реализовать AJAX-запросы без необходимости добавления скрытых кнопок. Давайте рассмотрим, как это можно сделать.
Вместо использования скрытой кнопки для отправки AJAX-запроса, вы можете использовать существующие элементы формы или даже обычные HTML-элементы (например, `div`, `span` или `button`) и привязать к ним AJAX-событие с помощью JavaScript.
Вот пример, как это можно сделать:
1. **Добавьте событие AJAX к элементу формы.** При этом можно использовать существующие элементы формы, такие как `select`, `radio`, или другие элементы, которые могут инициировать AJAX-вызов.
2. **Настройте обработчик AJAX в вашей форме.** В этот обработчик можно передать параметры и выполнить любые методы на стороне сервера.
Пример кода для вашей формы:
```php
$form['opn_select'] = [
'#type' => 'select',
'#title' => t('Choose an option'),
'#options' => [
5 => t('Option 5'),
10 => t('Option 10'),
],
'#ajax' => [
'callback' => '::ajaxCallback',
'wrapper' => 'names-fieldset-wrapper',
'method' => 'replace',
'progress' => ['type' => 'none'],
],
];
$form['names_fieldset'] = [
'#type' => 'fieldset',
'#prefix' => '<div id="names-fieldset-wrapper">',
'#suffix' => '</div>',
];
// Остальная часть вашего кода...
```
3. **Создайте AJAX-обработчик.** Обработчик будет вызываться при изменении значения в `select` и может манипулировать данными формы.
```php
public function ajaxCallback(array &$form, FormStateInterface $form_state) {
return $form['names_fieldset'];
}
```
4. **Использование JavaScript для ручного триггера AJAX-вызова.** Вы можете добавить JavaScript, который будет вызывать AJAX-запрос по событию, отличному от изменения элемента формы (например, клик по клавише или выбранному тексту).
```javascript
(function ($, Drupal) {
Drupal.behaviors.customAjaxBehavior = {
attach: function (context, settings) {
$('#my-custom-element', context).once('customAjaxBehavior').on('click', function () {
// Вызов AJAX на элементе формы (например, select)
$('#edit-opn-select').trigger('change');
});
}
};
})(jQuery, Drupal);
```
В данном примере `#my-custom-element` - это ваш пользовательский элемент, который вы хотите использовать для инициации AJAX-вызова.
Таким образом, вы будете иметь возможность использовать AJAX-запросы без добавления скрытых элементов на форму, и ваш код будет более чистым и удобным.