Как в Drupal навесить AJAX submit на элемент, отличный от кнопки

Если вы используете AJAX на своем сайте под управлением CMS / CMF Drupal 7, то наверняка вам приходилось или придется когда-нибудь решать такую распространенную проблему, как навешивание аякс-сабмита на элементы формы, отличные от кнопки. В показанном далее примере сниппета я таким образом прикреплю выполнение асинхронного кода к радиокнопкам.

<?php

/**
 * Объявляем HOOK_menu():
 */
function druwebru_menu() {
    $items = array();
    $items['druwebru/ajax-example'] = array(
        'title' => 'Использование trigger_as в Drupal AJAX',
        'page callback' => 'drupal_get_form',
        'page arguments' => array('druwebru_example_form', 2),
        'access arguments' => array('view content'),
        'type' => MENU_CALLBACK,
    );
    return $items;
}

/**
 * Объявляем HOOK_form():
 */
function druwebru_example_form($form, &$form_state) {
    $form['#prefix'] = '<div id="wizard-form-wrapper">';
    $form['#suffix'] = '</div>';
    $form['question'] = array(
        '#type' => 'item',
        '#markup' => '<p>Выберите овощ:</p>',
    );
    $form['answers'] = array(
        '#type' => 'radios',
        '#options' => array(
            0 => 'Картофель',
            1 => 'Кокос',
            2 => 'Апельсин',
        ),
        '#ajax' => array(
            'wrapper' => 'wizard-form-wrapper',
            'callback' => 'druwebru_form_wizard_callback',
            'progress' => array('type' => 'none'),
            'trigger_as' => array('name' => 'enter'), // - навешиваем триггер.
            'effect' => 'fade',
        ),
    );
    $form['submit_button'] = array(
        '#type' => 'submit',
        '#value' => 'Выбрать',
        '#name' => 'enter',
        '#ajax' => array(
            'wrapper' => 'wizard-form-wrapper',
            'callback' => 'druwebru_form_wizard_callback',
            'progress' => array('type' => 'none'),
            'effect' => 'fade',
        ),
        '#attributes' => array(
            'class' => array('element-invisible'), // - скрываем кнопку.
        ),
    );

    return $form;
}

/**
 * Объявляем AJAX callback:
 */
function druwebru_form_wizard_callback($form, $form_state) {
    return $form;
}

/**
 * Объявляем HOOK_form_submit():
 */
function druwebru_example_form_submit(&$form, &$form_state) {
    drupal_set_message('Вы выбрали: ' . $form_state['values']['answers']);
}

?>


Как видите, чтобы решить описанную проблему нужно всего лишь воспользоваться конструкцией с применением trigger_as. Триггер навешиваем по атрибуту кнопки - name.

Drupal AJAX FAPI обработка сабмита от произвольного элемента

Вот так все и будет выглядеть. Прошу читателей обращать внимание на 39-ую и 46-ую строчки программного кода.





© 2012-2014 Druweb.ru. Вы можете спокойно копировать любые материалы сайта только при наличии обратной ссылки.