如何为Drupal的管理员用户开发自定义表单?

use*_*003 1 forms drupal

对于管理员来说,这将是为drupal开发自定义表单的最佳方式吗?

先感谢您!

wil*_*aks 6

首先,您需要一个位置来访问您的表单,最好是在" 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'),
        ),
    );
}
Run Code Online (Sandbox Code Playgroud)

现在,要实际显示页面:" page arguments "中提供的值是drupal_get_form期望提供表单结构(必须是关联数组)的函数的名称:

/**
 * Form Structure
 */
function modulename_form_something(&$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;
}
Run Code Online (Sandbox Code Playgroud)

以下是有关Forms API的更多信息,您可以使用它来轻松制作一些非常复杂的表单.


现在你的表单显示在"/ admin/build/something"中,但你可能也想用这些数据做这些事情; 默认情况下,validate和submit函数的名称与表单结构函数相同,分别带有" _validate "和" _submit "(但是您可以在表单结构中使用#validate#submit覆盖它).

例如,假设字符串" no "不是有效值,其他所有内容都被接受.

/**
 * Form validation
 */
function modulename_form_something_validate($form, &$form_state){
    if ($form_state['values']['myfield'] == 'no'){
        form_set_error('myfield', '"<b>no</b>" is not a valid answer, try again.');
    }
}
Run Code Online (Sandbox Code Playgroud)

首先调用验证,但是您应该只检查该函数中的数据是否正常.如果您需要在收到表单时执行操作,请在"submit"处理程序中执行操作,因为可以多次调用validate,而submit只调用一次.

/**
 * Form submission
 */
function modulename_form_something_submit(&$form, &$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'] );
}
Run Code Online (Sandbox Code Playgroud)

让我们总结一下,这是整个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(&$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, &$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(&$form, &$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'] );
}
Run Code Online (Sandbox Code Playgroud)

不要忘记你还需要一个.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"
Run Code Online (Sandbox Code Playgroud)