﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-&lt;h3 style="font-family: Comic Sans MS"&gt;&lt;font color="#FA1A0A" size="10"&gt;︻┳═一Java&lt;/font&gt;&lt;/h3&gt;-随笔分类-PHP</title><link>http://www.blogjava.net/rain1102/category/37651.html</link><description>&lt;br/&gt;&lt;font color="green" style="font-family: 华文行楷;font-size:16px;"&gt;子曰：危邦不入，乱邦不居。天下有道则见，无道则隐。&lt;/font&gt;&lt;font color="#3C1435"&gt;&lt;/font&gt;</description><language>zh-cn</language><lastBuildDate>Fri, 20 Feb 2009 09:44:56 GMT</lastBuildDate><pubDate>Fri, 20 Feb 2009 09:44:56 GMT</pubDate><ttl>60</ttl><item><title>Windows下IIS+PHP 5.2的安装与配置</title><link>http://www.blogjava.net/rain1102/archive/2009/01/07/250374.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Wed, 07 Jan 2009 09:05:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/01/07/250374.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/250374.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/01/07/250374.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/250374.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/250374.html</trackback:ping><description><![CDATA[<p>Windows下PHP的安装虽然简单，但如果不注意方法，仍然会让你头疼。此外，PHP 5.2版本与之前4.x版本也有一些不同，所以有必要记录一下，避免下次忘记了这样的安装配置方法。<br />
<br />
步骤一：下载php 5.2 for windows的安装包，解压至C:\php。注意此解压目录可以是在任何盘下，然而目录名不能包含空格；<br />
以下是php5.2的文件目录：<br />
c:\php<br />
&nbsp;&nbsp; |<br />
&nbsp;&nbsp; +--dev<br />
&nbsp;&nbsp; |&nbsp; |<br />
&nbsp;&nbsp; |&nbsp; |-php5ts.lib<br />
&nbsp;&nbsp; |<br />
&nbsp;&nbsp; +--ext&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- extension DLLs for PHP<br />
&nbsp;&nbsp; |&nbsp; |<br />
&nbsp;&nbsp; |&nbsp; |-php_bz2.dll<br />
&nbsp;&nbsp; |&nbsp; |<br />
&nbsp;&nbsp; |&nbsp; |-php_cpdf.dll<br />
&nbsp;&nbsp; |&nbsp; |<br />
&nbsp;&nbsp; |&nbsp; |-..<br />
&nbsp;&nbsp; |<br />
&nbsp;&nbsp; +--extras<br />
&nbsp;&nbsp; |&nbsp; |<br />
&nbsp;&nbsp; |&nbsp; +--mibs&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- support files for SNMP<br />
&nbsp;&nbsp; |&nbsp; |<br />
&nbsp;&nbsp; |&nbsp; +--openssl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- support files for Openssl<br />
&nbsp;&nbsp; |&nbsp; |<br />
&nbsp;&nbsp; |&nbsp; +--pdf-related&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- support files for PDF<br />
&nbsp;&nbsp; |&nbsp; |<br />
&nbsp;&nbsp; |&nbsp; |-mime.magic<br />
&nbsp;&nbsp; |<br />
&nbsp;&nbsp; +--pear&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- initial copy of PEAR<br />
&nbsp;&nbsp; |<br />
&nbsp;&nbsp; |<br />
&nbsp;&nbsp; |-go-pear.bat&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- PEAR setup script<br />
&nbsp;&nbsp; |<br />
&nbsp;&nbsp; |-fdftk.dll<br />
&nbsp;&nbsp; |<br />
&nbsp;&nbsp; |-..<br />
&nbsp;&nbsp; |<br />
&nbsp;&nbsp; |-php-cgi.exe&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- CGI executable<br />
&nbsp;&nbsp; |<br />
&nbsp;&nbsp; |-php-win.exe&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- executes scripts without an opened command prompt<br />
&nbsp;&nbsp; |<br />
&nbsp;&nbsp; |-php.exe&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- CLI executable - ONLY for command line scripting<br />
&nbsp;&nbsp; |<br />
&nbsp;&nbsp; |-..<br />
&nbsp;&nbsp; |<br />
&nbsp;&nbsp; |-php.ini-dist&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- default php.ini settings<br />
&nbsp;&nbsp; |<br />
&nbsp;&nbsp; |-php.ini-recommended&nbsp; -- recommended php.ini settings<br />
&nbsp;&nbsp; |<br />
&nbsp;&nbsp; |-php5activescript.dll<br />
&nbsp;&nbsp; |<br />
&nbsp;&nbsp; |-php5apache.dll<br />
&nbsp;&nbsp; |<br />
&nbsp;&nbsp; |-php5apache2.dll<br />
&nbsp;&nbsp; |<br />
&nbsp;&nbsp; |-..<br />
&nbsp;&nbsp; |<br />
&nbsp;&nbsp; |-php5ts.dll&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- core PHP DLL<br />
&nbsp;&nbsp; |<br />
&nbsp;&nbsp; |-...<br />
<br />
步骤二：将c:\php目录下的php.ini-recommended（或php.ini-dist文件，官方推荐为前者）复制到当前目录，并修改文件名为php.ini；<br />
<br />
步骤三：编辑php.ini。主要修改如下两行的值：<br />
extension_dir = "c:\php\ext"<br />
doc_root = "c:\inetpub\wwwroot"<br />
<br />
修改时需要删除掉这两行行首的;注释。extension_dir的值为php安装目录下的ext目录，doc_root的值为IIS设置的主目录；<br />
<br />
步骤四：设置环境变量。在Path后添加如下的值：<br />
;:\php<br />
然后重启计算机。<br />
<br />
步骤五：打开Internet信息服务，找到&#8220;默认网站&#8221;，将网站停止。然后打开&#8220;属性&#8221;页。在&#8220;属性&#8221;页中找到&#8220;主目录&#8221;标签，单击&#8220;配置&#8221;按钮，添加应用程序映射。其值分别为：<br />
可执行文件：c:\php\php5isapi.dll<br />
扩展名：.php<br />
其余不用修改，确定后，重新启动默认网站；<br />
<br />
步骤六：在c:\inetpub\wwwroot下新建一个文件hello.php。输入内容：<br />
&lt;html&gt;<br />
&nbsp; &lt;head&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;title&gt;World&lt;/title&gt;<br />
&nbsp; &lt;/head&gt;</p>
<p>&nbsp; &lt;body&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;?php echo "Hello world" ?&gt;<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp; &lt;/body&gt;<br />
&lt;/html&gt;<br />
保存后，打开浏览器，输入地址：<a href="http://localhost/hello.php">http://localhost/hello.php</a>。如果网页中显示Hello world则说明安装正确。我们也可以在网页中通过查看hello.php的源代码，如果源代码中没有php代码，也说明安装是正确的。<br />
</p><img src ="http://www.blogjava.net/rain1102/aggbug/250374.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2009-01-07 17:05 <a href="http://www.blogjava.net/rain1102/archive/2009/01/07/250374.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OG(Organic Group) 模块介绍</title><link>http://www.blogjava.net/rain1102/archive/2007/12/20/168950.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Thu, 20 Dec 2007 02:21:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2007/12/20/168950.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/168950.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2007/12/20/168950.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/168950.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/168950.html</trackback:ping><description><![CDATA[<p><strong>Description<br />
</strong>让使用者可以建立并管理他们自己的群组。每一个群组可以拥有自己的成员，并有一个群组首页，让群组成员可以在此张贴文章、彼此交流。<br />
有的群组需要管理者审核后才能加入，或甚至需要透过邀请才能加入。群组可以拥有自己的版型、语系、分类等，有多个设定项目，并可与View模块整合。<br />
Enable users to create and manage their own 'groups'. Each group can have subscribers, and maintains a group page where subscribers can post into. Posts may be placed into multiple groups (i.e. cross-posting) and individual posts may be shared with non-subscribers or not. Membership to groups may be open, closed, moderated, or invitation only. Add-on modules are available for group image galleries, group calendars, group vocabulary, group stores, and so on.</p>
<p>Groups may choose their own theme and language. Groups have RSS feeds, and so on.<br />
<br />
<strong>Installation<br />
</strong>安装以后，需要新建一个内容类型，比如：groups，然后把这个groups内容类型与OG关联（进入Organic groups configuration，设置Group home page 为groups 内容类型）。</p>
<p>&nbsp;</p>
相关模块：<br />
------------------------------------------------------------------<br />
<span style="font-weight: bold"><span style="font-weight: bold">OG Actions</span><br />
<ol class="bb-list" style="list-style-type: circle">
    <li><a href="http://drupal.org/project/og_actions">http://drupal.org/project/og_actions</a>
    <li>
    <li>The og_actions module is a collection of 5 actions for use with the actions module and workflow module. These actions facilitate the use of organic groups with the actions and workflow modules, allowing administrators to create rules to modify the organic group information for specific nodes. </li>
</ol>
<p>---------------------------------------------------------------------------------<br />
<span style="font-weight: bold">OG Aggregator</span><br />
<ol class="bb-list" style="list-style-type: circle">
    <li><a href="http://drupal.org/project/og_aggregator">http://drupal.org/project/og_aggregator</a>
    <li>可以让 Organic Groups 拥有自己的 RSS Aggregator。
    <li>A module to create individual aggregator for Organic Groups using Aggregator.<br />
    Key features<br />
    ------------------<br />
    - Feed content filter (including keyword filter and excluding keyword filter)<br />
    - An individual feed page of every feed source is available<br />
    Requirements<br />
    ------------------<br />
    - Aggregator module<br />
    - OG module </li>
</ol>
<p>---------------------------------------------------------------------------------<br />
<span style="font-weight: bold">OG Audience</span><br />
<ol class="bb-list" style="list-style-type: circle">
    <li><a href="http://drupal.org/project/og_audience">http://drupal.org/project/og_audience</a>
    <li>
    <li>The OG Audience module provides an "audience" tab and/or a block on node pages that allows <a class="bb-url" href="http://drupal.org/project/og">Organic Groups</a> (OG) users to change the audience of existing content. A user can add a node to one or more of his subscribed groups. A group administrator can remove a node from his group(s).<br />
    Users with the proper permission can change the audience of a node even if they do not have the permission to edit the node. </li>
</ol>
<p>---------------------------------------------------------------------------------<br />
<span style="font-weight: bold">OG Author</span><br />
<ol class="bb-list" style="list-style-type: circle">
    <li><a href="http://drupal.org/project/og_author">http://drupal.org/project/og_author</a>
    <li>
    <li>This is a small module to set the authoring group for any group post.<br />
    This module has been sponsored by <a href="http://www.wiki9999.org/">http://www.wiki9999.org/</a> </li>
</ol>
<p>---------------------------------------------------------------------------------<br />
<span style="font-weight: bold">OG Block Visibility</span><br />
<ol class="bb-list" style="list-style-type: circle">
    <li><a href="http://drupal.org/project/og_block_visibility">http://drupal.org/project/og_block_visibility</a>
    <li>可以设定区块仅出现在某个群组里，例如可以用来让每个群组拥有自己的导览选单，或是让群组可以强调自己推荐的内容等。
    <li>This module allows you to specify that a block should be visible only within a selected group. This can be used for many purposes, from providing each organic group with its own navigation menu, to allowing a group to highlight its own featured content, etc. </li>
</ol>
<p>---------------------------------------------------------------------------------<br />
<span style="font-weight: bold">OG Calendar</span><br />
<ol class="bb-list" style="list-style-type: circle">
    <li><a href="http://drupal.org/project/og_calendar">http://drupal.org/project/og_calendar</a>
    <li>让每个群组都可以拥有一个活动行事历，仅显示该群组的活动。
    <li>This module provides each group with a calendar showing only the group's events.<br />
    Sponsored by Raven Brooks of <a class="bb-url" href="http://www.buyblue.org/">BuyBlue</a>.<br />
    Developed by <a class="bb-url" href="http://www.civicspacelabs.com/">CivicSpace Labs</a>. </li>
</ol>
<p>---------------------------------------------------------------------------------<br />
<span style="font-weight: bold">OG Forum</span><br />
<ol class="bb-list" style="list-style-type: circle">
    <li><a href="http://drupal.org/project/og_forum">http://drupal.org/project/og_forum</a>
    <li>让每个群组都拥有一个讨论版，并限制为仅有群组成员可以检视该讨论区里的文章。
    <li>Creates a forum per organic group and restricts viewing forum nodes by group membership.<br />
    <span style="font-weight: bold">Go ahead and use the dev release from the 30th of August.</span> It contains a bug fix to 2.0. </li>
</ol>
<p>---------------------------------------------------------------------------------<br />
<span style="font-weight: bold">OG Galleries</span><br />
<ol class="bb-list" style="list-style-type: circle">
    <li><a href="http://drupal.org/project/og_galleries">http://drupal.org/project/og_galleries</a>
    <li>
    <li>A module to create individual image galleries for Organic Groups using Taxonomy and Views. A public gallery is created, along with galleries for each group which are private to that group. Your galleries are controlled by a Views view, and you can set the url, fields, and filters as you like by changing the view. Node types can be image nodes, CCK nodes, or any other content type. Add items to the galleries by selecting a gallery when the node is edited. </li>
</ol>
<p>---------------------------------------------------------------------------------<br />
<span style="font-weight: bold">OG Gradebook</span><br />
<ol class="bb-list" style="list-style-type: circle">
    <li><a href="http://drupal.org/project/og_gradebook">http://drupal.org/project/og_gradebook</a>
    <li>
    <li>Creates a gradebook per organic group and restricts viewing grades by group membership. </li>
</ol>
<p>---------------------------------------------------------------------------------<br />
<span style="font-weight: bold">OG Join Role</span><br />
<ol class="bb-list" style="list-style-type: circle">
    <li><a href="http://drupal.org/project/og_joinrole">http://drupal.org/project/og_joinrole</a>
    <li>
    <li>The OG Join Role module simply adds a "join organic groups" permission to the Organic Groups module. A use case for this would be if you have a site where only members of a certain role are allowed to join an organic group. <br />
    The module is written in an all-or-nothing sort of way - either certain roles can join any and all groups or they can join no groups. It will not work on a per-group basis.<br />
    In addition to granting/denying permission to join a group, the module also modifies any text and/or links to join a group unless the user has the proper role. For example, the module removes any "og/subscribe" links on the page and replaces them with "nicer" text that you define in the admin settings. </li>
</ol>
<p>---------------------------------------------------------------------------------<br />
<span style="font-weight: bold">OG Minutes</span><br />
<ol class="bb-list" style="list-style-type: circle">
    <li><a href="http://drupal.org/project/og_minutes">http://drupal.org/project/og_minutes</a>
    <li>
    <li>This module makes <a class="bb-url" href="http://drupal.org/project/og">Organic groups</a> and <a class="bb-url" href="http://drupal.org/project/minutes">Minutes</a> work together. It allows to filter users so that the list of potential attendees in Minutes shows only the members of the group(s) to which the related event belongs. </li>
</ol>
<p>---------------------------------------------------------------------------------<br />
<span style="font-weight: bold">OG moderated posts</span><br />
<ol class="bb-list" style="list-style-type: circle">
    <li><a href="http://drupal.org/project/og_moderate">http://drupal.org/project/og_moderate</a>
    <li>
    <li>This module moderates public posts from organic groups module. Moderated posts will be hidden from anonymous visitors. Moderation needs to be done by node administrators or another module. </li>
</ol>
<p>---------------------------------------------------------------------------------<br />
<span style="font-weight: bold">OG Project</span><br />
<ol class="bb-list" style="list-style-type: circle">
    <li><a href="http://drupal.org/project/og_project">http://drupal.org/project/og_project</a>
    <li>
    <li>Allows the <a class="bb-url" href="http://drupal.org/project/project_issue">Project issue tracking module</a> to function properly on a site that has <a class="bb-url" href="http://drupal.org/project/og">Organic groups</a> enabled. Without this module, the issue tracker does not work if you enable organic groups. </li>
</ol>
<p>---------------------------------------------------------------------------------<br />
<span style="font-weight: bold">OG promote</span><br />
<ol class="bb-list" style="list-style-type: circle">
    <li><a href="http://drupal.org/project/og_promote">http://drupal.org/project/og_promote</a>
    <li>
    <li>Promote users that join certain groups to a special role.<br />
    Choose one role that all users who join the groups you select will be promoted to. Should a user leave that group, he will be demoted again. </li>
</ol>
<p>---------------------------------------------------------------------------------<br />
<span style="font-weight: bold">OG Public Access</span><br />
<ol class="bb-list" style="list-style-type: circle">
    <li><a href="http://drupal.org/project/og_public_access">http://drupal.org/project/og_public_access</a>
    <li>
    <li>The OG Public Access module allows <a class="bb-url" href="http://drupal.org/project/og">Organic Groups</a> (OG) administrators to control public access to their groups' content. This module does <span style="font-weight: bold">not</span> require group administrators to be granted the site-wide administer nodes permission.<br />
    The use case for this module is for a site with teams of writers submitting content privately in their groups, and editors controlling what is allowed to go public in specific groups. </li>
</ol>
<p>---------------------------------------------------------------------------------<br />
<span style="font-weight: bold">OG Roles</span><br />
<ol class="bb-list" style="list-style-type: circle">
    <li><a href="http://drupal.org/project/og_roles">http://drupal.org/project/og_roles</a>
    <li>
    <li>This module allows you to, for each group type, specify a list of roles that group administrators are allowed to assign. </li>
</ol>
<p>---------------------------------------------------------------------------------<br />
<span style="font-weight: bold">OG Teampage</span><br />
<ol class="bb-list" style="list-style-type: circle">
    <li><a href="http://drupal.org/project/og_teampage">http://drupal.org/project/og_teampage</a>
    <li>
    <li>This module provides a table view with all members (subscribers) of an organic group. </li>
</ol>
<p>---------------------------------------------------------------------------------<br />
<span style="font-weight: bold">OG User Roles</span><br />
<ol class="bb-list" style="list-style-type: circle">
    <li><a href="http://drupal.org/project/og_user_roles">http://drupal.org/project/og_user_roles</a>
    <li>
    <li>This module allows you to assign group-specific roles to users which are restricted to the groups they are in. In other words, using this module, you can assign the role "contributor" to a user in a group, and the user will only have the permissions of that role while he is in that particular group. <br />
    Requires og.module and og_forums.module.<br />
    Read the history of this module: <a href="http://drupal.org/node/87679">http://drupal.org/node/87679</a><br />
    Other features of this module allow you to:
    <p>&nbsp;</p>
    <ol class="bb-list" style="list-style-type: circle">
        <li>Assign a default role to all new users who sign up to your site.
        <li>Notify group admin of new group subscribers. Requires mimemail.module.
        <li>Set a default "Founder" group role for users who create groups.
        <li>Set a default group role for new subscribers to a group.
        <li>Create subgroups. Requires og_subgroups.module.
        <li>Comes with it's own access control for optionally integrating the taxonomy access control (TAC) and organic groups (OG) modules. See: <a href="http://groups.drupal.org/node/3700">http://groups.drupal.org/node/3700</a>.
        <li>Supports Content Access (<a href="http://www.drupal.org/project/content_access">http://www.drupal.org/project/content_access</a>) and Access Control List (<a href="http://www.drupal.org/project/acl">http://www.drupal.org/project/acl</a>) access control modules. See <a href="http://groups.drupal.org/node/5392">http://groups.drupal.org/node/5392</a>
        <li>Works with OG Vocabulary (<a href="http://www.drupal.org/project/og_vocab">http://www.drupal.org/project/og_vocab</a>) module. See this issue: <a href="http://drupal.org/node/162649">http://drupal.org/node/162649</a> </li>
    </ol>
    </li>
</ol>
<p>---------------------------------------------------------------------------------<br />
<span style="font-weight: bold">OG Vocab</span><br />
<ol class="bb-list" style="list-style-type: circle">
    <li><a href="http://drupal.org/project/og_vocab">http://drupal.org/project/og_vocab</a>
    <li>让每个群组都可以拥有自己的分类（vocabularies）。
    <li>Provide each <a class="bb-url" href="http://drupal.org/project/og">organic group</a> with its own vocabularies. </li>
</ol>
</span><br /><img src ="http://www.blogjava.net/rain1102/aggbug/168950.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2007-12-20 10:21 <a href="http://www.blogjava.net/rain1102/archive/2007/12/20/168950.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>模块介绍：Book Review</title><link>http://www.blogjava.net/rain1102/archive/2007/12/19/168775.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Wed, 19 Dec 2007 08:17:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2007/12/19/168775.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/168775.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2007/12/19/168775.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/168775.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/168775.html</trackback:ping><description><![CDATA[<ol class="bb-list" style="list-style-type: circle">
    <li><a href="http://drupal.org/project/bookreview">http://drupal.org/project/bookreview</a>
    <li>一个新的节点类型，内建多个与书籍数据相关的字段，包括书名、封面图片、出版者、作者、网站连结、版权、ISBN、页数、价格、摘要、目录、评论等，并可连结到外部的网络书店。<br />
    定义了特殊的书评节点，方便发布图书评论。
    <li>The book review module allows a site to publish book reviews. A book review is simply a glorified node, providing custom fields that are appropriate to writing a book review. </li>
</ol><img src ="http://www.blogjava.net/rain1102/aggbug/168775.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2007-12-19 16:17 <a href="http://www.blogjava.net/rain1102/archive/2007/12/19/168775.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>模块介绍：Article</title><link>http://www.blogjava.net/rain1102/archive/2007/12/19/168698.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Wed, 19 Dec 2007 03:59:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2007/12/19/168698.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/168698.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2007/12/19/168698.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/168698.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/168698.html</trackback:ping><description><![CDATA[<ol class="bb-list" style="list-style-type: circle">
    <li><a href="http://drupal.org/project/article">http://drupal.org/project/article</a>
    <li>将任意类型的节点根据类别（taxonomy）整理在一起集中显示，如生活类有3篇，技术类有4篇等。用户可以按照分类浏览。
    <li>The article module allows for nodes of any type to be organized and displayed in a centralized location. This allows the site administrator to organize nodes of several different types in one place. The user can navigate the nodes by selecting different categories in the taxonomy tree associated with the article module. </li>
</ol><img src ="http://www.blogjava.net/rain1102/aggbug/168698.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2007-12-19 11:59 <a href="http://www.blogjava.net/rain1102/archive/2007/12/19/168698.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>模块介绍：Admin RSS</title><link>http://www.blogjava.net/rain1102/archive/2007/12/19/168694.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Wed, 19 Dec 2007 03:48:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2007/12/19/168694.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/168694.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2007/12/19/168694.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/168694.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/168694.html</trackback:ping><description><![CDATA[<ol class="bb-list" style="list-style-type: circle">
    <li><a href="http://drupal.org/project/adminrss">http://drupal.org/project/adminrss</a>
    <li>提供包含待审核的节点和响应的RSS feed，方便管理者随时得知网站的最新状况，快速做出反应。
    <li>The AdminRSS module creates RSS feeds for the administrative information for Drupal websites.<br />
    These feeds are protected with a keystring that must be set in admin/settings/adminrss page.<br />
    The resulting pages can then be read at:<br />
    adminrss/node/keystring - RSS feed for unapproved nodes<br />
    adminrss/comment/keystring - RSS feed for unapproved comments<br />
    This can be most useful if you are managing a number of different drupal websites and rather than visiting each one to see if there are comments/nodes that need to be approved you can use an RSS reader to find out.<br />
    Thanks to Fredrik Jonsson and Gabor Hojtsy for their modules adminblock and commentrss which were heavily cribbed from to develop this module. </li>
</ol><img src ="http://www.blogjava.net/rain1102/aggbug/168694.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2007-12-19 11:48 <a href="http://www.blogjava.net/rain1102/archive/2007/12/19/168694.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>模块介绍：Admin block</title><link>http://www.blogjava.net/rain1102/archive/2007/12/19/168692.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Wed, 19 Dec 2007 03:45:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2007/12/19/168692.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/168692.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2007/12/19/168692.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/168692.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/168692.html</trackback:ping><description><![CDATA[<ol class="bb-list" style="list-style-type: circle">
    <li><a href="http://drupal.org/project/adminblock">http://drupal.org/project/adminblock</a>
    <li>用于帮助管理员方便的监管评论和文章。如果你的站点设置成发文需要审批，那么管理员每次都要进入内容管理查看审批队列。而此模块将通过区块显示所有等待审批的评论和文章队列，一目了然，可以方便快速地完成审批<br />
    提供一个区块，用来显示所有待审核的响应和节点。每一个项目都有自己的编辑与删除连结，便于快速管理。
    <li>The adminblock module enables admins to display a block with the comments approval queue and the node moderation queue. Each item gets their own edit link and delete link for quick administration. </li>
</ol><img src ="http://www.blogjava.net/rain1102/aggbug/168692.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2007-12-19 11:45 <a href="http://www.blogjava.net/rain1102/archive/2007/12/19/168692.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>模块介绍：freelinking</title><link>http://www.blogjava.net/rain1102/archive/2007/12/18/168545.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Tue, 18 Dec 2007 09:38:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2007/12/18/168545.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/168545.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2007/12/18/168545.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/168545.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/168545.html</trackback:ping><description><![CDATA[<dl>
<dt><strong>简介：</strong>
<dd>freelinking 模块为输入格式增加一个过滤，为已经存在或者将要存在的内容建立链接，它能够自动地为关键词建立链接，能够通过 &#8220;wiki 风格&#8221; 为内容提供链接。<br />
<dt><strong>链接：</strong>
<dd><a href="http://drupal.org/project/freelinking">http://drupal.org/project/freelinking</a> </dd></dl><img src ="http://www.blogjava.net/rain1102/aggbug/168545.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2007-12-18 17:38 <a href="http://www.blogjava.net/rain1102/archive/2007/12/18/168545.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>模块介绍：Forum Access</title><link>http://www.blogjava.net/rain1102/archive/2007/12/18/168543.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Tue, 18 Dec 2007 09:37:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2007/12/18/168543.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/168543.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2007/12/18/168543.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/168543.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/168543.html</trackback:ping><description><![CDATA[<dt><strong>简介：</strong>
<dd>这个模块让你可以将某个论坛设置为私有，你可以决定那个用户角色可以浏览、编辑、删除和发表帖子，还可以为每个论坛版面设置版主。
<p>&nbsp;</p>
<p>这个模块需要 <a href="http://www.drupalchina.org/node/1916">ACL 模块</a>。
<p>&nbsp;</p>
<dt><strong>链接：</strong>
<p>&nbsp;</p>
<dd><a href="http://drupal.org/project/forum_access">http://drupal.org/project/forum_access</a> </dd><img src ="http://www.blogjava.net/rain1102/aggbug/168543.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2007-12-18 17:37 <a href="http://www.blogjava.net/rain1102/archive/2007/12/18/168543.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>为分类以及分类信息的CRUD操作添加邮件通知功能</title><link>http://www.blogjava.net/rain1102/archive/2007/12/18/168474.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Tue, 18 Dec 2007 06:03:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2007/12/18/168474.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/168474.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2007/12/18/168474.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/168474.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/168474.html</trackback:ping><description><![CDATA[<p><span style="color: #008000">&lt;?php</span></p>
<p><span style="color: #008000">/**<br />
* Implementation of <span style="color: red">hook_taxonomy</span>().<br />
*<br />
* Sends email when changes to vocabularies or terms occur.<br />
*/<br />
function taxonomymonitor_taxonomy($op, $type, $array = array()) {<br />
&nbsp;$to = 'vipzhour@163.com';<br />
&nbsp;$name = check_plain($array['name']);</span></p>
<p><span style="color: #008000">&nbsp;// $type is either 'vocabulary' or 'term'.<br />
&nbsp;switch ($type) {<br />
&nbsp;&nbsp;case 'vocabulary':<br />
&nbsp;&nbsp;&nbsp;switch($op) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;case 'insert':<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$subject = t('Vocabulary @voc was added.', array('@voc'=&gt;$name));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />
&nbsp;&nbsp;&nbsp;&nbsp;case 'update':<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$subject = t('Vocabulary @voc was changed.', array('@voc'=&gt;$name));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />
&nbsp;&nbsp;&nbsp;&nbsp;case 'delete':<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$subject = t('Vocabulary @voc was deleted.', array('@voc'=&gt;$name));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;break;<br />
&nbsp;&nbsp;case 'term':<br />
&nbsp;&nbsp;&nbsp;switch($op) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;case 'insert':<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$subject = t('Term @term was added.', array('@term'=&gt;$name));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />
&nbsp;&nbsp;&nbsp;&nbsp;case 'update':<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$subject = t('Term @term was changed.', array('@term'=&gt;$name));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />
&nbsp;&nbsp;&nbsp;&nbsp;case 'delete':<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$subject = t('Term @term was deleted.', array('@term'=&gt;$name));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;}</span></p>
<p><span style="color: #008000">&nbsp;// Dump the vocabulary or term information out and send it along.<br />
&nbsp;$body = print_r($array, TRUE);</span></p>
<p><span style="color: #008000">&nbsp;// Send the email.<br />
&nbsp;<span style="color: #ff0000">drupal_mail</span>('taxonomymonitor-notify', $to, $subject, $body);<br />
}</span></p><img src ="http://www.blogjava.net/rain1102/aggbug/168474.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2007-12-18 14:03 <a href="http://www.blogjava.net/rain1102/archive/2007/12/18/168474.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>模块介绍：audio</title><link>http://www.blogjava.net/rain1102/archive/2007/12/17/168237.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Mon, 17 Dec 2007 07:25:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2007/12/17/168237.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/168237.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2007/12/17/168237.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/168237.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/168237.html</trackback:ping><description><![CDATA[<dt><strong>简介：</strong>
<dd>audio 模块允许有权限的用户上传音频文件，它使用 <a href="http://www.getid3.org/" rel="nofollow">getID3 library</a> 来读写 ID3 meta-tag 信息。
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这个模块还附带一个 <a href="http://musicplayer.sourceforge.net/" rel="nofollow">XSPF Flash 播放器</a>。 </p>
<dt><strong>链接：</strong>
<p>&nbsp;<a href="http://drupal.org/project/audio">http://drupal.org/project/audio</a> <br />
<br />
To install the audio module<br />
---------------------------<br />
<br />
1. Extract the 'audio' module directory, including all its subdirectories, into<br />
&nbsp;&nbsp; your sites/all/modules directory.</p>
<dd>
<p><br />
2. Install the getID3 package - optional but recommended. MAKE SURE YOU READ<br />
&nbsp;&nbsp; THE SECURITY NOTE BELOW!</p>
<p>&nbsp;&nbsp; a. Download the project getId3 version from SourceForge.net. The latest<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; version tested with the audio module is 1.7.7. Earlier versions contain<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bugs that will cause you headaches.</p>
<p>&nbsp;&nbsp; b. Extract the archive into the sites/all/modules/audio/getid3 directory. When you're<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; finished the directory structure should look something like:</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; drupal/<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sites/<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; all/<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; modules/<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; audio/<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; getid3/<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; README.txt<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [...]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; getid3/<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; getid3.php<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; write.php</p>
<p>&nbsp; c. *** IMPORTANT ***<br />
&nbsp;&nbsp;&nbsp;&nbsp; YOU MUST DELETE THE 'demos' FOLDER OF THE ID3 LIBRARY. FAILURE TO DO SO<br />
&nbsp;&nbsp;&nbsp;&nbsp; OPENS UP A MASSIVE SECURITY HOLE AND MAKES YOUR SITE EXTREMELY VULNERABLE<br />
&nbsp;&nbsp;&nbsp;&nbsp; TO ATTACKS!</p>
<p>3. Enable the audio, audio_getid3 and audio_image modules on the<br />
&nbsp;&nbsp; admin &gt;&gt; build &gt;&gt; modules page. The database tables will be created <br />
&nbsp;&nbsp; automagically for you at this point.</p>
<p>4. Go to admin &gt;&gt; settings &gt;&gt; audio and check that the path to the getID3<br />
&nbsp;&nbsp; package is configured correctly. If you follow the above directory<br />
&nbsp;&nbsp; structure, the path should be "sites/all/modules/audio/getid3/getid3/".<br />
</p>
</dd><img src ="http://www.blogjava.net/rain1102/aggbug/168237.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2007-12-17 15:25 <a href="http://www.blogjava.net/rain1102/archive/2007/12/17/168237.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>The Filter System</title><link>http://www.blogjava.net/rain1102/archive/2007/12/13/167400.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Thu, 13 Dec 2007 02:05:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2007/12/13/167400.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/167400.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2007/12/13/167400.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/167400.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/167400.html</trackback:ping><description><![CDATA[<p>&lt;?php <br />
// $Id$ </p>
<p>/** <br />
&nbsp;* @file <br />
&nbsp;* A silly module to assist whizbang novelists who are in a rut by providing a <br />
&nbsp;* random sentence generator for their posts. <br />
&nbsp;*/ </p>
<p>/** <br />
&nbsp;* Implementation of <span style="color: #ff0000">hook_filter</span>(). <br />
&nbsp;*/ <br />
function<span style="color: #008000">&nbsp;creativejuice_filter</span>($op, $delta = 0, $format = -1, $text = '') { <br />
&nbsp; switch ($op) { <br />
&nbsp;&nbsp;&nbsp; case 'list': <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return array(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 =&gt; t('Creative Juices filter'),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 =&gt; t('The name of my second filter'), <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ); </p>
<p>&nbsp;&nbsp;&nbsp; case 'description': <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; switch ($delta) { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 0: <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return t('Enables users to insert random sentences into their posts.'); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 1: <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return t('If this module provided a second filter, the description for that second filter would go here.'); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Should never return here as value of $delta never exceeds the last index of the 'list' array. <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; default: <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break; </p>
<p>&nbsp;&nbsp;&nbsp; case 'settings': <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // No settings user interface for this filter. <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break; </p>
<p>&nbsp;&nbsp;&nbsp; case 'no cache': <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return FALSE; </p>
<p>&nbsp;&nbsp;&nbsp; case 'prepare': <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return $text; </p>
<p>&nbsp;&nbsp;&nbsp; case 'process': <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return preg_replace_callback("|\[juice!\]|i", <span style="color: #ff0000">'creativejuice_sentence'</span>, $text); </p>
<p>&nbsp;&nbsp;&nbsp; default: <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return $text; <br />
&nbsp; } <br />
} </p>
<p>/** <br />
&nbsp;* Generate a random sentence. <br />
&nbsp;*/ <br />
function <span style="color: #ff0000">creativejuice_sentence</span>() { <br />
&nbsp; $phrase[0][] = t('A majority of us believe'); <br />
&nbsp; $phrase[0][] = t('Generally speaking,'); <br />
&nbsp; $phrase[0][] = t('As times carry on'); <br />
&nbsp; $phrase[0][] = t('Barren in intellect,'); <br />
&nbsp; $phrase[0][] = t('Deficient in insight,'); <br />
&nbsp; $phrase[0][] = t('As blazing blue sky poured down torrents of light,'); <br />
&nbsp; $phrase[0][] = t('Aloof from the motley throng,'); <br />
&nbsp; $phrase[1][] = t('life flowed in its accustomed stream'); <br />
&nbsp; $phrase[1][] = t('he ransacked the vocabulary'); <br />
&nbsp; $phrase[1][] = t('the grimaces and caperings of buffoonery'); <br />
&nbsp; $phrase[1][] = t('the mind freezes at the thought'); <br />
&nbsp; $phrase[1][] = t('she reverted to another matter'); <br />
&nbsp; $phrase[1][] = t('he lived as modestly as a hermit'); </p>
<p>&nbsp; $phrase[2][] = t('through the red tape of officialdom.'); <br />
&nbsp; $phrase[2][] = t('as it set anew in some fresh and appealing form.'); <br />
&nbsp; $phrase[2][] = t('supported by evidence.'); <br />
&nbsp; $phrase[2][] = t('as fatal as the fang of the most venomous snake.'); <br />
&nbsp; $phrase[2][] = t('as full of spirit as a gray squirrel.'); <br />
&nbsp; $phrase[2][] = t('as dumb as a fish.'); <br />
&nbsp; $phrase[2][] = t('like a damp-handed auctioneer.'); <br />
&nbsp; $phrase[2][] = t('like a bald ferret.'); </p>
<p>&nbsp; foreach ($phrase as $key =&gt; $value) { <br />
&nbsp;&nbsp;&nbsp; $rand_key = array_rand($phrase[$key]); <br />
&nbsp;&nbsp;&nbsp; $sentence[] = $phrase[$key][$rand_key]; <br />
&nbsp; } </p>
<p>&nbsp; return implode(' ', $sentence); <br />
} </p>
<p>/** <br />
&nbsp;* Implementation of hook_filter_tips(). <br />
&nbsp;*/ <br />
function <span style="color: #008000">creativejuice_filter_tips</span>($delta, $format, $long = FALSE) { <br />
&nbsp; if ($long) { <br />
&nbsp;&nbsp;&nbsp; // Detailed explanation for http://example.com/?q=filter/tips page. <br />
&nbsp;&nbsp;&nbsp; return t('The Creative Juices filter is for those times when your brain is incapable of being creative. These time comes for everyone, when even strong coffee and a barrel of jelly beans does not create the desired effect. When that happens, you can simply enter the [juice!] tag into your posts...'); <br />
&nbsp; } <br />
&nbsp; else { <br />
&nbsp;&nbsp;&nbsp; // Short explanation for underneath a post's textarea. <br />
&nbsp;&nbsp;&nbsp; return t('Insert a random sentence into your post with the [juice!] tag.'); <br />
&nbsp; } <br />
} <br />
</p><img src ="http://www.blogjava.net/rain1102/aggbug/167400.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2007-12-13 10:05 <a href="http://www.blogjava.net/rain1102/archive/2007/12/13/167400.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Poormanscron（调用cron任务）</title><link>http://www.blogjava.net/rain1102/archive/2007/12/11/167035.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Tue, 11 Dec 2007 11:58:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2007/12/11/167035.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/167035.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2007/12/11/167035.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/167035.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/167035.html</trackback:ping><description><![CDATA[<span lang="EN-US" style="font-size: 9pt; color: #003150; font-family: Verdana; mso-fareast-font-family: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">Poormanscron:<br />
</span><span style="font-size: 9pt; color: #003150; font-family: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">通过用户的浏览来调用</span><span lang="EN-US" style="font-size: 9pt; color: #003150; font-family: Verdana; mso-fareast-font-family: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">cron</span><span style="font-size: 9pt; color: #003150; font-family: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">任务，使不能设置</span><span lang="EN-US" style="font-size: 9pt; color: #003150; font-family: Verdana; mso-fareast-font-family: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">crontab</span><span style="font-size: 9pt; color: #003150; font-family: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">的站点也能简单地解决</span><span lang="EN-US" style="font-size: 9pt; color: #003150; font-family: Verdana; mso-fareast-font-family: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">cron</span><span style="font-size: 9pt; color: #003150; font-family: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">运行的问题。<br />
<p>A module which runs the Drupal cron operations without needing the cron application. </p>
<p>For every page view, this module checks to see if the last cron run was more than 1<br />
hour ago (this period is configurable). If so, the cron hooks are executed,<br />
and Drupal is happy. These cron hooks fire after all HTML is returned to the browser,<br />
so the user who kicks off the cron jobs should not notice any delay.</p>
</span><img src ="http://www.blogjava.net/rain1102/aggbug/167035.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2007-12-11 19:58 <a href="http://www.blogjava.net/rain1102/archive/2007/12/11/167035.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Taxonomy Access Control（管理用户对不同类别文章的访问权限）</title><link>http://www.blogjava.net/rain1102/archive/2007/12/11/167031.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Tue, 11 Dec 2007 11:47:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2007/12/11/167031.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/167031.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2007/12/11/167031.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/167031.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/167031.html</trackback:ping><description><![CDATA[<span lang="EN-US" style="font-size: 9pt; color: #003150; font-family: Verdana; mso-fareast-font-family: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">Taxonomy Access Control:<br />
</span><span style="font-size: 9pt; color: #003150; font-family: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">管理用户对不同类别文章的访问权限。</span><br />
<p>Access control for user roles based on taxonomy categories (vocabulary, terms).</p>
<ul>
    <li>Automatically controls access to taxonomy terms and nodes (based on their category terms)
    <li>Configuration page for each user roles
    <li>Five permission types (<em>View, Update, Delete, Create, List</em>) </li>
</ul>
<p><a href="http://drupal.org/project/taxonomy_access">http://drupal.org/project/taxonomy_access</a></p><img src ="http://www.blogjava.net/rain1102/aggbug/167031.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2007-12-11 19:47 <a href="http://www.blogjava.net/rain1102/archive/2007/12/11/167031.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Smiley（表情符）</title><link>http://www.blogjava.net/rain1102/archive/2007/12/11/167020.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Tue, 11 Dec 2007 11:15:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2007/12/11/167020.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/167020.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2007/12/11/167020.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/167020.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/167020.html</trackback:ping><description><![CDATA[<span lang="EN-US" style="font-size: 9pt; color: #003150; font-family: Verdana; mso-fareast-font-family: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">Smiley:<br />
</span><span style="font-size: 9pt; color: #003150; font-family: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">使用表情符，自带了一些基本的表情符，用户可以自己添加。</span><img src ="http://www.blogjava.net/rain1102/aggbug/167020.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2007-12-11 19:15 <a href="http://www.blogjava.net/rain1102/archive/2007/12/11/167020.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Excerpt（摘要模块）和Side Content（边栏导读）</title><link>http://www.blogjava.net/rain1102/archive/2007/12/11/167018.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Tue, 11 Dec 2007 11:05:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2007/12/11/167018.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/167018.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2007/12/11/167018.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/167018.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/167018.html</trackback:ping><description><![CDATA[<span lang="EN-US" style="font-size: 9pt; color: red; font-family: Verdana; mso-fareast-font-family: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><span style="color: #008000"><span lang="EN-US" style="font-size: 9pt; font-family: Verdana; mso-fareast-font-family: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">Excerpt</span><span lang="EN-US" style="font-size: 9pt; font-family: Verdana; mso-fareast-font-family: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">:<br />
</span></span></span><span style="font-size: 9pt; color: #003150; font-family: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">摘要模块。</span><span lang="EN-US" style="font-size: 9pt; color: #003150; font-family: Verdana; mso-fareast-font-family: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">Drupal</span><span style="font-size: 9pt; color: #003150; font-family: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">发布内容时只能用正文的开头作摘要，然后根据设定自动截取摘要。启用摘要模块就可以不受此限制，发布内容时将单独有一个摘要栏供作者随意填写。<br />
<span lang="EN-US" style="font-size: 9pt; color: #008000; font-family: Verdana; mso-fareast-font-family: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">Side Content:</span><span lang="EN-US" style="font-size: 9pt; color: #003150; font-family: Verdana; mso-fareast-font-family: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><br />
</span><span style="font-size: 9pt; color: #003150; font-family: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">在发布节点内容时可以将部分内容选择性的显示在边栏的区块里，可以用于强调某部分内容，类似有的书籍或杂志的边栏导读。</span></span><img src ="http://www.blogjava.net/rain1102/aggbug/167018.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2007-12-11 19:05 <a href="http://www.blogjava.net/rain1102/archive/2007/12/11/167018.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Working with Blocks</title><link>http://www.blogjava.net/rain1102/archive/2007/12/04/165125.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Tue, 04 Dec 2007 03:50:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2007/12/04/165125.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/165125.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2007/12/04/165125.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/165125.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/165125.html</trackback:ping><description><![CDATA[<strong>1</strong><strong><span style="font-family: 宋体">．</span></strong><strong>Understanding How Blocks Are Themed</strong>
<p style="text-align: left" align="left">During a page request, the theme system will ask the block system to return a list of blocks for</p>
<p style="text-align: left" align="left">each region. It does this when generating the variables to send to the page template (usually</p>
<p style="text-align: left" align="left">page.tpl.php). To gather the themed blocks for the left and right sidebars, Drupal executes the</p>
<p>following:</p>
<p style="text-indent: 21pt; text-align: left" align="left"><span style="color: green">$sidebar_left = </span><span style="color: red">theme</span><span style="color: green">('blocks', 'left');</span></p>
<p style="text-indent: 21pt; text-align: left" align="left"><span style="color: green">$sidebar_right = </span><span style="color: red">theme</span><span style="color: green">('blocks', 'right');</span></p>
<p style="text-align: left" align="left">// And any other regions exposed by hook_regions().</p>
<p style="text-align: left" align="left"><span style="color: purple">You might remember that theme('blocks') is actually a call to theme_blocks(). Here&#8217;s what theme_blocks() actually does:</span></p>
<p style="text-align: left" align="left"><span style="color: green">function</span><span style="color: red"> theme_blocks</span><span style="color: green">($region) {</span></p>
<p style="text-indent: 21pt; text-align: left" align="left"><span style="color: green">$output = '';</span></p>
<p style="text-indent: 21pt; text-align: left" align="left"><span style="color: green">if ($list = block_list($region)) {</span></p>
<p style="margin-left: 21pt; text-indent: 21pt; text-align: left" align="left"><span style="color: green">foreach ($list as $key =&gt; $block) {</span></p>
<p style="margin-left: 42pt; text-indent: 21pt; text-align: left" align="left"><span style="color: green">$output .= theme('block', $block);</span></p>
<p style="margin-left: 21pt; text-indent: 21pt; text-align: left" align="left"><span style="color: green">}</span></p>
<p style="text-indent: 21pt; text-align: left" align="left"><span style="color: green">}</span></p>
<p style="text-indent: 21pt; text-align: left" align="left"><span style="color: green">return $output;</span></p>
<p><span style="color: green">}</span></p>
<p><strong>2</strong><strong><span style="font-family: 宋体">．</span></strong><strong>Using the Block Hook</strong></p>
<p>function <span style="color: red">hook_block($op = 'list', $delta = 0, $edit = array())</span></p>
<p><span style="color: green">&lt;?php</span></p>
<p><span style="color: green">// $Id$</span></p>
<p><span style="color: green">/**</span></p>
<p><span style="color: green">&nbsp;* @file</span></p>
<p><span style="color: green">&nbsp;* Implements various blocks to improve pending content workflow.</span></p>
<p><span style="color: green">&nbsp;*/</span></p>
<p><span style="color: green">&nbsp;</span></p>
<p><span style="color: green">/**</span></p>
<p><span style="color: green">&nbsp;* Implementation of hook_block().</span></p>
<p><span style="color: green">&nbsp;*/</span></p>
<p><span style="color: green">function </span><strong><span style="color: purple">approval_block</span></strong><span style="color: green">($op = 'list', $delta = 0, $edit = array()) {</span></p>
<p><span style="color: green">&nbsp;switch ($op) {</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp; case <span style="color: #333399">'list'</span>:</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $blocks[0]['info'] = t('Pending comments');</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $blocks[1]['info'] = t('Unpublished nodes');</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return $blocks;</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp; case <span style="color: #333399">'configure'</span>:</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Only in block 0 (the Pending comments block) can one</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // set the number of comments to display.</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ($delta == 0) {</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $form['approval_block_num_posts'] = array(</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '#type' =&gt; 'textfield',</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '#title' =&gt; t('Number of pending comments to display'),</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '#default_value' =&gt; variable_get(</span><span style="color: red">'approval_block_num_posts',</span><span style="color: green"> 5),</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return $form;</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp; case <span style="color: #333399">'save'</span>:</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ($delta == 0) {</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: red">variable_set('</span><span style="color: green">approval_block_num_posts</span><span style="color: red">', </span><span style="color: green">(int) $edit['approval_block_num_posts']</span><span style="color: red">);</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp; case <span style="color: #333399">'view'</span>:</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ($delta == 0 &amp;&amp;user_access('administer comments')) {</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Retrieve the number of pending comments to display that</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // we saved earlier in the 'save' op, defaulting to 5.</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span><span style="color: red">$num_posts = variable_get('approval_block_num_posts', 5);</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Query the database for unpublished comments.</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $result = </span><span style="color: red">db_query_range</span><span style="color: green">('SELECT c.* FROM {comments} c WHERE c.status = %d ORDER BY c.timestamp', </span><strong><span style="color: black">COMMENT_NOT_PUBLISHED</span></strong><span style="color: green">,</span><span style="color: red"> 0, $num_posts</span><span style="color: green">);</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Preserve our current location so user can return after editing.</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: purple">$destination = drupal_get_destination();</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $items = array();</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while ($comment = </span><span style="color: red">db_fetch_object</span><span style="color: green">($result)) {</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $items[] = l($comment-&gt;subject, 'node/'. $comment-&gt;nid, array(), NULL, 'comment-'. $comment-&gt;cid). ' '. l(t('[edit]'), 'comment/edit/'. $comment-&gt;cid, array(), $destination);</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $block['subject'] = t('Pending comments');</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // We theme our array of links as an unordered list.</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $block['content'] = theme('item_list', $items);</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; elseif ($delta == 1 &amp;&amp; </span><span style="color: red">user_access</span><span style="color: green">('administer nodes')) {</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Query the database for the 5 most recent unpublished nodes.</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Unpublished nodes have their status column set to 0.</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $result = </span><span style="color: red">db_query_range</span><span style="color: green">('SELECT title, nid FROM {node} WHERE status = 0 ORDER BY changed DESC', 0, 5);</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: purple">$destination = drupal_get_destination();</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while ($node = </span><span style="color: red">db_fetch_object</span><span style="color: green">($result)) {</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $items[] = l($node-&gt;title, 'node/'. $node-&gt;nid). ' '. l(t('[edit]'), 'node/'. $node-&gt;nid .'/edit', array(), $destination);</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $block['subject'] = t('Unpublished nodes');</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // We theme our array of links as an unordered list.</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $block['content'] = theme('item_list', $items);</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return $block;</span></p>
<p><span style="color: green">&nbsp;}&nbsp;&nbsp;&nbsp; </span></p>
<p><span style="color: green">}</span></p>
<p><span style="color: purple">drupal_get_destination()</span></p>
<p style="text-align: left" align="left">This function remembers the page you were on before you submitted a form, so after you update the comment form to publish or delete a comment, you&#8217;ll be automatically redirected from whence you came.</p><img src ="http://www.blogjava.net/rain1102/aggbug/165125.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2007-12-04 11:50 <a href="http://www.blogjava.net/rain1102/archive/2007/12/04/165125.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>The Theme System</title><link>http://www.blogjava.net/rain1102/archive/2007/12/04/165075.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Tue, 04 Dec 2007 01:29:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2007/12/04/165075.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/165075.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2007/12/04/165075.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/165075.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/165075.html</trackback:ping><description><![CDATA[<strong>theme-name_breadcrumb()</strong>
<p><strong>theme-engine_ breadcrumb()</strong></p>
<p><strong>theme_ breadcrumb()</strong></p>
<p><strong><span style="font-size: 13pt">Defining Additional Template Files</span></strong></p>
<p style="text-align: left" align="left">First, create a file within your theme directory named <span style="color: purple">breadcrumb.tpl.php. This is the new template file for breadcrumbs. Because we wanted to change the &lt;div&gt; tag to a &lt;span&gt; tag, go ahead and populate the file with the following:</span></p>
<p><span style="color: green">&lt;span class="breadcrumb"&gt;&lt;?php print $breadcrumb ?&gt;&lt;/span&gt;</span></p>
<p style="text-align: left" align="left">That&#8217;s easy enough for a designer to edit. Now you need to let Drupal know to call</p>
<p style="text-align: left" align="left">this template file when looking to render its breadcrumbs. Inside template.php, override theme_breadcrumb() as you did previously, but this time you&#8217;re going to tell this function to use the template file instead of just the function:</p>
<p><span style="color: green">function <span style="color: red">mytheme_breadcrumb</span>($breadcrumb) {</span></p>
<p><span style="color: green">&nbsp;if (!empty($breadcrumb)) {</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $variables = array(</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'breadcrumb' =&gt; implode(' -&gt; ', $breadcrumb)</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return </span><span style="color: red">_phptemplate_callback</span><span style="color: green">('</span><span style="color: purple">breadcrumb</span><span style="color: green">', $variables);</span></p>
<p><span style="color: green">&nbsp;}</span></p>
<p><span style="color: green">}</span></p>
<p style="text-align: left" align="left">The magic inside this function is happening with <span style="color: red">_phptemplate_callback(). Its first parameter is the name of the template file to look for, and the second parameter is an array of variables to pass to the template file. You can create and pass along as many variables as you need into your template files.</span></p>
<p><strong><span style="font-size: 13pt">Defining New Block Regions</span></strong></p>
<p><span style="color: green">function <span style="color: red">mytheme_regions</span>() {</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return array(</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'left' =&gt; t('left sidebar'),</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'right' =&gt; t('right sidebar'),</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'content_top' =&gt; t('content top'),</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'content_bottom' =&gt; t('content bottom'),</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'header' =&gt; t('header'),</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'footer' =&gt; t('footer')</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );</span></p>
<p><span style="color: green">}</span></p>
<p>To print out the content top region in your page template, use &lt;?php print $content_top ?&gt;.</p><img src ="http://www.blogjava.net/rain1102/aggbug/165075.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2007-12-04 09:29 <a href="http://www.blogjava.net/rain1102/archive/2007/12/04/165075.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Working with Nodes</title><link>http://www.blogjava.net/rain1102/archive/2007/12/04/165071.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Tue, 04 Dec 2007 01:28:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2007/12/04/165071.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/165071.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2007/12/04/165071.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/165071.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/165071.html</trackback:ping><description><![CDATA[<strong><span style="font-size: 12pt; font-family: HelveticaNeue-HeavyCond">Creating a Node Module</span></strong>
<p style="text-align: left" align="left"><strong><span style="font-family: Utopia-Semibold">1</span></strong><strong><span style="font-family: 宋体">．</span></strong><strong><span style="font-family: Utopia-Semibold">Creating the .info File</span></strong></p>
<p style="text-align: left" align="left"><span style="font-size: 9pt; font-family: 宋体">Let&#8217;s also create the </span><span style="font-size: 9pt; font-family: 宋体">joke.info </span><span style="font-size: 9pt; font-family: 宋体">file and add it to the </span><span style="font-size: 9pt; font-family: 宋体">joke </span><span style="font-size: 9pt; font-family: 宋体">folder.</span></p>
<p style="text-align: left" align="left"><span style="color: green">; $Id$</span></p>
<p style="text-align: left" align="left"><span style="color: green">name = Joke</span></p>
<p style="text-align: left" align="left"><span style="color: green">description = Provides a joke node type with a punchline.</span></p>
<p><span style="color: green">version = "$Name$"</span></p>
<p><strong><span style="font-family: Utopia-Semibold">2</span></strong><strong><span style="font-family: 宋体">．</span></strong><strong><span style="font-family: Utopia-Semibold">Creating the .install File</span></strong></p>
<p><span style="color: green">&lt;?php</span></p>
<p><span style="color: green">function joke_install() {</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; switch ($GLOBALS['db_type']) {</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 'mysql':</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 'mysqli':</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; db_query("CREATE TABLE {joke} (</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nid int unsigned NOT NULL default '0',</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vid int unsigned NOT NULL default '0',</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; punchline text NOT NULL,</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PRIMARY KEY (nid,vid),</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UNIQUE KEY vid (vid),</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; KEY nid (nid)</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 'pgsql':</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; db_query("CREATE TABLE {joke} (</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nid int unsigned NOT NULL default '0',</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vid int unsigned NOT NULL default '0',</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; punchline text NOT NULL,</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PRIMARY KEY (nid,vid),</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UNIQUE KEY vid (vid),</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; KEY nid (nid)</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )");</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="color: green">}</span></p>
<p><span style="color: green">function joke_uninstall() {</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; db_query('DROP TABLE {joke}');</span></p>
<p><span style="color: green">}</span></p>
<p><strong><span style="font-family: Utopia-Semibold">3</span></strong><strong><span style="font-family: 宋体">．</span></strong><strong><span style="font-family: Utopia-Semibold">Creating the .module File</span></strong></p>
<p><span style="color: green">&lt;?php</span></p>
<p><span style="color: green">function </span><span style="color: red">joke_perm()</span><span style="color: green"> {</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return array('create joke', 'edit joke', 'delete joke');</span></p>
<p><span style="color: green">}</span></p>
<p><span style="color: green">/**</span></p>
<p><span style="color: green">* @file</span></p>
<p><span style="color: green">* Provides a "joke" node type.</span></p>
<p><span style="color: green">*/</span></p>
<p><span style="color: green">/**</span></p>
<p><span style="color: green">* Implementation of hook_node_info().</span></p>
<p><span style="color: green">*/</span></p>
<p><span style="color: green">function </span><span style="color: red">joke_node_info()</span><span style="color: green"> {</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // We return an array since a module can define multiple node types.</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // We're only defining one node type, type 'joke'.</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return array(</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'joke' =&gt; array(</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'name' =&gt; t('Joke'), // Required.</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'module' =&gt; 'joke',&nbsp;// Required.</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'description' =&gt; t('Tell us your favorite joke!'), // Required.</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'has_title' =&gt; TRUE,</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'title_label' =&gt; t('Title'),</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'has_body' =&gt; TRUE,</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'body_label' =&gt; t('Joke'),</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'min_word_count' =&gt; 2,</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'locked' =&gt; TRUE</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );</span></p>
<p><span style="color: green">}</span></p>
<p><span style="color: green">function joke_menu($may_cache) {</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $items = array();</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ($may_cache) {</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $items[] = array(</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'path' =&gt; 'node/add/joke',</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'title' =&gt; t('Joke'),</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'access' =&gt; </span><span style="color: red">user_access</span><span style="color: green">('create joke'),</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return $items;</span></p>
<p><span style="color: green">}</span></p>
<p><span style="color: green">function <span style="color: red">joke_access</span>($op, $node) {</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; global $user;</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ($op == 'create') {</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return (user_access('create joke'));</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ($op == 'update') {</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return (user_access('edit joke') &amp;&amp; ($user-&gt;uid == $node-&gt;uid));</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ($op == 'delete') {</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return (user_access('delete joke') &amp;&amp; ($user-&gt;uid == $node-&gt;uid));</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="color: green">}</span></p>
<p><span style="color: green">function <span style="color: red">joke_form</span>($node) {</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Get metadata for this node type</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // (we use it for labeling title and body fields).</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // We defined this in joke_node_info().</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $type = </span><span style="color: red">node_get_types('type', $node);</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $form['title'] = array(</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '#type' =&gt; 'textfield',</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '#title' =&gt; check_plain($type-&gt;title_label),</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '#required' =&gt; TRUE,</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '#default_value' =&gt; $node-&gt;title,</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '#weight' =&gt; -5</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $form['body_filter']['body'] = array(</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '#type' =&gt; 'textarea',</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '#title' =&gt; check_plain($type-&gt;body_label),</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '#default_value' =&gt; $node-&gt;body,</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '#rows' =&gt; 7,</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '#required' =&gt; TRUE</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: red">$form['body_filter']['filter'] = filter_form($node-&gt;format);</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $form['punchline'] = array(</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '#type' =&gt; 'textfield',</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '#title' =&gt; t('Punchline'),</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '#required' =&gt; TRUE,</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '#default_value' =&gt; $node-&gt;punchline,</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '#weight' =&gt; 5</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return $form;</span></p>
<p><span style="color: green">}</span></p>
<p><span style="color: green">function <span style="color: red">joke_validate</span>($node) {</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Enforce a minimum word length of 3.</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (isset($node-&gt;punchline) &amp;&amp; str_word_count($node-&gt;punchline) &lt;= 3) {</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $type = node_get_types('type', $node);</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; form_set_error('punchline', t('The punchline of your @type is too short. You need at least three words.', array('@type'=&gt; $type-&gt;name)));</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="color: green">}</span></p>
<p><span style="color: green">function <span style="color: red">joke_insert</span>($node) {</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; db_query("INSERT INTO {joke} (nid, vid, punchline) VALUES (%d, %d, '%s')",</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $node-&gt;nid, $node-&gt;vid, $node-&gt;punchline);</span></p>
<p><span style="color: green">}</span></p>
<p><span style="color: green">function <span style="color: red">joke_update</span>($node) {</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ($node-&gt;revision) {</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; joke_insert($node);</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else {</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; db_query("UPDATE {joke} SET punchline = '%s' WHERE vid = %d", $node-&gt;punchline, $node-&gt;vid);</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="color: green">}</span></p>
<p><span style="color: green">/**</span></p>
<p><span style="color: green">* Implementation of hook_delete().</span></p>
<p><span style="color: green">*/</span></p>
<p><span style="color: green">function<span style="color: red">&nbsp;joke_delete</span>(&amp;$node) {</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Delete the related information we were saving for this node.</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; db_query('DELETE FROM {joke} WHERE nid = %d', $node-&gt;nid);</span></p>
<p><span style="color: green">}</span></p>
<p><span style="color: green">/**</span></p>
<p><span style="color: green">* Implementation of hook_load().</span></p>
<p><span style="color: green">*/</span></p>
<p><span style="color: green">function <span style="color: red">joke_load</span>($node) {</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: red">drupal_add_js</span>('misc/collapse.js');</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return <span style="color: red">db_fetch_object</span>(db_query('SELECT punchline FROM {joke} WHERE vid = %d', $node-&gt;vid));</span></p>
<p><span style="color: green">}</span></p>
<p><span style="color: green">function <span style="color: red">joke_view</span>($node, $teaser = FALSE, $page = FALSE) {</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!$teaser) {</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Use Drupal's default node view.</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $node = node_prepare($node, $teaser);</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $node-&gt;guffaw = str_repeat(t('Ha!'), mt_rand(0, 10));</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Now add the punchline.</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /**</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $node-&gt;content['punchline'] = array(</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '#value' =&gt; </span><span style="color: red">theme('joke_punchline', $node),</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '#weight' =&gt; 2</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ($teaser) {</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Use Drupal's default node view.</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $node = node_prepare($node, $teaser);</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return $node;</span></p>
<p><span style="color: green">}</span></p>
<p><span style="color: green">function </span><span style="color: red">theme_joke_punchline($node)</span><span style="color: green"> {</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $output = '&lt;div class="joke-punchline"&gt;'.check_plain($node-&gt;punchline). '&lt;/div&gt;&lt;br /&gt;';</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $output .= '&lt;div class="joke-guffaw"&gt;'.check_plain($node-&gt;guffaw). '&lt;/div&gt;';</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return $output;</span></p>
<p><span style="color: green">}</span></p><img src ="http://www.blogjava.net/rain1102/aggbug/165071.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2007-12-04 09:28 <a href="http://www.blogjava.net/rain1102/archive/2007/12/04/165071.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Working with Users</title><link>http://www.blogjava.net/rain1102/archive/2007/12/03/164862.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Mon, 03 Dec 2007 06:32:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2007/12/03/164862.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/164862.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2007/12/03/164862.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/164862.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/164862.html</trackback:ping><description><![CDATA[<strong><span style="font-family: 宋体">1</span></strong><strong><span style="font-family: 宋体">．Introduction to hook_user()</span></strong>
<p style="text-align: left" align="left"><span style="font-family: 宋体">Implementing </span><span style="font-family: 宋体">hook_user() </span><span style="font-family: 宋体">gives your modules a chance to react to the different operations performed on a user account, and to modify the </span><span style="font-family: 宋体">$user </span><span style="font-family: 宋体">object. Let&#8217;s examine the function signature:</span></p>
<p style="text-align: left" align="left"><span style="color: green; font-family: 宋体">function hook_user($op, &amp;$edit, &amp;$user, $category = NULL)</span></p>
<p style="text-align: left" align="left"><span style="font-family: 宋体">The </span><span style="font-family: 宋体">$op </span><span style="font-family: 宋体">parameter is used to describe the current operation being performed on the user account and can have many different values:</span></p>
<p style="text-align: left" align="left"><span style="font-family: 宋体">&#8226; after_update: Called after the $user object has been saved to the database.</span></p>
<p style="text-align: left" align="left"><span style="font-family: 宋体">&#8226; categories: Returns an array of categories that appear as Drupal menu local tasks when the user edits the user account. See profile_user() in profile.module for an implementation.</span></p>
<p style="text-align: left" align="left"><span style="font-family: 宋体">&#8226; delete: A user has just been deleted from the database. This is an opportunity for the module to remove information related to the user from the database.</span></p>
<p style="text-align: left" align="left"><span style="font-family: 宋体">&#8226; form: Inject an additional form field element into the user edit form being displayed.</span></p>
<p style="text-align: left" align="left"><span style="font-family: 宋体">&#8226; insert: The new user account is about to be created and inserted into the database.</span></p>
<p style="text-align: left" align="left"><span style="font-family: 宋体">&#8226; login: The user has successfully logged in.</span></p>
<p style="text-align: left" align="left"><span style="font-family: 宋体">&#8226; logout: The user just logged out and his or her session has been destroyed.</span></p>
<p style="text-align: left" align="left"><span style="font-family: 宋体">&#8226; load: The user account was successfully loaded. The module may add additional information into the $user object.</span></p>
<p style="text-align: left" align="left"><span style="font-family: 宋体">&#8226; register: The user account registration form is about to be displayed. The module may add additional form elements to the form.</span></p>
<p style="text-align: left" align="left"><span style="font-family: 宋体">&#8226; submit: The user edit form has been submitted. Modify the account information before it is sent to user_save().</span></p>
<p style="text-align: left" align="left"><span style="font-family: 宋体">&#8226; update: The existing user account is about to be saved to the database.</span></p>
<p style="text-align: left" align="left"><span style="font-family: 宋体">&#8226; validate: The user account has been modified. The module should validate its custom</span></p>
<p style="text-align: left" align="left"><span style="font-family: 宋体">data and raise any necessary errors.</span></p>
<p style="text-align: left" align="left"><span style="font-family: 宋体">&#8226; view: The user&#8217;s account information is being displayed. The module should return</span></p>
<p style="text-align: left" align="left"><span style="font-family: 宋体">its custom additions to the display as an array. The view operation ultimately calls</span></p>
<p style="text-align: left" align="left"><span style="font-family: 宋体">theme_user_profile to format the user profile page. More details on this shortly.</span></p>
<p style="text-align: left" align="left"><strong><span style="font-family: 宋体">The $edit parameter</span></strong><span style="font-family: 宋体"> is an array of the form values submitted when a user account is being created or updated. Notice that it&#8217;s passed by reference, so any changes you make will actually change the form values.</span></p>
<p style="text-align: left" align="left"><strong><span style="font-family: 宋体">The $user object </span></strong><span style="font-family: 宋体">is also passed by reference, so any changes you make will actually change the $user information.</span></p>
<p><strong><span style="font-family: 宋体">The $category parameter</span></strong><span style="font-family: 宋体"> is the active user account category being edited.</span></p>
<p style="text-align: left" align="left"><span style="font-family: 宋体">■<strong>Caution</strong> Don&#8217;t confuse the $user parameter within hook_user() with the global $user object. The $user parameter is the user object for the account currently being manipulated. The global $user object is the user currently logged in.</span></p>
<p><strong><span style="font-family: 宋体">2.The User Registration Process</span></strong></p>
<p>Add a legalagree.module</p>
<p><span style="color: green">&lt;?php</span></p>
<p><span style="color: green">function</span><span style="color: red"> legalagree_user($op, &amp;$edit, &amp;$user, $category = NULL) </span><span style="color: green">{</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; switch ($op) {</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // User is registering</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case '</span><span style="color: #333399">register</span><span style="color: green">':</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Add a fieldset containing radio buttons to the user registration form</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $fields['legal_agreement'] = array(</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '#type' =&gt; 'fieldset',</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '#title' =&gt; t('Legal Agreement')</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $fields['legal_agreement']['decision'] = array(</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '#type' =&gt; 'radios',</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '#options' =&gt; array(t('I disagree'), t('I agree')),</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '#default_value' =&gt; 0,</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '#description' =&gt; t('By registering at %site-name, you agree that</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at any time, we (or our surly, brutish henchmen) may enter your place of</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; residence and smash your belongings with a ball-peen hammer.',</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; array('%site-name' =&gt; variable_get('site_name', 'drupal')))</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return $fields;</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case '</span><span style="color: #333399">validate</span><span style="color: green">':</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Make sure the user selected radio button 1 ('I agree').</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // the validate op is reused when a user updates information on</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // The 'my account' page, so we use isset() to test whether we are</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // on the registration page where the decision field is present.</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (isset($edit['decision']) &amp;&amp; $edit['decision'] != '1') {</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: red">form_set_error</span><span style="color: green">('decision', t('You must agree to the legal agreement before </span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; registration can be completed.'));</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case '</span><span style="color: #333399">insert</span><span style="color: green">':</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Record information for future lawsuit.</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: red">watchdog</span><span style="color: green">('user', t('User %user agreed to legal terms', array('%user' =&gt; $user-&gt;name)));</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="color: green">}</span></p>
<p><strong><span style="font-family: 宋体">3</span></strong><strong><span style="font-family: 宋体">．Adding Data to the $user Object</span></strong></p>
<p>Loginhistory.module</p>
<p><span style="color: green">&lt;?php</span></p>
<p><span style="color: green">function loginhistory_user($op, &amp;$edit, &amp;$account, $category = NULL) {</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; switch($op) {</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case </span><span style="color: red">'login'</span><span style="color: green">:</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Record timestamp in database</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; db_query("INSERT INTO {login_history} (uid, timestamp) values (%d, %d)", $account-&gt;uid, $account-&gt;login);</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case </span><span style="color: red">'load'</span><span style="color: green">:</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Add the number of times user has logged in.</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $account-&gt;loginhistory_count = db_result(db_query("SELECT COUNT(timestamp) as count FROM {login_history} WHERE uid = %d", $account-&gt;uid));</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case </span><span style="color: red">'view'</span><span style="color: green">:</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Add a field displaying number of logins.</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $items['login_history'] = array(</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'title' =&gt; t('Number of logins'),</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'value' =&gt; $account-&gt;loginhistory_count,</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'class' =&gt; 'member'</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return array(t('History')=&gt;$items);</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="color: green">}</span></p>
<p>Loginhistory.install</p>
<p><span style="color: green">&lt;?php</span></p>
<p><span style="color: green">function </span><span style="color: red">loginhistory_install() </span><span style="color: green">{</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; switch ($GLOBALS['db_type']) {</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 'mysql':</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 'mysqli':</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; db_query("CREATE TABLE {login_history} (</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uid int NOT NULL default '0',</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timestamp int NOT NULL default '0',</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; KEY (uid)</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )/*!40100 DEFAULT CHARACTER SET UTF8 */");</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 'pgsql':</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; db_query("CREATE TABLE {login_history} (</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uid int_unsigned default '0',</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timestamp int_unsigned NOT NULL default '0',</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; KEY (uid)</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )");</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="color: green">}</span></p>
<p><span style="color: green">function </span><span style="color: red">loginhistory_uninstall</span><span style="color: green">() {</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; db_query("DROP TABLE {login_history}");</span></p>
<p><span style="color: green">}</span></p>
<p><strong><span style="font-family: 宋体">4</span></strong><strong><span style="font-family: 宋体">．Simple External Authentication</span></strong></p>
<p style="text-align: left" align="left"><span style="font-family: 宋体">Let&#8217;s implement a very simple external authentication module that might be used inside a company where simple usernames are used. Suppose your company only hires people named Dave, and usernames are assigned based on first and last names. This module authenticates anyone whose username begins with the string </span><span style="font-family: 宋体">dave</span><span style="font-family: 宋体">, so the users </span><span style="font-family: 宋体">davebrown</span><span style="font-family: 宋体">, </span><span style="font-family: 宋体">davesmith</span><span style="font-family: 宋体">, and </span><span style="font-family: 宋体">davejones </span><span style="font-family: 宋体">will all successfully log in.</span></p>
<p><span style="color: green">&lt;?php</span></p>
<p><span style="color: green">/**</span></p>
<p><span style="color: green">* Implementation of hook_auth()</span></p>
<p><span style="color: green">*/</span></p>
<p><span style="color: green">function </span><span style="color: red">authdave_auth</span><span style="color: green">($username, $pass, $server) {</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Does username begin with 'dave'?</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (</span><span style="color: red">substr</span><span style="color: green">(</span><span style="color: red">drupal_strtolower</span><span style="color: green">($username), 0, 4 ) == 'dave') {</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Make a global variable to note that we did the authentication.</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; global $authdave_authenticated;</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $authdave_authenticated = TRUE;</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return TRUE;</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else {</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return FALSE;</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="color: green">}</span></p>
<p style="text-align: left" align="left"><span style="font-family: 宋体">If a row in the users table does not exist for this user, one will be created. However, no e-mail address has been provided at login like it was for Drupal&#8217;s default local user registration, so a module this simple is not a real solution if your site relies on sending e-mail to users. You&#8217;ll want to set the mail column of the users table so you will have an e-mail address associated with the user. To do this, you can have your module respond to the insert operation of the user hook, which is fired whenever a new user is inserted:</span></p>
<p><span style="color: green">/**</span></p>
<p><span style="color: green">* Implementation of hook_user()</span></p>
<p><span style="color: green">*/</span></p>
<p><span style="color: green">function authdave_user($op, &amp;$edit, &amp;$account, $category = NULL) {</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; switch($op) {</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case </span><span style="color: red">'insert'</span><span style="color: green">:</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // New user was just added; if we did authentication,</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // look up email address of user in a legacy database.</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: red">global $authdave_authenticated;</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (</span><span style="color: red">$authdave_authenticated</span><span style="color: green">) {</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $email = mycompany_email_lookup($account-&gt;name);</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Set email address in the user table for this user.</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; db_query("UPDATE {users} SET mail = '%s' WHERE uid = %d", $email,</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $account-&gt;uid);</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="color: green">}</span></p><img src ="http://www.blogjava.net/rain1102/aggbug/164862.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2007-12-03 14:32 <a href="http://www.blogjava.net/rain1102/archive/2007/12/03/164862.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Working with Databases</title><link>http://www.blogjava.net/rain1102/archive/2007/12/03/164780.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Mon, 03 Dec 2007 02:02:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2007/12/03/164780.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/164780.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2007/12/03/164780.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/164780.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/164780.html</trackback:ping><description><![CDATA[&nbsp;
<p><strong><span style="font-family: 宋体">Defining Database Parameters</span></strong></p>
<p><span style="font-family: 宋体">$db_url = 'mysql://username:password@localhost/databasename';</span></p>
<p><span style="font-family: 宋体">■</span><strong>Note</strong><span style="font-family: 宋体">If you are in a situation where you are writing a stand-alone PHP script or you have existing PHP code outside of Drupal that needs access to Drupal&#8217;s database, you will want to want to call <span style="color: red">include_once ('includes/bootstrap.inc')</span> and then call <span style="color: red">drupal_bootstrap(DRUPAL_BOOTSTRAP_DATABASE)</span> to generate an active connection. At that point, you can use<span style="color: red"> db_query()</span>, as explained in the next section.</span></p>
<p><strong><span style="font-family: 宋体">Performing Simple Queries</span></strong></p>
<p><span style="color: green; font-family: 宋体">db_query('SELECT * FROM {joke} WHERE vid = %d', $node-&gt;vid);</span></p>
<p style="text-align: left" align="left"><span style="color: purple; font-family: 宋体">db_query("INSERT INTO {joke} (nid, vid, punchline) VALUES (%d, %d, '%s')",</span></p>
<p><span style="color: purple; font-family: 宋体">$node-&gt;nid, $node-&gt;vid, $node-&gt;punchline);</span></p>
<p style="text-align: left" align="left"><span style="color: green; font-family: 宋体">db_query("UPDATE {joke} SET punchline = '%s' WHERE vid = %d", $node-&gt;punchline,</span></p>
<p><span style="color: green; font-family: 宋体">$node-&gt;vid);</span></p>
<p><span style="color: purple; font-family: 宋体">db_query('DELETE FROM {joke} WHERE nid = %d', $node-&gt;nid);</span></p>
<p><strong><span style="font-family: 宋体">Retrieving Query Results</span></strong></p>
<p style="text-align: left" align="left"><span style="font-family: 宋体">There are various ways to retrieve query results depending on whether you need a single row or the whole result set, or you are planning to get a range of results for internal use or for display as a paged result set.</span></p>
<p><strong><span style="font-size: 13pt; font-family: Utopia-Semibold">1</span></strong><strong><span style="font-size: 13pt; font-family: 宋体">．</span></strong><strong><span style="font-size: 9pt; font-family: Utopia-Semibold">Getting a Single Value</span></strong></p>
<p style="text-align: left" align="left"><span style="color: green; font-family: 宋体">$sql = "SELECT COUNT(*) FROM {node} WHERE type = 'blog' AND status = 1";</span></p>
<p><span style="color: green; font-family: 宋体">$total = </span><span style="color: red; font-family: 宋体">db_result</span><span style="color: green; font-family: 宋体">(</span><span style="color: purple; font-family: 宋体">db_query</span><span style="color: green; font-family: 宋体">($sql));</span></p>
<p><strong><span style="font-size: 9pt; font-family: Utopia-Semibold">2</span></strong><strong><span style="font-size: 9pt; font-family: 宋体">．</span></strong><strong><span style="font-size: 9pt; font-family: Utopia-Semibold">Getting Multiple Rows</span></strong></p>
<p><span style="color: green">$sql = "SELECT * FROM {node} WHERE type = 'blog' AND status = 1";</span></p>
<p><span style="color: green">$result = </span><span style="color: purple">db_query</span><span style="color: green">(</span><span style="color: navy">db_rewrite_sql</span><span style="color: green">($sql));</span></p>
<p><span style="color: green">while ($data = </span><span style="color: red">db_fetch_object</span><span style="color: green">($result)) {</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $node = node_load($data-&gt;nid);</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print node_view($node, TRUE);</span></p>
<p><span style="color: green">}</span></p>
<p style="text-align: left" align="left"><span style="font-family: 宋体">The preceding code snippet will print out all published nodes that are of type </span><span style="font-family: 宋体">blog</span><span style="font-family: 宋体">. (The </span><span style="font-family: 宋体">status </span><span style="font-family: 宋体">field in the node table is </span><span style="font-family: 宋体">0 </span><span style="font-family: 宋体">for unpublished nodes and </span><span style="font-family: 宋体">1 </span><span style="font-family: 宋体">for published nodes.) We will cover </span><span style="color: red; font-family: 宋体">db_rewrite_sql()</span><span style="font-family: 宋体">shortly. The </span><span style="color: red; font-family: 宋体">db_fetch_object()</span><span style="font-family: 宋体">function grabs a row from the result set as an object. To retrieve the result as an array, use </span><span style="color: red; font-family: 宋体">db_fetch_array()</span><span style="font-family: 宋体">. The practice of retrieving rows as objects is common since most developers prefer its less verbose syntax.</span></p>
<p><strong><span style="font-size: 9pt; font-family: Utopia-Semibold">3</span></strong><strong><span style="font-size: 9pt; font-family: 宋体">．</span></strong><strong><span style="font-size: 9pt; font-family: Utopia-Semibold">Getting a Limited Range of Results</span></strong></p>
<p style="text-align: left" align="left"><span style="color: green">$type = 'blog';</span></p>
<p style="text-align: left" align="left"><span style="color: green">$status = 1;</span></p>
<p style="text-align: left" align="left"><span style="color: green">$sql = "SELECT * FROM {node} n WHERE type = '%s' AND status = %d ORDER BY</span></p>
<p style="text-align: left" align="left"><span style="color: green">n.created DESC";</span></p>
<p><span style="color: green">$result = </span><span style="color: red">db_query_range</span><span style="color: green">(db_rewrite_sql($sql), $type, $status, 0, 10);</span></p>
<p><strong><span style="font-size: 9pt; font-family: Utopia-Semibold">4</span></strong><strong><span style="font-size: 9pt; font-family: 宋体">．</span></strong><strong><span style="font-size: 9pt; font-family: Utopia-Semibold">Getting Results for Paged Display</span></strong></p>
<p style="text-align: left" align="left"><span style="color: green">$sql = "SELECT * FROM {node} n WHERE type = 'blog' AND status = 1 ORDER BY</span></p>
<p style="text-align: left" align="left"><span style="color: green">n.created DESC"</span></p>
<p style="text-align: left" align="left"><span style="color: green">$result = pager_query(db_rewrite_sql($sql), 0, 10);</span></p>
<p style="text-align: left" align="left"><span style="color: green">while ($data = db_fetch_object($result)) {</span></p>
<p style="text-indent: 21pt; text-align: left" align="left"><span style="color: green">$node = node_load($data-&gt;nid);</span></p>
<p style="text-indent: 21pt; text-align: left" align="left"><span style="color: green">print node_view($node, TRUE);</span></p>
<p style="text-align: left" align="left"><span style="color: green">}</span></p>
<p style="text-align: left" align="left"><span style="color: green">// Add links to remaining pages of results.</span></p>
<p style="text-align: left" align="left"><span style="color: green">print theme('pager', NULL, 10);</span></p>
<p style="text-align: left" align="left"><span style="font-family: 宋体">Although pager_query() is not really part of the database abstraction layer, it is good to know when you need to create a paged result set with navigation. A call to theme('pager') at the end will display the navigation links to the other pages. You don&#8217;t need to pass the total number of results to theme('pager') because the number of results is remembered internally from the pager_query() call.</span></p>
<p><strong><span style="font-size: 9pt; font-family: Utopia-Semibold">5</span></strong><strong><span style="font-size: 9pt; font-family: 宋体">．</span></strong><strong><span style="font-size: 9pt; font-family: Utopia-Semibold">Deleting Tables on Uninstall</span></strong></p>
<p style="text-align: left" align="left"><span style="font-family: 宋体">The Administer </span><span style="font-family: 宋体">➤ Modules page has an Uninstall tab that not only allows modules to be disabled,but also removes their data from the database. If you want to enable the deletion of your module&#8217;s tables on this page, implement the uninstall hook in your module&#8217;s .install file. You might want to delete any variables you&#8217;ve defined at the same time</span><span style="font-size: 9pt; font-family: Utopia-Regular">.</span></p>
<p style="text-align: left" align="left"><span style="color: green">function annotate_uninstall() {</span></p>
<p style="text-indent: 21pt; text-align: left" align="left"><span style="color: green">db_query("DROP TABLE {annotations}");</span></p>
<p style="text-indent: 21pt; text-align: left" align="left"><span style="color: green">variable_del('annotate_nodetypes');</span></p>
<p><span style="color: green">}</span></p>
<p><strong><span style="font-size: 9pt; font-family: Utopia-Semibold">6</span></strong><strong><span style="font-size: 9pt; font-family: 宋体">．</span></strong><strong><span style="font-size: 9pt; font-family: Utopia-Semibold">Writing Your Own Database Abstraction Layer</span></strong></p>
<p style="text-align: left" align="left"><span style="font-family: 宋体">First, we make a copy of includes/database.mysql.inc and rename it as</span></p>
<p style="text-align: left" align="left"><span style="font-family: 宋体">includes/database.dnabase.inc. Then we change the logic inside each wrapper function to map to DNAbase&#8217;s functionality instead of MySQL&#8217;s functionality. When all is said and done, we have the following functions declared in our file:</span></p>
<p style="text-align: left" align="left"><span style="font-size: 9pt; font-family: TheSansMonoConSemiLight">_db_query($query, $debug = 0)</span></p>
<p style="text-align: left" align="left"><span style="color: green">db_affected_rows()</span></p>
<p style="text-align: left" align="left"><span style="color: green">db_connect($url)</span></p>
<p style="text-align: left" align="left"><span style="color: green">db_decode_blob($data)</span></p>
<p style="text-align: left" align="left"><span style="color: green">db_distinct_field($table, $field, $query)</span></p>
<p style="text-align: left" align="left"><span style="color: green">db_encode_blob($data)</span></p>
<p style="text-align: left" align="left"><span style="color: green">db_error()</span></p>
<p style="text-align: left" align="left"><span style="color: green">db_escape_string($text)</span></p>
<p style="text-align: left" align="left"><span style="color: green">db_fetch_array($result)</span></p>
<p style="text-align: left" align="left"><span style="color: green">db_fetch_object($result)</span></p>
<p style="text-align: left" align="left"><span style="color: green">db_lock_table($table)</span></p>
<p style="text-align: left" align="left"><span style="color: green">db_next_id($name)</span></p>
<p style="text-align: left" align="left"><span style="color: green">db_num_rows($result)</span></p>
<p style="text-align: left" align="left"><span style="color: green">db_query_range($query)</span></p>
<p style="text-align: left" align="left"><span style="color: green">db_query_temporary($query)</span></p>
<p style="text-align: left" align="left"><span style="color: green">db_result($result, $row = 0)</span></p>
<p style="text-align: left" align="left"><span style="color: green">db_status_report($phase)</span></p>
<p style="text-align: left" align="left"><span style="color: green">db_table_exists($table)</span></p>
<p style="text-align: left" align="left"><span style="color: green">db_unlock_tables()</span></p>
<p><span style="color: green">db_version()</span></p><img src ="http://www.blogjava.net/rain1102/aggbug/164780.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2007-12-03 10:02 <a href="http://www.blogjava.net/rain1102/archive/2007/12/03/164780.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>The Menu System</title><link>http://www.blogjava.net/rain1102/archive/2007/12/03/164779.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Mon, 03 Dec 2007 02:01:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2007/12/03/164779.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/164779.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2007/12/03/164779.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/164779.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/164779.html</trackback:ping><description><![CDATA[<p align="justify"><strong><span style="font-family: HelveticaNeue-MediumCond">Access Control</span></strong></p>
<p><span style="font-family: HelveticaNeue-MediumCond">Usually menu access is controlled by defining permissions inside the</span></p>
<p><span style="font-family: HelveticaNeue-MediumCond">module using hook_perm() and testing those permissions using user_access().</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">function mymenu_perm() {</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return array('receive greeting', 'receive goodbye');</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">}</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">function mymenu_menu($may_cache) {</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $items = array();</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ($may_cache) {</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Define a static menu item.</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $items[] = array(</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'title' =&gt; t('Greeting'),</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'path' =&gt; 'mymenu',</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'weight' =&gt; -10,</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'callback' =&gt; 'mymenu_hello',</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'callback arguments' =&gt; array(t('Hi!'), t('Ho!')),</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'access' =&gt; user_access('receive greeting')</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $items[] = array(</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'title' =&gt; t('Farewell'),</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'path' =&gt; 'mymenu/goodbye',</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'callback' =&gt; 'mymenu_goodbye',</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'access' =&gt; user_access('receive goodbye')</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return $items;</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">}</span></p>
<p><strong><span style="font-family: HelveticaNeue-MediumCond">Assigning Callbacks Without Adding a Link to the Menu</span></strong></p>
<p><span style="font-family: HelveticaNeue-MediumCond">Often you may want to map a URL to a function without creating a visible menu item. You</span></p>
<p><span style="font-family: HelveticaNeue-MediumCond">can do this by assigning the MENU_CALLBACK type to your menu item, as in this example from</span></p>
<p><span style="font-family: HelveticaNeue-MediumCond">node.module:</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">$items[] = array(</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'path' =&gt; 'rss.xml',</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'title' =&gt; t('RSS feed'),</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'callback' =&gt; 'node_feed',</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'access' =&gt; user_access('access content'),</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'type' =&gt; MENU_CALLBACK</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">);</span></p>
<p><strong><span style="font-family: Utopia-Semibold">Displaying Menu Items As Tabs</span></strong></p>
<p style="text-align: left" align="left"><span style="font-family: Utopia-Regular">In Drupal&#8217;s admittedly obscure menu lingo, a callback that is displayed as a tab is known as a</span></p>
<p style="text-align: left" align="left"><span style="font-family: Utopia-Regular">local task and has the type MENU_LOCAL_TASK or MENU_DEFAULT_LOCAL_TASK. The title of a local</span></p>
<p style="text-align: left" align="left"><span style="font-family: Utopia-Regular">task should be a short verb, such as &#8220;add&#8221; or &#8220;list.&#8221; Local tasks usually act on some kind of</span></p>
<p style="text-align: left" align="left"><span style="font-family: Utopia-Regular">object, such as a node, user, or workflow.</span></p>
<p style="text-align: left" align="left"><span style="font-family: Utopia-Regular">Local tasks must have a parent item in order for the tabs to be rendered. A common practice</span></p>
<p style="text-align: left" align="left"><span style="font-family: Utopia-Regular">is to assign a callback to a root path like milkshake, and then assign local tasks to paths that</span></p>
<p style="text-align: left" align="left"><span style="font-family: Utopia-Regular">extend that path, like milkshake/prepare, milkshake/drink, and so forth. Drupal has built-in</span></p>
<p style="text-align: left" align="left"><span style="font-family: Utopia-Regular">support for two levels of tabbed local tasks.</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">function milkshake_menu($may_cache) {</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $items = array();</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ($may_cache) {</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $items[] = array(</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'path' =&gt; 'milkshake',</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'title' =&gt; t('Milkshake flavors'),</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'callback' =&gt; 'milkshake_overview',</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'access' =&gt; TRUE</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $items[] = array(</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'path' =&gt; 'milkshake/list',</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'title' =&gt; t('List flavors'),</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'type' =&gt; </span><span style="color: red; font-family: HelveticaNeue-MediumCond">MENU_DEFAULT_LOCAL_TASK, //</span><span style="color: red; font-family: 宋体">默认选上此</span><span style="color: red; font-family: HelveticaNeue-MediumCond">menu</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'access' =&gt; TRUE,</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'weight' =&gt; 0</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $items[] = array(</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'path' =&gt; 'milkshake/add',</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'title' =&gt; t('Add flavors'),</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'callback' =&gt; 'milkshake_add',</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'type' =&gt; </span><span style="color: red; font-family: HelveticaNeue-MediumCond">MENU_LOCAL_TASK</span><span style="color: green; font-family: HelveticaNeue-MediumCond">,</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'access' =&gt; TRUE,</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'weight' =&gt; 1</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $items[] = array(</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'path' =&gt; 'milkshake/list/fruity',</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'title' =&gt; t('Fruity flavors'),</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'callback' =&gt; 'milkshake_list',</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'type' =&gt; </span><span style="color: red; font-family: HelveticaNeue-MediumCond">MENU_LOCAL_TASK</span><span style="color: green; font-family: HelveticaNeue-MediumCond">,</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'access' =&gt; TRUE,</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $items[] = array(</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'path' =&gt; 'milkshake/list/candy',</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'title' =&gt; t('Candy flavors'),</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'callback' =&gt; 'milkshake_list',</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'type' =&gt; </span><span style="color: red; font-family: HelveticaNeue-MediumCond">MENU_LOCAL_TASK</span><span style="color: green; font-family: HelveticaNeue-MediumCond">,</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'access' =&gt; TRUE,</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return $items;</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">}</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">function milkshake_overview() {</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $output = t('The following flavors are available...');</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // ... more code here</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return $output;</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">}</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">function milkshake_add() {</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return t('milkshake add');</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">}</span></p>
<p style="text-align: left" align="left"><span style="font-family: Utopia-Regular">If you want the menu item to show up in the administrative menu block, you have to make</span></p>
<p style="text-align: left" align="left"><span style="font-family: Utopia-Regular">the type a MENU_NORMAL_ITEM instead of a MENU_LOCAL_TASK. And if you want it to show up in both</span></p>
<p style="text-align: left" align="left"><span style="font-family: Utopia-Regular">places, use the following:</span></p>
<p><span style="color: red; font-family: Utopia-Regular">'type' =&gt; MENU_NORMAL_ITEM | MENU_LOCAL_TASK</span></p>
<p><strong><span style="font-family: HelveticaNeue-MediumCond">Programmatically Modifying Existing Menus</span></strong></p>
<p><span style="font-family: HelveticaNeue-MediumCond">1</span><span style="font-family: 宋体">．</span><span style="font-family: HelveticaNeue-MediumCond">Wrapping Calls to Menu Items</span></p>
<p><span style="font-family: HelveticaNeue-MediumCond">/**</span></p>
<p><span style="font-family: HelveticaNeue-MediumCond">* Implementation of hook_menu().</span></p>
<p><span style="font-family: HelveticaNeue-MediumCond">*/</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">function mymodule_menu($may_cache) {</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $items = array();</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!$may_cache &amp;&amp; module_exist('devel')) { // Make sure devel.module is enabled.</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $items[] = array(</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'path' =&gt; 'devel/cache/clear', // Same path that devel.module uses.</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'title' =&gt; t('Wrap cache clear'),</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'callback' =&gt; 'mymodule_clear_cache',</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'type' =&gt; MENU_CALLBACK,</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'access' =&gt; user_access('access devel information') // Same as devel.module.</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">}</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">function mymodule_clear_cache() {</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; drupal_set_message('We got called first!');</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Wrap the devel function normally called.</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; devel_cache_clear();</span></p>
<p><span style="color: green; font-family: HelveticaNeue-MediumCond">}</span></p>
<p><span style="color: green">2</span><span style="color: green; font-family: 宋体">．</span><span style="color: green">Deleting Existing Menus</span></p>
<p><span style="color: green">$items[] = array(</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'path' =&gt; 'node/add',</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'title' =&gt; t('This should not show up'),</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'callback' =&gt; 'drupal_not_found',</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'type' =&gt; MENU_CALLBACK</span></p>
<p><span style="color: green">);</span></p>
<p><strong><span style="font-family: HelveticaNeue-MediumCond">Adding to Existing Menus</span></strong></p>
<p><span style="color: green">$items[] = array(</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'path' =&gt; 'admin/user/user/eradicate',</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'title' =&gt; t('Eradicate all users'),</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'callback' =&gt; 'mymodule_eradicate_users',</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'type' =&gt; MENU_LOCAL_TASK,</span></p>
<p><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'access' =&gt; TRUE</span></p>
<p><span style="color: green">);</span></p><img src ="http://www.blogjava.net/rain1102/aggbug/164779.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2007-12-03 10:01 <a href="http://www.blogjava.net/rain1102/archive/2007/12/03/164779.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>创建annotate module</title><link>http://www.blogjava.net/rain1102/archive/2007/11/29/164010.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Thu, 29 Nov 2007 07:41:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2007/11/29/164010.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/164010.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2007/11/29/164010.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/164010.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/164010.html</trackback:ping><description><![CDATA[1.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">在</span>sites/all/modules<span style="font-family: 宋体">下面创建一个</span>annotate<span style="font-family: 宋体">文件夹</span>
<p style="margin-left: 21pt; text-indent: -21pt; tab-stops: list 21.0pt">2.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">创建</span>annotate module<span style="font-family: 宋体">的信息文件</span>(annotate.info)</p>
<p style="text-indent: 21pt">; $Id: annotate.info v 1.1.2.3 2007/06/18 23:06:32 dww Exp $</p>
<p style="text-indent: 21pt">name = Annotate</p>
<p style="text-indent: 21pt">description = Allows users to annotate nodes.</p>
<p style="text-indent: 21pt">package = Example</p>
<p style="text-indent: 21pt">version = 5.5</p>
<p style="text-indent: 21pt">//dependencies = node blog</p>
<p style="text-indent: 21pt">project = "annotate"</p>
<p style="margin-left: 21pt">datestamp = "1193367002"</p>
<p style="margin-left: 21pt; text-indent: -21pt; tab-stops: list 21.0pt">3.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">创建</span>annotate module<span style="font-family: 宋体">的实际的</span>module<span style="font-family: 宋体">功能文件</span>(annotate.module),<span style="font-family: 宋体">所以的功能都在此文件中定义</span>.</p>
<p style="text-indent: 21pt">&lt;?php</p>
<p style="text-indent: 21pt">// $Id$</p>
<p style="text-indent: 21pt">/**</p>
<p style="text-indent: 21pt">* @file</p>
<p style="text-indent: 21pt">* Lets users add private annotations to nodes.</p>
<p style="text-indent: 21pt">*</p>
<p style="text-indent: 21pt">* Adds a text field when a node is displayed</p>
<p style="text-indent: 21pt">* so that authenticated users may make notes.</p>
<p style="margin-left: 21pt">*/</p>
<p style="margin-left: 21pt; text-indent: -21pt; tab-stops: list 21.0pt">4.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">这时候到</span><span style="font-size: 9.5pt; color: #027ac6; font-family: Verdana">Administer</span><span style="font-family: 'MS Mincho'">➤</span> <span style="font-size: 9.5pt; color: #027ac6; font-family: Verdana">Site building</span><span style="font-family: 'MS Mincho'">➤</span> <span style="font-size: 9.5pt; color: #027ac6; font-family: Verdana">Modules</span><span style="font-family: 宋体">中就可以看到刚才添加的</span>annotate<span style="font-family: 宋体">模组</span>.<span style="font-family: 宋体">但这时候激活它在导航栏里面是看不到</span>annotate<span style="font-family: 宋体">设置菜单的</span>.</p>
<p style="margin-left: 21pt; text-indent: -21pt; tab-stops: list 21.0pt">5.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">实现</span>Hook(<span style="font-family: 宋体">钩子</span>),<span style="font-family: 宋体">添加一下代码</span>,<span style="font-family: 宋体">重新激活</span>annotate<span style="font-family: 宋体">模组</span>,<span style="font-family: 宋体">这样就可以看到在</span><span style="font-size: 9.5pt; color: #027ac6; font-family: Verdana">Administer</span><span style="font-family: 'MS Mincho'">➤</span> <span style="font-size: 9.5pt; color: #027ac6; font-family: Verdana">Site configuration</span><span style="font-family: 宋体">下多了一个</span><span style="font-size: 9.5pt; color: #027ac6; font-family: Verdana">Annotation settings</span><span style="font-family: 宋体">菜单</span></p>
<p style="margin-left: 21pt">/**</p>
<p style="margin-left: 21pt">* Implementation of hook_menu().</p>
<p style="margin-left: 21pt">*/</p>
<p style="margin-left: 21pt">function annotate_menu($may_cache) {</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp; $items = array();</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp; if ($may_cache) {</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $items[] = array(</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'path' =&gt; 'admin/settings/annotate',</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'title' =&gt; t('Annotation settings'),</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'description' =&gt; t('Change how annotations behave.'),</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'callback' =&gt; '<span style="color: green">drupal_get_form',</span></p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'callback arguments' =&gt; array('<span style="color: red">annotate_admin_settings'),</span></p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'access' =&gt; user_access('administer site configuration')</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return $items;</p>
<p style="margin-left: 21pt">}</p>
<p style="margin-left: 21pt; text-indent: -21pt; tab-stops: list 21.0pt">6.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">上面有行</span>'callback' =&gt; 'drupal_get_form'<span style="font-family: 宋体">代码</span>,<span style="font-family: 宋体">还有一行</span> 'callback arguments' =&gt; array('annotate_admin_settings'). <span style="font-family: 宋体">这里当用户通过</span><a href="http://www.example.com/?q=admin/settings/annotate">http://www.example.com/?q=admin/settings/annotate</a><span style="font-family: 宋体">访问的时候</span>,<span style="font-family: 宋体">将会调用</span>drupal_get_form()<span style="font-family: 宋体">函数</span>,<span style="font-family: 宋体">并且通过它的</span>form ID annotate_admin_settings<span style="font-family: 宋体">来调用</span>annotate_admin_settings()<span style="font-family: 宋体">函数</span>.<span style="font-family: 宋体">所以我们要自己定义这个方法</span>.</p>
<p style="margin-left: 21pt">/**</p>
<p style="margin-left: 21pt">* Define the settings form.</p>
<p style="margin-left: 21pt">*/</p>
<p style="margin-left: 21pt">function<span style="color: red"> annotate_admin_settings() {</span></p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $form['annotate_nodetypes'] = array(</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '#type' =&gt; 'checkboxes',</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '#title' =&gt; t('Users may annotate these node types'),</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '#options' =&gt; node_get_types('names'),&nbsp;//<span style="font-family: 宋体">返回所有</span>node<span style="font-family: 宋体">类型组成的数组</span></p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '#default_value' =&gt; variable_get('annotate_nodetypes', array('story')),</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '#description' =&gt; t('A text field will be available on these node types to make</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; user-specific notes.'),</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $form['array_filter'] = array('#type' =&gt; 'hidden');</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return system_settings_form($form);</p>
<p style="margin-left: 21pt">}</p>
<p style="margin-left: 21pt; text-indent: -21pt; tab-stops: list 21.0pt">7.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">实现</span>hook_nodeapi(),<span style="font-family: 宋体">当</span>Drupal<span style="font-family: 宋体">对</span>node<span style="font-family: 宋体">做各种各样的操作的时候对调用此函数</span>.</p>
<p style="margin-left: 21pt">/**</p>
<p style="margin-left: 21pt">* Implementation of hook_nodeapi().</p>
<p style="margin-left: 21pt">*/</p>
<p style="margin-left: 21pt">function annotate_nodeapi(&amp;$node, $op, $teaser, $page) {</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; switch ($op) {</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 'view':</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; global $user;</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // If only the node summary is being displayed, or if the</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // user is an anonymous user (not logged in), abort.</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ($teaser || $user-&gt;uid == 0) {</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $types_to_annotate = variable_get('annotate_nodetypes', array('story'));</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!in_array($node-&gt;type, $types_to_annotate)) {</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Add our form as a content item.</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $node-&gt;content['annotation_form'] = array(</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '#value' =&gt; <span style="color: green">drupal_get_form('<span style="color: red">annotate_entry_form</span>', $node),</span></p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '#weight' =&gt; 10</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="margin-left: 21pt">}</p>
<p style="margin-left: 21pt; text-indent: -21pt; tab-stops: list 21.0pt">8.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">下面我们要定义</span>annotate form,<span style="font-family: 宋体">作为页面现实内容</span></p>
<p style="margin-left: 21pt">/**</p>
<p style="margin-left: 21pt">* Define the form for entering an annotation.</p>
<p style="margin-left: 21pt">*/</p>
<p style="margin-left: 21pt">function <span style="color: red">annotate_entry_form($node) {</span></p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $form['annotate'] = array(</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '#type' =&gt; 'fieldset',</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '#title' =&gt; t('Annotations')</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $form['annotate']['nid'] = array( </p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '#type' =&gt; 'value', </p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '#value' =&gt; $node-&gt;nid </p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp; ); </p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $form['annotate']['note'] = array(</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '#type' =&gt; 'textarea',</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '#title' =&gt; t('Node'),</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '#default_value' =&gt; <span style="color: purple">$node-&gt;annotation,</span></p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '#description' =&gt; t('Make your personal annotations about this content</p>
<p style="margin-left: 21pt">here. Only you (and the site administrator) will be able to see them.')</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $form['annotate']['submit'] = array(</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '#type' =&gt; 'submit',</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '#value' =&gt; t('Update')</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return $form;</p>
<p style="margin-left: 21pt">}</p>
<p style="margin-left: 21pt; text-indent: -21pt; tab-stops: list 21.0pt">9.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">到目前为止对于</span>annotate<span style="font-family: 宋体">的内容我们还有做处理</span>.<span style="font-family: 宋体">从这里开始</span>,<span style="font-family: 宋体">我们就要把</span>annotate<span style="font-family: 宋体">的数据存储到数据库里面</span>,<span style="font-family: 宋体">很多</span>module<span style="font-family: 宋体">里面都有</span>.install<span style="font-family: 宋体">文件</span>,<span style="font-family: 宋体">该文件就是创建数据库表文件</span>.<span style="font-family: 宋体">我们要创建一个</span>annotate.install<span style="font-family: 宋体">文件</span></p>
<p style="margin-left: 21pt">&lt;?php</p>
<p style="margin-left: 21pt">// $Id$</p>
<p style="margin-left: 21pt">function annotate_install() {</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; drupal_set_message(t('Beginning installation of annotate module.'));</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; switch ($GLOBALS['db_type']) {</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 'mysql':</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 'mysqli':</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; db_query("CREATE TABLE annotations (</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uid int NOT NULL default 0,</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nid int NOT NULL default 0,</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; note longtext NOT NULL,</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timestamp int NOT NULL default 0,</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PRIMARY KEY (uid, nid)</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ) /*!40100 DEFAULT CHARACTER SET utf8 */;"</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $success = TRUE;</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 'pgsql':</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; db_query("CREATE TABLE annotations (</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uid int NOT NULL DEFAULT 0,</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nid int NOT NULL DEFAULT 0,</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; note text NOT NULL,</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timestamp int NOT NULL DEFAULT 0,</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PRIMARY KEY (uid, nid)</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );"</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $success = TRUE;</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; default:</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; drupal_set_message(t('Unsupported database.'));</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ($success) {</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; drupal_set_message(t('The module installed tables successfully.'));</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else {</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; drupal_set_message(t('The installation of the annotate module was unsuccessful.'),'error');</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="margin-left: 21pt">}</p>
<p style="margin-left: 21pt; text-indent: -21pt; tab-stops: list 21.0pt">10.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">这里要到数据库</span>system<span style="font-family: 宋体">表里把</span>annotate<span style="font-family: 宋体">给删了</span>,<span style="font-family: 宋体">然后重新激活</span>annotate<span style="font-family: 宋体">模组</span>.<span style="font-family: 宋体">添加提交事件</span>.</p>
<p style="margin-left: 21pt">/*</p>
<p style="margin-left: 21pt">* Save the annotation to the database.</p>
<p style="margin-left: 21pt">*/</p>
<p style="margin-left: 21pt">function<span style="color: red"> annotate_entry_form<span style="color: blue">_submit</span>($form_id, $form_values) {</span></p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; global $user;</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $nid = $form_values['nid'];</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $note = $form_values['note'];</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; db_query("DELETE FROM {annotations} WHERE uid = %d and nid = %d", $user-&gt;uid, $nid);</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; db_query("INSERT INTO {annotations} (uid, nid, note, timestamp) VALUES (%d, %d, '%s', %d)", $user-&gt;uid, $nid, $note, time());</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; drupal_set_message(t('Your annotation was saved.'));</p>
<p style="margin-left: 21pt">}</p>
<p style="margin-left: 21pt; text-indent: -21pt; tab-stops: list 21.0pt">11.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">为了实现在现实</span>annotate<span style="font-family: 宋体">的时候读取数据库里面的数据现实</span>,<span style="font-family: 宋体">这里要修改一下前面的</span>hook_nodeapi<span style="font-family: 宋体">函数</span>.<span style="font-family: 宋体">修改以后的为</span>:</p>
<p style="margin-left: 21pt">/**</p>
<p style="margin-left: 21pt">* Implementation of hook_nodeapi().</p>
<p style="margin-left: 21pt">*/</p>
<p style="margin-left: 21pt">function annotate_nodeapi(&amp;$node, $op, $teaser, $page) {</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; switch ($op) {</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 'view':</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; global $user;</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // If only the node summary is being displayed, or if the</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // user is an anonymous user (not logged in), abort.</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ($teaser || $user-&gt;uid == 0) {</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $types_to_annotate = variable_get('annotate_nodetypes', array('story'));</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!in_array($node-&gt;type, $types_to_annotate)) {</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">// Get previously saved note, if any.</span></p>
<p style="margin-left: 21pt"><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $result = db_query("SELECT note FROM {annotations} WHERE uid = %d AND nid = %d", $user-&gt;uid, $node-&gt;nid);</span></p>
<p style="margin-left: 21pt"><span style="color: green">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: purple">$node-&gt;annotation</span><span style="color: green"> = db_result($result);</span></p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Add our form as a content item.</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $node-&gt;content['annotation_form'] = array(</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '#value' =&gt; drupal_get_form('annotate_entry_form', $node),</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '#weight' =&gt; 10</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="margin-left: 21pt">}</p>
<p><span style="font-family: 宋体">这样在重新激活使用一下就可以了</span>!</p><img src ="http://www.blogjava.net/rain1102/aggbug/164010.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2007-11-29 15:41 <a href="http://www.blogjava.net/rain1102/archive/2007/11/29/164010.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>把玩Drupal模組： Hook System運作簡介 </title><link>http://www.blogjava.net/rain1102/archive/2007/11/29/163972.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Thu, 29 Nov 2007 05:23:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2007/11/29/163972.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/163972.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2007/11/29/163972.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/163972.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/163972.html</trackback:ping><description><![CDATA[<p>週二, 2006-05-09 20:07 — jimmy <br />
模組系統是drupal很重要的運作方式，drupal依靠著少少的核心程式，便能讓模組能做到任何事情。</p>
<p>drupal只有21個檔案在include裡頭，每次必會loading進來，其他的全都放在modules。<br />
也就是說，除了那幾隻檔案以外，全部的東西都把他當成module在寫。諸如CMS最基本的功能，文章管理、評論、討論區、分類...等的功能，全部都寫在module裡，include裡頭所提供的是各種api，檔案處理函式、資料庫存取、表單生成...等等，這樣的分層，module便可以專心的開發各種功能。</p>
<p>當然，這樣的架構不夠令人注目。有許多web app架構，對於模組 （module）、插件（plug-in）...等的運作，通常是讓他們各自為政，自己幹自己的事情。多是用核心提供的object和function，加上module自己額外的code，達到module要做到的額外功能。但是drupal的核心運作卻不是如此。</p>
<p>drupal處理使用的程式為<code>modules/user.module</code>。如果今天想要在看使用者資料的同時，也想看看所有使用者過去發表文章的list，那該怎麼寫呢？</p>
<p><strong>直接一點</strong>，更改user.modue，在顯示時，順便去文章資料庫抓相關的資料？然而這樣卻不是一個好方式，今天任何想要對使用者增加新功能的時候，都得trace一次user.module的code，看懂他在幹啥，然後把新的code安插在合適的地方... 最後可能增加user.module的複雜度，增加維護那支module的難度，共同開發時，更是一個危險的方式。</p>
<p><strong>第二種方式</strong>，重寫一個新的瀏覽頁面，重新寫一個SELECT的語句，讓SELECT的時候除了使用者資訊，也把文章資料一起抓出來，然後顯示到不同的頁面。但是這樣很浪費，明明跟user.module重複的功能達到一半以上，那是不是之後要新增功能，都得重寫一次呢？</p>
<p>上面兩種方式在drupal中也都可以達成，然而熟悉Drupal的人卻不會如此。Drupal的開發者很聰明，他的模組系統（module system）考慮到了模組再利用這一點，每個模組都視為可以再利用的資源，只要寫module的人想寫，透過模組系統便可以跟所有的module交互作用。</p>
<p><strong>第三種方式</strong>以<code>modules/user.module</code>為例，他即是處理包含新增、修改、刪除、註冊、登入....等所有與使用者相關的功能。在進行每個重要的功能時，user.module都會呼叫一個函式去掃所有的module，看看是否有其他的module要在user.module進行此動作時，也進行一些其他想要做的事情，這就是drupal重要的<a href="http://drupaldocs.org/api/head/group/hooks" rel="nofollow">Hook System</a>。<br />
<em>example:</em><br />
在drupal user.module裡頭可以找到如下的程式碼</p>
<pre>function user_view($uid = 0) {
// ... skip
// moudle_invoke掃描所有的module
// 看看有沒有modulename_user這個function
// 有個話就看'view'這個功能的部份要加上什麼
foreach (module_list() as $module) {
if ($data = module_invoke($module, 'user', 'view', '', $account)) {
// do something...
}
}
// ... skip
}
</pre>
<p>所以，第三種方式，不用重寫，也不用改到user.module，只要自己新增module和寫一個function，便可以輕鬆讓瀏覽使用者資訊時，加上過往文章。<br />
<em>example:</em><br />
新增自己的module，與hook system緊密運作<br />
新增sample.module</p>
<pre>function sample_user($type, &amp;$edit, &amp;$user, $category = NULL) {
if ($type == 'view') {
return /*過往文章，型別為一陣列*/;
}
}
</pre>
<p>這就是drupal把眾多主要功能都寫成module的原因，讓所有模組之間都可以交互利用，或是寫給別人利用，或是利用別人的module，像積木一樣推砌成想要的功能，卻又不浪費資源。</p>
<p><strong>參考資源：</strong><br />
詳細的用法在：<br />
<a title="http://drupaldocs.org/api/head/function/hook_user" href="http://drupaldocs.org/api/head/function/hook_user">http://drupaldocs.org/api/head/function/hook_user</a><br />
Module developer's guide：<br />
<a title="http://drupal.org/node/508" href="http://drupal.org/node/508">http://drupal.org/node/508</a></p><img src ="http://www.blogjava.net/rain1102/aggbug/163972.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2007-11-29 13:23 <a href="http://www.blogjava.net/rain1102/archive/2007/11/29/163972.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>模块介绍：jRating</title><link>http://www.blogjava.net/rain1102/archive/2007/11/29/163956.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Thu, 29 Nov 2007 03:49:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2007/11/29/163956.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/163956.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2007/11/29/163956.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/163956.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/163956.html</trackback:ping><description><![CDATA[<dt><strong>简介：</strong>
<dd>这个模块使用 jQuery 技术为节点提供评分功能，当 javascript 被禁止时，使用标准形式，如果启用 javascript 就可以通过图片 (如五星) 动态进行评分。
<p>&nbsp;</p>
<p>这个模块能够与 views 模块协作，它提供一个 views 字段，让评分结果可以通过 views 显示。
<p>&nbsp;</p>
<dt><strong>链接：</strong>
<p>&nbsp;</p>
<dd><a href="http://drupal.org/project/jrating">http://drupal.org/project/jrating</a> </dd><img src ="http://www.blogjava.net/rain1102/aggbug/163956.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2007-11-29 11:49 <a href="http://www.blogjava.net/rain1102/archive/2007/11/29/163956.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Drupal的Captcha</title><link>http://www.blogjava.net/rain1102/archive/2007/11/29/163957.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Thu, 29 Nov 2007 03:49:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2007/11/29/163957.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/163957.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2007/11/29/163957.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/163957.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/163957.html</trackback:ping><description><![CDATA[<p>大家在访问我的博客留言的时候，总是会发现有一个&#8220;考考智商&#8221;，很多人和我说，&#8220;这个太侮辱我的智商了！&#8221;，其实这个题目只是和大家开一个玩笑，但是放这个的真正目的是为了防spam。<br />
啥是Sapm呢？百度百科的解释是：<br />
-----------------------------------<br />
SPAM是stupid person advertesing method的简称,意思为兜售信息[邮件，广告，新闻，文章]，非索要信息。基本与垃圾邮件（junk mail）同义</p>
<p>即是指在Internet上利用Email进行广播式的广告宣传的行为。这种行为给很多人的信箱里塞入大量无关或无用的信息，因此越来越受到人们的厌恶，在美国这已经属非法行为。</p>
<p>Spam最初来历:<br />
spam即SPAM，原是一个罐装肉的牌子。对于这个牌子名字的来源有很多解释，官方版本说，它是&#8221;Specially Processed Assorted Meat&#8221;特殊加工过的混和肉。<br />
这种SPAM肉有段时间非常普及，到了无处不在，令人讨厌的程度。后来（1970年）Monty Python剧团有个很流行的Sketch comedy（一种短小的系列喜剧）叫Spam，剧中两位顾客试图点一份没有SPAM的早餐，但最后却没能成功。<br />
于是，许多年后的现在，Spam被用来统称互联网上到处散布垃圾广告消息的现象 <br />
-------------------------<br />
其实说白了就是使用自动化的工具，在网上批量的发布一些广告信息，用Email，或者论坛，或者博客。<br />
现在论坛在发帖的时候，都会有验证码之类的，也是为了防止Spam。<br />
Drupal作为成熟的CMS，自然有很多人对其进行Spam骚扰，而Drupal也有很多的插件反Spam。</p>
<p>最常用的是Captcha模块。<br />
安装好Captcha模块以后，我们会在用户管理目录下找到一个Captcha管理。这个管理看起来很简单，只有简简单单的几项。</p>
<p>第一项的意思是，在有admin captcha权限的用户的Form下面加上Captcha管理链接。这样一般要勾上，这样的话，你就可以方便的修改每一处要加Captcha的地方了。<br />
接下来的选项就是设置各个地方的Captcha。对于Captcha还有很多相关的模块，大家可以去Drupal上查到。有很多种，比如图片，比如算术，还有Riddler可以设置一些问题，比如一年有几个月之类的。可以对每一个Captcha Point设置一种Captcha检查方法。<br />
在这里，要注意的地方是，如果想增加一个Captcha Point的话，就要把第一项打勾，然后以管理员身份去你要添加Captcha的Form，下面会有一个链接，点一下就好了。这个当时我找了好久，最好逼到了看了Captcha代码，准备去修改数据库的时候才发现，呵呵。<br />
下面就是一些描述，还有另一个选项，选上以后，用户需要在每一次输入的时候都输入Captcha。<br />
我们看到Captcha还有很多其他的设置信息，比如图片检查设置，Riddler设置，都比较简单，点几下就明白了。<br />
对于Captcha的权限，有以下两个：一个是管理Captcha，一个是跳过Captcha检查。</p><img src ="http://www.blogjava.net/rain1102/aggbug/163957.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2007-11-29 11:49 <a href="http://www.blogjava.net/rain1102/archive/2007/11/29/163957.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>E-Mail field(cck邮件栏位)</title><link>http://www.blogjava.net/rain1102/archive/2007/11/28/163796.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Wed, 28 Nov 2007 12:18:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2007/11/28/163796.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/163796.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2007/11/28/163796.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/163796.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/163796.html</trackback:ping><description><![CDATA[<p>这个模块会为cck增加一个聚合栏位，用户可以在那儿添加feed，这个feed会加入到全站聚合里。<br />
官方发布页： <a title="http://drupal.org/project/feedfield" href="http://drupal.org/project/feedfield"><a href="http://drupal.org/project/feedfield">http://drupal.org/project/feedfield</a></a><br />
</p><img src ="http://www.blogjava.net/rain1102/aggbug/163796.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2007-11-28 20:18 <a href="http://www.blogjava.net/rain1102/archive/2007/11/28/163796.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CCK Field Permissions(cck栏位权限)</title><link>http://www.blogjava.net/rain1102/archive/2007/11/28/163794.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Wed, 28 Nov 2007 12:07:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2007/11/28/163794.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/163794.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2007/11/28/163794.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/163794.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/163794.html</trackback:ping><description><![CDATA[利用cck给某个内容类型建立了多个栏位，但你想有些栏位只给特定用户使用，怎么办？CCK Field Permissions这个模块就是解决这个问题的，你可以为单个栏位设置权限，允许特定用户组使用。<br />
比如使用video_cck(cck视频栏位)给一个类型的node添加一个video field，这时候就可以控制一些用户可以添加视频，一些不可以添加视频。使用CCK Field Permissions，开启以后到Administer-&gt;Site configuration-&gt;CCK Field Permissions来设置对哪些node起作用，然后设置每个node的fields！想通过CCK Field Permissions控制的就打勾！保存！然后到User management-&gt;Access control里面设置控制！<br />
<br />
下载地址：<a href="http://drupal.org/project/cck_field_perms">http://drupal.org/project/cck_field_perms</a><img src ="http://www.blogjava.net/rain1102/aggbug/163794.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2007-11-28 20:07 <a href="http://www.blogjava.net/rain1102/archive/2007/11/28/163794.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>video_cck(cck视频栏位)</title><link>http://www.blogjava.net/rain1102/archive/2007/11/28/163790.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Wed, 28 Nov 2007 11:55:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2007/11/28/163790.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/163790.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2007/11/28/163790.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/163790.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/163790.html</trackback:ping><description><![CDATA[<p>这个模块提供一个多媒体栏位，只要填入视频网址，即可自动播放。目前默认支持大多数英语视频网站，如：youtube。稍做修改，也可以支持国内视频网站的视频。</p>
需要结合CCK模块一起使用！<br />
启动以后到 Administer-&gt;Content management-&gt;Video CCK configuration下设置支持哪些网站视频！<br />
下载地址：http://drupal.org/project/video_cck<br /><img src ="http://www.blogjava.net/rain1102/aggbug/163790.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2007-11-28 19:55 <a href="http://www.blogjava.net/rain1102/archive/2007/11/28/163790.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ApacheBench(ab)和eAccelerator使用配置</title><link>http://www.blogjava.net/rain1102/archive/2007/11/28/163757.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Wed, 28 Nov 2007 09:33:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2007/11/28/163757.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/163757.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2007/11/28/163757.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/163757.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/163757.html</trackback:ping><description><![CDATA[<strong>ApacheBench(ab)</strong><br />
服务器负载太大而影响程序效率也是很常见的，Apache服务器自带有一个叫AB(ApacheBench)的工具，在bin目录下。使用这个轻巧的工具我们可以对服务器进行负载测试，<br />
<br />
基本用法:<br />
<br />
ab -n 全部请求数 -c 并发数 测试url <br />
<br />
<br />
例:ab -n 1000 -c 50 <a href="http://www.abc.com/a.php" target="_blank">http://www.abc.com/a.php<img class="cnk8_preview_icon" id="cnk8_com_shot_link_icon" style="border-top-width: 0px; padding-right: 0px; background-position: -370px 0px; display: inline; padding-left: 0px; font-weight: normal; border-left-width: 0px; left: auto; float: none; background-image: url(http://www.cnk8.com/images/v1.0/theme/asphalt/zh-cn/palette.gif); visibility: visible; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px; width: 14px; line-height: normal; padding-top: 1px; background-repeat: no-repeat; font-style: normal; font-family: 'trebuchet ms', arial, helvetica, sans-serif; position: static; top: auto; height: 12px; background-color: transparent; border-right-width: 0px; text-decoration: none; cssfloat: none" src="http://www.cnk8.com/images/v1.0/t.gif"  alt="" /></a><br />
<br />
得到结果类似于(后面颜色字为中文翻译):<br />
<br />
Server Software: &nbsp; &nbsp; &nbsp; &nbsp;Apache/2.0.55<br />
Server Hostname: &nbsp; &nbsp; &nbsp; &nbsp;localhost<br />
Server Port: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;80<br />
<br />
Document Path: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;/1.php<br />
Document Length: &nbsp; &nbsp; &nbsp; &nbsp;82522 bytes &nbsp;#请求文档大小<br />
<br />
Concurrency Level: &nbsp; &nbsp; &nbsp;50 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; #并发数 &nbsp;<br />
Time taken for tests: &nbsp; 92.76140 seconds #全部请求完成耗时<br />
Complete requests: &nbsp; &nbsp; &nbsp;10000 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;#全部请求数<br />
Failed requests: &nbsp; &nbsp; &nbsp; &nbsp;1974 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; #失败的请求<br />
&nbsp; (Connect: 0, Length: 1974, Exceptions: 0)<br />
Write errors: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0<br />
Total transferred: &nbsp; &nbsp; &nbsp;827019400 bytes #总传输大小<br />
HTML transferred: &nbsp; &nbsp; &nbsp; 825219400 bytes <br />
Requests per second: &nbsp; &nbsp;108.61 [#/sec] (mean) #每秒请求数(平均)<br />
Time per request: &nbsp; &nbsp; &nbsp; 460.381 [ms] (mean) #每次并发请求时间(所有并发)<br />
Time per request: &nbsp; &nbsp; &nbsp; 9.208 [ms] (mean, across all concurrent requests)&nbsp;&nbsp;#每一请求时间(并发平均) &nbsp; <br />
Transfer rate: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;8771.39 [Kbytes/sec] received #传输速率<br />
<br />
Connection Times (ms) #连接时间<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;min &nbsp;mean[+/-sd] median &nbsp; max<br />
Connect(#连接): &nbsp; &nbsp; &nbsp; &nbsp;0 &nbsp; &nbsp;0 &nbsp; 2.1 &nbsp; &nbsp; &nbsp;0 &nbsp; &nbsp; &nbsp;46<br />
Processing(#处理): &nbsp; &nbsp;31 &nbsp;458 &nbsp;94.7 &nbsp; &nbsp;438 &nbsp; &nbsp;1078<br />
Waiting(#等待): &nbsp; &nbsp; &nbsp; 15 &nbsp;437 &nbsp;87.5 &nbsp; &nbsp;422 &nbsp; &nbsp; 938<br />
Total: &nbsp; &nbsp; &nbsp; &nbsp; 31 &nbsp;458 &nbsp;94.7 &nbsp; &nbsp;438 &nbsp; &nbsp;1078<br />
<br />
<br />
其它参数:<br />
<br />
-n requests &nbsp; &nbsp; 全部请求数<br />
-c concurrency &nbsp;并发数<br />
-t timelimit &nbsp; &nbsp;最传等待回应时间<br />
-p postfile &nbsp; &nbsp; POST数据文件<br />
-T content-type POST Content-type<br />
-v verbosity &nbsp; &nbsp;How much troubleshooting info to print<br />
-w &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Print out results in HTML tables<br />
-i &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Use HEAD instead of GET<br />
-x attributes &nbsp; String to insert as table attributes<br />
-y attributes &nbsp; String to insert as tr attributes<br />
-z attributes &nbsp; String to insert as td or th attributes<br />
-C attribute &nbsp; &nbsp;加入cookie, eg. 'Apache=1234. (repeatable)<br />
-H attribute &nbsp; &nbsp;加入http头, eg. 'Accept-Encoding: gzip'<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Inserted after all normal header lines. (repeatable)<br />
-A attribute &nbsp; &nbsp;http验证,分隔传递用户名及密码<br />
-P attribute &nbsp; &nbsp;Add Basic Proxy Authentication, the attributes<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; are a colon separated username and password.<br />
-X proxy:port &nbsp; 代理服务器<br />
-V &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;查看ab版本<br />
-k &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Use HTTP KeepAlive feature<br />
-d &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Do not show percentiles served table.<br />
-S &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Do not show confidence estimators and warnings.<br />
-g filename &nbsp; &nbsp; Output collected data to gnuplot format file.<br />
-e filename &nbsp; &nbsp; Output CSV file with percentages served<br />
-h &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Display usage information (this message)<br />
<br />
<br />
<strong>About eAccelerator<br />
</strong>eAccelerator是一个的免费、开源的PHP模块，它能够为提供PHP加速、优化、加码、和动态内容缓存功能。它通过存储PH脚本编译后的状态而加快执行PHP脚本的速度，而不需要频繁的编译这个PHP脚本。而且它能优化PHP脚本，以提高执行PHP的速度。eAccelerator特色是减少了<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%B7%FE%CE%F1%C6%F7">服务器</span>负载、使PHP脚本加速1-10倍。<br />
对应你的php版本下载相应的dll文件．如果是PHP 5.2.5请下载<a href="http://www.sitebuddy.com/files/eAccelerator0952_5.2.5.dll" target="_blank"><font color="#ff0000">eAccelerator 0952 for PHP 5.2.5</font></a> <a href="http://www.sitebuddy.com/files/eLoader0952_5.2.5.dll" target="_blank"><font color="#ff0000">eLoader 0952 for PHP 5.2.5</font></a><br />
<br />
<table class="t_table" style="width: 0px" cellspacing="0">
    <tbody>
        <tr>
            <td>Attachment</td>
            <td>Size</td>
        </tr>
        <tr>
            <td><a href="http://www.sitebuddy.com/files/eAccelerator095_5.1.6.dll" target="_blank"><font color="#0000ff">eAccelerator 095 Final for PHP 5.1.6</font></a></td>
            <td>120 KB</td>
        </tr>
        <tr>
            <td><a href="http://www.sitebuddy.com/files/095_final_useful%20_files.zip" target="_blank"><font color="#0000ff">095_final_useful _files.zip</font></a></td>
            <td>41.97 KB</td>
        </tr>
        <tr>
            <td><a href="http://www.sitebuddy.com/files/eAccelerator095_5.1.5.dll" target="_blank"><font color="#0000ff">eAccelerator 0.9.5 Final for PHP 5.1.5</font></a></td>
            <td>120 KB</td>
        </tr>
        <tr>
            <td><a href="http://www.sitebuddy.com/files/eAccelerator095_5.1.6_optimize_size.dll" target="_blank"><font color="#0000ff">eAccelerator 095 Final for PHP 5.1.6 Optimized for Size</font></a></td>
            <td>108 KB</td>
        </tr>
        <tr>
            <td><a href="http://www.sitebuddy.com/files/eAccelerator095_5.2.0.dll" target="_blank"><font color="#0000ff">eAccelerator 095 Final for PHP 5.2.0</font></a></td>
            <td>120 KB</td>
        </tr>
        <tr>
            <td><a href="http://www.sitebuddy.com/files/eAccelerator095_5.0.5.dll" target="_blank"><font color="#0000ff">eAccelerator 095 Final for PHP 5.0.5</font></a></td>
            <td>120 KB</td>
        </tr>
        <tr>
            <td><a href="http://www.sitebuddy.com/files/eAccelerator095_php504.dll" target="_blank"><font color="#0000ff">eAccelerator 095 for PHP 5.0.4 (OLDER PHP VERSION)</font></a></td>
            <td>120 KB</td>
        </tr>
        <tr>
            <td><a href="http://www.sitebuddy.com/files/eAccelerator0951_5.2.2.dll" target="_blank"><font color="#0000ff">eAccelerator 0951 for PHP 5.2.2</font></a></td>
            <td>120 KB</td>
        </tr>
        <tr>
            <td><a href="http://www.sitebuddy.com/files/eAccelerator0951_521.dll" target="_blank"><font color="#0000ff">eAccelerator 0951 for PHP 5.2.1</font></a></td>
            <td>120 KB</td>
        </tr>
        <tr>
            <td><a href="http://www.sitebuddy.com/files/eAccelerator0951_5.2.2_VS_2005.dll" target="_blank"><font color="#0000ff">eAccelerator 0951 for PHP 5.2.2 Built with VC2005 SP1</font></a></td>
            <td>128 KB</td>
        </tr>
        <tr>
            <td><a href="http://www.sitebuddy.com/files/eAccelerator0951_5.1.4.dll" target="_blank"><font color="#0000ff">eAccelerator 0951 for PHP 5.1.4</font></a></td>
            <td>120 KB</td>
        </tr>
        <tr>
            <td><a href="http://www.sitebuddy.com/files/eAccelerator0951_5.2.3.dll" target="_blank"><font color="#0000ff">eAccelerator 0951 for PHP 5.2.3</font></a></td>
            <td>120 KB</td>
        </tr>
        <tr>
            <td><a href="http://www.sitebuddy.com/files/eAccelerator0951_5.2.0.dll" target="_blank"><font color="#0000ff">eAccelerator 0951 for PHP 5.2.0 (OLDER PHP VERSION)</font></a></td>
            <td>120 KB</td>
        </tr>
        <tr>
            <td><a href="http://www.sitebuddy.com/files/eAccelerator0951_5.2.4.dll" target="_blank"><font color="#0000ff">eAccelerator 0951 for PHP 5.2.4</font></a></td>
            <td>120 KB</td>
        </tr>
        <tr>
            <td><a href="http://www.sitebuddy.com/files/eLoader0951_5.2.4.dll" target="_blank"><font color="#0000ff">eLoader 0951 for PHP 5.2.4</font></a></td>
            <td>28 KB</td>
        </tr>
        <tr>
            <td><a href="http://www.sitebuddy.com/files/0952_final_useful%20_files.zip" target="_blank"><font color="#0000ff">0952_final_useful _files.zip</font></a></td>
            <td>42.27 KB</td>
        </tr>
        <tr>
            <td><a href="http://www.sitebuddy.com/files/eLoader0952_5.2.3.dll" target="_blank"><font color="#0000ff">eLoader 0952 for PHP 5.2.3</font></a></td>
            <td>28 KB</td>
        </tr>
        <tr>
            <td><a href="http://www.sitebuddy.com/files/eAccelerator0952_5.2.3.dll" target="_blank"><font color="#0000ff">eAccelerator 0952 for PHP 5.2.3</font></a></td>
            <td>120 KB</td>
        </tr>
        <tr>
            <td><a href="http://www.sitebuddy.com/files/eLoader0952_5.2.4.dll" target="_blank"><font color="#0000ff">eLoader0952_5.2.4.dll</font></a></td>
            <td>28 KB</td>
        </tr>
        <tr>
            <td><a href="http://www.sitebuddy.com/files/eAccelerator0952_5.2.4.dll" target="_blank"><font color="#0000ff">eAccelerator 0952 for PHP 5.2.4</font></a></td>
            <td>120 KB</td>
        </tr>
        <tr>
            <td><a href="http://www.sitebuddy.com/files/eAccelerator0952_5.2.5.dll" target="_blank"><font color="#ff0000">eAccelerator 0952 for PHP 5.2.5</font></a></td>
            <td><font color="#ff0000">120 KB</font></td>
        </tr>
        <tr>
            <td><a href="http://www.sitebuddy.com/files/eLoader0952_5.2.5.dll" target="_blank"><font color="#ff0000">eLoader 0952 for PHP 5.2.5</font></a></td>
            <td><font color="#ff0000">28 KB</font></td>
        </tr>
    </tbody>
</table>
<br />
<br />
We have been using this PHP accelerator (0.9.5), on multiple servers, for a long time. It's used on some high traffic sites without any problem.<br />
<strong>Install</strong>:<br />
a) Download a copy of <strong>eAccelerator</strong> that is compatible with your version of PHP.<br />
This can be an issue with <strong>eAccelerator</strong>. Sometimes it can take a little time before the Windows binaries are available for the most recent version of <strong>PHP</strong>.<br />
b) Copy a compatible eaccelerator.dll to your PHP extensions folder (like:D:\php\ext replace with your actual folder location).<br />
Make sure the configuration directive <strong>extension_dir in your </strong>php.ini is properly pointing to your extensions folder.<br />
Like: extension_dir = "D:/php/ext"<br />
//将dll文件复制到D:/php/ext下．<br />
c) Create a folder (with the appropriate permissions) for the temporary cached files.<br />
For example: D:\temp\eaccelerator<br />
//创建tmp目录　权限可写<br />
d) Add the following to your php.ini (as the first loaded extension):<br />
.<br />
;extension=php_yaz.dll<br />
;extension=php_zip.dll<br />
//编辑php.ini 在extension=php_zip.dll之后添以红字部分<br />
<br />
<font color="#ff0000">[eaccelerator] <br />
<span style="color: #008000">zend_extension_ts="D:\php\ext\eAccelerator0952_5.2.3.dll"<br />
zend_extension="D:\php\ext\eAccelerator0952_5.2.3.dll"<br />
eaccelerator.cache_dir = "D:\temp\eaccelerator"<br />
eaccelerator.shm_size="64"<br />
eaccelerator.enable="1"<br />
eaccelerator.optimizer="1"<br />
eaccelerator.debug ="0"<br />
eaccelerator.check_mtime="1"<br />
eaccelerator.filter=""<br />
eaccelerator.shm_max="0"<br />
eaccelerator.shm_ttl ="0"<br />
eaccelerator.shm_prune_period="0"<br />
eaccelerator.shm_only="0"<br />
eaccelerator.compress="1"<br />
eaccelerator.compress_level="9"<br />
eaccelerator.keys= "shm"<br />
eaccelerator.sessions="shm"<br />
eaccelerator.c<br />
zend_extension="D:\php\ext\eLoader0952_5.2.3.dll"<br />
</span></font>;;;;;;;;;;;;;;;;;;;<br />
; Module Settings ;<br />
;;;;;;;;;;;;;;;;;;;<br />
.<br />
.<br />
e) Restart your Web Server.You can see..<img src ="http://www.blogjava.net/rain1102/aggbug/163757.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2007-11-28 17:33 <a href="http://www.blogjava.net/rain1102/archive/2007/11/28/163757.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>网站多语言版本－－Drupal</title><link>http://www.blogjava.net/rain1102/archive/2007/11/22/162379.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Thu, 22 Nov 2007 06:53:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2007/11/22/162379.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/162379.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2007/11/22/162379.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/162379.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/162379.html</trackback:ping><description><![CDATA[<p>在官方网站上看到有两个module可以实现国际化多语言版本，首先看到的是menutranslation，而此module只是实现了对menu实现的国际化多语言控制，显然不适合一般的要求，但这个module配置很简单，只需要加入i18n就可以了，基本不需要配置什么的。<br />
与是就继续看了一下功能强大的localizer。此module需要自己配置很多。<br />
</p>
<p>Installation instructions (New installation: Localizer 1.10 on Drupal 5.1 and Drupal 5.2)</p>
<p>1. Download the latest Localizer module from http://drupal.org/project/localizer<br />
2. Download the flags icons from http://www.speedtech.it/files/localizer-flags.tgz<br />
3. Download pre-patched core files from <br />
&nbsp;&nbsp; http://www.speedtech.it/files/localizer-sites-all-5.1-1.10.tgz (Drupal 5.1)<br />
&nbsp;&nbsp; http://www.speedtech.it/files/localizer-sites-all-5.2-1.10.tgz (Drupal 5.2)&nbsp;&nbsp; <br />
4. Extract localizer-5.x-1.10.tgz archive under sites/all/modules (create the modules directory if needed)<br />
&nbsp;&nbsp; This will create sites/all/modules/localizer that contains the Localizer-related module code.<br />
5. Extract localizer-flags.tgz under sites/all/modules/localizer. This<br />
&nbsp;&nbsp; will create sites/all/modules/localizer/flags with the flag files in it.<br />
6. Extract localizer-sites-all-5.1-1.10.tgz (or localizer-sites-all-5.2-1.10.tgz) under sites/all (it already<br />
&nbsp;&nbsp; has the modules and localizer directory, so the contents will go into<br />
&nbsp;&nbsp; sites/all/modules/localizer.<br />
7. To the end of your sites/default/settings.php file, append and save<br />
&nbsp;&nbsp; (overwrite the file):<br />
&nbsp;&nbsp; $conf= array<br />
&nbsp;&nbsp; (<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'cache_inc' =&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'sites/all/modules/localizer/system/includes/cache.inc',<br />
&nbsp;&nbsp; );<br />
8. Login to your site as administrator (UID=1)<br />
9. Under Administer &gt; Site building &gt; modules, enable all the<br />
&nbsp;&nbsp; Localizer-related modules you need. Click Save configuration.<br />
10. Visit www.yoursite.com/update.php and run the update script.<br />
11. Under Administer &gt; Site configuration &gt; Localizer to configure options.<br />
12. Enjoy!</p>
<p><br />
Upgrade instructions (Upgrade from older versions of Localizer to Localizer<br />
1.10 on Drupal 5.1 and Drupal 5.2)</p>
<p>1. Download the latest Localizer module from http://drupal.org/project/localizer<br />
2. Download the flags icons from http://www.speedtech.it/files/localizer-flags.tgz<br />
3. Download pre-patched core files from <br />
&nbsp;&nbsp; http://www.speedtech.it/files/localizer-sites-all-5.1-1.10.tgz (Drupal 5.1)<br />
&nbsp;&nbsp; http://www.speedtech.it/files/localizer-sites-all-5.2-1.10.tgz (Drupal 5.2)&nbsp;&nbsp; <br />
4. Login to your site as administrator and under Administer &gt; Site<br />
&nbsp;&nbsp; building &gt; modules, disable all the Localizer-related modules<br />
5. Delete the old module/localizer directory (could be sites/all/modules/localizer)<br />
6. Return the Drupal 5.x modules that you previously patched for<br />
&nbsp;&nbsp; Localizer versions prior to 1.10 to their original state. (In other<br />
&nbsp;&nbsp; words, download Drupal 5.x and extract the the following files from<br />
&nbsp;&nbsp; the tarball: block.module, menu.module, taxonomy.module, bootstrap.inc,<br />
&nbsp;&nbsp; and common.inc. Upload these to your site, overwriting the existing<br />
&nbsp;&nbsp; modules.)<br />
7. Extract localizer-5.x-1.10.tgz archive under sites/all/modules<br />
&nbsp;&nbsp; (create the modules directory if needed) This will create<br />
&nbsp;&nbsp; sites/all/modules/localizer that contains the Localizer-related module code.<br />
8. Extract localizer-flags.tgz under sites/all/modules/localizer. This<br />
&nbsp;&nbsp; will create sites/all/modules/localizer/flags with the flag files in it.<br />
9. Extract localizer-sites-all-5.1-1.10.tgz (or localizer-sites-all-5.2-1.10.tgz) under sites/all (it already<br />
&nbsp;&nbsp; has the modules and localizer directory, so the contents will go into<br />
&nbsp;&nbsp; sites/all/modules/localizer.<br />
10. To the end of your sites/default/settings.php file, append and<br />
&nbsp;&nbsp; save (overwrite the file):<br />
&nbsp;&nbsp; $conf= array<br />
&nbsp;&nbsp; (</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'cache_inc' =&gt;<br />
&nbsp;&nbsp; 'sites/all/modules/localizer/system/includes/cache.inc',</p>
<p>&nbsp;&nbsp; );<br />
11. Login to your site as administrator (UID=1)<br />
12. Under Administer &gt; Site building &gt; modules, enable all the<br />
&nbsp;&nbsp;&nbsp; Localizer-related modules you need. Click Save configuration.<br />
13. Visit www.yoursite.com/update.php and run the update script.<br />
14. Under Administer &gt; Site configuration &gt; Localizer to configure<br />
&nbsp;&nbsp;&nbsp; options.<br />
15. Enjoy!</p>
按照它的说明文件，很快就可以实现国际化多语言版本的网站了!此module可以对node，block等等实现国际化!<img src ="http://www.blogjava.net/rain1102/aggbug/162379.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2007-11-22 14:53 <a href="http://www.blogjava.net/rain1102/archive/2007/11/22/162379.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>