自定义提交及注册登录表单(1)

由 east 于 周三, 2008-02-27 13:35 提交。

原文链接,drupal的默认提交表单形式比较土,而且如果你增加了多个字段,多个分类,表单会变得很长。drupal的最大优点是自由定制,是的,提交表单也完成可以自定义。
这是一张默认的提交表单:
点击查看原图
这是一张自定义的表单:
点击查看原图
这是一张默认注册表单:
点击查看原图
这是一张自定义的注册表单:
点击查看原图
下面就讲一讲自定义提交表单的具体步骤。

第一步,修改主题的template.php。

如果你的主题没有这个文件,就创建一个,这里以文件类型story为例,在其中添加代码:

<?php
function phptemplate_node_form($form) {
  if (
$form['form_id']['#value'] == 'story_node_form') {//story可修改为其它类型
   
return _phptemplate_callback('story_form', array('form' => $form));//story_form,可修改为你喜欢的其它名字
 
}
}
?>

这就是告诉系统提交story文章时,提交表单部分读取story_form.tpl.php这个文件。

第二步,在你的主题文件夹下,创建自定义tpl.php文件。这里就创建一个story_form.tpl.php,在里边随便输入几个字。

第三步,打开node/add/story提交页面看看,刚才输入的几个字是否显示。如果显示,说明已经成功,那就可经开始自定义了。如果不显示,就要看看是不是前面的步骤出错了。

第四步,开始自定义。

把这个代码放在story_form.tpl.php中:

<?php
print drupal_render($form['title']);
?>

刷新提交页面看看,是不是出现标题字段了。就是这么简单。接下来就跟写静态html页面一样简单,查看这个类型有多少个字段,一般来说,标题和正文都是有的:

<?php
print '<div class="title">'.drupal_render($form['title']).'</div>'.<div class="body">'.drupal_render($form['body_filter']).'</div>'; //div是随便加的,可以自由定义
?>

单个分类字段的代码通常是这样的:

<?php
print drupal_render($form['taxonomy']['x']); //x等于你的分类vid
?>

如果要连分组一起(包含fieldset样式),以分类为例,这样就行了:

<?php


print drupal_render($form['taxonomy']); //不需要指定分类vid 了,所有分类都出来了,不过fieldset也跟来了
?>

如果是cck增加的文本字段,通常形式是这样的:

<?php
print drupal_render($form['field_xxxx']['0']['value']);//xxxx等于字段名


?>

cck的图片、link、上传等字段通常是这样的:

<?php


print drupal_render($form['field_xxxx']);//xxxx等于字段名


?>

所有其它模块生成的字段也类似于此,可以到该模块的主文件中找到。最后当然就是提交和预览这些按钮了:

<?php
print drupal_render($form['form_token']);
print
drupal_render($form['form_id']);
print
drupal_render($form['preview']);
print
drupal_render($form['submit']);
?>

还有一些日志信息、菜单设置、发布设置怎么办?使用这个代码就行了:

<?php
print drupal_render($form);
?>

事实上drupal_render($form)会把该类型的所有字段都显示出来,但它不会重复显示,也就是说,如果你上面自定义了某个字段,它就不会显示了。所以如果你只需要定义某两个字段的样式,就把那两个字段的代码拎出来放在上面,然后跟上drupal_render($form),最后加上提交、预览等按钮就完成了。

接下来的事,当然就是去修改css了。

参考链接: http://drupal.org/node/101092 这个主帖中的方法适用于4.7。

貌似也可以用在5.x

原文最后不是有一句话吗:for those playing around with Drupal 5.x; replace form_render() with drupal_render()
不过我也没经过试验嘿嘿