<?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; Theme Template 主题模板</title>
	<atom:link href="http://nan.im/blog/tags/theme/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】移动手机版主题根据 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>酷狗铃声制作专家和 QQ 音乐 去掉广告的方法</title>
		<link>http://nan.im/blog/1183</link>
		<comments>http://nan.im/blog/1183#comments</comments>
		<pubDate>Sun, 03 Jan 2010 08:43:17 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[资源分享]]></category>
		<category><![CDATA[DIY MOD]]></category>
		<category><![CDATA[Download 下载]]></category>
		<category><![CDATA[Mobile Phone 移动电话]]></category>
		<category><![CDATA[Music 音乐]]></category>
		<category><![CDATA[Software 软件]]></category>
		<category><![CDATA[Theme Template 主题模板]]></category>

		<guid isPermaLink="false">http://anyliv.com/blog/?p=1183</guid>
		<description><![CDATA[虽然目前提供手机铃声下载的网站很多很多，但多是需要发短信收费的或者提供的铃声并不能满足自己的需要，这里推荐一个小工具“酷狗铃声制作专家”可以任意截取出整首音乐中自己喜欢的一段并以 MP3 或者 WAV 格式保存，但原软件里面附带大量广告内容，于是花了点时间研究了一下酷狗的皮肤机制，修改了铃声制作专家的皮肤达到去广告的目的，按照惯例修改并不涉及软件 exe 本身仅修改软件皮肤部分，本着“授之以鱼”不如“授之以渔”的知道思想，将具体的修改方法也提供给大家，另外发现 QQ 音乐与其原理类似这里也将 QQ 音乐去广告方法也顺便附上…… 如何去除酷狗广告： 上面的截图就是修改前后的对比图片，除了删除右边的广告通栏以外也删掉了下面的“发送到手机”付费按钮和一些容易误点的链接按钮等等，另外具体去广告的修改方法这里也简单介绍一下吧： 一、修改位置 &#8211; 由于酷狗的皮肤是由扩展名为 skn 格式的压缩文件包提供的，所以我们使用解压缩工具如 WinRAR 等直接打开酷狗目录下面的 skinRes.skn 文件，我们可以看到里面有非常多的图片界面资源，直接打开用来定位这些图片的 xml 格式文件 SkinResDef.xml 找到约 575 行，建议直接搜索“铃声制作”就可以快速定位到需要修改的位置，整个节点 frmRingMain 标签段就是“铃声制作专家”使用的皮肤信息，后面的修改也仅针对该段； 二、如何修改 &#8211; 找到 btnSendToPhone 标签，该标签就是“发送的手机”的按钮定义，修改其 position 属性值为 “0,0,0,0” 即可轻松隐藏掉该按钮；另外 fmRing 和 fmWeb 便是右边的广告部分，同样修改 position 值即可实现隐藏的目的。这里解释一下 position 的属性格式为 “X,Y,W,H” 分别是 X 轴 Y 轴坐标和该控件的 Width 及 [...]]]></description>
			<content:encoded><![CDATA[<p>虽然目前提供手机铃声下载的网站很多很多，但多是需要发短信收费的或者提供的铃声并不能满足自己的需要，这里推荐一个小工具“酷狗铃声制作专家”可以任意截取出整首音乐中自己喜欢的一段并以 MP3 或者 WAV 格式保存，但原软件里面附带大量广告内容，于是花了点时间研究了一下酷狗的皮肤机制，修改了铃声制作专家的皮肤达到去广告的目的，按照惯例修改并不涉及软件 exe 本身仅修改软件皮肤部分，本着“授之以鱼”不如“授之以渔”的知道思想，将具体的修改方法也提供给大家，另外发现 QQ 音乐与其原理类似这里也将 QQ 音乐去广告方法也顺便附上……<span id="more-1183"></span></p>
<p><center><a href="http://anyliv.com/blog/wp-content/uploads/MakeRing-noAds-MOD.jpg" rel="shadowbox[sbpost-1183];player=img;" title="MakeRing-noAds-MOD"><img src="http://anyliv.com/blog/wp-content/uploads/MakeRing-noAds-MOD-300x225.jpg" alt="" title="MakeRing-noAds-MOD" width="300" height="225" class="aligncenter size-thumbnail wp-image-1184" /></a></center></p>
<h3>如何去除酷狗广告：</h3>
<p>上面的截图就是修改前后的对比图片，除了删除右边的广告通栏以外也删掉了下面的“发送到手机”付费按钮和一些容易误点的链接按钮等等，另外具体去广告的修改方法这里也简单介绍一下吧：</p>
<p>一、修改位置 &#8211; 由于酷狗的皮肤是由扩展名为 skn 格式的压缩文件包提供的，所以我们使用解压缩工具如 WinRAR 等直接打开酷狗目录下面的 skinRes.skn 文件，我们可以看到里面有非常多的图片界面资源，直接打开用来定位这些图片的 xml 格式文件 SkinResDef.xml 找到约 575 行，建议直接搜索“铃声制作”就可以快速定位到需要修改的位置，整个节点 frmRingMain 标签段就是“铃声制作专家”使用的皮肤信息，后面的修改也仅针对该段；</p>
<p>二、如何修改 &#8211; 找到 btnSendToPhone 标签，该标签就是“发送的手机”的按钮定义，修改其 position 属性值为 “0,0,0,0” 即可轻松隐藏掉该按钮；另外 fmRing 和 fmWeb 便是右边的广告部分，同样修改 position 值即可实现隐藏的目的。这里解释一下 position 的属性格式为 “X,Y,W,H” 分别是 X 轴 Y 轴坐标和该控件的 Width 及 Height 定义，所以修改为 0 即可实现将控件定位在左上角并且宽高为 0 的目的，当然坐标修改为 “负值” 可能更好；</p>
<p>三、完善一下 &#8211; 按照上面的方法可以找到软件界面上任意控件的坐标位置及大小尺寸信息修改即可，但修改后会发现最外面整个软件的边框会较大，里面有很多空白，这里直接修改 frmRingMain 属性 position 后面两个值即可如 “0,0,500,400” 即可轻松调整整个界面的大小。</p>
<p>掌握上面一些小窍门即可轻松修改所有 skn 格式的皮肤并去除软件附带的广告控件，还自己一个清新绿色的软件，类似的软件有：酷狗音乐、QQ Music 等等。如果不想自己动手嫌麻烦的话可以直接下载我后面提供的修改好的 “酷狗铃声制作专家去广告版” 提取自最新的 <a href="http://www.kugou.com/">酷狗音乐</a> 但精简了所有与铃声制作无关的文件，无需安装酷狗原版，直接下载解压即可使用。</p>
<p>铃声制作专家下载：<a href="http://u.115.com/file/bhzzocop">http://u.115.com/file/bhzzocop</a>（绿色无广告清爽版）</p>
<h3>如何去除 QQ 音乐广告：</h3>
<p>由于 QQ 音乐的皮肤也采用此种方案，这里顺便补充关于 QQ 音乐如何去广告：找到 QQ 音乐默认皮肤 QQMusic\QQMusicSkin\Default\List 路径下的 config.xml 文件删除里面的两个广告标记 Color 和 DlgItem 标签约 8 &#8211; 14 行然后修改上面的三个 DlgItem 标签将 height 属性值由 179 改为 242 即可看见清爽无广告的 QQ Music 了，享受没有广告的清爽 QQ 音乐吧，这里有个贴士是使用 QQ 音乐在线听歌会在以下路径生成大量临时文件：“C:\Users\用户名\AppData\Roaming\Tencent\QQMusic\cache” 大家可以根据具体情况自行清理……</p>
]]></content:encoded>
			<wfw:commentRss>http://nan.im/blog/1183/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>【WordPress】如何给 WP 增加单篇文章的分页功能</title>
		<link>http://nan.im/blog/1180</link>
		<comments>http://nan.im/blog/1180#comments</comments>
		<pubDate>Sat, 02 Jan 2010 14:12:10 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[网站前端]]></category>
		<category><![CDATA[CODE 代码]]></category>
		<category><![CDATA[Develop 开发]]></category>
		<category><![CDATA[Theme Template 主题模板]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://anyliv.com/blog/?p=1180</guid>
		<description><![CDATA[目前的 WordPress 虽然内核早已支持文章分页功能，但后台编辑器的分页按钮一直被注释掉，包括官方附带模板在内的绝大多数模板也并不支持文章分页功能。这里提供一些代码帮助你修改模板使你的 WordPress 前端支持单文章分页符的显示，后台编辑器上也添加分页符添加按钮等功能，而重要的是不涉及 WordPress 核心代码，未来升级 WordPress 将不需要修改这些代码…… 一、首先是为后台的管理页面添加一个 JavaScript 的入口，代码添加于主题的 functions.php 文件中： if(is_admin()){ wp_enqueue_script('admins', WP_CONTENT_URL.'/.../jquery.admin.dev.js', array('jquery'), '0.0.9', true); } 其实直接添加后面的 js 代码到管理页底部也可以，但为了以后为后台管理页添加 js 的方便，还是单独放一个文件吧。这里用到了 WordPress 中用来引入 JavaScript 的 wp_enqueue_script 函数和判断是否是管理页面的 is_admin 函数。 二、然后是为文章 HTML 编辑器添加 nextpage 按钮，代码添加到上面引入的 admin.dev.js 文件中： if(anyBar = document.getElementById("ed_toolbar")){ var barSize = edButtons.length; var barLast = anyBar.lastChild; edButtons[edButtons.length] = new [...]]]></description>
			<content:encoded><![CDATA[<p>目前的 WordPress 虽然内核早已支持文章分页功能，但后台编辑器的分页按钮一直被注释掉，包括官方附带模板在内的绝大多数模板也并不支持文章分页功能。这里提供一些代码帮助你修改模板使你的 WordPress 前端支持单文章分页符的显示，后台编辑器上也添加分页符添加按钮等功能，而重要的是不涉及 WordPress 核心代码，未来升级 WordPress 将不需要修改这些代码……<span id="more-1180"></span></p>
<p>一、首先是为后台的管理页面添加一个 JavaScript 的入口，代码添加于主题的 functions.php 文件中：</p>
<pre lang="php" line="1">
if(is_admin()){
	wp_enqueue_script('admins', WP_CONTENT_URL.'/.../jquery.admin.dev.js', array('jquery'), '0.0.9', true);
}
</pre>
<p>其实直接添加后面的 js 代码到管理页底部也可以，但为了以后为后台管理页添加 js 的方便，还是单独放一个文件吧。这里用到了 WordPress 中用来引入 JavaScript 的 <a href="http://codex.wordpress.org/Function_Reference/wp_enqueue_script">wp_enqueue_script</a> 函数和判断是否是管理页面的 is_admin 函数。</p>
<p>二、然后是为文章 HTML 编辑器添加 nextpage 按钮，代码添加到上面引入的 admin.dev.js 文件中：</p>
<pre lang="javascript" line="1">
if(anyBar = document.getElementById("ed_toolbar")){
	var barSize = edButtons.length; var barLast = anyBar.lastChild;
	edButtons[edButtons.length] = new edButton("ed_next","page","<! --nextpage-- >","","n");
	while( barLast.nodeType != 1 ){ barLast = barLast.previousSibling; }
	barLast = barLast.cloneNode(true);
	barLast.id = "ed_pag"; barLast._idx = barSize; barLast.value = "PAGE"; barLast.title = "";
	barLast.onclick = function(){ edInsertTag(edCanvas, this._idx); return false; }
	anyBar.appendChild(barLast);
}
</pre>
<p>其实打开 wp-includes 里面 js 目录下的 quicktags.dev.js 会发现里面原本已经有 nextpage 按钮的代码但被注释了，约在 130 行左右，上面用到了一些现成的接口，会把一个 nextpage 按钮添加到 HTML 编辑器的最后面，这样可以在 HTML 编辑器模式非常方便的插入用于分页的 nextpage 标记。上面代码中的 nextpage 按钮两边的空格是为了防止 WordPress 文章输出为注释加的，实际应用时需要删掉。</p>
<p>三、最后是为分页链接提供显示位置，修改模板文件在文章内容输出的后面添加代码，通常是 index.php 中的 the_content 函数输出内容之后，添加一个 <a href="http://codex.wordpress.org/Template_Tags/wp_link_pages">wp_link_pages</a> 函数即可，具体的一些函数参数可从 WordPress 网站参考。</p>
]]></content:encoded>
			<wfw:commentRss>http://nan.im/blog/1180/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

