#drupal #forms
#drupal #формы
Вопрос:
какой будет лучший способ разработки пользовательских форм для drupal, для административной части системы?
заранее благодарю вас!
Ответ №1:
Прежде всего, вам нужно указать местоположение для доступа к вашей форме, предпочтительно в пространстве имен «admin /*«, если форма предназначена только для администрирования. Если вы просто показываете форму, вы могли бы напрямую использовать drupal_get_form в качестве обратного вызова страницы (но вы могли бы использовать любую функцию для генерации HTML-кода, даже смешивать с функциями темы)
Кроме того, вам нужно знать, какие разрешения требуются для доступа к форме. По умолчанию я использовал «страницы администрирования доступа«, но вам, вероятно, следует использовать что-то более конкретное, в зависимости от того, для чего вы собираетесь использовать форму.
Допустим, указан путь «admin /build / something«, вам нужно использовать hook_menu для регистрации этого пути:
/**
* Implementation of hook_menu().
*/
function modulename_menu(){
return array(
'admin/build/something' => array(
'title' => 'Example Admin Form',
'description' => 'Admin form introduced by the MODULENAME module',
'type' => MENU_NORMAL_ITEM,
'page callback' => 'drupal_get_form',
'access arguments' => array('access administration pages'),
),
);
}
Теперь, для фактического отображения страницы: значением, указанным в «аргументахстраницы», было имя
функции, которая drupal_get_form ожидает предоставить структуру формы
(которые должны быть ассоциативным массивом):
/**
* Form Structure
*/
function modulename_form_something(amp;$form_state){
$form = array();
$form['myfield'] = array(
'#title' => 'My Field',
'#description' => 'This is a basic text input field',
'#type' => 'textfield',
'#default_value' => $form_state['values']['myfield'],
);
//
// Here you can add more elements in the form
//
return $form;
}
Вот больше информации об API Forms, с помощью которого вы можете легко создавать некоторые довольно сложные формы.
Теперь ваша форма отображается по адресу «/admin/build / something», но вы, вероятно, захотите что-то сделать и с этими данными; по умолчанию функции validate и submit называются так же, как функция form structure, «_validate» и «_submit» соответственно (однако вы можете переопределить это с помощью #validate и #submit в структуре формы).
Допустим, строка «no» не является допустимым значением, все остальное принимается.
/**
* Form validation
*/
function modulename_form_something_validate($form, amp;$form_state){
if ($form_state['values']['myfield'] == 'no'){
form_set_error('myfield', '"<b>no</b>" is not a valid answer, try again.');
}
}
Сначала вызывается проверка, однако вам следует только проверить, в порядке ли данные в этой функции. Если вам нужно выполнить действия при получении формы, сделайте это в обработчике «отправить», потому что validate может быть вызван несколько раз, в то время как submit вызывается только один раз.
/**
* Form submission
*/
function modulename_form_something_submit(amp;$form, amp;$form_state){
//
// Here you can perform whatever action that form is made for.
//
drupal_set_message( 'The form has been sent. "myfield" has the following value: '.$form_state['values']['myfield'] );
}
Давайте подведем итог, вот весь modulename.module
файл:
<?php
/**
* Implementation of hook_menu().
*/
function modulename_menu(){
return array(
'admin/build/something' => array(
'title' => 'Example Admin Form',
'description' => 'Admin form introduced by the MODULENAME module',
'type' => MENU_NORMAL_ITEM,
'page callback' => 'drupal_get_form',
'page arguments' => 'modulename_form_something',
'access arguments' => array('access administration pages'),
),
);
}
/**
* Form Structure
*/
function modulename_form_something(amp;$form_state){
$form = array();
$form['myfield'] = array(
'#title' => 'My Field',
'#description' => 'This is a basic text input field',
'#type' => 'textfield',
'#default_value' => $form_state['values']['myfield'],
);
//
// Here you can add more elements in the form
//
return $form;
}
/**
* Form validation
*/
function modulename_form_something_validate($form, amp;$form_state){
if ($form_state['values']['myfield'] == 'no'){
form_set_error('myfield', '"<b>no</b>" is not a valid answer, try again.');
}
}
/**
* Form submission
*/
function modulename_form_something_submit(amp;$form, amp;$form_state){
//
// Here you can perform whatever action that form is made for.
//
drupal_set_message( 'The form has been sent. "myfield" has the following value: '.$form_state['values']['myfield'] );
}
Не забывайте, что вам также нужен файл .info для установки модуля:
Источник modulename.info
:
; $Id
name = Admin Form
description = This module adds an admin form
package = Example Module
core = "6.x"
version = "6.x-0.1-dev"
Комментарии:
1. У меня не вызывается функция _submit. что-то изменилось в ядре drupal?
2. Я думаю, вы, возможно, пропустили «аргументы страницы» из примера hook_menu
Ответ №2:
Система Drupal form api поможет вам создать любую форму, которая вам нужна. Если вам нужно сохранить настройки, system_settings_form
это хороший ярлык.
Единственное отличие при создании форм администратора заключается в том, чтобы не забывать устанавливать какие-либо требуемые разрешения и размещать форму где-нибудь в /admin/
разделе сайта. В формах администратора на самом деле нет ничего особенного.
Ответ №3:
Если я не неправильно понял ваш вопрос, я думаю, вы можете избежать проблем с Forms API, используя модуль Webform.
Не требуется код, приятный пользовательский интерфейс и встроенные инструменты статистики.
http://drupal.org/project/webform
Посмотрите пару обучающих видеороликов, и вы сможете создать практически любую форму в кратчайшие сроки.
Комментарии:
1. возможно ли использовать webform с модулем views?