10 шагов к постижению форм в Друпале

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

Аватар пользователя neochief neochief 28 января 2009 в 13:14


Этот урок создан специально для начинающих и средне-продвинутых Друпал-разработчиков. Он должен быстро дать понятие об азах Forms API, а также показать возможность создаия более сложных вещей на примере пошаговых форм.

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

И прежде чем начать, я расскажу вам как все-таки заставить любой из этих кусков кода работать. Предположим, вы уже имеете установленный тестовый сайт на Друпал 6. Вам прийдется проделать следующие действия:

  1. Создать новую директорию в sites/all/modules, например my_module
  2. Создать файл my_module.info в директории my_module, содержащий это:
  3. name = My module
    description = Module for form api tutorial
    core = 6.x
  4. Создать файл my_module.module. Полностью скопировать отсюда первый пример и вставить в my_module.module.
  5. Включить модуль "My module" на странице модулей (admin/build/modules).
  6. Перейти на страницу my_module/form для запуска кода.
  7. Далее вам предстоит провести для каждого примера, полную замену содержимого my_module.module на код последующего примера. Не забывайте после этого переходить на страницу my_module/form для того, чтобы увидеть результаты своей работы.

А дальше огромная куча кода »

Комментарии

Аватар пользователя neochief neochief 28 января 2009 в 14:15

Заранее извиняюсь за то, что не привожу полную статью прямо здесь, тому есть объективные причины. Надеюсь вам не составит особого труда кликнуть по ссылке.

Хабравчане могут заплюсовать этот топик — топик на хабре.

Аватар пользователя sadmin sadmin 28 января 2009 в 14:04

Отметил в закладки. То, что полная статья на тематическом сайте, а здесь только её часть не вижу ничего страшного. Спасибо интересную заметку

Аватар пользователя direqtor direqtor 29 января 2009 в 7:32

Сам хотел подобную заметку осилить, но недосуг. Очень хорошо.

Одно замечание - нет необходимости повторять в каждом примере один и тот же код, например реализацию hook_menu и вызов формы.

Лучше писать только существенные дополнения в каждом примере

Аватар пользователя goodboy goodboy 29 января 2009 в 14:04

Спасибо за большую статью! К сожалению, не нашел ответа на свой простой вопрос: как получить данные, введенные с формы.

У меня есть страница со сниппетом, который выводит данные при помощи запроса. Затем понадобилось параметризировать запрос. Я создал форму, в обработчике submit вижу значения переменных формы, но не могу ими воспользоваться кроме как сообщить по drupal_set_message. После нажатия на "submit", попадаю на ту же страницу, значения полей меняются на дефолтные и дальше непонятно...

Аватар пользователя neochief neochief 29 января 2009 в 17:48

@Химический Али, да я б с радостью дал, если бы он был. Там же инвайты не бесконечные, а более того, дефицитные. У меня за прошлые статьи давали по одному, я их и тратил сразу же. А за эту даже ничего не дали.

Аватар пользователя neochief neochief 30 января 2009 в 12:36

"Goodboy" wrote:
для данного решения нужно создавать отдельный модуль

Ну кагбэ первая часть статьи об этом и утверждает.

Аватар пользователя goodboy goodboy 30 января 2009 в 12:59

Да, я видел. Только не понял: это обязательное условие или просто так удобнее приводить примеры.
Если мне понадобится форма, я должен под нее создавать отдельный модуль?

Я использовал формы на чистом PHP, использовал на Друпале (отправлял email). Немножко имею представление, но чувствую, что плаваю в друпаловской специфике работы с формами. Поэтому схватился за вашу статью. Она ведь написана для таких, как я, не так ли? Но вот не удалось ничего почерпнуть из нее.

Аватар пользователя neochief neochief 30 января 2009 в 17:54

Нет, через блоки может и быстрее (минуты на две), но никак не правильнее и не лучше. Вы теряете многое с таким подходом.

Goodboy, в создании своих модулей для нужд сайта нет вообще ничего зазорного и гепер-сложного. Именно так и надо делать почти со всем в мире Друпала.

Аватар пользователя ingumsky@drupal.org ingumsky@drupal.org 31 января 2009 в 2:11

Собирался написать подобную статью после того, как смогу довести до ума свой модуль с реализацией form_alter. Теперь вот думаю, нужна ли будет моя статья после такого подробного и пошагового описания действий.

Аватар пользователя direqtor direqtor 31 января 2009 в 4:07

"<a href="mailto:ingumsky@drupal.org">ingumsky@drupal.org</a>" wrote:
как смогу довести до ума свой модуль с реализацией form_alter
Нужна, конечно. form_alter все-таки несколько другое дело, хотя и использует то же самое API

Аватар пользователя ingumsky@drupal.org ingumsky@drupal.org 31 января 2009 в 14:14

"direqtor" wrote:
Нужна, конечно. form_alter все-таки несколько другое дело, хотя и использует то же самое API

Да, пожалуй, так и есть. Тогда всё же напишу после разбирательств с темизацией -)

Аватар пользователя wanders.32 wanders.32 3 февраля 2009 в 19:34

Спасибо, вчера прочитал, сегодня дали на доделку модуль с формой, как раз двухстраничность добавить, ну и по мелочи функционал закончить)

Аватар пользователя digital_sword digital_sword 14 февраля 2009 в 7:27

"<a href="mailto:ingumsky@drupal.org">ingumsky@drupal.org</a>" wrote:
Смотрите form_alter

Не совсем понял, как пользоваться хуками. Вы не могли бы для примера код вставить (замена кода function my_module_menu() {...} в примере?
И в блок то как форму?

Аватар пользователя VVS VVS 10 декабря 2010 в 13:17

Подскажите, как сделать на мультистраничной форме кнопку "Назад"?

<?php
    $form
['back'] = array(
      
'#type' => 'button',
      
'#value' => 'Назад',
      
'#attributes' => array('onClick' => 'history.go(-1)'),
    );
?>

Кнопка добавляется вида:
<input type="submit" class="form-submit" onclick="history.go(-1)" value="Назад" id="edit-back" name="op">
и при нажатии на неё происходит валидация и отправка формы, правда неизвестно чего...

В API написано
#button_type
Used by: button, image_button, submit
Description: Adds a CSS class to the button, in the form form-[button_type_value]. Note that this does NOT set the HTML attribute type of the button.

В русском переводе этого ВООБЩЕ нет!