<?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>nan.im &#187; Drupal</title>
	<atom:link href="http://nan.im/blog/tags/drupal/feed" rel="self" type="application/rss+xml" />
	<link>http://nan.im/blog</link>
	<description></description>
	<lastBuildDate>Sat, 28 Jan 2012 05:58:17 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>如何为 Drupal 添加简单的 SEO META 标签（title keywords description）</title>
		<link>http://nan.im/blog/1309</link>
		<comments>http://nan.im/blog/1309#comments</comments>
		<pubDate>Wed, 08 Sep 2010 09:22:07 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[网站前端]]></category>
		<category><![CDATA[Develop 开发]]></category>
		<category><![CDATA[Drupal]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Search Engine Optimization（SEO）搜索引擎优化]]></category>

		<guid isPermaLink="false">http://anyLiv.com/blog/?p=1309</guid>
		<description><![CDATA[Drupal 做为优秀的世界级开源 CMS 建站系统，自然有很多开发者贡献与 SEO 相关的模块插件扩展例如：用来批量自定义 URL 的PathAuto 模块和制作 SiteMap 站点地图的 xmlSiteMap 模块当然还有就是用于 keywords description 等等位于页面 HEAD 标签内一些 META 标记的 NodeWords 模块等等，但我个人通常对于 20 行以下代码能够实现的功能不大愿意使用第三方模块，所以这里提供一些 Drupal 原生代码以实现在网页的 HEAD 标签内添加一些对 SEO 有利的 META 标签甚至 TITLE 标签等等…… 示例将仅仅针对 NODE 文章节点页面做 SEO 优化演示，其他页面大家可以以此类推，具体需要将以下代码放置于当前使用主题模板的（node.tpl.php）文件中： if($page != 0){ //首先判断是否为节点单页而非文章列表页； $keys = $info= NULL; $info = substr(filter_xss($node->content['body']['#value'], array()), 0, 240); //过滤节点内容部分的特殊字符并截取前 240 [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://drupal.org/">Drupal</a> 做为优秀的世界级开源 CMS 建站系统，自然有很多开发者贡献与 SEO 相关的模块插件扩展例如：用来批量自定义 URL 的<a href="http://drupal.org/project/pathauto">PathAuto</a> 模块和制作 SiteMap 站点地图的 <a href="http://drupal.org/project/xmlsitemap">xmlSiteMap</a> 模块当然还有就是用于 keywords description 等等位于页面 HEAD 标签内一些 META 标记的 <a href="http://drupal.org/project/nodewords">NodeWords</a> 模块等等，但我个人通常对于 20 行以下代码能够实现的功能不大愿意使用第三方模块，所以这里提供一些 Drupal 原生代码以实现在网页的 HEAD 标签内添加一些对 SEO 有利的 META 标签甚至 TITLE 标签等等……<span id="more-1309"></span></p>
<p>示例将仅仅针对 NODE 文章节点页面做 SEO 优化演示，其他页面大家可以以此类推，具体需要将以下代码放置于当前使用主题模板的（node.tpl.php）文件中：</p>
<pre lang="php" line="1">
if($page != 0){
		//首先判断是否为节点单页而非文章列表页；

	$keys = $info= NULL;
	$info = substr(filter_xss($node->content['body']['#value'], array()), 0, 240);
		//过滤节点内容部分的特殊字符并截取前 240 个字符做为摘要部分；
	foreach($node->taxonomy as $term){ $keys .= $term->name; }
		//遍历节点的术语标签并存入数组备用；

	drupal_set_html_head('<meta name="keywords" content="'.$keys.'">');
	drupal_set_html_head('<meta name="description" content="'.$info.'">');
		//利用 Drupal 函数将 html 代码加入页面 head 标签；
}
</pre>
<p>示例中直接使用术语表 taxonomy 中的术语标签 term 做为网页的 keywords 页面关键字，然后使用节点 body 部分的前 240 个文本字符做为 description 页面摘要部分，当然你可以根据具体情况自行调整，如果你是 SEO 控的话大可以把节点的 log 字段好好利用起来做为摘要部分自行录入，也可以单独创建新的 CCK 专门用于 SEO 都是可以的，只是在拾取字段的时候调整代码即可。</p>
<blockquote><p>推荐阅读使用的几个函数：</p>
<p><a href="http://api.drupal.org/api/function/drupal_set_html_head/">drupal_set_html_head</a>：用于在当前页面的 HEAD 标签内添加 HTML 代码；</p>
<p><a href="http://api.drupal.org/api/function/drupal_set_title/">drupal_set_title</a>：用于修改当前页面的 title 标签；</p>
<p><a href="http://api.drupal.org/api/function/drupal_set_breadcrumb/">drupal_set_breadcrumb</a>：用于修改当前页面的面包屑数组；</p>
</blockquote>
<p>这里主要想说明的是 Drupal 的很多函数都是可以在主题模板和模块插件中共用的，而且诸如 drupal_set_html_head 等等函数不仅仅在模板的 page.tpl.php 中管用在其他有效的 tpl 文件中也都是可以使用的，记得我刚刚接触 Drupal 的时候一直苦恼与如何在节点模板区域控制整个页面的 title 标题和 breadcrumb 面包屑直到后来研习 Drupal 的模板渲染引擎机制才恍然大悟……</p>
]]></content:encoded>
			<wfw:commentRss>http://nan.im/blog/1309/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>【Drupal】移动手机版主题根据 iPhone Android 客户端自动切换模板</title>
		<link>http://nan.im/blog/1195</link>
		<comments>http://nan.im/blog/1195#comments</comments>
		<pubDate>Sat, 24 Jul 2010 18:26:05 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[网站前端]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[Drupal]]></category>
		<category><![CDATA[iOS iPhone iTouch iPad]]></category>
		<category><![CDATA[Mobile Phone 移动电话]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Theme Template 主题模板]]></category>

		<guid isPermaLink="false">http://anyliv.com/blog/?p=1195</guid>
		<description><![CDATA[越来越多的网站开始注重“移动互联网”的价值提供手机移动版的网页界面，当然使用 drupal 构建的站点也可以通过根据 iPhone 或者 Android 设备类型来切换主题模板的方法来实现手机移动版站点，只需要为 drupal 单独制作一套或几套适合手机等移动设备浏览的主题模板即可，不建议在同一套主题模板里面或者模块里面大量使用判断语句来分别对应设备输出，当然也不建议使用 PHP 或 API 从底层新建一个独立的站点那样会相当的得不偿失，就失去了我们使用 drupal 的初衷了，另外虽然采用独立的子域名可以共享主站的文件但却不容易共享主站的很多数据，我一直建议大家在使用及开发 drupal 的时候尽量按照 drupal 的方法来即（Using Drupal by Drupal&#8217;s Way）所以在你的移动版站点没有看到预期价值的时候完全没有必要投入大的开发成本而把事情变的复杂对于 drupal 几行代码加一个简单的手机移动版主题就足以最低的开发成本应对绝大多数移动用户…… 如果是实现简单的 Drupal 根据用户客户端浏览器设备切换移动版非常容易只需要主题模板在站点的 setting.php 配置文件中添加及修改以下代码： $mobi = strpos($_SERVER['HTTP_USER_AGENT'], 'iPhone') &#124;&#124; strpos($_SERVER['HTTP_USER_AGENT'], 'Android'); $conf = array('theme_default' => $mobi ? '移动版主题名称' : '普通版主题名称'); 首先从客户端浏览器的 UA 来判断客户端的具体类型，这里只做了 iPhone 和 Android 的判断其他可自行添加，值得一提的是 iPhone Safari [...]]]></description>
			<content:encoded><![CDATA[<p>越来越多的网站开始注重“移动互联网”的价值提供手机移动版的网页界面，当然使用 drupal 构建的站点也可以通过根据 iPhone 或者 Android 设备类型来切换主题模板的方法来实现手机移动版站点，只需要为 drupal 单独制作一套或几套适合手机等移动设备浏览的主题模板即可，不建议在同一套主题模板里面或者模块里面大量使用判断语句来分别对应设备输出，当然也不建议使用 PHP 或 API 从底层新建一个独立的站点那样会相当的得不偿失，就失去了我们使用 drupal 的初衷了，另外虽然采用独立的子域名可以共享主站的文件但却不容易共享主站的很多数据，我一直建议大家在使用及开发 drupal 的时候尽量按照 drupal 的方法来即（Using Drupal by Drupal&#8217;s Way）所以在你的移动版站点没有看到预期价值的时候完全没有必要投入大的开发成本而把事情变的复杂对于 drupal 几行代码加一个简单的手机移动版主题就足以最低的开发成本应对绝大多数移动用户……<span id="more-1195"></span></p>
<p>如果是实现简单的 Drupal 根据用户客户端浏览器设备切换移动版非常容易只需要主题模板在站点的 setting.php 配置文件中添加及修改以下代码：</p>
<pre lang="php" line="1">
$mobi = strpos($_SERVER['HTTP_USER_AGENT'], 'iPhone') || strpos($_SERVER['HTTP_USER_AGENT'], 'Android');
$conf = array('theme_default' => $mobi ? '移动版主题名称' : '普通版主题名称');
</pre>
<p>首先从客户端浏览器的 UA 来判断客户端的具体类型，这里只做了 iPhone 和 Android 的判断其他可自行添加，值得一提的是 iPhone Safari 和 Android Chrome 使用的浏览器核心均为 webkit 也是目前对于 HTML5 + CSS3 支持的最好的浏览器核心，在页面渲染上几乎没有差别大可做统一处理。在当前站点设置目录的 setting 控制着当前站点的所有基本设置信息 $conf 可以用来配置一些默认的属性当然包括用户的主题模板。</p>
<p>由于 iPhone 和 Android 内置的 Safari 及 Chrome 浏览器已经具备几乎全部的富因特网功能，所以需要考虑用户也有使用完整版页面的期望及可能也就是为此多数移动版站点也同时提供切换到完整页面的链接，当然 drupal 中也可以通过修改 $user 对象来实现这一需求 Drupal 中用来控制用户当前主题模板的变量字段为 $user->theme 当然可能需要开启用户多主题支持，然后就可以用程序为 $user->theme 赋值来修改用户当前的主题模板核心代码如下：</p>
<pre lang="php" line="1">
function setheme_setheme($theme = NULL){
    global $user;
    user_save($user, array('theme'=>$theme));
    drupal_goto('<front>');
}</pre>
<p>上面提供的只是核心函数的代码这里用到了一个 drupal 的内置函数 user_save 可以用来向 $user 对象赋值非常方便，当然需要写成一个小的模块才会完整最好用 hook_menu 定义一个菜单路径例如 /setheme/ 这样就可以通过 /setheme/garland 或者 /setheme/minnelli 将打算切换的主题名称传递给这个函数达到通过链接切换主题模板的目的，最好切换完成后使用 drupal_goto 返回到需要的页面即可，当然这样做还有一些问题例如对于缓存的处理……</p>
]]></content:encoded>
			<wfw:commentRss>http://nan.im/blog/1195/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>【Drupal】删除及隐藏 node form 表单中的一些栏目</title>
		<link>http://nan.im/blog/1253</link>
		<comments>http://nan.im/blog/1253#comments</comments>
		<pubDate>Thu, 03 Jun 2010 16:09:25 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[网站前端]]></category>
		<category><![CDATA[CODE 代码]]></category>
		<category><![CDATA[Drupal]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Theme Template 主题模板]]></category>

		<guid isPermaLink="false">http://anyLiv.com/blog/?p=1253</guid>
		<description><![CDATA[在 Drupal 默认的 node-form 内容录入表单除了已经有 标题 内容 以外还有一些不常使用的栏目如：日志 版本 菜单 等平常并不容易用到，但一大堆栏目出现在 node-form 表单中对用户来说会显得不大友好，这里提供一些代码可以去掉或隐藏掉一些平常不会用到的 node 表单栏目如 Revision information 栏目 Authoring information 栏目 Publishing options 栏目等等： 用于隐藏 node-form 表单的代码需要放置于主题的 template.php 文件中： // node-form for Drupal 5.x ... function phptemplate_node_form($form) { $form['log']['#access'] = FALSE; $form['menu']['#access'] = FALSE; return $form; } // node-form for Drupal 6.x ... function phptemplate_node_form($form) [...]]]></description>
			<content:encoded><![CDATA[<p>在 Drupal 默认的 node-form 内容录入表单除了已经有 标题 内容 以外还有一些不常使用的栏目如：日志 版本 菜单 等平常并不容易用到，但一大堆栏目出现在 node-form 表单中对用户来说会显得不大友好，这里提供一些代码可以去掉或隐藏掉一些平常不会用到的 node 表单栏目如 Revision information 栏目 Authoring information 栏目 Publishing options 栏目等等：<span id="more-1253"></span></p>
<p>用于隐藏 node-form 表单的代码需要放置于主题的 template.php 文件中：</p>
<pre lang="php" line="1">
// node-form for Drupal 5.x ...
function phptemplate_node_form($form) {
	$form['log']['#access'] = FALSE;
	$form['menu']['#access'] = FALSE;
	return $form;
}

// node-form for Drupal 6.x ...
function phptemplate_node_form($form) {
	$form['menu_settings']['#access'] = FALSE;
	$form['revision_information']['#access'] = FALSE;
	return $form;
}
</pre>
<p>上面代码分别被用于 Drupal5 和 Drupal6 其实只是表单的 name 做了一些变化，需要注意的是有些表单元素是不可以设置其 access 为 false 的例如 Publishing options 就不可以一旦 Publishing options 被设置 access false 的话会导致节点默认的 Published 或是 Promoted to front page 值为空从而使节点不能被正常显示，要隐藏 Publishing options 除使用访问控制（User Access）设置以外还可以使用 CSS 将涉及节点管理功能的几个栏目隐藏也可以达到效果，具体可以在你的主题 CSS 中添加 #node-form .admin { display:none; } 即可实现隐藏节点管理的几个表单栏目并且不影响表单提交功能。</p>
<p>其实利用主题函数覆写还可以实现将几个提交按钮（button）与表单内容相分离的效果，例如设计师需要将整个表单栏目部分添加修饰而为 提交 预览 等几个按钮做单独的修饰，这个时候就可以用上面的主题覆写函数使用 drupal_render($form['submit']) 单独获得按钮元素用来输出。</p>
]]></content:encoded>
			<wfw:commentRss>http://nan.im/blog/1253/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>【Drupal】简化 WYSIWYG 编辑器的图片上传操作</title>
		<link>http://nan.im/blog/1252</link>
		<comments>http://nan.im/blog/1252#comments</comments>
		<pubDate>Tue, 01 Jun 2010 14:14:44 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[网站前端]]></category>
		<category><![CDATA[CODE 代码]]></category>
		<category><![CDATA[Develop 开发]]></category>
		<category><![CDATA[Drupal]]></category>
		<category><![CDATA[JavaScript JS]]></category>
		<category><![CDATA[User Experience 用户体验]]></category>
		<category><![CDATA[W3C Behavior 行为层]]></category>

		<guid isPermaLink="false">http://anyLiv.com/blog/?p=1252</guid>
		<description><![CDATA[虽然 Drupal WYSIWYG 所见即所得模块非常之强大，为超过 10 种流行的网页编辑器提供与 Drupal 结合的中间层，但其实很多时候我发现项目站点的需求并没有那么多，很多时候我们只需要一个简单的网页编辑器加上简单的图片或文件上传功能即可，但在 Drupal 中似乎并不容易实现这些需求，出于安全等因素的考虑多数编辑器如 FckEditor TinyMCE 等其图片上传工作除 WYSISYG 模块外还需要 IMCE 模块来提供中间层支持，而 IMCE 繁琐的上传步骤不单让我们自己头疼也使绝大多数用户在使用 IMCE 上传图片时觉得繁琐，我自己粗略回忆一下至少还需要约 8 次鼠标点击才能在编辑器里面看到上传的图片这是非常不利于用户体验的，下面提供一些方法和代码可以大大减少上传图片的点击步骤简化上传图片和文件的操作 下面提供的方法仅针对 Drupal 5.x 另外对于 Drupal 6.x 可使用新版的 ckEditor 做类似修改也很容易实现，另外下文提到的 fckEditor 模块是指从 drupal.org 下载的模块文件而 fckEditor 编辑器是指从 ckEditor.com 下载的编辑器文件，读者需要仔细阅读区分： 1、下载模块：如果项目中只需要一种编辑器就足够，而且也并不需要 IMCE 来管理每个用户的文件，我们就可以不使用 WYSIWYG IMCE 这两个功能过于强大的模块了，只需要下载并启用 fckEditor 一个模块即可，具体安装方法不再详述在 fckEditor module for drupal 这里有详细的描写，要点是要将下载的 fckEditor 编辑器放置到相应 [...]]]></description>
			<content:encoded><![CDATA[<p>虽然 Drupal <a href="http://drupal.org/project/wysiwyg">WYSIWYG</a> 所见即所得模块非常之强大，为超过 10 种流行的网页编辑器提供与 Drupal 结合的中间层，但其实很多时候我发现项目站点的需求并没有那么多，很多时候我们只需要一个简单的网页编辑器加上简单的图片或文件上传功能即可，但在 Drupal 中似乎并不容易实现这些需求，出于安全等因素的考虑多数编辑器如 FckEditor TinyMCE 等其图片上传工作除 WYSISYG 模块外还需要 IMCE 模块来提供中间层支持，而 IMCE 繁琐的上传步骤不单让我们自己头疼也使绝大多数用户在使用 IMCE 上传图片时觉得繁琐，我自己粗略回忆一下至少还需要约 8 次鼠标点击才能在编辑器里面看到上传的图片这是非常不利于用户体验的，下面提供一些方法和代码可以大大减少上传图片的点击步骤简化上传图片和文件的操作<span id="more-1252"></span></p>
<blockquote><p>下面提供的方法仅针对 Drupal 5.x 另外对于 Drupal 6.x 可使用新版的 <a href="http://drupal.org/project/ckeditor">ckEditor</a> 做类似修改也很容易实现，另外下文提到的 fckEditor 模块是指从 drupal.org 下载的模块文件而 fckEditor 编辑器是指从 ckEditor.com 下载的编辑器文件，读者需要仔细阅读区分：</p></blockquote>
<p>1、<strong>下载模块</strong>：如果项目中只需要一种编辑器就足够，而且也并不需要 IMCE 来管理每个用户的文件，我们就可以不使用 WYSIWYG IMCE 这两个功能过于强大的模块了，只需要下载并启用 <a href="http://drupal.org/project/fckeditor">fckEditor</a> 一个模块即可，具体安装方法不再详述在 <a href="http://drupal.org/project/fckeditor">fckEditor module for drupal</a> 这里有详细的描写，要点是要将下载的 fckEditor 编辑器放置到相应 fckEditor module 模块目录之下，然后就可以进行下面的修改操作了；</p>
<p>2、<strong>开启上传</strong>：默认的 fckEditor 模块需要搭配 IMCE 才可以实现图片的上传功能，这里需要做一些修改来开启 fckEditor 编辑器内置的 FileManager 来负责上传操作从而代替 IMCE 模块，具体修改方法在 fckEditor 模块下面的 README.txt 也有详细的说明我这里简单翻译一下要点步骤。在编辑器中的 /modules/fckeditor/fckeditor/editor/filemanager/connectors/php/config.php 文件中添加一句代码 require_once “../../../../../filemanager.config.php”; 加到最前面即可然后设置该文件后面的 $Config['Enabled']=true; 还要设置 $Config['UserFilesAbsolutePath']=&#8217;files&#8217; 该值为你的文件上传目录对于 Drupal5 通常是 files 需要注意是该目录为相对于站点根路径的目录，修改之后即可在 Drupal 的 admin/settings/fckeditor 中配置 file browser settings 了非常方便；</p>
<p>3、<strong>优化交互</strong>：照上面修改之后就可以只使用 fckEditor 一个模块来负责编辑器和文件上传功能，但我的用户在使用之后仍然觉得有些繁琐体现在，多数情况下用户都在上传新的图片，而点击编辑器的图片按钮出现的却是“图像属性”和“浏览服务器”上传功能，这会无形中引导用户走向类似 IMCE 的操作方式（<a href="http://drupal.fckeditor.net/comment/reply/1#comment-form">看这里</a>）所以最简单的修改是将“上传”选项卡移至首选功能具体需要修改 fck_image.js 文件中将 dialog.AddTab(&#8216;Upload&#8217;,FCKLang.DlgLnkUpload) 连同前面的 if 语句拿到 dialog.AddTab(&#8216;Info&#8217;,FCKLang.DlgImgInfoTab) 语句之前然后在后面的 window.onload 函数中写入一句 OnDialogTabChange(&#8216;Upload&#8217;) 即可实现窗口启动时自动切换到“文件上传”功能以减少点击和误导，具体文件位置比较深自己搜索一下；</p>
<p>4、<strong>再次优化</strong>：如此修改之后上传文件已经变的相对容易了，但有用户仍反应是否可以在选择文件之后直接触发上传而不用再点“上传到服务器”呢我估计是受了 swfUpload 的影响，当然这也很容易解决需要修改上面同一位置的 fck_image.html 文件中文件选择框 input id=”txtUploadFile” onChange=”document.getElementById(&#8216;btnUpload&#8217;).click()” 添加一个事件即可具体是在 file 选取之后由程序触发上传按钮，当然事件改为 this.form.submit() 也是可以的，但那样就没有上传动画了。</p>
<p>5、<strong>进阶优化</strong>：经过上面这些修改已经基本可以满足目前我的用户需求了，但这里其实可以拓展一下例如还可以将 upload 表单和 image info 表单放到同一个弹出层里面类似腾讯在某些页面的编辑器，这样就可以一劳永逸的解决所有问题，我这里就不提供修改方法了读者可以自己摸索一下。</p>
<p>开源程序的优点就是他的任何内容你都可以看到并可以根据自己的需求修改，这也是我喜欢 HTML CSS JavaScript 喜欢 Drupal WordPress 的原因之一，我知道有人会觉得 Image Assist 模块也会比较容易上传但 Image Assist 每上传会占用一个新的 node 这与 WordPress 的上传机制类似，我个人并不太喜欢，如果你有其他更高明的方法欢迎分享一下！！</p>
]]></content:encoded>
			<wfw:commentRss>http://nan.im/blog/1252/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>【Drupal】后台 PHP 与前端 JavaScript 之间的数据传递</title>
		<link>http://nan.im/blog/1251</link>
		<comments>http://nan.im/blog/1251#comments</comments>
		<pubDate>Mon, 24 May 2010 14:17:03 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[网站前端]]></category>
		<category><![CDATA[CODE 代码]]></category>
		<category><![CDATA[Develop 开发]]></category>
		<category><![CDATA[Drupal]]></category>
		<category><![CDATA[JavaScript JS]]></category>
		<category><![CDATA[Module]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Theme Template 主题模板]]></category>

		<guid isPermaLink="false">http://anyLiv.com/blog/?p=1251</guid>
		<description><![CDATA[在 Drupal 模块或主题开发中经常会有需要传递一些值给 JavaScript 的情况，大概有几种方法一是可以直接在模板里面写 JavaScript 然后嵌 PHP 进去，也可以用 Drupal 的接口直接输出 JavaScript 到页面的 head 信息中去，其实我自己之前一直是直接在模板里面写 JS 嵌套 PHP 的，后来发现 Drupal 现有的 drupal_add_js 提供了传递变量的接口具体如下…… 下面是简单的实现步骤，目的是传递 drupal 的 basePath 给 JavaScript 使用，当然这在 Drupal6 中是已经默认传递的，大家可以举一反三来使用： //首先是在模块文件或者是主题的 template 文件中加入如下代码： drupal_add_js(array('basePath' => $GLOBALS['base_path']), 'setting'); //然后你会发现在页面的 script 输出部分会有以下信息输出： Drupal.extend({ settings:{"basePath": "/drupal/"} }); //这样你就可以在页面引入的 JavaScript 文件中直接调用该对象了如： alert(Drupal.settings['basePath']); 非常方便主要起作用的是 drupal_add_js 的第二个参数 setting 他告诉 [...]]]></description>
			<content:encoded><![CDATA[<p>在 Drupal 模块或主题开发中经常会有需要传递一些值给 JavaScript 的情况，大概有几种方法一是可以直接在模板里面写 JavaScript 然后嵌 PHP 进去，也可以用 Drupal 的接口直接输出 JavaScript 到页面的 head 信息中去，其实我自己之前一直是直接在模板里面写 JS 嵌套 PHP 的，后来发现 Drupal 现有的 drupal_add_js 提供了传递变量的接口具体如下……<span id="more-1251"></span></p>
<p>下面是简单的实现步骤，目的是传递 drupal 的 basePath 给 JavaScript 使用，当然这在 Drupal6 中是已经默认传递的，大家可以举一反三来使用：</p>
<pre lang="php" line="1">
//首先是在模块文件或者是主题的 template 文件中加入如下代码：
drupal_add_js(array('basePath' => $GLOBALS['base_path']), 'setting');

//然后你会发现在页面的 script 输出部分会有以下信息输出：
Drupal.extend({ settings:{"basePath": "/drupal/"} });

//这样你就可以在页面引入的 JavaScript 文件中直接调用该对象了如：
alert(Drupal.settings['basePath']);
</pre>
<p>非常方便主要起作用的是 <a href="http://api.drupal.org/api/function/drupal_add_js/">drupal_add_js</a> 的第二个参数 setting 他告诉 drupal 系统这段 js 是设置类型的数组，其他使用方法请访问 drupal 的线上 api 函数手册。其实在只传递一个变量时这种方法带来的优势并不明显，但如果有若干个模块需要传递多个变量给 JavaScript 的时候 drupal_add_js 函数会自动将他们合并到一起在页面头部输出，只调用一个 Drupal.extend() 方法为 Drupal 对象增加额外的值，也希望大家在写模块或模板的时候尽量遵循 Drupal 提供给我们的现有的 api 这将让你的工作事半功倍同时也让你的项目更容易维护代码更具有可读性。</p>
]]></content:encoded>
			<wfw:commentRss>http://nan.im/blog/1251/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>【Drupal】常用 Drupal Module 模块简介及下载</title>
		<link>http://nan.im/blog/1210</link>
		<comments>http://nan.im/blog/1210#comments</comments>
		<pubDate>Tue, 04 May 2010 17:36:19 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[网站前端]]></category>
		<category><![CDATA[CMS 内容管理系统]]></category>
		<category><![CDATA[Develop 开发]]></category>
		<category><![CDATA[Download 下载]]></category>
		<category><![CDATA[Drupal]]></category>
		<category><![CDATA[Module]]></category>

		<guid isPermaLink="false">http://anyliv.com/blog/?p=1210</guid>
		<description><![CDATA[优秀的开源建站系统 Drupal 的影响力更多是来自全球 Drupal 开发者贡献的近六万个 Modules 模块扩展套用当下流行的一句广告词 “近六万个模块几乎能做任何事” 但如何迅速的在这六万的模块中迅速找到最合适的成了一件并不容易的事情，我这里推荐一些常用的 Drupal Modules 模块扩展简单介绍和下载地址，这些扩展也是多数网站所必备的模块，希望能对一些 Drupal 初学者有所帮助，以下排名不分先后当然大家有其他不错的模块也可以分享给我…… 1、Content Construction Kit (CCK)：必备模块 CCK 可以非常方便的定制节点（NODE）的内容，添加各种类型的字段（Field）并调整展示形式，在官方 Drupal 7 中已经内置该模块。 2、Views：不多说了几乎也是必备模块，可以根据各种条件筛选出所需的内容并生成页面或者区块等等。 3、Path Auto：可以方便的自动根据节点名称、节点类型、节点分类等信息生成简洁链接（CleanURLs）而无需人工参与。 4、Administration menu：方便管理员的友好多级下拉菜单，可以在任何页面访问到任何功能菜单或是清除 Drupal 缓存非常方便。 5、ImageAPI：这个模块单独作用不大但是其他很多模块会依赖该模块如：ImageField ImageCache 等等。 6、IMCE：模块 IMCE 可以为每个用户构建一个小型的网络硬盘，并非常容易嵌入到各种所见即所得（WYSIWYG）编辑器提供图片及文件上传。 7、ImageCache：模块 ImageCache 可以非常容易的生成各种尺寸的缓存图片包括：缩放、裁切、旋转等等。 8、Google Analytics：统计代码是每个网站所必须的，这个模块对于使用 Google 分析的用户非常方便，无需改动任何代码输入配置文件 ID 即可。 9、CAPTCHA：模块 CAPTCHA 可以借助扭曲的字母图片来区分人类和垃圾消息机器人。 10、what you see is what you get [...]]]></description>
			<content:encoded><![CDATA[<p>优秀的开源建站系统 Drupal 的影响力更多是来自全球 Drupal 开发者贡献的近六万个 Modules 模块扩展套用当下流行的一句广告词 “近六万个模块几乎能做任何事” 但如何迅速的在这六万的模块中迅速找到最合适的成了一件并不容易的事情，我这里推荐一些常用的 Drupal Modules 模块扩展简单介绍和下载地址，这些扩展也是多数网站所必备的模块，希望能对一些 Drupal 初学者有所帮助，以下排名不分先后当然大家有其他不错的模块也可以分享给我……<span id="more-1210"></span></p>
<p>1、<a href="http://drupal.org/project/cck">Content Construction Kit (CCK)</a>：必备模块 CCK 可以非常方便的定制节点（NODE）的内容，添加各种类型的字段（Field）并调整展示形式，在官方 Drupal 7 中已经内置该模块。</p>
<p>2、<a href="http://drupal.org/project/views">Views</a>：不多说了几乎也是必备模块，可以根据各种条件筛选出所需的内容并生成页面或者区块等等。</p>
<p>3、<a href="http://drupal.org/project/pathauto">Path Auto</a>：可以方便的自动根据节点名称、节点类型、节点分类等信息生成简洁链接（CleanURLs）而无需人工参与。</p>
<p>4、<a href="http://drupal.org/project/admin_menu">Administration menu</a>：方便管理员的友好多级下拉菜单，可以在任何页面访问到任何功能菜单或是清除 Drupal 缓存非常方便。</p>
<p>5、<a href="http://drupal.org/project/imageapi">ImageAPI</a>：这个模块单独作用不大但是其他很多模块会依赖该模块如：ImageField ImageCache 等等。</p>
<p>6、<a href="http://drupal.org/project/imce">IMCE</a>：模块 IMCE 可以为每个用户构建一个小型的网络硬盘，并非常容易嵌入到各种所见即所得（WYSIWYG）编辑器提供图片及文件上传。</p>
<p>7、<a href="http://drupal.org/project/imagecache">ImageCache</a>：模块 ImageCache 可以非常容易的生成各种尺寸的缓存图片包括：缩放、裁切、旋转等等。</p>
<p>8、<a href="http://drupal.org/project/google_analytics">Google Analytics</a>：统计代码是每个网站所必须的，这个模块对于使用 Google 分析的用户非常方便，无需改动任何代码输入配置文件 ID 即可。</p>
<p>9、<a href="http://drupal.org/project/captcha">CAPTCHA</a>：模块 CAPTCHA 可以借助扭曲的字母图片来区分人类和垃圾消息机器人。</p>
<p>10、<a href="http://drupal.org/project/wysiwyg">what you see is what you get (WYSIWAY)</a>：模块 WYSIWAY 为超过 10 种网页编辑器如 TinyMCE CKEditor FCKeditor YuiEditor 等提供中间层支持。</p>
<p>11、<a href="http://drupal.org/project/contemplate">Content Templates (Contemplate)</a>：模块 ContentTemplates 可以在不改动 tpl 模板文件的前提下修改节点的展示效果类似于 node-type.tpl.php 的作用。</p>
<p>12、<a href="http://drupal.org/project/jquery_update">jQuery Update</a>：该模块可以更新 Drupal 附带的 jQuery 库到最新版，通常 Drupal 发行版的默认 jQuery 均为次新版。</p>
<p>13、<a href="http://drupal.org/project/lightbox2">Lightbox2</a> <a href="http://drupal.org/project/thickbox">ThickBox</a> <a href="http://drupal.org/project/shadowbox">ShadowBox</a>：模块 Lightbox 和 ThickBox 包括 ShadowBox 均可以提供给图片非常优雅的展示方式，不同的是 ShadowBox 支持的格式更多如 swf avi mp4 等等。</p>
<p>14、<a href="http://drupal.org/project/last_node">Last Node</a>：如果是简单的输出几个最近更新的列表可以尝试 Last Node 模块而不是庞大的 Views 模块。</p>
<p>15、<a href="http://drupal.org/project/taxonomy_super_select">taxonomy super select</a>：可以让多值的术语框变成 checkbox 而不需要 Ctrl 加点击选取多个术语。</p>
<p>16、……</p>
<p>当然，上面这些模块只是我在项目中经常会用到的，但只是近六万的模块之一毛，希望大家多多推荐好用方便的模块过来。</p>
]]></content:encoded>
			<wfw:commentRss>http://nan.im/blog/1210/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>【Drupal】中使用 check_plain 和 t 函数来安全处理字符</title>
		<link>http://nan.im/blog/1232</link>
		<comments>http://nan.im/blog/1232#comments</comments>
		<pubDate>Sun, 02 May 2010 14:04:28 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[网站前端]]></category>
		<category><![CDATA[CODE 代码]]></category>
		<category><![CDATA[Drupal]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Theme Template 主题模板]]></category>

		<guid isPermaLink="false">http://anyLiv.com/blog/?p=1232</guid>
		<description><![CDATA[从事 Drupal 模块开发特别是主题开发中会经常需要输出或者调用一些文本或字符，但如果是不信任来源的字串如开放给任意用户使用的一些输入等等，这类不信任的字串在输出或使用时请不要大意，未经过滤的不信任字符将给你的项目带来巨大的隐患，好在 Drupal 为我们提供了一个 check_plain 及用于翻译的 t 函数用来优雅的处理这类问题。 关于这两个函数的基本用法可以参考 api.drupal.org 的官方介绍： t()：http://api.drupal.org/api/function/t/6 check_plain()：http://api.drupal.org/api/function/check_plain/6 当开发者对于即将使用或输出字串不信任的时候可以使用 check_plain 来安全优雅的过滤掉不安全代码，下面是一些简单的示例及说明，其中 drupal_set_message 是用于向 Drupal 前端返回一段信息的函数，我这里假定 $tText 为来自不信任来源的一段字串，而使用 t 函数的原因是我们需要输出的这段字串可以被翻译： 1、首先是一些未采取任何措施的信息调用及输出： echo t(&#8216;Some Text For Testing&#8217;); //未包含不信任变量时该方法安全； echo t(“Some $testText For Testing”); //一旦包含不信任内容则不安全； 2、然后我们可以使用 check_plain 来处理不信任的字串如下： echo check_plain($testText); echo t(&#8216;Some&#8217;),check_plain($testText),t(&#8216;For Testing&#8217;); //当然你也可以再 t 一次但事情就变的复杂了； 3、但如此输出的直接结果便是来自用户的字串 testText 无法被翻译，好在 Drupal 的 t [...]]]></description>
			<content:encoded><![CDATA[<p>从事 Drupal 模块开发特别是主题开发中会经常需要输出或者调用一些文本或字符，但如果是不信任来源的字串如开放给任意用户使用的一些输入等等，这类不信任的字串在输出或使用时请不要大意，未经过滤的不信任字符将给你的项目带来巨大的隐患，好在 Drupal 为我们提供了一个 check_plain 及用于翻译的 t 函数用来优雅的处理这类问题。<span id="more-1232"></span></p>
<p>关于这两个函数的基本用法可以参考 api.drupal.org 的官方介绍：</p>
<p>t()：http://api.drupal.org/api/function/t/6</p>
<p>check_plain()：http://api.drupal.org/api/function/check_plain/6</p>
<p>当开发者对于即将使用或输出字串不信任的时候可以使用 check_plain 来安全优雅的过滤掉不安全代码，下面是一些简单的示例及说明，其中 drupal_set_message 是用于向 Drupal 前端返回一段信息的函数，我这里假定 $tText 为来自不信任来源的一段字串，而使用 t 函数的原因是我们需要输出的这段字串可以被翻译：</p>
<p>1、首先是一些未采取任何措施的信息调用及输出：</p>
<p>echo t(&#8216;Some Text For Testing&#8217;);      //未包含不信任变量时该方法安全；</p>
<p>echo t(“Some $testText For Testing”);      //一旦包含不信任内容则不安全；</p>
<p>2、然后我们可以使用 check_plain 来处理不信任的字串如下：</p>
<p>echo check_plain($testText);</p>
<p>echo t(&#8216;Some&#8217;),check_plain($testText),t(&#8216;For Testing&#8217;);      //当然你也可以再 t 一次但事情就变的复杂了；</p>
<p>3、但如此输出的直接结果便是来自用户的字串 testText 无法被翻译，好在 Drupal 的 t 函数使用 @ 占位符为我们提供了另外一种方式来确保安全：</p>
<p>echo t(&#8216;Some @testText For Testing&#8217;, array(&#8216;@testText&#8217; => $testText));      //使用这种格式将非常利于翻译人员操作；</p>
<p>当然这里还可以使用其他一些占位符例如 % 和 ! 等等以实现不同的需求如添加 html 代码或者跳过 check_plain 等等，具体可参考 api.drupal.org 上关于 t 函数的一些用法示例，由于 Drupal 里很多函数都已经内置了 check_plain 操作如常用的 l 函数等等所以 ! 占位符也会经常被用到，当然如果 l 函数的 html 属性为 true 时创建链接还是需要过滤的。最后需要补充的是前面所做的努力需要一个前提就是信任的翻译，否则即使代码上无懈可击如果在翻译上出了问题也是很让人头疼的。</p>
]]></content:encoded>
			<wfw:commentRss>http://nan.im/blog/1232/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>【Drupal】用 jQuery 过滤 Drupal Term 术语输入框中的中文逗号</title>
		<link>http://nan.im/blog/1239</link>
		<comments>http://nan.im/blog/1239#comments</comments>
		<pubDate>Sat, 01 May 2010 13:03:11 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[网站前端]]></category>
		<category><![CDATA[CODE 代码]]></category>
		<category><![CDATA[Develop 开发]]></category>
		<category><![CDATA[Drupal]]></category>
		<category><![CDATA[JavaScript JS]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://anyLiv.com/blog/?p=1239</guid>
		<description><![CDATA[在 Drupal 中被用于分类的 taxonomy 术语表输入框在自由标签模式下默认会使用 “英文逗号” 来分割 term 术语信息，但这点会极其不方便我们的中文用户，在默认场景下会需要在输入每一个中文术语后，切换输入法到英文来输入一个逗号，然后再切换回中文继续输入下一个术语。在我的一个 Drupal 项目初期编辑们居然都是一次输入多个英文逗号，然后使用方向键调整光标来输入一个个术语，直到我发现了这个问题并提供了以下两行非常简单的 jQuery 代码大大方便了我们的用户录入信息…… 使用 jQuery 替换 Drupal Term 术语文本框里的中文标点： $('input.form-text').blur(function(){ $(this).val($(this).val().replace(/，/g, ', ')); $(this).val($(this).val().replace(/、/g, ', ')); $(this).val($(this).val().replace(/，/g, ', ')).val($(this).val().replace(/、/g, ', ')); }); 上面几行 jQuery 代码会在文本框失去焦点的时候触发，当然你也可以使用表单的 submit 触发代码替换事件，上面代码中的选择器也需要在具体项目中修改，两行代码分别会替换术语框中的中文逗号和顿号为英文的逗号，可以根据具体项目需求修改，如果两个符号均需要替换就可以采用后面的 jQuery 连写方法。]]></description>
			<content:encoded><![CDATA[<p>在 Drupal 中被用于分类的 taxonomy 术语表输入框在自由标签模式下默认会使用 “英文逗号” 来分割 term 术语信息，但这点会极其不方便我们的中文用户，在默认场景下会需要在输入每一个中文术语后，切换输入法到英文来输入一个逗号，然后再切换回中文继续输入下一个术语。在我的一个 Drupal 项目初期编辑们居然都是一次输入多个英文逗号，然后使用方向键调整光标来输入一个个术语，直到我发现了这个问题并提供了以下两行非常简单的 jQuery 代码大大方便了我们的用户录入信息……<span id="more-1239"></span></p>
<p>使用 jQuery 替换 Drupal Term 术语文本框里的中文标点：</p>
<pre lang="javascript" line="1">
$('input.form-text').blur(function(){
    $(this).val($(this).val().replace(/，/g, ', '));
    $(this).val($(this).val().replace(/、/g, ', '));

    $(this).val($(this).val().replace(/，/g, ', ')).val($(this).val().replace(/、/g, ', '));
});
</pre>
<p>上面几行 jQuery 代码会在文本框失去焦点的时候触发，当然你也可以使用表单的 submit 触发代码替换事件，上面代码中的选择器也需要在具体项目中修改，两行代码分别会替换术语框中的中文逗号和顿号为英文的逗号，可以根据具体项目需求修改，如果两个符号均需要替换就可以采用后面的 jQuery 连写方法。</p>
]]></content:encoded>
			<wfw:commentRss>http://nan.im/blog/1239/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>【Drupal】基于分类 taxonomy 实现相关文章 Related Post</title>
		<link>http://nan.im/blog/1207</link>
		<comments>http://nan.im/blog/1207#comments</comments>
		<pubDate>Fri, 12 Feb 2010 05:46:01 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[网站前端]]></category>
		<category><![CDATA[CODE 代码]]></category>
		<category><![CDATA[Develop 开发]]></category>
		<category><![CDATA[Drupal]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Theme Template 主题模板]]></category>

		<guid isPermaLink="false">http://anyliv.com/blog/?p=1207</guid>
		<description><![CDATA[对于偏内容型站点来说，相关文章（Related Post）成为留住游客从而降低访客跳出率的重要手段，虽然在 Drupal 中默认是没有此类功能但 Drupal 本身为我们提供了很多丰富的 API 接口使我们可以借助分类 taxonomy 的一些接口很容易的通过修改主题模板 Theme 为 Drupal 站点添加诸如 相关文章 类似文章 推荐内容 等功能…… 代码可放入相应节点类型的 node.tpl.php 具体如下： $title = 'Related Post :'; $items = $atids = array(); foreach($node->taxonomy as $term){ $atids[] = $term->tid; } $datas = taxonomy_select_nodes($atids, 'or'); while ($data = db_fetch_object($datas)){ $items[] = l($data->title, 'node/'.$data->nid); } echo theme('item_list', $items, $title, [...]]]></description>
			<content:encoded><![CDATA[<p>对于偏内容型站点来说，相关文章（Related Post）成为留住游客从而降低访客跳出率的重要手段，虽然在 Drupal 中默认是没有此类功能但 Drupal 本身为我们提供了很多丰富的 API 接口使我们可以借助分类 taxonomy 的一些接口很容易的通过修改主题模板 Theme 为 Drupal 站点添加诸如 相关文章 类似文章 推荐内容 等功能……<span id="more-1207"></span></p>
<p>代码可放入相应节点类型的 node.tpl.php 具体如下：</p>
<pre lang="php" line="1">

$title = 'Related Post :';
$items = $atids = array();

foreach($node->taxonomy as $term){ $atids[] = $term->tid; }

$datas = taxonomy_select_nodes($atids, 'or');
while ($data = db_fetch_object($datas)){
	$items[] = l($data->title, 'node/'.$data->nid);
}

echo theme('item_list', $items, $title, $type = 'ul');
</pre>
<p>代码非常简单首先是获取该节点所有术语标签 term 的 tid 然后使用 drupal 提供的 <a href="http://api.drupal.org/api/function/taxonomy_select_nodes">taxonomy_select_nodes</a> 函数直接取得站点内所有含有相同术语的 node 节点重组为一个数组交给 item_list 主题函数输出即可。</p>
<p>方法比较简单所有算法肯定也会比较弱智，单纯的根据术语标签（term）来推荐相关文章会导致推荐内容不准确，如果能使用更高级的算法当然最好。还有就是不能自由选择参与相关文章的节点类型（node type）你肯定不想所有节点类型参与相关文章，我的做法是在为 $items[] 赋值之前用 node_load 读取 nodeType 并判断，但这同时也消耗大量资源和牺牲站点性能本身 taxonomy_select_nodes 就不是省油的函数，所以我也在开篇就表示该方法更适用于偏内容型站点，该类站点多为游客访客用户可以开启站点缓存节点不用每次都执行多次查询，对于非缓存站点该方法并不推荐。</p>
<p>当然我觉得最好的方法还是使用更智能高级的算法根据节点标题、术语、内容等参数并施以不同的权重，直接读取数据库生成相关文章会好的多，类似 WordPress 上的 <a href="http://wordpress.org/extend/plugins/yet-another-related-posts-plugin/">YARPP</a> 模块就做的非常智能！</p>
]]></content:encoded>
			<wfw:commentRss>http://nan.im/blog/1207/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

