Drupal Forms API. Часть 2 — для Drupal 7


    Вторая часть статьи содержит отличия, свойственные Drupal Forms API для версии 7. Эта часть статьи публикуется как открытый топик, видный не только подписчикам блога Drupal. Но свои дальнейшие статьи (по созданию тем) буду публиковать как закрытые статьи блога, чтобы не мешать тем, кому Drupal не интересен.

    В прошлой статье, мы разобрали функционал простого модуля, который возвращал введенное имя в форму при помощи AJAX (именуемого в Друпале 6 «AHAH»). Теперь очередь версии 7.



    1. Наиболее интересные изменения в API Друпала 7


    • В Друпал 7, изменились info-файлы. Теперь, любые файлы с php кодом, включаемые в модуль (inc и test файлы), нужно объявлять info-файле. В нашем случае, таковых нет.
    • Изменился способ обработки AJAX. Теперь не обязательно задавать путь для обработки через hook_menu, в можно сразу указать callback-функцию.
    • Путь обработки запросов теперь системный — /system/ajax.
    • Изменилась обработка форм. Теперь, callback-функция получает две переменные — массив формы и указатель на состояние формы.


    2. Изменения в коде формы


    Изменения в коде формы незначительны. Принципы Drupal Forms API остались те же.
    /* FC Form */
    // Теперь функция создания формы тоже принимает две переменные (это нужно при обработке формы, например, для генерации многостраничных форм)
    function fc_form($form, &$form_state) {
      $form = array(); 
      $form['name'] = array(
        '#type' => 'textfield',
        '#description' => 'Your name',
        '#size' => '15',
      );
      $form['submit'] = array(
        '#type' => 'submit',
        '#value' => 'Submit',
        // Элемент теперь называется ajax
        '#ajax' => array(
          // Вместо пути теперь указывается callback-функция
          'callback' => 'fastcontact_ajax',
          'wrapper' => 'fc-form',   
        ),
      );
     return $form;
    } 
    


    2. Изменения в коде обработки запроса


    // Эта callback-функция получает два параметра. Массив формы и массив с ее состоянием
    function fastcontact_ajax($form, &$form_state) {
      // Извлекаем значение элемента name из массива values массива form_state
      $name=$form_state['values']['name'];
      // И добавляем к существующей форме элемент markup с выводимым значением.
      $form['result'] = array(
        '#markup' => 'Вы ввели имя <b>'.$name.'</b>',
      );
      return $form;
    }
    


    Значение массива $form_state — довольно большое. Там хранятся все данные о форме и ее состоянии. Оттуда мы и берем значение нашего поля name.

    Если в Друпале 6 мы отсылали текст, который отображался в случае успеха, через drupal_json(), то в Друпале 7 мы пересобираем форму и добавляем к ней элемент markup. Markup служит для вывода html-разметки в форму. Этот элемент существовал и в 6 версии Друпала — но в 7 версии его синтаксис изменился.

    Теперь, нам осталось отобразить форму. Мы можем сделать это стандартным кодом из прошлой статьи.
    function render_fc_form() {
      $out  = '<div id="fc-form-wrapper">';
      $out .= drupal_render(drupal_get_form('fc_form'));
      $out .= '</div><!-- /.fc-form-->';
      return $out;
    }
    


    Обратите внимание, что в Друпале 7 гораздо больше изменений API. Вот список изменений, произведенных в API Друпала после 6 версии, касающиеся написания модулей (для тем, отдельный список).

    Скачать архив с целым модулем
    Поделиться публикацией
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 14

      0
      Кто вызывает render_fc_form?
      Роутер → ajax_form_callback → fastcontact_ajax.

      fastcontact_ajax возвращает массив.
        0
        Для того, чтобы модуль работал, в любом месте страницы или блока, где включен фильтр php-кода, добавляется строка <?php echo render_fc_form(); ?>

        Верно, fastcontact_ajax возвращает массив (так и должно быть).

        Я дополнил статью, добавив в коце ссылку на архив с модулем. Архив с модулем. Надо было сразу рабочий пример выложить.
          0
          следует уточнить, нужно ли перечислять в info только css/js файлы но и .tpl.php, .admin.php и тд если такие есть?
            0
            Речь идет в первую очередь о файлах с кодом на php. Это inc файлы в первую очередь. Друпал создает индекс функций и классов, что позволит улучшить работу кода в системе.

            Спасибо за уточнение — я также подправил этот момент в статье.
            –13
            Выглядит слишком сложно, почему-бы просто не использовать MyTaskHelper.ru?
              +4
              Угу, а вместо друпала — ucoz.ru ))
                +4
                почему бы не пиарить свой говносервис в теме, где общее с ним лишь слово Форма?
                  +2
                  как ты уже…
                  –2
                  Фапифап?
                    0
                    Класс! Если еще допилят до продакшена views, можно переходить.
                      –1
                      вьюс слишком монструозен, порой мне кажется что сами разрабы уже в нем потерялись…
                      вывести руками со сложными фильтрами кастомными бывает проще чем через views корячится…
                        0
                        Кастомизация или views избитая тема для холивара.
                        Иногда проще набросать views за 5 минут, чем кодить 2 часа и еще час тестить.
                        Кастомизацию и свой код на нагруженныъ проектах естественно никто не отменял.
                      +1
                      Комменты не друпальские.
                      На отключенный JS кладём? Если уж писать пример, то надо это учитывать.
                        0
                        > именуемого в Друпале 6 «AHAH»

                        он так называется потому что на AHAH и расчитан, потому что во враппер вставляется именно HTML (а не XML) присланный с сервера.

                        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                        Самое читаемое