<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>泡泡牛 &#187; 专业</title>
	<atom:link href="http://www.paopaoniu.com/tags/%e4%b8%93%e4%b8%9a/feed" rel="self" type="application/rss+xml" />
	<link>http://www.paopaoniu.com</link>
	<description>分享体验与思想! —— 互联网、财经、运营、策划、出版</description>
	<lastBuildDate>Mon, 12 Apr 2010 15:35:15 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Drupal专业开发指南(45)——第15章 Drupal 缓存（cache）（2）页面缓存</title>
		<link>http://www.paopaoniu.com/html/drupal-zhuan-ye-kai-fa-zhi-nan-45-di-15-zhang-drupal-huan-cun-cache-2-ye-mian-huan-cun-2521.html</link>
		<comments>http://www.paopaoniu.com/html/drupal-zhuan-ye-kai-fa-zhi-nan-45-di-15-zhang-drupal-huan-cun-cache-2-ye-mian-huan-cun-2521.html#comments</comments>
		<pubDate>Mon, 29 Sep 2008 20:20:31 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Drupal]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[专业]]></category>
		<category><![CDATA[开发指南]]></category>
		<category><![CDATA[模块]]></category>
		<category><![CDATA[缓存]]></category>
		<category><![CDATA[页面]]></category>

		<guid isPermaLink="false">http://www.paopaoniu.com/?p=2521</guid>
		<description><![CDATA[页面
我们前面讨论了很多，都是关于对站点的耗费资源的成分进行缓存的，但是 Drupal 最有效的缓存优化是对整个页面视图进行缓存。对于匿名用户，很容易做到这一点，这是因为所有页面对于所有匿名用户都是相同的。然而，对于登录用户，每个页 面都是针对用户量身定做的。因此需要采用不同的缓存策略来处理这种情况。
对于匿名用户，Drupal 可以使用一个简单的查询来取回缓存的页面内容，当然它需要一些其它查询以加载 Drupal 本身。对于匿名用户页面缓存，有两种缓存策略供你选择：普通模式和激进模式。当然你也可以禁用页面缓存。这些设置可以在 Drupal 后台管理接口 Administer &#62; Site configuration &#62; Performance 中找到。在接下来的部分中，让我们看一下每种设置。
禁用模式
这将完全禁用页面缓存。通常在开发网站的时候使用。一般情况下，你需要启用页面缓存。
注意 即使禁用了页面缓存，Drupal 仍对用户菜单、过滤后的内容、系统变量进行缓存。这些部件级别的缓存不能被禁用。
普通模式
与完全不使用缓存相比，普通模式对性能有巨大提升，因此它是对一个运行缓慢的 Drupal 站点提升速度的最简单方式之一。让我们仔细的看一下，当缓存系统的普通模式启用时，请求的生命周期。
为了理解页面缓存的普通模式，你首先需要了解 Drupal 的引导指令流程。引导指令流程由在 Drupal 称之为阶段的小的独立的步骤组成。在安装和更新流程中，Drupal 就用到了将引导指令系统划分为多个阶段的优点，在这些流程中只需要加载需要的代码即可。对当前讨论，我们需要知道的是，系统在提供缓存页面时，只需要加载 他所需要的代码和数据库链接即可。
图15-1 详细展示了为匿名用户请求提供缓存页面的流程。

图15-1 本图展示了当 Drupal 处于页面缓存普通模式下为匿名用户请求提供缓存页面的生命周期。引导指令流程的前面5个阶段与缓存无关，用在这里仅仅是为了保持完整性。n* 意味着在该处数据库查询次数是未知的。
在最开始，请求使得 Web 服务器执行 index.php，index.php 中的第一行 PHP 代码是用来包含文件 includes/bootstrap.inc，该文件含有加载引导指令的核心函数。接着， index.php 调用函数 drupal_bootstrap()。
drupal_bootstrap() 负责执行每一个引导指令阶段。对于普通模式缓存，我们只需要关心引导指令阶段 DRUPAL_BOOTSTRAP_LATE_PAGE_CACHE 就可以了。在该阶段，首先从数据库中取回系统变量。假定缓存策略是普通模式，接下来就是包含文件 includes/module.inc 了。 module.inc 内部的函数用来允许 Drupal 将模块系统放到线上。Drupal 接着将初始化实现了钩子函数 hook_init() 或者 hook_exit() 的模块。通过分别调用 [...]]]></description>
		<wfw:commentRss>http://www.paopaoniu.com/html/drupal-zhuan-ye-kai-fa-zhi-nan-45-di-15-zhang-drupal-huan-cun-cache-2-ye-mian-huan-cun-2521.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Drupal专业开发指南(44)&#8211;第15章 Drupal 缓存（cache）（1）</title>
		<link>http://www.paopaoniu.com/html/drupal-zhuan-ye-kai-fa-zhi-nan-44-di-15-zhang-drupal-huan-cun-cache-1-1360.html</link>
		<comments>http://www.paopaoniu.com/html/drupal-zhuan-ye-kai-fa-zhi-nan-44-di-15-zhang-drupal-huan-cun-cache-1-1360.html#comments</comments>
		<pubDate>Mon, 29 Sep 2008 20:17:33 +0000</pubDate>
		<dc:creator>popox</dc:creator>
				<category><![CDATA[Drupal]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[专业]]></category>
		<category><![CDATA[开发]]></category>
		<category><![CDATA[指南]]></category>
		<category><![CDATA[数据库]]></category>
		<category><![CDATA[模块]]></category>
		<category><![CDATA[缓存]]></category>
		<category><![CDATA[过滤器]]></category>

		<guid isPermaLink="false">http://www.paopaoniu.com/?p=1360</guid>
		<description><![CDATA[缓存
为动态网站建造页面需要对数据库进行大量的数据读取，以获取诸如保存的内容、站点设置、当前用户等等诸多信息。将这些耗费资源的操作结果保存起来以 备后用，这是从应用层提高一个反应缓慢站点的最简单的途径之一。Drupal 内置的缓存 API 对大部分核心数据进行了自动缓存，并为 Drupal 开发者提供了一组工具以进行量身定做。
缓存是如何工作的
模块开发者可以将他们要缓存的数据保存到 Drupal 数据库中专门用于缓存的数据库表中，或者它们也可以为缓存的存储创建一个新的数据库表。当下次用到这些缓存过的信息时，可以通过一个简单的查询快速的获取这些信息，而不是在使用笨重的数据操作了。
在你的模块中，你可以放置缓存信息的默认数据库表是 cache。当缓存信息的数据量不大时，最好使用该表。你过你想为每个节点、菜单、用户缓存信息，你将需要为你的模块创建独有的缓存数据库表，这样就可以 减小 Drupal 的 cache 表的大小，从而提高新能。当要为你的模块创建一个新的缓存数据库表时，该表的数据结构一定要与 cache 表完全相同，不同的仅仅是表名。为了一致性，在表明前面加上前缀 cache_ 是个不错的注意。让我们看一下 cache 表的结构；参看表格15-1.
注意：当为你的模块创建一个新的缓存数据库表时，该表的数据结构一定要与 cache 表完全相同
表15-1 表cache的元数据
Field   Type          Null   Index
cid     varchar(255)  NO     PRIMARY
data    [...]]]></description>
		<wfw:commentRss>http://www.paopaoniu.com/html/drupal-zhuan-ye-kai-fa-zhi-nan-44-di-15-zhang-drupal-huan-cun-cache-1-1360.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Drupal专业开发指南-(42)第14章 在 Drupal 中使用分类（Drupal taxonomy）（2）</title>
		<link>http://www.paopaoniu.com/html/drupal-zhuan-ye-kai-fa-zhi-nan-42-di-14-zhang-zai-drupal-zhong-shi-yong-fen-lei-drupal-taxonomy-2-1804.html</link>
		<comments>http://www.paopaoniu.com/html/drupal-zhuan-ye-kai-fa-zhi-nan-42-di-14-zhang-zai-drupal-zhong-shi-yong-fen-lei-drupal-taxonomy-2-1804.html#comments</comments>
		<pubDate>Mon, 29 Sep 2008 20:13:54 +0000</pubDate>
		<dc:creator>popox</dc:creator>
				<category><![CDATA[Drupal]]></category>
		<category><![CDATA[taxonomy]]></category>
		<category><![CDATA[term]]></category>
		<category><![CDATA[专业]]></category>
		<category><![CDATA[分类]]></category>
		<category><![CDATA[开发指南]]></category>
		<category><![CDATA[节点]]></category>
		<category><![CDATA[词汇表]]></category>
		<category><![CDATA[词语]]></category>

		<guid isPermaLink="false">http://www.paopaoniu.com/?p=1804</guid>
		<description><![CDATA[根据词语（term）查看内容
你可以通过进入一个词语的 URL 来查看该词语下面的所有节点。例如，在 URL http://example.com/?q=taxonomy/term/5,5 是你希望查看的词语的 term ID。结果将是一列包含了每个使用该词作为标签的节点的标题和 Teaser。
在 URL 中使用 AND 和 OR
构建支持 AND 和 OR的分类（taxonomy）URL 的语法为，分别使用逗号&#8221;,&#8221;和加号&#8221;+&#8221;。下面是一些例子。
指定了词语 ID 为5和6的所有节点的展示，使用下面的 URL：
http://example.com/?q=taxonomy/term/5,6
使用下面的 URL 展示指定了词语 ID为1或2或者3的所有节点：
http://example.com/?q=taxonomy/term/1+2+3
taxonomy.module 对混合使用 AND 和 OR 目前还没有提供支持。
提示：使用 path 模块，来为你这些分类 URL 设置用户友好的 URL，这样他们后面就不会有这些令人害怕的数字了。
为多层级词汇表声明深度 
在前面的例子中，我们是用了一个隐含的参数。例如，URL http://example.com/?q=taxonomy/term/5 实际上是 http://example.com/?q=taxonomy/term/5/0
当为了展示准备结果集时，最后一个参数0就是所要搜索的层级数；如果参数为 all 时，这意味着包括所有的层级。假定你有一个多层级词汇表，如表14-3所示。
表 14-3 一个地理多层级词汇表 （子词语为它们父亲后面，缩进了）
Term ID Name
1 Canada
2 British Columbia
3 Vancouver
4 Ontario
5 Toronto
第一层级是国家（Canada）；它有两个孩子，British Columbia 和 Ontario 省。每一个省都包含一个孩子，一个 [...]]]></description>
		<wfw:commentRss>http://www.paopaoniu.com/html/drupal-zhuan-ye-kai-fa-zhi-nan-42-di-14-zhang-zai-drupal-zhong-shi-yong-fen-lei-drupal-taxonomy-2-1804.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Drupal专业开发指南-(41)第14章 在 Drupal 中使用分类（Drupal taxonomy）（1）</title>
		<link>http://www.paopaoniu.com/html/drupal-zhuan-ye-kai-fa-zhi-nan-41-di-14-zhang-zai-drupal-zhong-shi-yong-fen-lei-drupal-taxonomy-1-1798.html</link>
		<comments>http://www.paopaoniu.com/html/drupal-zhuan-ye-kai-fa-zhi-nan-41-di-14-zhang-zai-drupal-zhong-shi-yong-fen-lei-drupal-taxonomy-1-1798.html#comments</comments>
		<pubDate>Mon, 29 Sep 2008 20:12:52 +0000</pubDate>
		<dc:creator>popox</dc:creator>
				<category><![CDATA[Drupal]]></category>
		<category><![CDATA[taxonomy]]></category>
		<category><![CDATA[专业]]></category>
		<category><![CDATA[分类]]></category>
		<category><![CDATA[开发指南]]></category>
		<category><![CDATA[系统]]></category>
		<category><![CDATA[节点]]></category>
		<category><![CDATA[词汇表]]></category>
		<category><![CDATA[词语]]></category>

		<guid isPermaLink="false">http://www.paopaoniu.com/?p=1798</guid>
		<description><![CDATA[分类是对事物的划分归类。Drupal 自带了一个分类模块（Taxonomy module），它允许你对节点（就是所谓的&#8221;事物&#8221;）进行分类。在本章中，你将看到 Drupal 支持的分类的不同形式。你也将看到数据是如何存储的，如何对分类（taxonomy）数据库表写出查询语句,以在你自己的模块中使用这些语句。最后，你将会看到，当分类（Taxonomy）改变时，你的模块如何受到改变的通知，还有我们将介绍一些常用的分类（Taxonomy）相关的任务。
什么是分类
分类涉及到对事物进行归类。你将会在 Administer &#62; Content Management &#62; Categories 下面看到 Drupal 的对分类的支持（如果在这里没有的话，请确认启用了分类模块）。当涉及到 Drupal 的分类系统时，用词的准确性是非常重要的。让我们看一下你将会遇到的常用词。
词语（terms）
词语是将要应用到节点上实际标签。例如，假定你有一个包含产品评论的网站。你可以在每一个评论上使用词语&#8221;坏的&#8221;、&#8221;可以&#8221;、&#8221;优秀&#8221;来进行标记。词语有时也称为标签，将一个词语指定到一个对象（比如说一个产品评论节点）上的行为称之为标签化。
抽象层次（A level of Abstraction）
当你查看数据结构时，你会立即发现，Drupal 对所有你输入的词语添加一个层次上的抽象，在内部对它们的引用是通过 ID 来完成的，而不是通过名字。例如，如果你在前面输入了一个词语，但是你的经理觉得单词&#8221;Poor&#8221;比&#8221;Bad&#8221;更好一些，这时没有任何难的。你简单的编辑这个 id 为1词语，将它从&#8221;Bad&#8221;改为&#8221;Poor&#8221;。在 Drupal 内部一切工作正常，这是因为 Drupal 在内部把它当作了 ID 为1的词语来进行使用。
同义词（Synonyms）
当你定义一个词语时，你可以输入该词的同义词；一个同义词是一个具有同样含义的单词。Drupal 包含的分类功能允许你输入同义词，并提供了数据库表对它们进行存储，以及一些有用的函数比如 taxonomy_get_synonyms($tid) 和 taxonomy_get_synonym_root($synonym),但是对这些函数的用户接口的实现留给了贡献模块，比如术语表模块（glossary module）（http://drupal.org/project/glossary）。
词汇表（vocabularies）
一个词汇表包含了一组词语。Drupal 允许你将一个词汇表与一个或多个节点类型相联系。当跨节点类型进行分类时，这种弱联系非常有用。例如，如果你有一个站点，允许用户可以提交关于旅游的故事和图片；这将非常容易的让你看到标记为 Belgium 的所有故事和图片。词汇表接口编辑页面如图14-1所示。
必须的词汇表
词汇表可以是必须的，也可以不必须。如果一个词汇表是必须的，那么用户在提交节点表单以前必须为节点选择一个词语。如果不是必须的，那么用户提交表单时，可以使用默认词语 none.
受控的词汇表
当一个词汇表有一个有限的词语时（也就是说，用户不可以添加新的词语），被称为受控词汇表。对于一个受控词汇表，词汇一般都存在于下拉选择按钮中。当然，管理员，或者拥有管理分类权限的用户可以添加，删除，或者修改词语。
自由化标签
自由化标签与受控词汇表相对立。当用户提交一个节点时，可以输入他们自己的词语。如果词语还不是词汇表的一部份的话，它将被添加。当启用自由化标签时，词汇表的用户接口将会以一个文本输入框出现（使用 Javascript 自动完成），而不是受控词汇表所使用的下拉选择按钮。
单独 VS 多个词语
Drupal 允许你设置对于一个给定的节点，是使用单独的一个词语还是使用多个词语进行标签化。选择后者，将使得用户接口的节点提交表单中的单选下拉按钮变为多选下拉按钮。
提示：本选项仅适用于受控词汇表，对于自由化标签不使用
相关词语
如果一个词汇表允许相关词语，那么当你定义一个新的词语的时候，将会出现一个多选下拉菜单，这样你就可以从已经存在的词语中间选出相关的词语。
重量
每一个词汇表都有一个重量，从-10到10（如图14-1所示）。这用来控制用户的节点提交表单中的词汇表的布局。词汇表的重量越轻，对应的分类字段集位置越靠上边。重量越大，位置越靠下面。
每一个词语也都有一个重量。词语的在用户的下拉选择按钮中的位置决定于它的重量。这一优先级同样展现在 Administer &#62; Content management &#62; Categories &#62; List terms。

图14-1 添加词汇表的表单
分类的种类
分类有多个种类。最简单的仅有一列词语，而最复杂的则有复杂的层次结构关系。另外，词语可以有同义词或者与它相关的词语。让我们从最简单的开始。
扁平结构
一个仅包含了一列词语的词汇表是非常简单的。表14-1展示了我们如何在一个叫做编程语言的简单的扁平的词汇表中对编程语言进行分类。
表14-1词汇表中的简单词语
Term ID [...]]]></description>
		<wfw:commentRss>http://www.paopaoniu.com/html/drupal-zhuan-ye-kai-fa-zhi-nan-41-di-14-zhang-zai-drupal-zhong-shi-yong-fen-lei-drupal-taxonomy-1-1798.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Drupal专业开发指南-(40)第13章 Drupal文件（file）（2）</title>
		<link>http://www.paopaoniu.com/html/drupal-zhuan-ye-kai-fa-zhi-nan-40-di-13-zhang-drupal-wen-jian-file-2-1790.html</link>
		<comments>http://www.paopaoniu.com/html/drupal-zhuan-ye-kai-fa-zhi-nan-40-di-13-zhang-drupal-wen-jian-file-2-1790.html#comments</comments>
		<pubDate>Mon, 29 Sep 2008 20:12:19 +0000</pubDate>
		<dc:creator>popox</dc:creator>
				<category><![CDATA[Drupal]]></category>
		<category><![CDATA[file]]></category>
		<category><![CDATA[专业]]></category>
		<category><![CDATA[开发指南]]></category>
		<category><![CDATA[文件系统]]></category>
		<category><![CDATA[节点]]></category>
		<category><![CDATA[钩子]]></category>

		<guid isPermaLink="false">http://www.paopaoniu.com/?p=1790</guid>
		<description><![CDATA[媒体处理
文件 API 没有为上传文件提供一个通用的用户接口。为了为大多数用户填充这一空白，已将 upload.module 添加到了 Drupal 核心中，而且有多个第3方模块提供了可选方案。
上传模块（Upload Module）
上传模块为你选择的节点类型添加了一个上传字段。上传字段如图13-2所示。

图13-2. 当启用了上传模块并且用户具有&#8221;upload files&#8221;权限时，在节点表单中添加了一个&#8221;文件附件（File attachments）&#8221;字段。
在节点编辑表单上一个文件被上传以后，upload.module 将在节点主体下面添加已上传文件的下载链接。拥有&#8221;view uploaded files&#8221;权限的用户可以看到这些链接，如图13-3所示。

图13-3. 使用核心上传模块为一节点上传文件后得到的链接列表视图。
这一通用解决方案可能不能满足所有用户的需求，所以在接下来的部分，让我们看一些更特殊的例子。
其它的通用文件处理模块
对于文件上传，可替代 upload.module 的模块有 filemanager 模块（http://drupal.org/project/filemanager）和 attachment 模块（http://drupal.org/project/attachment）。上传文件的另一选择是，使用 CCK 模块加上一个贡献的文件处理字段，比如 imagefield 或 filefield。更多 CCK 字段类型可参看 http://drupal.org/taxonomy/term/88。
图片和相册（Images and Image Galleries）
需要创建一个相册？图片（image）模块（http://drupal.org/project/image）是个不错的选择。它能够处理图片的缩放和创建相册。当使用 CCK 在节点内部展示图片时，此时也有多个很好的解决方案。Imagecache（http://drupal.org/project /imagecache）能够处理创建图片分支（上传文件修改后的副本，比如一个缩略图（thumbnails）），而imagefield（http: //drupal.org/project/imagefield）将在节点表单内部创建一个图片上传字段。
视频和音频（Video and Audio）
视频模块（http://drupal.org/project/video）用来处理在节点内部上传和嵌入视频。音频模块（http: //drupal.org/project/audio）用来处理上传音频，而且还可以使用一个嵌入的 Flash 播放器来播放音频。它也可以为 podcasting 生成 RSS 种子。
文件 API
文件 API 还很年轻并有待修改，而且由于使用第三方模块可以完成大事多数文件处理功能，因此我们在这里就不详细讨论了，有兴趣的读者可以直接阅读 API 文档来学习它，文档的位于 http://api.drupal.org/api/5/group/file。
数据库 Schema
尽管 Drupal 将文件存放在硬盘上，但它还是使用数据库存储了文件必要的元数据。除了上传者、MIME 类型、位置，它还维护了上传文件的修订信息。下面是两个表的 [...]]]></description>
		<wfw:commentRss>http://www.paopaoniu.com/html/drupal-zhuan-ye-kai-fa-zhi-nan-40-di-13-zhang-drupal-wen-jian-file-2-1790.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Drupal专业开发指南-(39)第13章 Drupal 文件（file）（1）</title>
		<link>http://www.paopaoniu.com/html/drupal-zhuan-ye-kai-fa-zhi-nan-39-di-13-zhang-drupal-wen-jian-file-1-1786.html</link>
		<comments>http://www.paopaoniu.com/html/drupal-zhuan-ye-kai-fa-zhi-nan-39-di-13-zhang-drupal-wen-jian-file-1-1786.html#comments</comments>
		<pubDate>Mon, 29 Sep 2008 20:11:39 +0000</pubDate>
		<dc:creator>popox</dc:creator>
				<category><![CDATA[Drupal]]></category>
		<category><![CDATA[专业]]></category>
		<category><![CDATA[开发指南]]></category>
		<category><![CDATA[文件]]></category>
		<category><![CDATA[服务器]]></category>
		<category><![CDATA[权限]]></category>
		<category><![CDATA[模式]]></category>

		<guid isPermaLink="false">http://www.paopaoniu.com/?p=1786</guid>
		<description><![CDATA[Drupal 文件
Drupal 有多种方式可用来上传和下载文件。在本章中，你将学到公共和私有文件以及如何提供它们的，简单的介绍了多媒体文件的处理，看了一下 Drupal 的文件授权钩子函数。
Drupal 如何提供文件的
Drupal 提供了两种毫无联系的模式来管理文件下载的安全性：公共模式和私有模式。在私有模式下，当请求一个下载文件时将会检查用户的权限，如果用户不具有合适的权限的话，将会拒绝下载。在公共模式下，任何可以访问文件的 URL 的用户都可以下载文件。该设置将应用于整个站点而不是一个模块或者一个文件，所以一般在站点初始安装时做出选择，是使用私有模式提供文件还是使用公共模式，这一设置将会影响到所有使用了文件 API 的模块。
警告：由于公共和私有文件存储方法为下载文件生成不同的 URL，那么你需要在你上传文件以前先为你的站点做出最好的选择，在接下来要一直使用你选择的方法，这一点很重要。
为了设置文件系统路径并声明使用那种下载方法，导航到 Administer &#62; Site configuration &#62; File system。
如图13-1所示，如果你声明的目录不存在或者如果 PHP 对该目录没有写权限的话，Drupal 将会给你警告。

图13-1，在 Drupal 中用来声明文件相关设置的页面。在这里，Drupal 给出警告，所声明的文件系统路径不存在；为文件系统路径声明的目录必须存在并具有合适的权限。
公共文件
最直接的配置方式使用公共文件下载方法，此时 Drupal 不参与文件下载过程。再上传文件时，Drupal 简单的将它们保存到在 Administer &#62; Site configuration &#62; File system 声明的目录中，并在数据库中保存文件的 URL（这样 Drupal 知道哪些文件可用，谁上传的等等）。当请求一个文件时，文件将作为一个静态文件通过 THTTP 被 Web 服务器直接传递给用户，这一过程与 Drupal 一点关系都没有。这种方式的特点是非常的快，因为不需要执行 PHP 代码，而且不用检查 Drupal 用户的权限。
当声明文件系统路径时，文件夹必须存在并且允许 PHP 对其写入数据。一般情况下运行 Web 服务器的用户（在操作系统上）也是运行 PHP 的用户。因此，授予该用户对文件夹的写权限，将允许 [...]]]></description>
		<wfw:commentRss>http://www.paopaoniu.com/html/drupal-zhuan-ye-kai-fa-zhi-nan-39-di-13-zhang-drupal-wen-jian-file-1-1786.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Drupal专业开发指南-(36)第12章 搜索和索引内容 (1)</title>
		<link>http://www.paopaoniu.com/html/drupal-zhuan-ye-kai-fa-zhi-nan-36-di-12-zhang-sou-suo-he-suo-yin-nei-rong-1-1746.html</link>
		<comments>http://www.paopaoniu.com/html/drupal-zhuan-ye-kai-fa-zhi-nan-36-di-12-zhang-sou-suo-he-suo-yin-nei-rong-1-1746.html#comments</comments>
		<pubDate>Mon, 29 Sep 2008 20:06:16 +0000</pubDate>
		<dc:creator>popox</dc:creator>
				<category><![CDATA[Drupal]]></category>
		<category><![CDATA[专业]]></category>
		<category><![CDATA[开发指南]]></category>
		<category><![CDATA[搜索]]></category>
		<category><![CDATA[系统]]></category>
		<category><![CDATA[索引]]></category>
		<category><![CDATA[节点]]></category>
		<category><![CDATA[表单]]></category>

		<guid isPermaLink="false">http://www.paopaoniu.com/?p=1746</guid>
		<description><![CDATA[搜索和索引内容
MySQL 和 PostgreSQL 都有内置的全文搜索能力。你可以很容易的使用这些数据库特定解决方案来建立一个搜索引擎，但你失去了对搜索机制的控制，同时也不能让你的搜索系统与你的应用完全匹配。而且有时候数据库认为优先级比较高的词语，而实际上在你的应用中则被认为是&#8221;噪音&#8221;。
由于数据库全文搜索不能很好的满足应用需求，Drupal 社区建立一个定制的搜索引擎，来实现针对 Drupal 的索引和页面等级算法。结果就建立了与 Drupal 其他框架部分相一致的搜索引擎，它具有标准的配置和用户接口 &#8211; 不用担心底层使用了什么数据库。
在本章我们讨论了如何使用模块编写搜索 API 的钩子函数和构建定制的搜索表单。我们还将学习一下 Drupal 是如何解析和索引内容的，还有就是如何编写索引器的钩子函数。
提示：Drupal 能够理解复杂的查询语句，比如包含布尔操作 and/or，精确短语，或者甚至可以排除每个词语。这些情况的一个实际例子如下所示：
Beatles OR John Lennon &#8220;Penny Lane&#8221; -insect
构建一个定制的搜索页面
Drupal 可对节点和用户名进行搜索。即使你开发了一个你自己定制的节点类型，Drupal 也可以对其节点视图中显示的内容进行索引。例如，假定你有一个 recipe（处方）节点类型，它包含两个字段 ingredients（药物成分）和 instructions（用法说明）；你创建一个新的处方节点，其节点 ID 为22。当有匿名用户访问 http://example.com/?q=node/22 时就可以看到这些节点字段，搜索模块将在它下次访 http://example.com/cron.php 时（一般通过一个 cron 周期性运行它），将会对处方节点的内容和其它元数据进行索引。
Drupal 默认提供了节点搜索和用户搜索。开始你可能会觉得节点搜索和用户搜索的底层机制是一样的，事实上它们使用了两种独立的方式来实现搜索功能。对于节点搜索，每次所搜都没有直接对 node 表进行查询，它首先使用一个索引器把内容预处理为一种结构化的格式，在节点搜索时，将会对结构化的索引数据进行查询，这样就会产生更快更准确的结果。我们在下面的部分将会详细的介绍索引器。
用户搜索一点也不复杂，这是因为用户名只是数据库中的一个单独字段，搜索语句只需要对该字段进行检查就可以了。而且，用户名中不允许包含 HTML，所以你不需要使用 HTML 索引器。相反，你只需要几行代码直接对 user 表进行查询就可以了。
让我们看一个例子。假定我们的站点使用了 path.module，我们需要对数千个 URL 别名进行管理，这使得现有的 URL 别名管理页面显得非常笨拙。我们将编写一个搜索接口来快速的寻找我们想找的东西。幸运的是你可以使用搜索 API 提供的默认搜索表单（如图12-1所示）。如果这个接口能够满足你的需求，那么你只需要编写为搜索请求查找采集数（hits）的逻辑就可以了。这一搜索逻辑一般是一个数据库查询语句。

图12-1 搜索 API 的搜索默认用户接口
它看起来很简单，默认内容搜索表单事实上很强大，它可以对你站点上的节点内容的所有可视的元素进行查询，这是由于索引器的缘故。也就是说，通过该接口，可以对节点的标题、主体、其它定制属性、评论、分类词语进行查询。高级搜索特性，如图12-2所示，是过滤搜索结果的另一种方式。
很有可能你想扩展默认搜索表单以添加额外的搜索字段，你已在第10章学到了如何去扩展。明确的，你可以使用 hook_form_alter() [...]]]></description>
		<wfw:commentRss>http://www.paopaoniu.com/html/drupal-zhuan-ye-kai-fa-zhi-nan-36-di-12-zhang-sou-suo-he-suo-yin-nei-rong-1-1746.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Drupal专业开发指南(35)第11章 Drupal 过滤器系统（filter）（2）创建一个定制的过滤器</title>
		<link>http://www.paopaoniu.com/html/drupal-zhuan-ye-kai-fa-zhi-nan-35-di-11-zhang-drupal-guo-lv-qi-xi-tong-filter-2-chuang-jian-yi-ge-ding-zhi-de-guo-lv-qi-1744.html</link>
		<comments>http://www.paopaoniu.com/html/drupal-zhuan-ye-kai-fa-zhi-nan-35-di-11-zhang-drupal-guo-lv-qi-xi-tong-filter-2-chuang-jian-yi-ge-ding-zhi-de-guo-lv-qi-1744.html#comments</comments>
		<pubDate>Mon, 29 Sep 2008 20:05:41 +0000</pubDate>
		<dc:creator>popox</dc:creator>
				<category><![CDATA[Drupal]]></category>
		<category><![CDATA[filter]]></category>
		<category><![CDATA[专业]]></category>
		<category><![CDATA[开发指南]]></category>
		<category><![CDATA[系统]]></category>
		<category><![CDATA[过滤器]]></category>

		<guid isPermaLink="false">http://www.paopaoniu.com/?p=1744</guid>
		<description><![CDATA[创建一个定制的过滤器
当然，Drupal 过滤器可以添加超链接，格式化你的内容，将文本转化为空中的 pirate-speak，但是它能够聪明的帮我们写日志么，或者至少能够帮我们把我们创造性的火花碰撞出来么？当然，它也可以做到这一点！让我们创建一个带有过滤器的模块，用来向日志中插入随机的句子。我们将启用这一模块，这样当你在编写文章毫无灵感需要一些火花时，你可以简单的键入[juice!]，当你保存文章时，它将会被替换为一个随机生成的句子。如果你需要更多的智慧火花时，你可以在一个页面中多次插入[juice!]标签。
在 sites/all/modules/custom/ 下面创建一个名为 creativejuice 的文件夹。首先，向 creativejuice 文件夹下面添加 creativejuice.info 文件：
; $Id$
name = Creative Juice
description = Adds a random sentence filter to content.
version = $Name$
接着，创建 creativejuice.module 文件并也将其添加到 creativejuice 文件夹下：
&#60;?php
// $Id$
/**
* @file
* A silly module to assist whizbang novelists who are in a rut by providing a
* random sentence generator for their posts.
*/
hook_filter()
现在我们已经为创建模块做好了铺垫，让我们在 creativejuice.module 中添加 hook_filter() [...]]]></description>
		<wfw:commentRss>http://www.paopaoniu.com/html/drupal-zhuan-ye-kai-fa-zhi-nan-35-di-11-zhang-drupal-guo-lv-qi-xi-tong-filter-2-chuang-jian-yi-ge-ding-zhi-de-guo-lv-qi-1744.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Drupal专业开发指南(29)第10章 Drupal 表单 API（form API）- 创建基本的表单(2)</title>
		<link>http://www.paopaoniu.com/html/drupal-zhuan-ye-kai-fa-zhi-nan-29-di-10-zhang-drupal-biao-dan-api-form-api-chuang-jian-ji-ben-de-biao-dan-2-1697.html</link>
		<comments>http://www.paopaoniu.com/html/drupal-zhuan-ye-kai-fa-zhi-nan-29-di-10-zhang-drupal-biao-dan-api-form-api-chuang-jian-ji-ben-de-biao-dan-2-1697.html#comments</comments>
		<pubDate>Mon, 29 Sep 2008 20:00:36 +0000</pubDate>
		<dc:creator>popox</dc:creator>
				<category><![CDATA[Drupal]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[专业]]></category>
		<category><![CDATA[基本]]></category>
		<category><![CDATA[开发指南]]></category>
		<category><![CDATA[表单]]></category>

		<guid isPermaLink="false">http://www.paopaoniu.com/?p=1697</guid>
		<description><![CDATA[主题化表单
Drupal 拥有内置的函数，用以处理你定义的表单数据结构，并将其翻译或者说是呈现成 HTML 代码。然后，许多时候你可能需要修改 Drupal 生成的输出，或者你可能想其安全的控制整个流程。幸运的是，Drupal 很容易做到这一点。
使用 #prefix、#suffix 和 #markup
如果你的主体化需求非常简单，那么你就可以使用属性 #prefix 和 #suffix 来为表单元素前面和/或后面添加 HTML 代码，从而满足需求：
$form['color'] = array(
‘#prefix&#8217; =&#62; &#8220;,
‘#title&#8217; =&#62; t(&#8217;Color&#8217;),
‘#type&#8217; =&#62; ‘fieldset&#8217;,
‘#suffix&#8217; =&#62; &#8221; .
t(&#8217;This information will be displayed publicly!&#8217;) . &#8220;;
);
该代码在颜色（color）字段集上方添加了一条水平线，在其下方添加了一条私有消息。你甚至可以在你的表单中使用类型 #markup 来声明标示字体。任何一个没有属性 #type 的表单元素默认为类型 #markup。
$form['blinky'] = array(
‘#type&#8217; = ‘markup&#8217;,
‘#value&#8217; = ‘Hello!&#8217;
);
注意： 本方法向你的表单中引入了 HTML 标示字体，一般认为该方法与使用 标签效果差不多好。但是与编写一个主题函数相比，它不够干净利落，同时也增加了你网站设计人员的工作量。
使用主题函数
主题化表单的最灵活的方式是为表单或者表单元素单独构建一个主题函数。Drupal 默认的主题函数名称为&#8221;theme_&#8221;加上你的表单 ID 的名称。在我们的例子中，使用了 theme_formexample_nameform()。下面的主题函数将被调用并生成完全一样的输出
function theme_formexample_nameform($form) {
$output [...]]]></description>
		<wfw:commentRss>http://www.paopaoniu.com/html/drupal-zhuan-ye-kai-fa-zhi-nan-29-di-10-zhang-drupal-biao-dan-api-form-api-chuang-jian-ji-ben-de-biao-dan-2-1697.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Drupal专业开发指南(28)第10章 Drupal 表单 API（form API）- 创建基本的表单</title>
		<link>http://www.paopaoniu.com/html/drupal-zhuan-ye-kai-fa-zhi-nan-28-di-10-zhang-drupal-biao-dan-api-form-api-chuang-jian-ji-ben-de-biao-dan-1689.html</link>
		<comments>http://www.paopaoniu.com/html/drupal-zhuan-ye-kai-fa-zhi-nan-28-di-10-zhang-drupal-biao-dan-api-form-api-chuang-jian-ji-ben-de-biao-dan-1689.html#comments</comments>
		<pubDate>Mon, 29 Sep 2008 20:00:18 +0000</pubDate>
		<dc:creator>popox</dc:creator>
				<category><![CDATA[Drupal]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[专业]]></category>
		<category><![CDATA[基本]]></category>
		<category><![CDATA[开发指南]]></category>
		<category><![CDATA[表单]]></category>

		<guid isPermaLink="false">http://www.paopaoniu.com/?p=1689</guid>
		<description><![CDATA[创建基本的表单
如果你拥有直接通过 HTML 创建自己表单的经验，那么，刚开始，你可能会觉得 Drupal 的方式让人感到困惑。本节通过例子使你能够快速的创建自己的表单。在开始，我们将创建一个简单的模块，用来让你输入自己的名字并将其打印出来。我们把它放在一个独立的模块里面，这样我们就不需要修改任何已存在的代码了。我们的表单仅包含两个元素：文本输入框和提交按钮。我们首先在 简历一个 .info 文件，输入以下内容：
; $Id$
name = Form example
description = Shows how to build a Drupal form.
version = &#8220;$Name$&#8221;
接下来，我们把真实的模块放在 sites/all/modules/custom/formexample/formexample.module:
&#60;?php
// $Id$
/**
* Implementation of hook_menu().
*/
function formexample_menu($may_cache) {
$items = array();
if ($may_cache) {
$items[] = array(
‘path&#8217; =&#62; ‘formexample&#8217;,
‘title&#8217; =&#62; t(&#8217;View the form&#8217;),
‘callback&#8217; =&#62; ‘formexample_page&#8217;,
‘access&#8217; =&#62; TRUE
);
}
return $items;
}
/**
* Called when user goes to example.com/?q=formexample
*/
function formexample_page() {
$output = [...]]]></description>
		<wfw:commentRss>http://www.paopaoniu.com/html/drupal-zhuan-ye-kai-fa-zhi-nan-28-di-10-zhang-drupal-biao-dan-api-form-api-chuang-jian-ji-ben-de-biao-dan-1689.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
