[Решено] Как после выполнения ajax callback функции (Form API) вызвать кастомную javascript функцию ?

Главные вкладки

Аватар пользователя muaddip muaddip 30 января 2014 в 2:37

Возможно тему сформулировал некоректно!
Задача состоит в следующем, есть самописный модуль, который строит в боковой колонке форму. Хочется доработать логику и сделать при определенных комбинациях полей, у select list некоторые option - disabled.
Например получить такой html:

<select>
<option value="1" disabled="disabled">1</option>
<option value="2" disabled="disabled">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
</select>

Плюс ко всему хочется всяких украшательств, типа jquery плагина для замены селект листа, на констуркцию из html елементов которые можно темизировать.
Для всего этого необходимо, чтобы после ajax обновления формы, вызывался кастомный javascript код.
Лазил целый день, но так и не нашел информации, как сделать javascript callback после выполнения form ajax callback Smile
Любые идеи с радостью выслушаю.

Комментарии

Аватар пользователя kv4 kv4 30 января 2014 в 7:54

Тут читаете https://api.drupal.org/api/drupal/includes!ajax.inc/group/ajax/7
Тут скачиваете примеры https://drupal.org/project/examples

В двух словах в функции которая указана как callback, должно быть примерно следующее

<?php
  $commands 
= array();
  
$commands[] = ajax_command_replace(NULL$output);
  
$commands[] = ajax_command_prepend(NULLtheme('status_messages'));
  return array(
'#type' => 'ajax''#commands' => $commands);
?>

Собственно то, что вы запихаете в массив $commands будет выполнено на стороне клиента.
Тут набор готовых функций, которые можно использовать - https://api.drupal.org/api/drupal/includes%21ajax.inc/group/ajax_commands/7
Но если того, что уже есть не хватает, можно написать свой клиентский код. А то, как его вызывать подглядеть в реализации drupal.

UPD: есть вот такой ресурс http://xandeadx.ru/ там много полезного. В частности по вашему вопросу там есть вот что http://xandeadx.ru/blog/drupal/492

Вообще посмотрите там статьи по этому адресу http://xandeadx.ru/search/node/%24commands (сам не смотрел, но наверное там будет для вас полезного)

Аватар пользователя muaddip muaddip 30 января 2014 в 13:08

kv4 wrote:

...

UPD: есть вот такой ресурс http://xandeadx.ru/ там много полезного. В частности по вашему вопросу там есть вот что http://xandeadx.ru/blog/drupal/492

Вообще посмотрите там статьи по этому адресу http://xandeadx.ru/search/node/%24commands (сам не смотрел, но наверное там будет для вас полезного)

С материалами приведенными по ссылкам знаком, блог андеда читаю давно.
Засунуть $commands в callback функцию не додумался. Сейчас поиграюсь, и отпишусь, что получилось.

Аватар пользователя muaddip muaddip 31 января 2014 в 12:40

Сработал вариант с commands[]:

<?php
$commands
[0] = array();
..........
for (
$i=1$i<n$i++) {
  
$id_element '.form-item-name-field option:nth-child('$i .')';
  
$commands[] = ajax_command_invoke($id_element'attr', array(array('disabled' => 'disabled')));
}
..........
$commands[0] = ajax_command_replace('#some-id'drupal_render($form['wrapper']));
return array(
'#type' => 'ajax''#commands' => $commands);
?>

Обновляется html на странице, а потом выполняется javascript, заданный command[].