<?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/%e5%87%bd%e6%95%b0/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专业开发指南(63)&#8211;第23章 Drupal 安装过程 profile</title>
		<link>http://www.paopaoniu.com/html/drupal-zhuan-ye-kai-fa-zhi-nan-63-di-23-zhang-drupal-an-zhuang-guo-cheng-profile-1431.html</link>
		<comments>http://www.paopaoniu.com/html/drupal-zhuan-ye-kai-fa-zhi-nan-63-di-23-zhang-drupal-an-zhuang-guo-cheng-profile-1431.html#comments</comments>
		<pubDate>Mon, 29 Sep 2008 20:36:57 +0000</pubDate>
		<dc:creator>popox</dc:creator>
				<category><![CDATA[Drupal]]></category>
		<category><![CDATA[profile]]></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=1431</guid>
		<description><![CDATA[当你安装 Drupal 时，一些模块被启用，一些特定的配置被选择，但是这些默认的可能并不是你所需要的。Drupal 安装器使用了一个默认的安装过程 profile，用来决定所有的这些配置。通过创建你自己的安装过程 profile，你可以定制 Drupal 的初始安装，从而使你的站点带有你想要的模块和设置。可能你在为每一个高校工作，你想创建一个安装过程 profile，从而能够启用一个与你高校的单点登录系统相绑定的定制模块，能够为站点管理员创建一个新的角色，能够在安装完成时向你发送 e-mail。Drupal 的安装器系统，允许你通过创建一个安装过程 profile 来定制安装时的各种操作。在本章你将学到如何做到这一点。
Profile 的存放位置
你的 Drupal 站点已经包含了一个安装过程 profile。它是 Drupal 自带的默认的安装过程 profile，位于 profiles/default/default.profile。我们想创建一个新的名为“university”（大学）的 profile，所以我们将先在 profiles/university/university.profile 创建一个新的文件。先在，我们将向这个文件仅添加一个独立的函数：
&#60;?php
// $Id$
/**
* Return a description of the profile for the initial installation screen.
*
* @return
* An array with keys ‘name’ and ‘description’ describing this profile.
*/
function university_profile_details() {
return array(
‘name’ =&#62; st(’Drupal (Customized for Iowa [...]]]></description>
		<wfw:commentRss>http://www.paopaoniu.com/html/drupal-zhuan-ye-kai-fa-zhi-nan-63-di-23-zhang-drupal-an-zhuang-guo-cheng-profile-1431.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Drupal专业开发指南(58)&#8211;第21章 Drupal 开发最佳实践(1)</title>
		<link>http://www.paopaoniu.com/html/drupal-zhuan-ye-kai-fa-zhi-nan-58-di-21-zhang-drupal-kai-fa-zui-jia-shi-jian-1-1411.html</link>
		<comments>http://www.paopaoniu.com/html/drupal-zhuan-ye-kai-fa-zhi-nan-58-di-21-zhang-drupal-kai-fa-zui-jia-shi-jian-1-1411.html#comments</comments>
		<pubDate>Mon, 29 Sep 2008 20:32:21 +0000</pubDate>
		<dc:creator>popox</dc:creator>
				<category><![CDATA[Drupal]]></category>
		<category><![CDATA[description]]></category>
		<category><![CDATA[module]]></category>
		<category><![CDATA[代码]]></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=1411</guid>
		<description><![CDATA[在本章，你将找到所有的代码小提示和最佳实践，这将使你从 Drupal 开发者中脱颖而出，并帮你摆脱电脑的折磨。
代码规范
Drupal 社区已经达成一致，它的代码基础必须拥有一个标准的外观，从而提高可读性，也使得初学者更容易的学习。社区也鼓励第3方模块的开发者采用这些标准。
行缩进
Drupal 代码缩进使用两个空格，而不是 tab 键。对于大多说编辑器，你都可以设置一个偏好，从而自动的使用 tab 键代替空格，这样你就可以继续使用 Tab 键了 &#8211; 如果你习惯使用 tab 键的话。
控制结构
控制结构体是程序中用来控制执行流程的指令，比如条件语句和循环语句。条件语句有 if、else、elseif 和 switch 语句。循环语句有 while、do-while、for 和 foreach。
控制结构体在控制关键字（if、elseif、while、for 等等）和开括号&#8221;（&#8221;之间应有一个空格，从而将其与函数调用（也使用圆括号）区分开来。&#8221;{&#8221;应该与关键字位于同一行（而不是自成一行）。
&#8220;}&#8221;应该自成一行。
不正确的：
if ($a &#38;&#38; $b)
{
sink();
}
正确的：
if ($a &#38;&#38; $b) {
sink();
}
elseif ($a &#124;&#124; $b) {
swim();
}
else {
fly();
}
花括号&#8221;{}&#8221;一般总是使用的，即便是它们不是必须的时候，为了增强可读性可减少出错的机会。
不正确的：
while ($a &#60; 10)
$a++;
正确的：
while ($a &#60; 10) {
$a++;
}
Switch 语句的格式应该这样：
switch ($a) {
case 1:
red();
break;
case 2:
blue();
break;
default:
green();
}
函数调用
在操作符（=、 &#60;、&#62; 等等）的两边应该各有一个空格，在函数名和函数的开括号&#8221;(&#8221;之间没有空格。在函数的开括号&#8221;(&#8221;和它的第一个参数之间也没有空格。中间的函数参数使用逗 号&#8221;,&#8221;和空格&#8221; &#8220;分隔的，最后一个参数和闭括号&#8221;)&#8221;之间没有空格。下面的例子说明了这些要点。
不正确的：
$var=foo ($bar,$baz);
正确的：
$var = foo($bar, $baz);
该规则也存在例外的情况。在一个代码区块中，存在多个相关的赋值语句时，如果能够提高可读性的话，是可以赋值操作符周围插入更多空格的：
$a_value [...]]]></description>
		<wfw:commentRss>http://www.paopaoniu.com/html/drupal-zhuan-ye-kai-fa-zhi-nan-58-di-21-zhang-drupal-kai-fa-zui-jia-shi-jian-1-1411.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Drupal专业开发指南(52)&#8211;第18章 Drupal 的本地化及中文化（1）</title>
		<link>http://www.paopaoniu.com/html/drupal-zhuan-ye-kai-fa-zhi-nan-52-di-18-zhang-drupal-de-ben-di-hua-ji-zhong-wen-hua-1-1389.html</link>
		<comments>http://www.paopaoniu.com/html/drupal-zhuan-ye-kai-fa-zhi-nan-52-di-18-zhang-drupal-de-ben-di-hua-ji-zhong-wen-hua-1-1389.html#comments</comments>
		<pubDate>Mon, 29 Sep 2008 20:26:38 +0000</pubDate>
		<dc:creator>popox</dc:creator>
				<category><![CDATA[Drupal]]></category>
		<category><![CDATA[uploads]]></category>
		<category><![CDATA[中文化]]></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=1389</guid>
		<description><![CDATA[Drupal 的开发和使用，都是通过一个国际化的社区完成的。因此，Drupal 默认支持本地化。本地化是将用户接口的文本替换为用户本地的翻译过的文本。在本章，我们将看一下如何启用本地化，以及如何有选择的将 Drupal 的内置的字符串替换为我们自己的。然后，我们看一个完全的翻译，并学习如何创建、导入和导出它们。
启用本地模块（Locale Module）
当你初次安装 Drupal 时，大多数模块（甚至包括核心模块比如说本地化模块）默认是禁用的。这与 Drupal 的哲学，仅当需要的时候才启用相应的功能，相一致。你可以在 Administer &#62; Site building &#62; Modules 下面启用本地化模块。本章的例子都假定本地化模块已启用。
使用 t() 函数来翻译字符串
在 Drupal 中所有的字符串都应该使用 t() 函数封装；它是 Drupal 的翻译函数，由于经常使用，为了方便，所以将其函数简写为“t”。t() 函数看起来如下所示：
function t($string, $args = 0) {
global $locale;
if (function_exists(’locale’) &#38;&#38; $locale != ‘en’) {
// Translate the string.
$string = locale($string);
}
if (!$args) {
return $string;
}
…
}
除翻译以外，t() 函数对字符串中的占位符中的插入值也进行了处理。这些值一般为用户提供的输入，在展示它们以前，必须对它们进行文本转换。
t(’Hello, my name is %name.’, array(’%name’ =&#62; ‘John’);
Hello, my [...]]]></description>
		<wfw:commentRss>http://www.paopaoniu.com/html/drupal-zhuan-ye-kai-fa-zhi-nan-52-di-18-zhang-drupal-de-ben-di-hua-ji-zhong-wen-hua-1-1389.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Drupal专业开发指南(51)&#8211;第17章 在 Drupal 中使用 jQuery（3）编写一个使用 jQuery 的 Drupal 模块</title>
		<link>http://www.paopaoniu.com/html/drupal-zhuan-ye-kai-fa-zhi-nan-51-di-17-zhang-zai-drupal-zhong-shi-yong-jquery-3-bian-xie-yi-ge-shi-yong-jquery-de-drupal-mo-kuai-1385.html</link>
		<comments>http://www.paopaoniu.com/html/drupal-zhuan-ye-kai-fa-zhi-nan-51-di-17-zhang-zai-drupal-zhong-shi-yong-jquery-3-bian-xie-yi-ge-shi-yong-jquery-de-drupal-mo-kuai-1385.html#comments</comments>
		<pubDate>Mon, 29 Sep 2008 20:25:50 +0000</pubDate>
		<dc:creator>popox</dc:creator>
				<category><![CDATA[Drupal]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[plus]]></category>
		<category><![CDATA[vote]]></category>
		<category><![CDATA[widget]]></category>
		<category><![CDATA[函数]]></category>
		<category><![CDATA[开发指南]]></category>
		<category><![CDATA[投票]]></category>

		<guid isPermaLink="false">http://www.paopaoniu.com/?p=1385</guid>
		<description><![CDATA[让我们编写一个基于 jQuery 的 Drupal 模块。我们将建立一个如图17-2所示的 Ajax 的投票小组件，它可以让用户为喜欢的文章添加一分。我们使用 jQuery 来处理投票和总分的改变，而不用重新加载整个页面。我们还添加一个基于角色的授权，这样只有具有&#8221;rate 内容&#8221;授权的用户才允许投票。由于每个用户的每次投票只能增加一份，让我们将模块的名称命名为&#8221;plus1&#8243;。

图17-2 投票组件
在我们接触到 plus1 的 jQuery 部分以前，首先我们需要构建模块所需的基本一些代码。如果你以前从来没有创建过模块，请参看第2章。如果有经验的话，现在就开始了。
在 sites/all/modules/custom 下面创建一个名为 plus1 的目录（你可能需要创建这个目录如果它不存在的话）。在目录 plus1 下面，创建文件 plus1.info，它包含下面的代码：
name = Plus 1
description = &#8220;A +1 voting widget for nodes. &#8221;
version = &#8220;$Name$&#8221;
该文件将模块注册到 Drupal 中，这样可以通过管理页面启用或者禁用它。
接着，你将创建 plus1.install 文件。这个 PHP 文件里面的函数将在模块启用或者禁用的时候调用，一般用来创建或者删除数据库表。在这里我们想用它来追踪谁为哪个节点投了票。
&#60;?php
// $Id$
/**
* Implementation of hook_install().
*/
function plus1_install() {
switch ($GLOBALS['db_type']) {
case ‘mysql&#8217;:
case ‘mysqli&#8217;:
db_query(&#8221;CREATE TABLE {plus1_vote} (
uid int [...]]]></description>
		<wfw:commentRss>http://www.paopaoniu.com/html/drupal-zhuan-ye-kai-fa-zhi-nan-51-di-17-zhang-zai-drupal-zhong-shi-yong-jquery-3-bian-xie-yi-ge-shi-yong-jquery-de-drupal-mo-kuai-1385.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Drupal专业开发指南(47)&#8211;第16章 Drupal 会话（session）（1）</title>
		<link>http://www.paopaoniu.com/html/drupal-zhuan-ye-kai-fa-zhi-nan-47-di-16-zhang-drupal-hui-hua-session-1-1365.html</link>
		<comments>http://www.paopaoniu.com/html/drupal-zhuan-ye-kai-fa-zhi-nan-47-di-16-zhang-drupal-hui-hua-session-1-1365.html#comments</comments>
		<pubDate>Mon, 29 Sep 2008 20:22:25 +0000</pubDate>
		<dc:creator>popox</dc:creator>
				<category><![CDATA[Drupal]]></category>
		<category><![CDATA[cookie]]></category>
		<category><![CDATA[session]]></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=1365</guid>
		<description><![CDATA[会话（session）
HTTP 是一个无状态协议，这意味着浏览器和服务器之间的每次交互都是相互独立的。那么你如何追踪一个用户（他或她）对一个网站的页面的一系列的访问呢？使用会话（session）。
从 PHP4 开始，通过一组会话函数，PHP 提供了对会话的内置支持。在本章，你将看到 Drupal 是如何使用 PHP 的会话的。
什么是会话？
当一个浏览器第一次请求一个 Drupal 站点的页面时，PHP 会向浏览器发送一个 cookie，它包含了一个随机生成的长为32位的字符串 ID，默认称之为 PHPSESSID。在浏览器第一次访问一个站点时，返回的 HTTP 头部信息中的一行包含了 PHPSESSID，如下所示：
HTTP/1.1 200 OK
Date: Wed, 17 Jan 2007 20:24:58 GMT
Server: Apache/1.3.33 (Darwin) PHP/5.1.6
Set-Cookie: PHPSESSID=3sulj1mainvme55r8udcc6j2a4; expires=Fri, 09 Feb 2007 23:58:19
GMT; path=/
Last-Modified: Wed, 17 Jan 2007 20:24:59 GMT
Cache-Control: no-store, no-cache, must-revalidate
Cache-Control: post-check=0, pre-check=0
Transfer-Encoding: chunked
Content-Type: text/html; charset=utf-8
在接下来的访问中，浏览器将 cookie 放到每个 HTTP 请求中，以向服务器出示 cookie。
GET [...]]]></description>
		<wfw:commentRss>http://www.paopaoniu.com/html/drupal-zhuan-ye-kai-fa-zhi-nan-47-di-16-zhang-drupal-hui-hua-session-1-1365.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Drupal专业开发指南(46)&#8211;第15章 Drupal 缓存（cache）（3）缓存 API</title>
		<link>http://www.paopaoniu.com/html/drupal-zhuan-ye-kai-fa-zhi-nan-46-di-15-zhang-drupal-huan-cun-cache-3-huan-cun-api-1363.html</link>
		<comments>http://www.paopaoniu.com/html/drupal-zhuan-ye-kai-fa-zhi-nan-46-di-15-zhang-drupal-huan-cun-cache-3-huan-cun-api-1363.html#comments</comments>
		<pubDate>Mon, 29 Sep 2008 20:21:16 +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>

		<guid isPermaLink="false">http://www.paopaoniu.com/?p=1363</guid>
		<description><![CDATA[使用缓存 API
对于模块开发者来说，如果他想使用缓存 API 的话，那么就需要掌握两个函数：cache_set() 和 cache_get()。
使用 cache_set() 缓存数据
cache_set() 用来将数据写入到缓存中。函数签名如下：
cache_set($cid, $table = ‘cache’, $data, $expire = CACHE_PERMANENT, $headers = NULL)
函数参数有：
$cid：唯一的缓存 ID，为一字符串，作为缓存数据的键。
$table：用来存储数据的表的名称。你可以创建你自己的表，或者使用 cache、cache_filter、cache_menu、cache_page。默认使用 cache 表。
$data：存储在缓存中的数据。记住复杂 PHP 数据类型必须先序列化。
$expire：缓存数据的有效期时间长度。可能值有 CACHE_PERMANENT、CACHE_TEMPORARY 或者一个 Unix 时间戳。
$headers：对于缓存页面，传给浏览器的 HTTP 头部字符串。
一个 cache_set() 的通用迭代模式可在 filter.module 找到。
// Store in cache with a minimum expiration time of 1 day.
if ($cache) {
cache_set($cid, ‘cache_filter’, $text, time() + (60 * 60 [...]]]></description>
		<wfw:commentRss>http://www.paopaoniu.com/html/drupal-zhuan-ye-kai-fa-zhi-nan-46-di-15-zhang-drupal-huan-cun-cache-3-huan-cun-api-1363.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Drupal专业开发指南(16)&#8211;第7章Drupal 节点（Drupal node）（2）</title>
		<link>http://www.paopaoniu.com/html/drupal-zhuan-ye-kai-fa-zhi-nan-16-di-7-zhang-drupal-jie-dian-drupal-node-2-1436.html</link>
		<comments>http://www.paopaoniu.com/html/drupal-zhuan-ye-kai-fa-zhi-nan-16-di-7-zhang-drupal-jie-dian-drupal-node-2-1436.html#comments</comments>
		<pubDate>Tue, 26 Aug 2008 05:32:42 +0000</pubDate>
		<dc:creator>popox</dc:creator>
				<category><![CDATA[Drupal]]></category>
		<category><![CDATA[编程开发]]></category>
		<category><![CDATA[Drupal node]]></category>
		<category><![CDATA[Drupal 节点]]></category>
		<category><![CDATA[Drupal专业开发指南]]></category>
		<category><![CDATA[hook]]></category>
		<category><![CDATA[punchline]]></category>
		<category><![CDATA[函数]]></category>
		<category><![CDATA[字段]]></category>
		<category><![CDATA[类型]]></category>
		<category><![CDATA[钩子]]></category>

		<guid isPermaLink="false">http://www.paopaoniu.com/?p=1436</guid>
		<description><![CDATA[第7章 Drupal 节点（Drupal node）（2）
注意：在前面列表中提到的内部名称字段，是用来构造&#8221;创建内容(create content)&#8221;链接的 URL 的。例如，我们使用&#8221;joke&#8221;作为我们节点类型的内部名称（它是我们返回的数组的键），那么要创建一个新的笑话的话，用户要访问页面 http://example.com/?q=node/add/joke。通常你不需要对此作出修改。内部名称存储在表 node 和 node_revisions 的&#8221;type&#8221;列中。
定义一个菜单回调函数
现在你已经定义了基本的节点属性，让我们为路径 node/add/joke 创建一个菜单回调函数，这样你就可以创建一个笑话表单并定义一些权限了。
/**
* Implementation of hook_menu().
*/
function joke_menu($may_cache) {
$items = array();
// Do not cache this menu item during the development of this module.
if (!$may_cache) {
$items[] = array(
‘path&#8217; =&#62; ‘node/add/joke&#8217;,
‘title&#8217; =&#62; t(&#8217;Joke&#8217;),
‘access&#8217; =&#62; user_access(&#8217;create joke&#8217;),
);
}
return $items;
}
由于菜单系统的层次性，在这里&#8221;callback&#8221;参数是可选的。你可以不对其进行设置，替代的你使用父路径 node/add 的回调函数，可以在 node.module 中的菜单钩子中找到该路径。在那里，它映射到了构建节点表单的函数 node_add() 上。通过使用已经定义好的回调函数，由于已经将它映射到了核心的节点验证和提交程序上了，所以你可以节省大量的工作。换句话说就是，现在你只需要关注于你自己定制的数据就可以了（在这里，你的模块将需要处理笑话妙语（punchline）字段），而其他的用户提交的数据比如标题和主体都不用你操心。这是由于 node.module 将会负责标题和主体以及其它一些核心节点属性的创建、验证、处理等操作。
使用 hook_perm() 定义特定于节点类型的权限
在你的菜单项目中你也添加了对&#8221;create [...]]]></description>
		<wfw:commentRss>http://www.paopaoniu.com/html/drupal-zhuan-ye-kai-fa-zhi-nan-16-di-7-zhang-drupal-jie-dian-drupal-node-2-1436.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
