Как разработать пользовательские формы для пользователей-администраторов Drupal?

#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?