Вы здесь

Как изменить место, где выводятся ошибки при работе с ajax формой?

1

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

Сделал так, но срабатывает, только когда форма загружается первый раз:

function HOOK_preprocess_page(&$vars) {
  // Выводим ошибки только в форме.
  if (isset($vars['node'])) {
    $node = $vars['node'];
    if ($node->type == 'TYPE') {
      $vars['show_messages'] = FALSE;
    }
  }

}

// внутри формы
$form['heading']['errors'] = array(
  '#type' => 'markup',
  '#markup' => theme('status_messages'),
);
Версия Drupal: 
7.x
Категория: 
AJAXForm APITheming
Вопрос задан 05.05.2015 - 20:20

Ответы

2

Вот такой код у меня для Entityforms ajax, который срабатывает на субмит.

В форме (hook_form_alter) добавляю новый элемент (тут как раз весом и решить можно куда выводить):

$form['messages'] = array(
  '#markup' => '<div id="' . $form_id . '-messages"></div>',
  '#weight' => -99,
);

А на аякс колбеке для submit такой код:

list($form, $form_state) = ajax_get_form();
drupal_process_form($form['#form_id'], $form, $form_state);

$commands = array();
$commands[] = ajax_command_html('#' . $form['#form_id'] . '-messages', theme('status_messages'));

return array('#type' => 'ajax', '#commands' => $commands);

Можешь поизучать код, если интересно, тут: https://github.com/Niklan/entityform_ajax/blob/master/entityform_ajax.mo...

Ответ дан 05.05.2015 - 23:31
Аватар пользователя Niklan
Niklan
441

Спасибо, сделал так как ниже и всё заработало.

  function MODULE_ajax_multistep_form_callback($form, $form_state) {
    // было раньше
    // return $form;
    $commands = array();
    $commands[] = ajax_command_html('#MY-FORM-ID', render($form));
    if (form_get_errors()) {
      $commands[] = ajax_command_html('#form-error-messages', theme('status_messages'));
    }

    return array('#type' => 'ajax', '#commands' => $commands);
  }

  // Форма.
  $form['#prefix'] = '<div id="MY-FORM-ID">';
  $form['#suffix'] = '</div>';
  // ....
  $form['heading']['errors'] = array(
    '#type' => 'markup',
    '#markup' => '<div id="form-error-messages">' . theme('status_messages') . '</div>',
  );
  $form['actions']['submit'] = array(
    //..
    '#ajax' => array(
      'wrapper' => 'MY-FORM-ID',
      'callback' => 'MODULE_ajax_multistep_form_callback',
    ),
  );
Комментарий оставлен 06.05.2015 - 00:50
0

Создай поле #markup с каким-нибудь id'шником.
И в ajax-обработчике выводи туда error. Он будет общим на эту форму.

Пример обработчика в конце статьи. А именно $commands. Ну и далее через CSS можно куда угодно его поставить.

В общем, надо смотреть как реализован ajax.

Ответ дан 05.05.2015 - 21:00
Аватар пользователя SAM
SAM
208