2016-11-13 4 views
0

Я пытаюсь добавить обратный вызов ajax, который будет запущен при изменении текстового поля ввода, но не может понять, как это сделать. Я попытался добавления АЯКС событие поля в form_alter крюком (который работал хорошо для избранной области), но его не стрелять:drupal 7 как активировать обратный вызов ajax при изменении текстового поля

my_form_alter(&$form, &$form_state) { 
    form['my_text_field'][LANGUAGE_NONE]['#ajax'] = array(
     'callback' => 'my_text_field_callback', 
     'wrapper' => 'my-field-wrapper', 
     'method' => 'replace', 
     'event' => 'change' 
    ); 
} 

Обратный вызов так просто, как он получает:

function my_text_field_callback($form, &$form_state) { 
    return $form['my_text_field']; 
} 

Я также пробовал события нажатия клавиш, но не могу получить обратный вызов.

+0

Уверены ли вы, что он не работает? AFAIK событие изменения запускается только тогда, когда текстовое поле теряет фокус. Попробуйте ввести события ввода или keyup. – 2pha

ответ

1

Может быть, эта ссылка может помочь вам: https://www.drupal.org/docs/7/api/javascript-api/ajax-forms-in-drupal-7

  • Изменения в форме должны быть сделаны только в функции формы строитель (ajax_example_autocheckboxes() в примере здесь), или проверка будет выполнена. Функция обратного вызова не должна изменять форму или любое другое состояние.
  • О обратных вызовах Ajax и #default_value: когда Ajax заменяет элементы формы на странице, значения полей формы не заполняются автоматически #default_value. Однако существуют другие способы установки значений по умолчанию при использовании обратных вызовов Ajax. См. Эти ссылки для дальнейшего обсуждения/подсказок и пример кода: Form API: значение по умолчанию не изменяется, а значение Default_value не работает для кнопок «Радио» в обратном вызове Ajax.
  • Можно заменить любой HTML на странице, а не только элемент формы. Это всего лишь вопрос предоставления идентификатора обертки.
  • Вы можете легко заменить всю форму, если это проще всего. Просто добавьте #prefix и #suffix во весь массив формы, затем установите это как #ajax ['wrapper']. (Это позволит вам изменить несколько элементов формы с помощью одного вызова ajax.) Единственная причина, по которой это не делается, заключается в том, что процесс выполняется быстрее, если переносится меньше информации.
  • Имейте в виду, что форма $, с которой вы имеете дело в своей функции обратного вызова, уже отправлена ​​через все функции обработки формы (но еще не отправлена ​​в drupal_render()). Таким образом, при настройке, скажем, разметка элемента проста:

    $ elements ['some_element'] ['# markup'] = 'Новая разметка.';

    return $ elements;

  • Изменение значения, которое уже были преобразованы в #attributes свойства означает роет глубже в $ массиве формы, а также и изменяющейся соответствующее свойство этого элемента.

    // Вы должны сделать оба

    $ элементов [ 'some_element'] [ '# отключено'] = TRUE;

    $ elements ['some_element'] ['# attributes'] ['disabled'] = 'disabled';

    return $ elements;

+0

Спасибо за такую ​​полную разбивку. Много полезной информации, но в этом случае я пытаюсь создать обратный вызов в функции построителя форм, а не в обратном вызове. Или я чего-то не хватает? – Finglish

+0

возможно, попробуйте другой тип события?тип изменения более эффективен при выборе или флажках, попробуйте другой для текстового поля, такого как keyup? – Fky