跳转到主要内容
东方龙马 提交于 4 May 2009
Drupal有各种节点类型(在用户界面叫做内容类型),例如新闻和页面。为了达到只对其中一些做出注释的目的,我们需要建立一个页面用来告知模块究竟有哪些节点类型是我们想注释的。在此页面中,我们需要有一个对每一个存在的节点类型都生效的复选框(check boxes)。这样用户就可以通过是否选中某些选项来决定是否对相应的节点类型进行注释。这种页面叫做管理页面,其代码只在有必要的时候才会进行读取和分析。所以,我们不将它放在每次有页面请求都会被读取的annotate.module文件中,而是单独的放在一个名为annotate.admin.inc的文件里。   首先要做的是建立sites/all/modules/custom/annotate/annotate.admin.inc文件,然后把下面这段代码添加进去:   <?php //$Id$   /**  *@file  *Administration page callbacks for annotate module.  */   /**  *Form builder. Configure annotations.  *  *@ingroup forms  *@see system_settings_form().  */ function annotate_admin_settings(){  //Get an array of node types with internal names as keys and  //“friendly names”as values.  //E.G.,array(‘page’ => ‘Page’,’story’ => ‘Story’)  $options = node_get_types(‘names’);    $form[‘annotate_node_types’] = array( ‘#type’ => ‘checkboxes’, ‘#title’ => t(‘Users may annotate these content types’), '#options' => $options, '#default_value' => variable_get('annotate_node_types', array('page')), '#description' => t('A text field will be available on these content types to make user-specific notes.'), );   return system_settings_form($form); }   表单在Drupal中是以一种树状结构出现的,准确的说是多维数组。这种结构向durpal的表单生成引擎描述了表单究竟该如何呈现。为了可读性方面的考虑,我们将数组的每个元素独立的放在一行。每个表单的属性(实际上是数组的键)用一个井号(‘#’)标出。一开头,我们就将表单元素中type一项声明为“checkboxes”,这是说将会把一个带有键值的数组以复选框的形式展现出来。而这个数组就是我们在变量 $options中得到的。   就这样,node_get_types('names')输出结果从它本来的返回值——一个带有键值的数组,现在已经变成了方便可用的选项。   此时的输出结果大致如下:     数组的键值就是Drupal内在的节点类型,在它的右边,是用来展示给用户看的比较通俗的名字。假设你的Drupal有一个叫做Savory Recipe的节点,那么数组的输出可能就会变成下面这样:     也就是说,在网页表单中,Drupal将会生成一个选项是page和story的复选区域。   然后我们通过定义#title的值来给以上的表单元素加上一个恰当的标题。   提示:t()函数是Drupal用来使字符翻译变的更容易的函数,任何用来给用户阅读的文本都应该用它来定义和返回,比如我们表单中的#title和#description。这样通过让字符翻译函数去执行所有的文本,就可以使你的模块在其他语言环境下的本地化过程变得容易许多。而我们并没有对菜单项这样做的原因是——菜单项的翻译工作是自动进行的。   下一个指令#default_value,其值将会是这个表单元素的默认值。由于checkboxes是一个复数的表单元素(可以有不只一个checkbox存在于其中),所以#default_value的值也是一个数组,这个数组很值得讨论一下:   variable_get(‘annotate_node_types’,array(‘story’))   Drupal允许开发者们通过使用这样一对特殊的函数:variable_get() 和 variable_set()来实现任意变量的存取。数据存在variables数据表中,而且当程序需要的时候随时可以读取。因为这些变量是在每个请求进行的过程中都要从数据库中检索出来的,那么用这种方式来储存大量的数据显然不是一个好主意。但它用来存储诸如模块的配置设定之类的值显然是非常方便的系统。这里要注意的是,我们传给variable_get()函数的首先是一个对键值的描述,然后是这个键的默认值。在这个例子中,键的值就是允许添加注释的节点的类型数组,而其默认值我们设置为story这个节点类型。   小贴士:当使用system_settings_form()的时候,表单元素的名字(这里是annotate_node_types)必须和variable_get()中键的名字保持一致。   最后,我们用一个描述来为网站管理员提供了一些信息。   保存你刚刚建立的文件,然后访问Administer > Site building > Modules。你的模块应该在列表的末尾,其组别是Pro Drupal Development(如果它不在那,再次检查你的annotate.info和annotate.module文件,并确保他们在sites/all/modules/custom 目录下)。那么,启用你的新模块吧。   现在annotate模块已经启用了,从导航条进入到Administer >Settings > Annotate应该就能看见annotate.module的设置页面了。(如图2-1所示)                图2-1 annotate.module为我们生成的配置表单   看,只用了几行代码,我们的模块就有了一个可以自动保存设定的函数配置表!OK,其中一行字有些太长了,但这完全不影响你感受Drupal给你带来的能力大增的美妙感觉。

 

Taxonomy upgrade extras