<?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; PHP</title>
	<atom:link href="http://nan.im/blog/tags/php/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>【WP】如何添加新版 WordPress 菜单系统代码</title>
		<link>http://nan.im/blog/1271</link>
		<comments>http://nan.im/blog/1271#comments</comments>
		<pubDate>Sat, 19 Jun 2010 09:27:46 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[网站前端]]></category>
		<category><![CDATA[CMS 内容管理系统]]></category>
		<category><![CDATA[CODE 代码]]></category>
		<category><![CDATA[Develop 开发]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Theme Template 主题模板]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://anyLiv.com/blog/?p=1271</guid>
		<description><![CDATA[WordPress.org 昨天释放了 3.0 的正式版的更新，在新版 WordPress 中引入了一个新的系统 “MENU” 菜单系统 WP 的新菜单系统和 Drupal 及其他 CMS 的菜单系统功能基本相同但使用上更为方便也使 WordPress 在主题开发者和用户使用者直接建立了又一座友好的桥梁，下面提供一些代码给主题（theme）开发者尽快将你的主题升级开启（menu）菜单系统的支持…… 函数语法： Menus SubPanel：http://codex.wordpress.org/Appearance_Menus_SubPanel wp_nav_menu：http://codex.wordpress.org/Function_Reference/wp_nav_menu register_nav_menus：http://codex.wordpress.org/Function_Reference/register_nav_menus 组件模式： 考虑到目前绝大多数主题模板均不支持新版的菜单系统所以 WordPress 3.0 添加了一个专门为菜单系统使用的 Widget 小组件叫 CustomMenu 定制菜单，对于不支持新菜单系统的主题使用者仍然可以在后台 外观 &#8211; 菜单 页面创建一个新的菜单，然后使用 CustomMenu Widget 加载到页面的小组件区域显示，正式版加入的这个小组件使得目前所有的主题无需任何修改即可平滑的支持新版菜单系统，之前在 RC 版则需要为主题添加 add_theme_support(&#8216;nav-menus&#8217;) 语句才能开启菜单系统，但使用组件的缺点是显而易见的，使用者只能将菜单放置到小工具的位置以固定的结构显示，这个时候其实和之前的链接 Links Widget 小组件并没有什麽区别甚至可定制性更差，所以我们需要对主题模板做一些修改使其支持最新版的 WordPress 菜单系统。 菜单简介： 之前 WordPress 的链接功能虽然可以实现部分菜单的功能，因为我也发现很多主题开发者使用链接功能来使用户可以方便的定制自己的导航和菜单，在新版 WordPress 中则提供了更为自由和先进的菜单系统，就像我之前所说的他为主题开发者和模板使用者直接架起了又一座友好的桥梁，使开发者不用为了一个菜单或导航的变动而修改源代码，用户可以根据自己的情况随时 添加 删除 排序 [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://wordpress.org/">WordPress.org</a> 昨天释放了 3.0 的正式版的更新，在新版 WordPress 中引入了一个新的系统 “MENU” 菜单系统 WP 的新菜单系统和 Drupal 及其他 CMS 的菜单系统功能基本相同但使用上更为方便也使 WordPress 在主题开发者和用户使用者直接建立了又一座友好的桥梁，下面提供一些代码给主题（theme）开发者尽快将你的主题升级开启（menu）菜单系统的支持……<span id="more-1271"></span></p>
<h3>函数语法：</h3>
<blockquote>
<p>Menus SubPanel：<a href="http://goo.gl/f7Gk">http://codex.wordpress.org/Appearance_Menus_SubPanel</a></p>
<p>wp_nav_menu：<a href="http://goo.gl/rcrE">http://codex.wordpress.org/Function_Reference/wp_nav_menu</a></p>
<p>register_nav_menus：<a href="http://goo.gl/RUmG">http://codex.wordpress.org/Function_Reference/register_nav_menus</a></p>
</blockquote>
<h3>组件模式：</h3>
<p>考虑到目前绝大多数主题模板均不支持新版的菜单系统所以 WordPress 3.0 添加了一个专门为菜单系统使用的 Widget 小组件叫 CustomMenu 定制菜单，对于不支持新菜单系统的主题使用者仍然可以在后台 外观 &#8211; 菜单 页面创建一个新的菜单，然后使用 CustomMenu Widget 加载到页面的小组件区域显示，正式版加入的这个小组件使得目前所有的主题无需任何修改即可平滑的支持新版菜单系统，之前在 RC 版则需要为主题添加 add_theme_support(&#8216;nav-menus&#8217;) 语句才能开启菜单系统，但使用组件的缺点是显而易见的，使用者只能将菜单放置到小工具的位置以固定的结构显示，这个时候其实和之前的链接 Links Widget 小组件并没有什麽区别甚至可定制性更差，所以我们需要对主题模板做一些修改使其支持最新版的 WordPress 菜单系统。</p>
<h3>菜单简介：</h3>
<p>之前 WordPress 的链接功能虽然可以实现部分菜单的功能，因为我也发现很多主题开发者使用链接功能来使用户可以方便的定制自己的导航和菜单，在新版 WordPress 中则提供了更为自由和先进的菜单系统，就像我之前所说的他为主题开发者和模板使用者直接架起了又一座友好的桥梁，使开发者不用为了一个菜单或导航的变动而修改源代码，用户可以根据自己的情况随时 添加 删除 排序 层级 排列菜单系统，更可以直接在后台页面设置一些菜单属性如 打开方式 菜单描述 链接关系 等等，而这一切只需要添加很少的代码即可实现……</p>
<h3>基本运用：</h3>
<p>例如，我们在 WP 后台的 外观 &#8211; 菜单 页面添加了一个新的菜单其名称为 “菜单示例” 然后在主题模板中就可以使用 wp_nav_menu(&#8216;menu&#8217; => &#8216;菜单示例&#8217;) 来直接调用这个菜单不过具体操作中尽量不要使用中文，因为默认该函数会以菜单名称做为 class 或者 id 的一部分，虽然可以使用参数 container_class 来覆写最外层的 class 但下一级的 ul 仍会引用菜单名称为 id 的一部分。</p>
<h3>高级应用：</h3>
<p>但显然该方式并不灵活，因为我们的开发者需要告知用户创建菜单的名称是什麽，双方必须有一个约定期间如果有任何差别菜单都不会被正确的显示，这可不是我们所需要的于是更高级的应用则是使用 register_nav_menus 函数为主题注册一个菜单位置（Theme Locations）然后由用户来觉得将哪个菜单什么样的菜单放置到这个主题位置中去，这有点类似 drupal 中的区块（block）概念，这是一个平滑友好的接口：</p>
<p>首先，需要在主题中注册声明菜单位置：需要在你的主题模板 functions.php 中添加一个新的注册语句 register_nav_menus 该函数接收一个数组参数做为注册的菜单项，例要添加两个菜单一个用于导航一个用于页脚链接如 register_nav_menus(array(&#8216;topMenu&#8217; => &#8216;导航&#8217;, &#8216;subMenu&#8217; => &#8216;页脚&#8217;)) 其中参数数组的下标用于在内部程序调用数组内容则显示给后台用户，添加该语句之后就可以在后台 外观 &#8211; 菜单 界面看到 Theme Locations 选择区块了，里面也可以看到我们新添加的这两个菜单位置一个叫导航另一个页脚；</p>
<p>然后，需要在主题模板文件中调用菜单：开发者可根据自己的需求在需要显示菜单的位置使用 wp_nav_menu 函数调用输出由用户自行配置的菜单如要输出导航位置的菜单可使用 wp_nav_menu(array(&#8216;theme_location&#8217; => &#8216;topMenu&#8217;)) 使用参数 theme_location 来指定前面声明的菜单位置，这样就建立了一个很好的中间层帮助用户和开发者处理菜单链接的问题。</p>
<h3>补充说明：</h3>
<p>另外 wp_nav_menu 也支持很多参数可供调用如：参数 container_id 和 container_class 用来定义输出的菜单外层标签属性；参数 container 用来定义菜单外层的 HTML 标签类型如 div 等等；参数 menu_id 和 menu_class 可用来定义菜单 ul 的 class 属性；参数 echo 可控制返回 return 还是直接输出我觉得 WP 的多数函数都应该添加该参数或者都改为 return 返回方式就像 drupal 一样返回值而不是输出；另外还有很多参数可从本文开头提供的链接查询。</p>
]]></content:encoded>
			<wfw:commentRss>http://nan.im/blog/1271/feed</wfw:commentRss>
		<slash:comments>1</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】后台 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】中使用 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】基于分类 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>
		<item>
		<title>如何在 WordPress 安装目录外调用 WP 函数</title>
		<link>http://nan.im/blog/1200</link>
		<comments>http://nan.im/blog/1200#comments</comments>
		<pubDate>Sat, 06 Feb 2010 15:17:18 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[网站前端]]></category>
		<category><![CDATA[CODE 代码]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Theme Template 主题模板]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://anyliv.com/blog/?p=1200</guid>
		<description><![CDATA[通常我们会把 WordPress 安装到站点根域名的 /blog/ 目录，这样将非常方便以后拓展其他站点功能，可如果要在站点的根目录如 “/” 调用最新发布的文章该怎么办？大概有这么几种方法：最为直接的方法是使用 PHP 读取 WordPress 数据库的 posts 表取出最新更新的内容；另一种使用 PHP 或者 JavaScript 抓出 WordPress 的 RSS 订阅内容；第三种方法就是我下面要介绍的直接使用 WordPress 自带函数在非安装目录输出想要的内容…… 代码很简单：require(&#8216;/blog/wp-blog-header.php&#8217;) 在要使用 WP 函数的页面直接 require 引入 wp-blog-header.php 文件即可，具体路径根据情况修改。 引入 wp-blog-header.php 文件之后就可以在该页面使用诸如 get_archives(&#8216;postbypost&#8217;, 10) 之类的 WordPress 自带函数了，非常方便！]]></description>
			<content:encoded><![CDATA[<p>通常我们会把 WordPress 安装到站点根域名的 /blog/ 目录，这样将非常方便以后拓展其他站点功能，可如果要在站点的根目录如 “/” 调用最新发布的文章该怎么办？大概有这么几种方法：最为直接的方法是使用 PHP 读取 WordPress 数据库的 posts 表取出最新更新的内容；另一种使用 PHP 或者 JavaScript 抓出 WordPress 的 RSS 订阅内容；第三种方法就是我下面要介绍的直接使用 WordPress 自带函数在非安装目录输出想要的内容……<span id="more-1200"></span></p>
<p>代码很简单：require(&#8216;/blog/wp-blog-header.php&#8217;) 在要使用 WP 函数的页面直接 require 引入 wp-blog-header.php 文件即可，具体路径根据情况修改。</p>
<p>引入 wp-blog-header.php 文件之后就可以在该页面使用诸如 get_archives(&#8216;postbypost&#8217;, 10) 之类的 WordPress 自带函数了，非常方便！</p>
]]></content:encoded>
			<wfw:commentRss>http://nan.im/blog/1200/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>如何使用 PHP 在自己网站上显示最新的微博</title>
		<link>http://nan.im/blog/1198</link>
		<comments>http://nan.im/blog/1198#comments</comments>
		<pubDate>Tue, 26 Jan 2010 15:29:18 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[网站前端]]></category>
		<category><![CDATA[CODE 代码]]></category>
		<category><![CDATA[Develop 开发]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Sina 新浪]]></category>

		<guid isPermaLink="false">http://anyliv.com/blog/?p=1198</guid>
		<description><![CDATA[最近发现 twitter 上朋友越来越冷清，大家也都开始无奈的使用 新浪微博 了，但新浪一直没有开发或开放 API 是大家比较郁闷的。这里提供一个我写的小 PHP 函数可以帮大家在自己的站点上显示输出最近更新的微博内容，使用 PHP 获取最新微博的函数为 any_get_weibo($sinaId, $listNs) 参数分别是你的新浪微博数字 ID 和需要显示的微博条数，由于新浪小组件的限制条数不能超过 15 条…… 具体代码如下： function any_get_weibo($sinaId, $listNs){ $output = ' '; $gethtm = file_get_contents('http://v.t.sina.com.cn/widget/widget_blog.php?uid='. $sinaId .''); // 这里从一个新浪小组件里调用数据来源可以减少一定的数据流也可以避免跳到登陆页； $tempOp = explode(' ', $gethtm); for($n = 1; $n]]></description>
			<content:encoded><![CDATA[<p>最近发现 twitter 上朋友越来越冷清，大家也都开始无奈的使用 <a href="http://t.sina.com.cn/">新浪微博</a> 了，但新浪一直没有开发或开放 API 是大家比较郁闷的。这里提供一个我写的小 PHP 函数可以帮大家在自己的站点上显示输出最近更新的微博内容，使用 PHP 获取最新微博的函数为 any_get_weibo($sinaId, $listNs) 参数分别是你的新浪微博数字 ID 和需要显示的微博条数，由于新浪小组件的限制条数不能超过 15 条……<span id="more-1198"></span></p>
<p>具体代码如下：</p>
<pre lang="php" line="1">
function any_get_weibo($sinaId, $listNs){
	$output  = '
<ul>';
	$gethtm  = file_get_contents('http://v.t.sina.com.cn/widget/widget_blog.php?uid='. $sinaId .'');
		// 这里从一个新浪小组件里调用数据来源可以减少一定的数据流也可以避免跳到登陆页；
	$tempOp  = explode('
<p class="wgtCell_txt">', $gethtm);
	for($n = 1; $n <= $listNs; $n++){
		$tempTs  = explode('

', $tempOp[$n]);
		$output .= '
<li>'.$tempTs[0].'</li>

';
	}
	$output .= '</ul>

<a href="http://t.sina.com.cn/'.$sinaId.'/profile">more...</a>';
	return $output;
}
</pre>
<p>简单说明：有了上面的函数就可以使用 any_get_weibo($sinaId, $listNs) 函数来直接获取你的最新微博内容了，其中 $sinaId 是你的新浪微博 ID 这里的 ID 不是个性化域名里面的 URL 而是诸如 1503269170 类似的数字 ID 否则将可能无法获取数据，获取这个数字 ID 可以在“关注”或者“粉丝”的页面地址 URL 里面很容易找到；后面的 $listNs 是打算获取多少条微博，由于新浪这个 widget 最多只输出 15 条微博，所以这个变量不能超过 15 条，否则将无法获取。</p>
<p>拓展一下：另外也可以举一反三，利用 twitter 的 feed 地址 http://search.twitter.com/search.atom?q=from:anyLiv&#038;rpp=1 也可以取到用户名为 anyLiv 的最新 tweet 内容了。这里这个小函数只是一个简单的实现，原理是把新浪那个小组件输出的整个页面拔下来然后按照一些规律截取出自己需要的内容，自己使用的时候当然可以加一些修饰或者截取一下输出内容的长度及使用 &#038;showpic=0 参数控制以哪种方式显示图片等等就看自己需求了，顺便抱怨一下新浪既然已经做了微博为什麽不开放 API 呢……</p>
]]></content:encoded>
			<wfw:commentRss>http://nan.im/blog/1198/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

