Pull to refresh

Comments 15

'#value' => t('Отправить.'),
В функцию t() нужно подставлять текст для перевода на английском языке
Да и вообще у вас весь код не правильный и подход изначально не тот. Почитайте про модуль ctools, который берет на себя всю работу с формой.
> '#value' => t('Отправить.'),
> В функцию t() нужно подставлять текст для перевода на английском языке
спасибо, поправил. с англ. переписывал для примера.

>Почитайте про модуль ctools, который берет на себя всю работу с формой.
можно будет глянуть.
Нормальный подход. Необязательно делать один попап для одного модуля с помощью CTools (в котором 1000 других вещей), ограничелся практически стандартными возможностями.

Только exit(); там?
ограничился*

Только exit(); там зачем?* — вопрос автору.
exit чтобы прервать выполнение скрипта и чтобы случайно ничего после принта формы дополнительно не спринтилось.
Автор спасибо за труд и вклад в drupal :) Я кстати попробую твой модуль вписать в свой проект, у нас пока Flag as Offensive, но заказчик давно просил что-то подобное.
Спасибо за более точную наводку! посмотрю обязательно :)
* Вместо exit() в друпале нужно использовать drupal_exit()
* 'access callback' => TRUE, — зло. Объявите свой permission или используйте стандартный access content
* simple_ajax_popup() — В корне неверный подход к работе с формами. Используйте стандартный #ajax из Forms API, тогда отработают стандартный валидатор и сабмит формы, она ребилднется и вернет нужную информацию.
> 'access callback' => TRUE, — зло.
это всего лишь пример.

> simple_ajax_popup() — В корне неверный подход к работе с формами. Используйте стандартный #ajax из Forms API, тогда отработают стандартный валидатор и сабмит формы, она ребилднется и вернет нужную информацию.

Для моего случая когда формы изначально нет на странице, это почему то не срабатывает. Функция определенная в #ajax не вызывается. Если знаете в чем проблема — буду рад узнать.
> 'access callback' => TRUE, — зло.
это всего лишь пример.

Кто-то поймет, что это только пример и сделает правильно, но большинство тупо скопирует.

Для моего случая когда формы изначально нет на странице, это почему то не срабатывает. Функция определенная в #ajax не вызывается. Если знаете в чем проблема — буду рад узнать.

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

Вот рабочий пример
Модуль
function test_menu() {
  $items = array();
  $items['test'] = array(
    'type' => MENU_SUGGESTED_ITEM,
    'title' => t('Test page'),
    'page callback' => 'test_page',
    'access arguments' => array('access content'),
  );
  $items['callback'] = array(
    'type' => MENU_CALLBACK,
    'page callback' => 'test_callback',
    'access arguments' => array('access content'),
  );

  return $items;
}

function test_page() {
  drupal_add_js('misc/jquery.form.js');
  drupal_add_js(drupal_get_path('module', 'test') . '/test.js');
  $output = '<div id="form"></div>';
  return $output . l(t('Get form'), 'callback', array('attributes' => array('id' => 'test-link')));
}

function test_callback() {
  print drupal_render(drupal_get_form('test_form'));
  drupal_exit();
}

function test_form($form, $form_state) {
  $form = array();
  $form['aass'] = array(
    '#theme' => 'status_messages'
  );
  $form['messages'] = array(
    '#markup' => '',
  );
  $form['name'] = array(
    '#title' => t('Name'),
    '#type' => 'textfield',
    '#default_value' => '',
    '#required' => TRUE,
  );
  $form['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Submit'),
  );
  return $form;
}

function test_form_validate(&$form, &$form_state) {}

function test_form_submit($form, &$form_state) {
  $form_state['rebuild'] = TRUE;
  drupal_set_message(t('Ok. All good!'));
}

test.js
(function($) {
  $(document).ready(function() {
    var success = function() {
      $('#test-form').ajaxForm({
        target: '#form',
        success: success
      });
    };
    $('#test-link').click(function(event) {
      $.get(Drupal.settings.basePath + 'callback', function(data) {
        $('#form').html(data);
        Drupal.attachBehaviors('#test-form');
        success();
      });
      event.preventDefault();
    });
  });
})(jQuery);

Спасибо! Отличный пример — все работает. Сегодня уже поздно, завтра постараюсь привести код в порядок и обновить пост.
Все делается проще:
в hook_form_alter добавляем для сабмита нужной формы свойство '#ajax', где указываем callback-функцию, враппер и метод. В callback-е просто возвращаем array('#type' => 'ajax', '#commands' => $commands) или html-код;

Sign up to leave a comment.

Articles