欢迎各位兄弟 发布技术文章
这里的技术是共享的
1)druapl创建的表单是安全的
封装了表单的创建和存取
它表单首先存储于数据库
对表单进行缓存
第二个用户 就不用生存 直接从数据库取(我觉得是从缓存取吧)
每个表单有id 通过id取表单
2)drupal_get_form($from_id)
http://api.drupal.org/api/function/drupal_get_form/5
看到说明
根据某个表单构造函数,生成相应的表单,
某个表单构造函数 自己随便定义的函数,是不受任何钩子函数的回调
$from_id为表单的名字(唯一)
drupal_get_form("hello_form")
多个表单以向导的方式提交时,此函数可保存表单状态
function my_form()//my_form 就是 $form_id
{
// 文本框 name是文本框的名称
$form['name'] = array(
'#type' =>'textfield',//drupal 规定文本框用textfield来表示
'#title'=>t('Your name'),//标题 显示在文本框前面
'#description'=>t('Please input your name');//文本框下面的描述
}
//提交按钮 //
$form['submit'] = array('#type'=>'submit','#value'=>t('Save'));
return $form;
}
function hello_drupal_form(){
return drupal_get_form('my_form');
}
表单元素有哪些
http://api.drupal.org/api/file/developer/topics/forms_api_reference.html/5
fieldset 将表单元素分组
属性
'#collapsible' => TRUE, //是否可折叠
'#collapsed' => FALSE, //默认是(false)打开 还是(true)关闭
function my_form()//my_form 就是 $form_id
{
$form['basic'] = array(
'#type'=>'fieldset',
'#title'=>t('Basic information'),
'#collspsiable'=>true,
'#collapsed'=>false
);
// 文本框 name是文本框的名称
$form['basic']['name'] = array(
'#type' =>'textfield',//drupal 规定文本框用textfield来表示
'#title'=>t('Your name'),//标题 显示在文本框前面
'#default_value'=>'hello world',
'#description'=>t('Please input your name')//文本框下面的描述
);
$form['basic']['age'] = array(
'#type'=>'textfield',
'#title'=>'Your age'
);
//提交按钮 //
$form['submit'] = array('#type'=>'submit','#value'=>t('Save'));
return $form;
}
item 可读的元素 纯文字的描述
$form['notice'] = array(
'#type' =>'item',
'#value'=>'切记,这是一次性批量操作,容易出错',
'#title' =>'bbbbbbbb',
);
3) t('Your name') 开发中文网站的时候 可以直接写
4) 验证类似于钩子函数 表单函数名_validate
//两个参数 必写
//$form_id表单id
//$form_values表单的相当于post,
但是作用比post大,它本质上是从db中取的
//此函数其实是可选的,可以不验证
//drupal 5
function test_form_validate($form_id,$form_values)
{
form_set_error('',t(You must input your name'));
}
//drupal 6
/ * 表单验证
* @param (array) &$form
* 表单字段
* @param (array) &$form_state
* 表单值,用做判断表单的各种参数,包括用户提交的所有数据
*/
function myform_page_form_validate(&$form, &$form_state) {
/**
* 用户提交的所有数据在 $form_state['values'] 之中,相当于 $_POST
* 根据需求,验证昵称是否少于 2 个字符,中英文均算一个字符
* 可使用封装好的计算字符串长度函数:drupal_strlen
*/
if (drupal_strlen($form_state['values']['name']) < 2) {
/**
* 如果少于 2 个字符,调用 form_set_error() 写入错误信息,系统将显示错误信息,同时阻止表单提交
* form_set_error() 的格式,第一个参数:字段名称,第二个参数:用户将看到的错误信息
*/
form_set_error('name', '昵称不能少于 2 个字符');
} else if (drupal_strlen($form_state['values']['title']) > 255) {
form_set_error('title', '标题长度不能大于 255 个字符');
}
// 如验证通过,将进入表单提交环节
}
5)submit 类似于钩子函数的回调函数
表单函数名_submit
表单提交处理函数
//drupal 5
function test_form_submit($form_id,$form_values)
{
drupal_set_message(t('Your name is ').$form_values['name'].' '.
t('Your age is ').$form_values['age'];
}
//drupal 6
/**
* 表单提交
* @param (array) &$form
* @param (array) &$form_state
*/
function myform_page_form_submit(&$form, &$form_state) {
/**
* 写入数据库
*/
db_query("INSERT INTO {myform} (id, title, name, mail, timestamp, body)
VALUES (null, '%s', '%s', '%s', %d, '%s')", $form_state['values']['title'],
$form_state['values']['name'], $form_state['values']['mail'],
$_SERVER['REQUEST_TIME'], $form_state['values']['body']);
// 获取上一条 insert sql 返回的主键,以此判断是否执行成功
if (db_last_insert_id('myform', 'id')) {
/**
* 执行成功了,到数据库去看看,是不是有这条记录了
* 显示一条信息给用户
*/
drupal_set_message('感谢您,反馈已经提交,我们将尽快和您取得联系');
// 如果想将用户重定向到一个页面,可修改 $form['#redirect'] 值,如:
$form['#redirect'] = 'test/abcde';
/**
* 这里也可以使用 drupal_goto 来重定向,但这并不是个好方法
* 因为可能还有其它提交函数在 后面排队,被这儿一重定向,后面就没机会执行了
*/
} else {
// 数据写入失败了
drupal_set_message('抱歉,遇到问题,提交失败了', 'error');
}
}
<?php
//帮助
function hellodrupal_help($path) {
$output = ''; //declare your output variable
switch ($path) {
case "admin/help#hellodrupal":
$output = '<p>'. t("第一个Drupal模块") .'</p>';
break;
}
return $output;
}//function on this display help
function hellodrupal_block($op='list',$delta=0){
switch ($op)
{
case 'list' :
$block[0]['info'] = t('我的第一个drupal模块');
$block[1]['info'] = t('我的第二个drupal模块');
return $block;
case 'view' :
switch ($delta)
{
case 0 :
$block['subject'] = '我的第一个block';
$block['content'] = '欢迎访问我的站点';
break;
case 1 :
//$block['subject'] = '我的第二个block';
//$block['content'] = '欢迎再次访问我的站点';
$query = "select nid,title,created from {node}";
$queryResult = db_query_range($query, 0 ,10);
$links = array();
while ($node = db_fetch_object($queryResult))
{
$links[] = l($node->title,'node/'.$node->nid);
}
$block['content'] = theme('item_list', $links);
$block['subject'] = '我的第二个block';
break;
}
return $block;
break;
}
}
function hellodrupal_menu() {
$items = array();
$items['hello'] = array(
'title'=>t('hello drupal page'),
'page callback'=>'hello_druapl_page',
'page arguments' => array('hello','helloDrupal'),
//'page arguments' => array(1,2),
//它的优先级 大于 url传来的参数 也就是此时url如果放参数,参数不起作用我
//如果要默认值 就放在回调函数的形参上 (默认的时候要注意,第几个有默认值, page arguments=>array(......)) 中第几个元素就必须没有,假如有的话 虽不在url中赋值,但是是有值的 值为两个单或双引号括起来
//array(1,2)表示只取url前两个参数 array(1)表示只取url第一个参数
'access arguments'=> array('access hellodrupal blocks')
);
$items['helloform'] = array(
'title'=>t('hello drupal page form'),
'page callback'=>'hello_drupal_form',
'page arguments' => array('page callback arguments'),
'access arguments'=> array('access hellodrupal blocks')
);
return $items;
}
/*function hello_druapl_page()
{
$output = 'hello drupal page';
return $output;
}*/
function hello_druapl_page($name = null, $nickname = null)
{
$output = '';
if(empty($name)){
$output = "hello andbody";
}
else {
$output = "hello ".$name;
}
if(!empty($nickname)){
$output .= ' your nick name is '.$nickname;
}
return $output;
}
//定义权限 仅仅指明什么权限对这个模块可用
function hellodrupal_perm(){
return array('access hellodrupal blocks');
}
function hello_drupal_form(){
return drupal_get_form('my_form');
}
/*function my_form()//my_form 就是 $form_id
{
// 文本框 name是文本框的名称
$form['name'] = array(
'#type' =>'textfield',//drupal 规定文本框用textfield来表示
'#title'=>t('Your name'),//标题 显示在文本框前面
'#description'=>t('Please input your name')//文本框下面的描述
);
//提交按钮 //
$form['submit'] = array('#type'=>'submit','#value'=>t('Save'));
return $form;
}*/
function my_form()//my_form 就是 $form_id
{
$form['basic'] = array(
'#type'=>'fieldset',
'#title'=>t('Basic information'),
'#collapsible'=>true,
'#collapsed'=>false
);
// 文本框 name是文本框的名称
$form['basic']['name'] = array(
'#type' =>'textfield',//drupal 规定文本框用textfield来表示
'#title'=>t('Your name'),//标题 显示在文本框前面
'#default_value'=>'hello world',
'#description'=>t('Please input your name')//文本框下面的描述
);
$form['basic']['age'] = array(
'#type'=>'textfield',
'#title'=>'Your age'
);
//提交按钮 //
$form['submit'] = array('#type'=>'submit','#value'=>t('Save'));
return $form;
}
//表单函数_validate 验证类似于钩子函数的回调函数
function my_form_validate(&$form, &$form_state)
{
/**
* 用户提交的所有数据在 $form_state['values'] 之中,相当于 $_POST
*/
// form_set_error('',$form_values['name']);
if($form_state['values']['name'] == '')
{
form_set_error('',t('You must input your name'));
}
}
//表单函数_submit 提交函数
function my_form_submit(&$form, &$form_state)
{
/**
* 用户提交的所有数据在 $form_state['values'] 之中,相当于 $_POST
*/
drupal_set_message(t('Your name is ').$form_state['values']['name'].' '.
t('Your age is ').$form_state['values']['age']);
}