<?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>Dominic.Xu&#039;s 博客 &#187; Web应用</title>
	<atom:link href="http://xuplus.com/article/category/web/feed" rel="self" type="application/rss+xml" />
	<link>http://xuplus.com</link>
	<description>Web 2.0 生活</description>
	<lastBuildDate>Wed, 24 Aug 2011 05:26:12 +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>用Postgresql作为BIND9 数据存储情况下TXT等包含空格记录的处理</title>
		<link>http://xuplus.com/article/2011/07/a225.html</link>
		<comments>http://xuplus.com/article/2011/07/a225.html#comments</comments>
		<pubDate>Mon, 04 Jul 2011 02:26:10 +0000</pubDate>
		<dc:creator>Dominic</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[Web应用]]></category>
		<category><![CDATA[BIND]]></category>
		<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[spf]]></category>

		<guid isPermaLink="false">http://xuplus.com/article/2011/07/a225.html</guid>
		<description><![CDATA[前段时间尝试用PostgreSQL 作为BIND9的后端数据存储玩玩，发现真不错，需要的Postgresql数据库表结构简单，查询效率高、及时生效。SOA记录也是一条语句，但发送邮件需要的TXT记录出现了问题，按照SPF格式写入了以下TXT记录：“v=spf1 ip4:60.166.118.xxx include:xuplus.com -all”，结果使用nslookup查询出来的情况竟然是这样的： 服务器:&#160; google-public-dns-a.google.com Address:&#160; 8.8.8.8 非权威应答: xuplus.com&#160;&#160;&#160;&#160;&#160; text = &#160;&#160;&#160;&#160;&#160;&#160;&#160; &#34;v=spf1&#34; &#160;&#160;&#160;&#160;&#160;&#160;&#160; &#34;ip4:60.166.118.xxx&#34; &#160;&#160;&#160;&#160;&#160;&#160;&#160; &#34;include:xuplus.com&#34; &#160;&#160;&#160;&#160;&#160;&#160;&#160; &#34;-all&#34; 这样的记录是没有办法使用的，使用SPF记录测试工具（http://www.openspf.org/Tools）是没有办法通过。查阅了一番资料发现无法解决这个问题，翻阅bind9 源代码发现在rdata.c文件的dns_rdata_tofmttext函数中使用了的linebreak就是空格字符，那么向spf这种需要包含空格的记录怎么办呢？经过尝试可以添加斜线(\)作为转义字符，由于数据库记录中斜线也需要转义，所以将记录对应的rdata字段值改成 &#8216;v=spf1\\ ip4:60.166.118.xxx\\ include:xuplus.com\\ -all&#8217;这样的即可，这样之后再次nslookup就可以发现结果正常了： 服务器:&#160; cache2.ahwhtel.net.cn Address:&#160; 202.102.199.68 非权威应答: xuplus.com&#160;&#160;&#160;&#160;&#160; text = &#160;&#160;&#160;&#160;&#160;&#160;&#160; &#34;v=spf1 ip4:60.166.118.xxx include:xuplus.com -all&#34; xuplus.com&#160;&#160;&#160;&#160;&#160; nameserver = dns2.xuplus.com xuplus.com&#160;&#160;&#160;&#160;&#160; nameserver = dns1.xuplus.com dns1.gi-rms.com internet address = 60.166.118.xxx dns2.gi-rms.com internet [...]]]></description>
			<content:encoded><![CDATA[<p>前段时间尝试用PostgreSQL 作为BIND9的后端数据存储玩玩，发现真不错，需要的Postgresql数据库表结构简单，查询效率高、及时生效。SOA记录也是一条语句，但发送邮件需要的TXT记录出现了问题，按照SPF格式写入了以下TXT记录：“v=<a href="http://xuplus.com/article/tag/spf" class="st_tag internal_tag" rel="tag" title="标签 spf 下的日志">spf</a>1 ip4:60.166.118.xxx include:xuplus.com -all”，结果使用nslookup查询出来的情况竟然是这样的：</p>
<blockquote><p>服务器:&#160; google-public-dns-a.google.com      <br />Address:&#160; 8.8.8.8</p>
<p>非权威应答:      <br />xuplus.com&#160;&#160;&#160;&#160;&#160; text =</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; &quot;v=spf1&quot;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &quot;ip4:60.166.118.xxx&quot;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &quot;include:xuplus.com&quot;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &quot;-all&quot;</p>
</blockquote>
<p>这样的记录是没有办法使用的，使用SPF记录测试工具（<a href="http://www.openspf.org/Tools">http://www.openspf.org/Tools</a>）是没有办法通过。查阅了一番资料发现无法解决这个问题，翻阅bind9 源代码发现在rdata.c文件的dns_rdata_tofmttext函数中使用了的linebreak就是空格字符，那么向spf这种需要包含空格的记录怎么办呢？经过尝试可以添加斜线(\)作为转义字符，由于数据库记录中斜线也需要转义，所以将记录对应的rdata字段值改成 &#8216;v=spf1\\ ip4:60.166.118.xxx\\ include:xuplus.com\\ -all&#8217;这样的即可，这样之后再次nslookup就可以发现结果正常了：</p>
<blockquote><p>服务器:&#160; cache2.ahwhtel.net.cn     <br />Address:&#160; 202.102.199.68</p>
<p>非权威应答:     <br />xuplus.com&#160;&#160;&#160;&#160;&#160; text =</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; &quot;v=spf1 ip4:60.166.118.xxx include:xuplus.com -all&quot;</p>
<p>xuplus.com&#160;&#160;&#160;&#160;&#160; nameserver = dns2.xuplus.com     <br />xuplus.com&#160;&#160;&#160;&#160;&#160; nameserver = dns1.xuplus.com      <br />dns1.gi-rms.com internet address = 60.166.118.xxx      <br />dns2.gi-rms.com internet address = 60.166.118.xxx</p>
</blockquote>
<p><a href="http://xuplus.com/article/tag/bind" class="st_tag internal_tag" rel="tag" title="标签 BIND 下的日志">BIND</a> 9也有转移字符：斜线(\)。</p>

	标签： <a href="http://xuplus.com/article/tag/bind" title="BIND" rel="tag">BIND</a>, <a href="http://xuplus.com/article/tag/postgresql" title="PostgreSQL" rel="tag">PostgreSQL</a>, <a href="http://xuplus.com/article/tag/spf" title="spf" rel="tag">spf</a><br />
]]></content:encoded>
			<wfw:commentRss>http://xuplus.com/article/2011/07/a225.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>给CodeIgniter 2.0.1中的PostgreSQL 数据库驱动打两个补丁</title>
		<link>http://xuplus.com/article/2011/03/a223.html</link>
		<comments>http://xuplus.com/article/2011/03/a223.html#comments</comments>
		<pubDate>Sat, 26 Mar 2011 04:32:16 +0000</pubDate>
		<dc:creator>Dominic</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[CodeIgniter]]></category>
		<category><![CDATA[PostgreSQL]]></category>

		<guid isPermaLink="false">http://xuplus.com/article/2011/03/a223.html</guid>
		<description><![CDATA[近期帮朋友用CodeIgniter基于PostgreSQL做了个小东西，发现CodeIgniter2.0.0在实现PostgreSQL数据库驱动是有两个小缺陷。 一个是CI的数据库通用接口insert_batch，CI2.0发布包中的PosgreSQL驱动实现，并没有实现该接口，可以在system\database\drivers\postgre\postgre_driver.php文件中的_insert函数下添加如下函数。 // -------------------------------------------------------------------- /** * Insert_batch statement * * Generates a platform-specific insert string from the supplied data * * @access public * @param string the table name * @param array the insert keys * @param array the insert values * @return string */ function _insert_batch($table, $keys, $values) { return &#34;INSERT INTO &#34;.$table.&#34; (&#34;.implode(', [...]]]></description>
			<content:encoded><![CDATA[<p>近期帮朋友用CodeIgniter基于PostgreSQL做了个小东西，发现CodeIgniter2.0.0在实现PostgreSQL数据库驱动是有两个小缺陷。</p>
<p>一个是CI的数据库通用接口insert_batch，CI2.0发布包中的PosgreSQL驱动实现，并没有实现该接口，可以在system\database\drivers\postgre\postgre_driver.php文件中的_insert函数下添加如下函数。</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:56c1e069-d5d8-441e-a25f-2f25bd6335aa" class="wlWriterEditableSmartContent">
<pre style=" width: 600px; height: 339px;background-color:White;overflow: auto;">
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/

--><span style="color: #000000;">    </span><span style="color: #008000;">//</span><span style="color: #008000;"> --------------------------------------------------------------------</span><span style="color: #008000;">
</span><span style="color: #000000;">    </span><span style="color: #008000;">/*</span><span style="color: #008000;">*
     * Insert_batch statement
     *
     * Generates a platform-specific insert string from the supplied data
     *
     * @access    public
     * @param    string    the table name
     * @param    array    the insert keys
     * @param    array    the insert values
     * @return    string
     </span><span style="color: #008000;">*/</span><span style="color: #000000;">
    </span><span style="color: #0000FF;">function</span><span style="color: #000000;"> _insert_batch(</span><span style="color: #800080;">$table</span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #800080;">$keys</span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #800080;">$values</span><span style="color: #000000;">)
    {
        </span><span style="color: #0000FF;">return</span><span style="color: #000000;"> </span><span style="color: #000000;">&quot;</span><span style="color: #000000;">INSERT INTO </span><span style="color: #000000;">&quot;</span><span style="color: #000000;">.</span><span style="color: #800080;">$table</span><span style="color: #000000;">.</span><span style="color: #000000;">&quot;</span><span style="color: #000000;"> (</span><span style="color: #000000;">&quot;</span><span style="color: #000000;">.</span><span style="color: #008080;">implode</span><span style="color: #000000;">(</span><span style="color: #000000;">'</span><span style="color: #000000;">, </span><span style="color: #000000;">'</span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #800080;">$keys</span><span style="color: #000000;">)</span><span style="color: #000000;">.</span><span style="color: #000000;">&quot;</span><span style="color: #000000;">) VALUES </span><span style="color: #000000;">&quot;</span><span style="color: #000000;">.</span><span style="color: #008080;">implode</span><span style="color: #000000;">(</span><span style="color: #000000;">'</span><span style="color: #000000;">, </span><span style="color: #000000;">'</span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #800080;">$values</span><span style="color: #000000;">);
    }
    </span><span style="color: #008000;">//</span><span style="color: #008000;"> --------------------------------------------------------------------</span><span style="color: #008000;">
</span></div>
</pre>
<p><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --></div>
<p>另一个是insert_id()函数，该函数如果在数据表没有serial字段可能无法返回数值，导致问题，特别是主从表而从表不需要serial字段的情况下。</p>
<p>如果碰到这个问题可以把原来的：</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:ef1bb250-26e5-4a8d-be70-b94787eb5ee2" class="wlWriterEditableSmartContent">
<pre style=" width: 600px; height: 160px;background-color:White;overflow: auto;">
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/

--><span style="color: #0000FF;">elseif</span><span style="color: #000000;"> (</span><span style="color: #800080;">$table</span><span style="color: #000000;"> </span><span style="color: #000000;">!=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">null</span><span style="color: #000000;"> </span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;"> </span><span style="color: #800080;">$column</span><span style="color: #000000;"> </span><span style="color: #000000;">!=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">null</span><span style="color: #000000;"> </span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;"> </span><span style="color: #800080;">$v</span><span style="color: #000000;"> </span><span style="color: #000000;">&gt;=</span><span style="color: #000000;"> </span><span style="color: #000000;">'</span><span style="color: #000000;">8.0</span><span style="color: #000000;">'</span><span style="color: #000000;">)
        {
            </span><span style="color: #800080;">$sql</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #008080;">sprintf</span><span style="color: #000000;">(</span><span style="color: #000000;">&quot;</span><span style="color: #000000;">SELECT pg_get_serial_sequence('%s','%s') as seq</span><span style="color: #000000;">&quot;</span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #800080;">$table</span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #800080;">$column</span><span style="color: #000000;">);
            </span><span style="color: #800080;">$query</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">$this</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">query(</span><span style="color: #800080;">$sql</span><span style="color: #000000;">);
            </span><span style="color: #800080;">$row</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">$query</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">row();
            </span><span style="color: #800080;">$sql</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #008080;">sprintf</span><span style="color: #000000;">(</span><span style="color: #000000;">&quot;</span><span style="color: #000000;">SELECT CURRVAL('%s') as ins_id</span><span style="color: #000000;">&quot;</span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #800080;">$row</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">seq);
        }</span></div>
</pre>
<p><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --></div>
<p>修改成：</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:a019abdb-182a-4895-b778-f4fe70626d09" class="wlWriterEditableSmartContent">
<pre style=" width: 600px; height: 195px;background-color:White;overflow: auto;">
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/

--><span style="color: #000000;">        </span><span style="color: #0000FF;">elseif</span><span style="color: #000000;"> (</span><span style="color: #800080;">$table</span><span style="color: #000000;"> </span><span style="color: #000000;">!=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">null</span><span style="color: #000000;"> </span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;"> </span><span style="color: #800080;">$column</span><span style="color: #000000;"> </span><span style="color: #000000;">!=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">null</span><span style="color: #000000;"> </span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;"> </span><span style="color: #800080;">$v</span><span style="color: #000000;"> </span><span style="color: #000000;">&gt;=</span><span style="color: #000000;"> </span><span style="color: #000000;">'</span><span style="color: #000000;">8.0</span><span style="color: #000000;">'</span><span style="color: #000000;">)
        {
            </span><span style="color: #800080;">$sql</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #008080;">sprintf</span><span style="color: #000000;">(</span><span style="color: #000000;">&quot;</span><span style="color: #000000;">SELECT pg_get_serial_sequence('%s','%s') as seq</span><span style="color: #000000;">&quot;</span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #800080;">$table</span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #800080;">$column</span><span style="color: #000000;">);
            </span><span style="color: #800080;">$query</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">$this</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">query(</span><span style="color: #800080;">$sql</span><span style="color: #000000;">);
            </span><span style="color: #800080;">$row</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">$query</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">row();
            </span><span style="color: #0000FF;">if</span><span style="color: #000000;">(</span><span style="color: #800080;">$row</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">seq</span><span style="color: #000000;">!=</span><span style="color: #000000;">''</span><span style="color: #000000;">)
                </span><span style="color: #800080;">$sql</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #008080;">sprintf</span><span style="color: #000000;">(</span><span style="color: #000000;">&quot;</span><span style="color: #000000;">SELECT CURRVAL('%s') as ins_id</span><span style="color: #000000;">&quot;</span><span style="color: #000000;">,</span><span style="color: #000000;"> </span><span style="color: #800080;">$row</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">seq);
            </span><span style="color: #0000FF;">else</span><span style="color: #000000;">
                </span><span style="color: #800080;">$sql</span><span style="color: #000000;">=</span><span style="color: #000000;">'</span><span style="color: #000000;">SELECT LASTVAL() as ins_id</span><span style="color: #000000;">'</span><span style="color: #000000;">;
        }</span></div>
</pre>
<p><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --></div>

	标签： <a href="http://xuplus.com/article/tag/codeigniter" title="CodeIgniter" rel="tag">CodeIgniter</a>, <a href="http://xuplus.com/article/tag/postgresql" title="PostgreSQL" rel="tag">PostgreSQL</a><br />
]]></content:encoded>
			<wfw:commentRss>http://xuplus.com/article/2011/03/a223.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CentOS下redmine、apache、svn配置安装心得</title>
		<link>http://xuplus.com/article/2011/01/a221.html</link>
		<comments>http://xuplus.com/article/2011/01/a221.html#comments</comments>
		<pubDate>Tue, 18 Jan 2011 07:43:19 +0000</pubDate>
		<dc:creator>Dominic</dc:creator>
				<category><![CDATA[Web应用]]></category>
		<category><![CDATA[软件应用]]></category>
		<category><![CDATA[RedMine]]></category>
		<category><![CDATA[SELinux]]></category>
		<category><![CDATA[SVN]]></category>

		<guid isPermaLink="false">http://xuplus.com/article/2011/01/a221.html</guid>
		<description><![CDATA[CentOS默认开启了SELinux，安装Redmine、apache、svn之类的还是蛮复杂的，经过几次折腾之后，终于顺利将redmine折腾成功了，有些心得记录下来备查： 集成方案大体为： a) svn和apache集成，通过http协议访问svn，svn使用域名svn.test.com，仓库访问路径为：http://svn.test.com/XXXX b) svn通过Perl和redmine的数据库集成提供身份和权限认证，仓库访问用户名和密码由redmine中创建的用户和密码访问，可访问项目仓库受redmine控制 c) redmine用mongrel_rails 运行于3000端口 d) apache使用proxy模块将pms.image-pro.com.cn的80端口反向代理到redmine的3000端口 e) 每5分钟通过cron的形式将redmine中项目信息同步到svn中 1、不要使用passenger集成Apache，使用反向代理方式集成Apache 官方指南中使用passenger来和Apache集成，但是passenger跟SELinux集成是很困难正常运行的，解决办法需要将SELinux更改为permissive模式（编辑 /etc/sysconfig/selinux文件修改为SELINUX=permissive），然而使用Apache的反向代理向rails转发却简单得多。 这种方式需要开启redmine的“启用用于版本库管理的Web Service”功能，设置方式为安装完成之后，用admin账号登陆redmine，进入“管理”-&#62;“配置”-&#62;“版本库”设置页面开启“启用用于版本库管理的Web Service”选项，并生成一个API Key，这个API key有用。 相关virtualhost配置节点如下： &#60;VirtualHost *:80&#62; ServerAdmin bbs@test.com DocumentRoot &#34;/var/www/redmine&#34; ServerName pms.test.com ErrorLog &#34;logs/pms.test.com-error.log&#34; CustomLog &#34;logs/pms.test.com-access.log&#34; combined &#60;Location /sys&#62; Order deny,allow Allow from 127.0.0.1 Deny from all &#60;/Location&#62; ProxyPass / http://localhost:3000/ ProxyPassReverse / http://localhost:3000/ &#60;/VirtualHost&#62; 这里Allow from跟上面说的一样，最好添加服务器的ip通过，这样一个Location节点即可完成SVN设置，保证redmine中看到的svn仓库地址和SVN客户端（例如：TortoiseSVN）中使用的svn仓库地址一致（都是http://svn.test.com/XXXXX，而不是一个/svn-private/XXX,一个/svn/XXXX），而且svn仓库地址也够简洁。 [...]]]></description>
			<content:encoded><![CDATA[<p>CentOS默认开启了SELinux，安装Redmine、<a href="http://xuplus.com/article/tag/apache" class="st_tag internal_tag" rel="tag" title="标签 apache 下的日志">apache</a>、svn之类的还是蛮复杂的，经过几次折腾之后，终于顺利将redmine折腾成功了，有些心得记录下来备查：</p>
<p>集成方案大体为：</p>
<p>a) svn和apache集成，通过http协议访问svn，svn使用域名svn.test.com，仓库访问路径为：http://<a href="http://xuplus.com/article/tag/svn" class="st_tag internal_tag" rel="tag" title="标签 SVN 下的日志">svn</a>.test.com/XXXX</p>
<p>b) svn通过Perl和redmine的数据库集成提供身份和权限认证，仓库访问用户名和密码由redmine中创建的用户和密码访问，可访问项目仓库受redmine控制</p>
<p>c) redmine用mongrel_rails 运行于3000端口</p>
<p>d) apache使用proxy模块将pms.image-pro.com.cn的80端口反向代理到redmine的3000端口</p>
<p>e) 每5分钟通过cron的形式将redmine中项目信息同步到svn中</p>
<h3>1、不要使用passenger集成Apache，使用反向代理方式集成Apache</h3>
<p>官方指南中使用passenger来和Apache集成，但是passenger跟SELinux集成是很困难正常运行的，解决办法需要将SELinux更改为permissive模式（编辑</p>
<p>/etc/sysconfig/selinux文件修改为SELINUX=permissive），然而使用Apache的反向代理向rails转发却简单得多。</p>
<p>这种方式需要开启redmine的“启用用于版本库管理的Web Service”功能，设置方式为安装完成之后，用admin账号登陆redmine，进入“管理”-&gt;“配置”-&gt;“版本库”设置页面开启“启用用于版本库管理的Web Service”选项，并生成一个API Key，这个API key有用。</p>
<p>相关virtualhost配置节点如下：</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:fe72048e-799b-4af5-980b-2a738bab157a" class="wlWriterEditableSmartContent">
<pre style=" width: 481px; height: 331px;background-color:White;overflow: auto;">
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/

--><span style="color: #000000;">&lt;VirtualHost *:</span><span style="color: #800080;">80</span><span style="color: #000000;">&gt;
    ServerAdmin bbs@test.com
    DocumentRoot </span><span style="color: #800000;">&quot;</span><span style="color: #800000;">/var/www/<a href="http://xuplus.com/article/tag/redmine" class="st_tag internal_tag" rel="tag" title="标签 RedMine 下的日志">redmine</a></span><span style="color: #800000;">&quot;</span><span style="color: #000000;">
    ServerName pms.</span><span style="color: #0000FF;">test</span><span style="color: #000000;">.com
    ErrorLog </span><span style="color: #800000;">&quot;</span><span style="color: #800000;">logs/pms.test.com-error.log</span><span style="color: #800000;">&quot;</span><span style="color: #000000;">
    CustomLog </span><span style="color: #800000;">&quot;</span><span style="color: #800000;">logs/pms.test.com-access.log</span><span style="color: #800000;">&quot;</span><span style="color: #000000;"> combined
   &lt;Location /sys&gt;
      Order deny,allow
      Allow from </span><span style="color: #800080;">127</span><span style="color: #000000;">.</span><span style="color: #800080;">0</span><span style="color: #000000;">.</span><span style="color: #800080;">0</span><span style="color: #000000;">.</span><span style="color: #800080;">1</span><span style="color: #000000;">
      Deny from all
   &lt;/Location&gt;

   ProxyPass / </span><span style="color: #008080;">http:</span><span style="color: #000000;">//</span><span style="color: #008080;">localhost:</span><span style="color: #800080;">3000</span><span style="color: #000000;">/
   ProxyPassReverse / </span><span style="color: #008080;">http:</span><span style="color: #000000;">//</span><span style="color: #008080;">localhost:</span><span style="color: #800080;">3000</span><span style="color: #000000;">/
&lt;/VirtualHost&gt;</span></div>
</pre>
<p><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --></div>
<p>注意：如果/etc/hosts文件中没有解析相关域名到127.0.0.1的话，最好在Allow from后面添加一行让服务器ip可以正常访问。</p>
<h3>2、使用两个virtualhost，分别安装redmine和svn，并使用一个location配置svn</h3>
<p>这样的好处是明显的，svn单独访问也足够间接，不使用svn和svn-private两个Location配置来分别供给SVN客户端和redmine使用。</p>
<p>相关virtualhost配置节点如下：</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:3c4dcdee-e72f-4962-acfd-755b6cf5102a" class="wlWriterEditableSmartContent">
<pre style=" width: 594px; height: 704px;background-color:White;overflow: auto;">
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/

--><span style="color: #000000;">&lt;VirtualHost *:</span><span style="color: #800080;">80</span><span style="color: #000000;">&gt;
    ServerAdmin svn@test.com
    ServerName svn.</span><span style="color: #0000FF;">test</span><span style="color: #000000;">.com
    ErrorLog </span><span style="color: #800000;">&quot;</span><span style="color: #800000;">logs/dummy-svn.test.com-error.log</span><span style="color: #800000;">&quot;</span><span style="color: #000000;">
    CustomLog </span><span style="color: #800000;">&quot;</span><span style="color: #800000;">logs/dummy-svn.test.com-access.log</span><span style="color: #800000;">&quot;</span><span style="color: #000000;"> combined

    PerlLoadModule </span><span style="color: #008080;">Apache2:</span><span style="color: #000000;">:Redmine
    &lt;Location /&gt;
        DAV svn
        SVNParentPath </span><span style="color: #800000;">&quot;</span><span style="color: #800000;">/var/svn</span><span style="color: #800000;">&quot;</span><span style="color: #000000;">
        Order deny,allow
        Deny from all
        Satisfy any

        PerlAccessHandler </span><span style="color: #008080;">Apache:</span><span style="color: #000000;">:</span><span style="color: #008080;">Authn:</span><span style="color: #000000;">:</span><span style="color: #008080;">Redmine:</span><span style="color: #000000;">:access_handler
        PerlAuthenHandler </span><span style="color: #008080;">Apache:</span><span style="color: #000000;">:</span><span style="color: #008080;">Authn:</span><span style="color: #000000;">:</span><span style="color: #008080;">Redmine:</span><span style="color: #000000;">:authen_handler
        AuthType Basic
        AuthName </span><span style="color: #800000;">&quot;</span><span style="color: #800000;">Redmine SVN Repository</span><span style="color: #800000;">&quot;</span><span style="color: #000000;"> 

        #read-only access
        &lt;Limit GET PROPFIND OPTIONS REPORT&gt;
           Require valid-user
           Allow from </span><span style="color: #800080;">127</span><span style="color: #000000;">.</span><span style="color: #800080;">0</span><span style="color: #000000;">.</span><span style="color: #800080;">0</span><span style="color: #000000;">.</span><span style="color: #800080;">1</span><span style="color: #000000;">
           # Allow from another-ip
            Satisfy any
        &lt;/Limit&gt;
        # write access
        &lt;LimitExcept GET PROPFIND OPTIONS REPORT&gt;
          Require valid-user
        &lt;/LimitExcept&gt;

        ## for mysql
        RedmineDSN </span><span style="color: #800000;">&quot;</span><span style="color: #800000;">DBI:mysql:database=redmine;host=localhost</span><span style="color: #800000;">&quot;</span><span style="color: #000000;"> 

        RedmineDbUser </span><span style="color: #800000;">&quot;</span><span style="color: #800000;">redmine</span><span style="color: #800000;">&quot;</span><span style="color: #000000;">
        RedmineDbPass </span><span style="color: #800000;">&quot;</span><span style="color: #800000;">password</span><span style="color: #800000;">&quot;</span><span style="color: #000000;">
  &lt;/Location&gt;
&lt;/VirtualHost&gt;
</span></div>
</pre>
<p><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --></div>
<p>这里Allow from跟上面说的一样，最好添加服务器的ip通过，这样一个Location节点即可完成SVN设置，保证redmine中看到的svn仓库地址和SVN客户端（例如：TortoiseSVN）中使用的svn仓库地址一致（都是http://svn.test.com/XXXXX，而不是一个/svn-private/XXX,一个/svn/XXXX），而且svn仓库地址也够简洁。</p>
<h3>3、如果邮件使用GMail的服务，则需要使用ruby 1.8.7，rails要求2.3.5</h3>
<p>如果默认安装的是ruby 1.8.6则发送邮件的时候会报错，要求先自行starttls命令。必须升级到1.8.7</p>
<p>相关命令：</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:a7220959-88ff-4da7-a70c-8cb440e9e139" class="wlWriterEditableSmartContent">
<pre style=" width: 442px; height: 239px;background-color:White;overflow: auto;">
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/

--><span style="color: #000000;">ftp ftp</span><span style="color: #000000;">.</span><span style="color: #000000;">ruby-lang</span><span style="color: #000000;">.</span><span style="color: #000000;">org
</span><span style="color: #0000FF;">cd</span><span style="color: #000000;"> </span><span style="color: #000000;">/</span><span style="color: #000000;">pub</span><span style="color: #000000;">/</span><span style="color: #000000;">ruby
get ruby-</span><span style="color: #000000;">1.8</span><span style="color: #000000;">.</span><span style="color: #000000;">7</span><span style="color: #000000;">.</span><span style="color: #000000;">pXXX</span><span style="color: #000000;">.</span><span style="color: #000000;">tar</span><span style="color: #000000;">.</span><span style="color: #000000;">gz
tar zxvf ruby-</span><span style="color: #000000;">1.8</span><span style="color: #000000;">.</span><span style="color: #000000;">7</span><span style="color: #000000;">.</span><span style="color: #000000;">pXXX</span><span style="color: #000000;">.</span><span style="color: #000000;">tar</span><span style="color: #000000;">.</span><span style="color: #000000;">gz ruby-</span><span style="color: #000000;">1.8</span><span style="color: #000000;">.</span><span style="color: #000000;">7</span><span style="color: #000000;">.</span><span style="color: #000000;">pXXX
</span><span style="color: #0000FF;">cd</span><span style="color: #000000;"> ruby-</span><span style="color: #000000;">1.8</span><span style="color: #000000;">.</span><span style="color: #000000;">7</span><span style="color: #000000;">.</span><span style="color: #000000;">pXXX
</span><span style="color: #000000;">./</span><span style="color: #000000;">configure --prefix</span><span style="color: #000000;">=/</span><span style="color: #000000;">usr
make
make install
ruby -v
which ruby
</span><span style="color: #0000FF;">cd</span><span style="color: #000000;"> </span><span style="color: #000000;">..</span><span style="color: #000000;">
</span></div>
</pre>
<p><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --></div>
<p>这里XXX是对应的发布版本号，当前是330，需要注意的是有些版本不一定能够正常编译通过，我在测试的时候p160编译就通过不了。</p>
<h3>4、相关SELinux权限设置</h3>
<p>执行以下命令赋予相关目录正确的SELinux属性：</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:c29e3b87-3dc1-4de6-9dd7-bfdf2f8cccfc" class="wlWriterEditableSmartContent">
<pre style=" width: 757px; height: 106px;background-color:White;overflow: auto;">
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/

--><span style="color: #000000;">chcon -u system_u -R -t httpd_log_t /var/www/redmine/log
chcon -u system_u -R -t httpd_tmpfs_t /var/www/redmine/tmp
chcon -u system_u -R -t httpd_sys_script_rw_t /var/www/redmine/files
chcon -u system_u -R -t httpd_sys_script_rw_t /var/www/redmine/public/plugin_assets</span></div>
</pre>
<p><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --></div>
<p>由于svn版本库的SELinux设置比较复杂，可以通过以下命令直接处理完毕</p>
<p>chcon -u system_u -R -h -t httpd_sys_script_rw_t /var/svn<br />
  </p>
<h3>5、redmine跟svn之间有关版本库通过可以通过cron来完成</h3>
<p>cron执行内容如下：</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:a45e6648-8037-4220-b30f-17a3623fcfbd" class="wlWriterEditableSmartContent">
<pre style=" width: 442px; height: 121px;background-color:White;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;overflow: auto;">
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/

--><span style="color: #000000;">0</span><span style="color: #000000;">,</span><span style="color: #000000;">5</span><span style="color: #000000;">,</span><span style="color: #000000;">10</span><span style="color: #000000;">,</span><span style="color: #000000;">15</span><span style="color: #000000;">,</span><span style="color: #000000;">20</span><span style="color: #000000;">,</span><span style="color: #000000;">25</span><span style="color: #000000;">,</span><span style="color: #000000;">30</span><span style="color: #000000;">,</span><span style="color: #000000;">35</span><span style="color: #000000;">,</span><span style="color: #000000;">40</span><span style="color: #000000;">,</span><span style="color: #000000;">45</span><span style="color: #000000;">,</span><span style="color: #000000;">50</span><span style="color: #000000;">,</span><span style="color: #000000;">55</span><span style="color: #000000;"> * * * * </span><span style="color: #000000;">/</span><span style="color: #000000;">usr</span><span style="color: #000000;">/</span><span style="color: #000000;">bin</span><span style="color: #000000;">/</span><span style="color: #000000;">ruby </span><span style="color: #000000;">/</span><span style="color: #000000;">var</span><span style="color: #000000;">/</span><span style="color: #000000;">www</span><span style="color: #000000;">/</span><span style="color: #000000;">redmine</span><span style="color: #000000;">/</span><span style="color: #000000;">extra</span><span style="color: #000000;">/</span><span style="color: #000000;">svn</span><span style="color: #000000;">/</span><span style="color: #000000;">reposman</span><span style="color: #000000;">.</span><span style="color: #000000;">rb --redmine pms</span><span style="color: #000000;">.</span><span style="color: #000000;">test</span><span style="color: #000000;">.</span><span style="color: #000000;">com -k apikey --svn-</span><span style="color: #0000FF;">dir</span><span style="color: #000000;"> </span><span style="color: #000000;">/</span><span style="color: #000000;">var</span><span style="color: #000000;">/</span><span style="color: #000000;">svn --owner apache --url http:</span><span style="color: #000000;">//</span><span style="color: #000000;">svn</span><span style="color: #000000;">.</span><span style="color: #000000;">test</span><span style="color: #000000;">.</span><span style="color: #000000;">com</span><span style="color: #000000;">/</span><span style="color: #000000;"> </span><span style="color: #000000;">&gt;&gt;</span><span style="color: #000000;"> </span><span style="color: #000000;">/</span><span style="color: #000000;">var</span><span style="color: #000000;">/</span><span style="color: #000000;">log</span><span style="color: #000000;">/</span><span style="color: #000000;">reposman</span><span style="color: #000000;">.</span><span style="color: #000000;">log</span></div>
</pre>
<p><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --></div>
<p>其中apikey内容为redmine后台生成的API key，这样每5分钟都会将redmine中的版本库信息同步到svn中（自动创建版本库）</p>
<h3>6、redmine使用mongrel自启动</h3>
<p>安装mongrel之后，使用cron来确保在启动时候自动启动mongrel_rails来启动redmine。</p>
<p>cron执行内容如下：</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:51eee048-f387-4f14-b285-af28b53c1c68" class="wlWriterEditableSmartContent">
<pre style=" width: 442px; height: 72px;background-color:White;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;overflow: auto;">
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/

--><span style="color: #000000;">@reboot </span><span style="color: #0000FF;">cd</span><span style="color: #000000;"> </span><span style="color: #000000;">/</span><span style="color: #000000;">var</span><span style="color: #000000;">/</span><span style="color: #000000;">www</span><span style="color: #000000;">/</span><span style="color: #000000;">redmine</span><span style="color: #000000;">;</span><span style="color: #000000;"> rm -f log</span><span style="color: #000000;">/</span><span style="color: #000000;">mongrel</span><span style="color: #000000;">.</span><span style="color: #000000;">pid</span><span style="color: #000000;">;</span><span style="color: #000000;"> </span><span style="color: #000000;">/</span><span style="color: #000000;">usr</span><span style="color: #000000;">/</span><span style="color: #000000;">bin</span><span style="color: #000000;">/</span><span style="color: #000000;">mongrel_rails </span><span style="color: #0000FF;">start</span><span style="color: #000000;"> -p </span><span style="color: #000000;">3000</span><span style="color: #000000;"> -d -e production</span></div>
</pre>
<p><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --></div>
<h3>7、使用ImageMagick绘制甘特图，需要rMagick 1.5.17版本</h3>
<p>执行以下命令：</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:2f63f43a-e8c9-4b8a-ba85-a83644cf5ce8" class="wlWriterEditableSmartContent">
<pre style=" width: 630px; height: 186px;background-color:White;overflow: auto;">
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/

--><span style="color: #000000;">yum install ImageMagick -y
yum install ImageMagick-devel -y
yum install freetype -y
yum install gd-devel -y
wget </span><span style="color: #008080;">http:</span><span style="color: #000000;">//www.osresources.com/files/centos-windows-fonts/msfonts.tbz
mkdir /usr/share/fonts/default/TrueType
tar xvjpf msfonts.tbz -C /usr/share/fonts/default/TrueType/
gem install rmagick -v=</span><span style="color: #800080;">1</span><span style="color: #000000;">.</span><span style="color: #800080;">15</span><span style="color: #000000;">.</span><span style="color: #800080;">17</span><span style="color: #000000;">

</span></div>
</pre>
<p><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --></div>
<h3>8、Redmine.pm存放文字需要根据实际情况来定</h3>
<p>x64位操作系统perl库文件位置是/usr/lib64/perl5下，perl5.10版本库位置不再是/perl5.8.8，最后位置也不一定是Apache目录，例如：我机器上就是复制到/usr/lib64/perl5/Apache2目录下，所以具体目录应该根据实际情况决定，拷贝完毕之后Apache的相关VirtualHost配置加载的模块语句就有变化了（如上我的变成了Apache::Redmine）。</p>
<p>&#160;</p>
<p>整体来说，安装过程需要仔细，特别是SELinux在某种程度上来说是设置的羁绊，但RedHat等公司开发它肯定有他的安全必要性，所以我们还是完成SELinux环境下安装比较好。</p>
<p>相关可参考官方资源和文档：</p>
<p>Installing Redmine：<a href="http://www.redmine.org/projects/redmine/wiki/RedmineInstall">http://www.redmine.org/projects/redmine/wiki/RedmineInstall</a></p>
<p>How To Automate repository creation：<a href="http://www.redmine.org/projects/redmine/wiki/HowTo_Automate_repository_creation">http://www.redmine.org/projects/redmine/wiki/HowTo_Automate_repository_creation</a></p>
<p>Repositories access control with apache, mod_dav_svn and mod_perl：<a href="http://www.redmine.org/projects/redmine/wiki/HowTo_configure_Redmine_for_advanced_Subversion_integration">http://www.redmine.org/projects/redmine/wiki/HowTo_configure_Redmine_for_advanced_Subversion_integration</a></p>
<p>Email Configuration：<a href="http://www.redmine.org/projects/redmine/wiki/EmailConfiguration">http://www.redmine.org/projects/redmine/wiki/EmailConfiguration</a></p>
<p><a href="http://xuplus.com/article/tag/selinux" class="st_tag internal_tag" rel="tag" title="标签 SELinux 下的日志">SELinux</a>, Subversion and mod_svn：<a href="http://ejohansson.se/archives/2007/11/04/selinux-subversion-and-mod_svn/">http://ejohansson.se/archives/2007/11/04/selinux-subversion-and-mod_svn/</a></p>

	标签： <a href="http://xuplus.com/article/tag/redmine" title="RedMine" rel="tag">RedMine</a>, <a href="http://xuplus.com/article/tag/selinux" title="SELinux" rel="tag">SELinux</a>, <a href="http://xuplus.com/article/tag/svn" title="SVN" rel="tag">SVN</a><br />
]]></content:encoded>
			<wfw:commentRss>http://xuplus.com/article/2011/01/a221.html/feed</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>PayDollar支付通道开发介绍及ECShop开发PayDollar注意事项</title>
		<link>http://xuplus.com/article/2011/01/a201.html</link>
		<comments>http://xuplus.com/article/2011/01/a201.html#comments</comments>
		<pubDate>Tue, 04 Jan 2011 09:09:54 +0000</pubDate>
		<dc:creator>Dominic</dc:creator>
				<category><![CDATA[Web应用]]></category>
		<category><![CDATA[ECShop]]></category>
		<category><![CDATA[PayPal]]></category>

		<guid isPermaLink="false">http://xuplus.com/article/2011/01/a201.html</guid>
		<description><![CDATA[前些时候帮助一个香港朋友开发了ECShop的支付插件，他们使用PayDollar支付网关。 www.paydollar.com联款通有限公司成立于2000年，是领先的世界级电子付款及移动付款解决方案与技术提供应商，亦是香港最大第三方支付平台之一。 「传款易支付网关」是一个完善、综合、安全及提供实时交易的平台，可供银行或支付处理服务机构架设一个可支持多种支付方式的收付款服务，帮助提高商户销量及生产力。 「传款易支付网关」能处理不同渠道的实时支付交易，如网络支付及移动设备支付。也能提供界面连接到各种支付系统主机作为支付授权和结算。 核心功能 支持多语言和多支付模式，提供各类完整的报告 支持多支付模式如:网上交易、离线交易、其他定制化的支付交易 便捷架设及提供多商户连接界面 灵活选择独立支付界面或后端连接界面，商户无须额外投资任何软件 支付方式 VISA / 万事达咭 / 大来信用证JCB 本地银行户口付款 (如PPS) 交易功能 通过网络及移动设备进行电子商务、移动商务、邮购及电话购物 实时撤销及处理退款要求 手动、自动或整批结算选择 电子邮件通知功能 综合商户帐户让商户可以通过不同渠道进行交易管理 完善的交易报告显示销售状况 单笔交易或整批交易资料下载 控制功能 多层式用户群控制管理，可供银行或商户使用 提供安全管理网站给银行及商户 指定商户每比、每日、每月的金额上限 风险控制工具包括:阻挡负面IP及信用卡的交易、实时交易检查及风险警示功能 安全功能 采用128位SSL加密装置 资料库加密 支持VISA验证、SecureCode认证JCB/Jsecure认证服务 PayAlert(实时交易风险检查) 其他增值功能 循环支付设定及管理 自建购物网站和购物交易管理 界面标准 支持ISO 8583和SSL银行支付连接界面 &#160; 总之，在香港它就是像支付宝、快钱这样的第三方支付平台，可对大陆客户提供中国银联网上支付平台、支付宝平台、财付通平台、快钱平台、PayPal平台支付以及Visa、MasterCar、JCB等信用卡直接扣帐支付的一个综合支付交易平台。应该是香港商家对大陆客户提供服务的可靠支付通道。 如果有碰到有朋友或者客户需要使用PayDollar支付平台可以参考一下内容： 一般香港商户在完成在香港的银行开户之后，可以接洽PayDollar，PayDollar之后会发送一个CheckList让香港商户去准备，要求做到以下几点： 一个商户自己的页面（一般有网站即可）； 在页面底部放入PayDollar和相应需要支付平台的Logo（PayDollar必须放，其他Logo要看香港商户跟PayDollar的谈判，如果只有银联平台则只放PayDollar和银联的Logo）； 提供一个包含交易货币的有关货物和服务的描述页面； 提供一个描述退换货、货物配送、使用条款的页面； 提供一个公司联系方式信息页面，至少包含公司地址、email地址和电话号码； 提供一个页面描述支付卡交易策略和安全保障措施（例如：SSL和数据加密，他们会给一个范例）； 提供一个页面描述顾客数据隐私保护策略（例如：Cookies）； 一个购物车 其中，很多条款他们都提供了参考页面，购物车可以实现也可以不实现，只要有购买页面即可。就是为了满足这个需要踩帮助香港的朋友使用了ECShop，谁知道ECShop并没有PayDollar支付插件，网上可以找到一些PayDollar的支付代码（ShopEx的插件代码），但是已经不能和PayDollar现在的支付网关适应了。 准备好之后，PayDollar会开通商户的支付功能，并提供一个商户号（Merchant [...]]]></description>
			<content:encoded><![CDATA[<p>前些时候帮助一个香港朋友开发了ECShop的支付插件，他们使用PayDollar支付网关。</p>
<p>www.paydollar.com联款通有限公司成立于2000年，是领先的世界级电子付款及移动付款解决方案与技术提供应商，亦是香港最大第三方支付平台之一。    </p>
<p>「传款易支付网关」是一个完善、综合、安全及提供实时交易的平台，可供银行或支付处理服务机构架设一个可支持多种支付方式的收付款服务，帮助提高商户销量及生产力。 </p>
<p>「传款易支付网关」能处理不同渠道的实时支付交易，如网络支付及移动设备支付。也能提供界面连接到各种支付系统主机作为支付授权和结算。    </p>
<p><strong>核心功能</strong> </p>
<ul>
<li>支持多语言和多支付模式，提供各类完整的报告 </li>
<li>支持多支付模式如:网上交易、离线交易、其他定制化的支付交易 </li>
<li>便捷架设及提供多商户连接界面 </li>
<li>灵活选择独立支付界面或后端连接界面，商户无须额外投资任何软件      </li>
</ul>
<p><strong>支付方式</strong></p>
<ul>
<li>VISA / 万事达咭 / 大来信用证JCB 本地银行户口付款 (如PPS)      </li>
</ul>
<p><strong>交易功能</strong></p>
<ul>
<li>通过网络及移动设备进行电子商务、移动商务、邮购及电话购物 </li>
<li>实时撤销及处理退款要求 </li>
<li>手动、自动或整批结算选择      </li>
</ul>
<p><strong>电子邮件通知功能</strong></p>
<ul>
<li>综合商户帐户让商户可以通过不同渠道进行交易管理 </li>
<li>完善的交易报告显示销售状况 </li>
<li>单笔交易或整批交易资料下载      </li>
</ul>
<p><strong>控制功能</strong></p>
<ul>
<li>多层式用户群控制管理，可供银行或商户使用 </li>
<li>提供安全管理网站给银行及商户 </li>
<li>指定商户每比、每日、每月的金额上限 </li>
<li>风险控制工具包括:阻挡负面IP及信用卡的交易、实时交易检查及风险警示功能      </li>
</ul>
<p><strong>安全功能</strong></p>
<ul>
<li>采用128位SSL加密装置 </li>
<li>资料库加密 </li>
<li>支持VISA验证、SecureCode认证JCB/Jsecure认证服务 </li>
<li>PayAlert(实时交易风险检查)      </li>
</ul>
<p><strong>其他增值功能</strong></p>
<ul>
<li>循环支付设定及管理 </li>
<li>自建购物网站和购物交易管理 </li>
</ul>
<p><strong>界面标准</strong></p>
<ul>
<li>支持ISO 8583和SSL银行支付连接界面 </li>
</ul>
<p>&#160;</p>
<p>总之，在香港它就是像支付宝、快钱这样的第三方支付平台，可对大陆客户提供中国银联网上支付平台、支付宝平台、财付通平台、快钱平台、PayPal平台支付以及Visa、MasterCar、JCB等信用卡直接扣帐支付的一个综合支付交易平台。应该是香港商家对大陆客户提供服务的可靠支付通道。</p>
<p>如果有碰到有朋友或者客户需要使用PayDollar支付平台可以参考一下内容：</p>
<p> <!-- nextpage -->
<p>一般香港商户在完成在香港的银行开户之后，可以接洽PayDollar，PayDollar之后会发送一个CheckList让香港商户去准备，要求做到以下几点：</p>
<ol>
<li>一个商户自己的页面（一般有网站即可）； </li>
<li>在页面底部放入PayDollar和相应需要支付平台的Logo（PayDollar必须放，其他Logo要看香港商户跟PayDollar的谈判，如果只有银联平台则只放PayDollar和银联的Logo）； </li>
<li>提供一个包含交易货币的有关货物和服务的描述页面； </li>
<li>提供一个描述退换货、货物配送、使用条款的页面； </li>
<li>提供一个公司联系方式信息页面，至少包含公司地址、email地址和电话号码； </li>
<li>提供一个页面描述支付卡交易策略和安全保障措施（例如：SSL和数据加密，他们会给一个范例）； </li>
<li>提供一个页面描述顾客数据隐私保护策略（例如：Cookies）； </li>
<li>一个购物车 </li>
</ol>
<p>其中，很多条款他们都提供了参考页面，购物车可以实现也可以不实现，只要有购买页面即可。就是为了满足这个需要踩帮助香港的朋友使用了ECShop，谁知道ECShop并没有PayDollar支付插件，网上可以找到一些PayDollar的支付代码（ShopEx的插件代码），但是已经不能和PayDollar现在的支付网关适应了。</p>
<p>准备好之后，PayDollar会开通商户的支付功能，并提供一个商户号（Merchant Id），我们还需要发送邮件到<a href="mailto:service@paydollar.com">service@paydollar.com</a>，要求开通商户帐号的哈希码安全认证功能（为了确保支付安全还是开通了好）</p>
<p>在给ECShop开发PayDollar支付插件有以下几个问题树妖注意：</p>
<ol>
<li>PayDollar对于每一个币种都是单独的商户号也对应不同的哈希码安全认证； </li>
<li>PayDollar现在支持哈希码安全认证功能，且哈希算法变成了SHA1，哈希码安全认证有效期两年； </li>
<li>PayDollar的跳转商户页面和PayDollar返回支付成功信息页面是两个页面； </li>
<li>PayDollar有关哈希码安全认证功能中各个参数有变化（相对网上可以搜索到的ShopEx的插件代码），连接字符串已经变成了竖线|而不是&amp;符号； </li>
<li>提供给PayDollar的交易返回页面是需要在PayDollar管理系统中设置的，而不是在代码中指定的，PayDollar是通过Post方法来将数据提交到这个指定URL； </li>
<li>如果不是使用Client通过浏览器Post的方式支付，则需要自己实现支付页面（可自己实现信用卡信息填写页面，做3DS验证）。 </li>
</ol>
<p>在给ECShop开发插件过程中我给上面第三条和第五条搞败了，ECShop接收返回信息是通过/respond.php文件再调用includes/modules/payment/paydollar.php中的respond()方法的，开始的时候我并不知道这样，这样直接导致需要单独给一个文件给PayDollar来处理支付通知信息，respond()方法中只提供支付成败信息然后让respond.php输出支付成败提示信息，respond.php文件还一定得显示respond.dwt这个Smarty模板文件。为了偷懒，我在在respond()方法中通过判断回传参数来区分是PayDollar直接跳转的还是Post回传的。设置PayDollar系统中返回链接方式如下：</p>
<p>登录PayDollar之后，在“商家资料”页面，点击“支付选项”，进入设置页面，填入对应的链接地址，选中右侧的“可用”，点击“更新”按钮再在后续页面点击“确定”按钮即可，如下图：</p>
<p><a href="http://xuplus.com/uploads/2011/01/paydollar_setting.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="paydollar_setting" border="0" alt="paydollar_setting" src="http://xuplus.com/uploads/2011/01/paydollar_setting_thumb.png" width="505" height="160" /></a></p>
<p>这样就可以正常实现支付了。附件中是PayDollar集成开发的文档，仅供参考，文档主要有：</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:ba859874-17a3-44ae-a535-7cd67bb0b417" class="wlWriterEditableSmartContent">
<pre style=" width: 579px; height: 340px;background-color:White;overflow: auto;">
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/

--><span style="color: #000000;">├─开源购物车插件
│      Magento PayDollar_v1</span><span style="color: #000000;">.</span><span style="color: #000000;">zip
│      OpenCart PayDollar_v148b</span><span style="color: #000000;">.</span><span style="color: #000000;">zip
│      oscommerce paydollar v2</span><span style="color: #000000;">.</span><span style="color: #000000;">3</span><span style="color: #000000;">.</span><span style="color: #000000;">zip
│      PayDollar_开源购物车集成指南_v2</span><span style="color: #000000;">.</span><span style="color: #000000;">pdf
│      VirtueMart_PayDollar</span><span style="color: #000000;">.</span><span style="color: #000000;">zip
│      virtuemart_payment_extra_info</span><span style="color: #000000;">.</span><span style="color: #000000;">txt
│      ZenCart paydollar_payment_module_1-</span><span style="color: #000000;">0</span><span style="color: #000000;">.</span><span style="color: #000000;">zip
│
├─技术文档
│      付款流程概述</span><span style="color: #000000;">.</span><span style="color: #000000;">pdf
│      传款易定时付款用户指南SchedulePay_V1</span><span style="color: #000000;">.</span><span style="color: #000000;">6</span><span style="color: #000000;">.</span><span style="color: #000000;">pdf
│      传款易批事务处理用户指南V1</span><span style="color: #000000;">.</span><span style="color: #000000;">0</span><span style="color: #000000;">.</span><span style="color: #000000;">pdf
│      传款易集成指南 _v3</span><span style="color: #000000;">.</span><span style="color: #000000;">7_</span><span style="color: #000000;">.</span><span style="color: #000000;">pdf
│
├─接口代码例子
│      asp_DirectClientPost</span><span style="color: #000000;">.</span><span style="color: #000000;">zip
│      asp_SimpleClientPost</span><span style="color: #000000;">.</span><span style="color: #000000;">zip
│      Csharp_DirectClientPost</span><span style="color: #000000;">.</span><span style="color: #000000;">zip
│      Csharp_DirectServerSide</span><span style="color: #000000;">.</span><span style="color: #000000;">zip
│      Csharp_SimpleClientPost</span><span style="color: #000000;">.</span><span style="color: #000000;">zip
│      java_DirectClientPost</span><span style="color: #000000;">.</span><span style="color: #000000;">zip
│      java_DirectServerSide</span><span style="color: #000000;">.</span><span style="color: #000000;">zip
│      java_SimpleClientPost</span><span style="color: #000000;">.</span><span style="color: #000000;">zip
│      <a href="http://xuplus.com/article/tag/php" class="st_tag internal_tag" rel="tag" title="标签 PHP 下的日志">php</a>_DirectClientPost</span><span style="color: #000000;">.</span><span style="color: #000000;">zip
│      php_DirectServerSide</span><span style="color: #000000;">.</span><span style="color: #000000;">zip
│      php_SimpleClientPost</span><span style="color: #000000;">.</span><span style="color: #000000;">zip
│
└─文件
        Bank required checklist items</span><span style="color: #000000;">.</span><span style="color: #000000;">pdf
        FAQ_for_Alipay_By_PayDollar</span><span style="color: #000000;">.</span><span style="color: #000000;">pdf
        Logo使用说明</span><span style="color: #000000;">.</span><span style="color: #000000;">txt
        PayDollar_商户操作指南_v3-</span><span style="color: #000000;">5</span><span style="color: #000000;">.</span><span style="color: #000000;">pdf
        PayDollar_操作指南</span><span style="color: #000000;">.</span><span style="color: #000000;">pdf
        退款手续_v1</span><span style="color: #000000;">.</span><span style="color: #000000;">pdf</span></div>
</pre>
<p><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --></div>
<p>下载地址：<a href="http://cid-2b707ffec38c35d2.office.live.com/self.aspx/Public/%E7%BD%91%E7%BB%9C%E5%85%B1%E4%BA%AB/PayDollar%E9%9B%86%E6%88%90%E8%B5%84%E6%96%99.rar">PayDollar集成资料.rar</a></p>

	标签： <a href="http://xuplus.com/article/tag/ecshop" title="ECShop" rel="tag">ECShop</a>, <a href="http://xuplus.com/article/tag/paypal" title="PayPal" rel="tag">PayPal</a><br />
]]></content:encoded>
			<wfw:commentRss>http://xuplus.com/article/2011/01/a201.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Drupal6中启用文章内容多语言支持的方法</title>
		<link>http://xuplus.com/article/2010/11/a173.html</link>
		<comments>http://xuplus.com/article/2010/11/a173.html#comments</comments>
		<pubDate>Wed, 17 Nov 2010 03:40:52 +0000</pubDate>
		<dc:creator>Dominic</dc:creator>
				<category><![CDATA[Drupal]]></category>
		<category><![CDATA[多语言]]></category>

		<guid isPermaLink="false">http://xuplus.com/article/2010/11/a173.html</guid>
		<description><![CDATA[这两天尝试Drupal6，想分析看一下Drupal6中对于多语言内容是如何支持的？参照了网上hsiao blog的一系列文章： durpal建设多语言站点之一 drupal建立多语言站点之二：使用Localization client模块 durpal建立多语言站点之三：内容多语言 drupal建设多语言站点之四：不同语言的站点名称 但是他的文章主要描述了站点多语言的支持“durpal建立多语言站点之三：内容多语言”这篇文章却并没有讲解怎么开启内容多语言，第二幅图片中却有“Translate”的链接。相当奇怪！ Drupal 6中包含了Content Translation模块，该模块允许网站内容翻译成不同语言，它和本地化模块 （Locale模块，负责管理多语言，并提供多语言网站翻译接口）协同工作，它是创建和维护多语言内容站点的关键。Drupal默认并没有开启该模块功能，要正确开启该模块功能，需要进行以下操作： 在站点构建中的模块管理中启用“Content translation”模块，如果安装列i18n模块，建议同时启用“Content type translation”模块； 在“权限”配置页面权限给适当的用户角色分配“翻译内容”权限； “语言”的配置页面中新增并启用的所需要的语言； 在管理-&#62;内容管理-&#62;内容类型页面中，点击要支持多语言功能的内容类型（例如：Page和Story）右侧的“编辑”按钮，然后在“流程设置”折叠框中的“多语言支持”选中“启用，与翻译一起”。 这样在创建或者编辑文章的时候会出现一个语言下拉框和翻译链接，如下图： 点击“翻译”链接进入翻译查看页面可以看到如下页面： 点击旁边“添加翻译”链接或者“编辑”页面就可以进入其他语言内容编辑页面了。 标签： Drupal, 多语言]]></description>
			<content:encoded><![CDATA[<p>这两天尝试Drupal6，想分析看一下Drupal6中对于多语言内容是如何支持的？参照了网上hsiao blog的一系列文章：    <br /><u><strong><a href="http://hi.baidu.com/yxiaoyxiao/blog/item/a7a7d3954b2d6f41d0135e69.html">durpal建设多语言站点之一</a></strong></u>     <br /><u><strong><a href="http://hi.baidu.com/yxiaoyxiao/blog/item/0d19b277882c7b11b051b9ba.html">drupal建立多语言站点之二：使用Localization client模块</a></strong></u>     <br /><u><strong><a href="http://hi.baidu.com/yxiaoyxiao/blog/item/1db379d021b75985a1ec9c30.html">durpal建立多语言站点之三：内容多语言</a></strong></u>     <br /><u><strong><a href="http://hi.baidu.com/yxiaoyxiao/blog/item/7267ccca93e9c14cf21fe7a6.html">drupal建设多语言站点之四：不同语言的站点名称</a></strong></u></p>
<p>但是他的文章主要描述了站点多语言的支持“durpal建立多语言站点之三：内容多语言”这篇文章却并没有讲解怎么开启内容多语言，第二幅图片中却有“Translate”的链接。相当奇怪！</p>
<p><a href="http://xuplus.com/article/tag/drupal" class="st_tag internal_tag" rel="tag" title="标签 Drupal 下的日志">Drupal</a> 6中包含了Content Translation模块，该模块允许网站内容翻译成不同语言，它和本地化模块 （Locale模块，负责管理多语言，并提供多语言网站翻译接口）协同工作，它是创建和维护多语言内容站点的关键。Drupal默认并没有开启该模块功能，要正确开启该模块功能，需要进行以下操作：</p>
<ol>
<li>在站点构建中的模块管理中启用“Content translation”模块，如果安装列i18n模块，建议同时启用“Content type translation”模块； </li>
<li>在“权限”配置页面权限给适当的用户角色分配“翻译内容”权限； </li>
<li>“语言”的配置页面中新增并启用的所需要的语言； </li>
<li>在管理-&gt;内容管理-&gt;内容类型页面中，点击要支持多语言功能的内容类型（例如：Page和Story）右侧的“编辑”按钮，然后在“流程设置”折叠框中的“多语言支持”选中“启用，与翻译一起”。 </li>
</ol>
<p>这样在创建或者编辑文章的时候会出现一个语言下拉框和翻译链接，如下图：</p>
<p><a href="http://xuplus.com/uploads/2010/11/image.png"><img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://xuplus.com/uploads/2010/11/image_thumb.png" width="244" height="229" /></a></p>
<p>点击“翻译”链接进入翻译查看页面可以看到如下页面：</p>
<p><a href="http://xuplus.com/uploads/2010/11/image1.png"><img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://xuplus.com/uploads/2010/11/image_thumb1.png" width="244" height="61" /></a></p>
<p>点击旁边“添加翻译”链接或者“编辑”页面就可以进入其他语言内容编辑页面了。</p>

	标签： <a href="http://xuplus.com/article/tag/drupal" title="Drupal" rel="tag">Drupal</a>, <a href="http://xuplus.com/article/tag/%e5%a4%9a%e8%af%ad%e8%a8%80" title="多语言" rel="tag">多语言</a><br />
]]></content:encoded>
			<wfw:commentRss>http://xuplus.com/article/2010/11/a173.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Xoops中获取模块配置参数的方法。</title>
		<link>http://xuplus.com/article/2008/03/a92.html</link>
		<comments>http://xuplus.com/article/2008/03/a92.html#comments</comments>
		<pubDate>Fri, 28 Mar 2008 02:59:54 +0000</pubDate>
		<dc:creator>Dominic</dc:creator>
				<category><![CDATA[XOOPS]]></category>
		<category><![CDATA[参数]]></category>

		<guid isPermaLink="false">http://xuplus.com/article/2008/03/a92.html</guid>
		<description><![CDATA[Xoops群（53219504，17380705）中有人询问在开发的时候，怎样获取在xoops_version.php中添加的参数值。其实Xoops中统一管理模块的参数是非常好的一种做法（将在下一个平台性项目中借鉴这个做法），获取的方法也非常简单，针对不同的情况可以分别实现如下： 1、更改现有模块代码，且现有模块代码中包含了全局性变量$xoopsModuleConfig的情况 这种情况比较简单： global $xoopsModuleConfig; $configvalue=$xoopsModuleConfig["xxxx"]; //xxxx为xoops_vesion.php中定义的参数对应名称 2、现有模块代码中不包含$xoopsModuleConfig或者自行开发简单模块且不使用Framework $module_handler = &#38;xoops_gethandler('module');//获取module句柄$module_handler $module = $module_handler-&#62;getByDirname("xxx");//xxx为模块目录名称，获取特定module操作句柄$module $config_handler = &#38;xoops_gethandler('config');//获取config的句柄$config_handler $criteria = new CriteriaCompo(new Criteria('conf_modid', $module-&#62;getVar('mid')));// 根据上述module的id构建查询参数$criteria $configs =&#38; $config_handler-&#62;getConfigs($criteria);//用config句柄获得特定module的参数配置结果集 foreach(array_keys($configs) as $i) { $moduleConfig[$configs[$i]-&#62;getVar('conf_name')] = $configs[$i]-&#62;getConfValueForOutput();//转化成数组 } unset($configs); 之后直接使用$moduleConfig['xxxx']就可以访问了，也可以把$moduleConfig设置为全局变量。 3、使用Framework的模块 load_functions("config"); $moduleConfig = mod_loadConfg("moduledirname"); 使用Framework的情况可以参考article中代码。 标签： XOOPS, 参数]]></description>
			<content:encoded><![CDATA[<p>Xoops群（53219504，17380705）中有人询问在开发的时候，怎样获取在xoops_version.php中添加的参数值。其实Xoops中统一管理模块的参数是非常好的一种做法（将在下一个平台性项目中借鉴这个做法），获取的方法也非常简单，针对不同的情况可以分别实现如下：</p>
<p>1、更改现有模块代码，且现有模块代码中包含了全局性变量$xoopsModuleConfig的情况</p>
<p>这种情况比较简单：</p>
<pre class="csharpcode">global $xoopsModuleConfig;
$configvalue=$xoopsModuleConfig[<span class="str">"xxxx"</span>];
//xxxx为xoops_vesion.php中定义的参数对应名称</pre>
<p>2、现有模块代码中不包含$xoopsModuleConfig或者自行开发简单模块且不使用Framework</p>
<pre class="csharpcode">$module_handler = &amp;<a href="http://xuplus.com/article/tag/xoops" class="st_tag internal_tag" rel="tag" title="标签 XOOPS 下的日志">xoops</a>_gethandler(<span class="str">'module'</span>);<span class="rem">//获取module句柄$module_handler</span>
$module = $module_handler-&gt;getByDirname(<span class="str">"xxx"</span>);<span class="rem">//xxx为模块目录名称，获取特定module操作句柄$module</span>
$config_handler = &amp;xoops_gethandler(<span class="str">'config'</span>);<span class="rem">//获取config的句柄$config_handler</span>
$criteria = <span class="kwrd">new</span> CriteriaCompo(<span class="kwrd">new</span> Criteria(<span class="str">'conf_modid'</span>, $module-&gt;getVar(<span class="str">'mid'</span>)));<span class="rem">// 根据上述module的id构建查询参数$criteria</span>
$configs =&amp; $config_handler-&gt;getConfigs($criteria);<span class="rem">//用config句柄获得特定module的参数配置结果集</span>

<span class="kwrd">foreach</span>(array_keys($configs) <span class="kwrd">as</span> $i)
{
$moduleConfig[$configs[$i]-&gt;getVar(<span class="str">'conf_name'</span>)] = $configs[$i]-&gt;getConfValueForOutput();<span class="rem">//转化成数组</span>
}
unset($configs);</pre>
<p>之后直接使用$moduleConfig['xxxx']就可以访问了，也可以把$moduleConfig设置为全局变量。</p>
<p>3、使用Framework的模块</p>
<pre class="csharpcode">load_functions(<span class="str">"config"</span>);
$moduleConfig = mod_loadConfg(<span class="str">"moduledirname"</span>);</pre>
<p>使用Framework的情况可以参考article中代码。</p>
<style type="text/css">
.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }
</style>

	标签： <a href="http://xuplus.com/article/tag/xoops" title="XOOPS" rel="tag">XOOPS</a>, <a href="http://xuplus.com/article/tag/%e5%8f%82%e6%95%b0" title="参数" rel="tag">参数</a><br />
]]></content:encoded>
			<wfw:commentRss>http://xuplus.com/article/2008/03/a92.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>[Hack]Xoops中article模块分类显示页面同时显示子分类文章的方法</title>
		<link>http://xuplus.com/article/2007/12/a79.html</link>
		<comments>http://xuplus.com/article/2007/12/a79.html#comments</comments>
		<pubDate>Thu, 27 Dec 2007 05:02:55 +0000</pubDate>
		<dc:creator>Dominic</dc:creator>
				<category><![CDATA[XOOPS]]></category>
		<category><![CDATA[article模块]]></category>
		<category><![CDATA[Hack]]></category>

		<guid isPermaLink="false">http://xuplus.com/article/2007/12/a79.html</guid>
		<description><![CDATA[D.J.老大的article模组确实好用，但是在分类文章列表显示页面view.category.php这个文件中却只显示给定栏目ID的文章和子分类列表及子分类文章数。虽然个人比较喜欢这种方式，但这种方式并不适合目前国内流行文章管理系统在显示栏目的文章方式，一般的网站在现实栏目时需要将分类的子分类文章也同时显示出来。 针对目前大多数都是采用两级分类的方式，我对view.category.php做了一些Hack: 1、在view.category.php 97行附近修改如下： $counts_category =&#38; $category_handler-&#62;getCategoryCounts(array_keys($categories), &#34;access&#34;); &#160;&#160;&#160; //Add By XuYong 获取子栏目下给定篇数文章 &#160;&#160;&#160; $articles_perpage = (empty($start) &#38;&#38; empty($list)) ? $xoopsModuleConfig[&#34;articles_category&#34;] : $xoopsModuleConfig[&#34;articles_perpage&#34;]; &#160;&#160;&#160; //End Add foreach( $categories as $id=&#62;$cat){ &#160;&#160;&#160; //Add By XuYong 获取子栏目下给定篇数文章 &#160;&#160;&#160; $subcriteria = new CriteriaCompo(new Criteria(&#34;ac.ac_publish&#34;, 0, &#34;&#62;&#34;)); &#160;&#160;&#160; $subarticle_id =&#38; $article_handler-&#62;getIdsByCategory($cat, $articles_perpage, 0, $subcriteria); &#160;&#160;&#160; if(count($subarticle_id)&#62;0){ &#160;&#160;&#160;&#160;&#160;&#160;&#160; $criteria = [...]]]></description>
			<content:encoded><![CDATA[<p>D.J.老大的article模组确实好用，但是在分类文章列表显示页面view.category.php这个文件中却只显示给定栏目ID的文章和子分类列表及子分类文章数。虽然个人比较喜欢这种方式，但这种方式并不适合目前国内流行文章管理系统在显示栏目的文章方式，一般的网站在现实栏目时需要将分类的子分类文章也同时显示出来。</p>
<p>针对目前大多数都是采用两级分类的方式，我对view.category.php做了一些Hack:</p>
<p>1、在view.category.<a href="http://xuplus.com/article/tag/php" class="st_tag internal_tag" rel="tag" title="标签 PHP 下的日志">php</a> 97行附近修改如下：</p>
<p>$counts_category =&amp; $category_handler-&gt;getCategoryCounts(array_keys($categories), &quot;access&quot;);    <br />&#160;&#160;&#160; //Add By XuYong 获取子栏目下给定篇数文章 </p>
<p>&#160;&#160;&#160; $articles_perpage = (empty($start) &amp;&amp; empty($list)) ? $xoopsModuleConfig[&quot;articles_category&quot;] : $xoopsModuleConfig[&quot;articles_perpage&quot;];    <br />&#160;&#160;&#160; //End Add </p>
<p>foreach( $categories as $id=&gt;$cat){    <br />&#160;&#160;&#160; //Add By XuYong 获取子栏目下给定篇数文章     <br />&#160;&#160;&#160; $subcriteria = new CriteriaCompo(new Criteria(&quot;ac.ac_publish&quot;, 0, &quot;&gt;&quot;));     <br />&#160;&#160;&#160; $subarticle_id =&amp; $<a href="http://xuplus.com/article/tag/article" class="st_tag internal_tag" rel="tag" title="标签 article 下的日志">article</a>_handler-&gt;getIdsByCategory($cat, $articles_perpage, 0, $subcriteria);     <br />&#160;&#160;&#160; if(count($subarticle_id)&gt;0){     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; $criteria = new Criteria(&quot;art_id&quot;, &quot;(&quot;.implode(&quot;,&quot;,$subarticle_id).&quot;)&quot;, &quot;IN&quot;);     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; $tags = array(&quot;uid&quot;, &quot;writer_id&quot;, &quot;art_title&quot;, &quot;art_summary&quot;, &quot;art_image&quot;, &quot;art_pages&quot;, &quot;art_categories&quot;, &quot;art_time_publish&quot;, &quot;art_counter&quot;, &quot;art_comments&quot;, &quot;art_trackbacks&quot;);     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; $subarticles_obj =&amp; $article_handler-&gt;getAll($criteria, $tags);     <br />&#160;&#160;&#160; }else{     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; $subarticles_obj = array();     <br />&#160;&#160;&#160; } </p>
<p>&#160;&#160;&#160; $subcatarticles = array();    <br />&#160;&#160;&#160; foreach ($subarticle_id as $id) {     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; $_article = array(     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &quot;id&quot;&#160;&#160;&#160;&#160;&#160;&#160;&#160; =&gt; $id,     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &quot;title&quot;&#160;&#160;&#160;&#160;&#160;&#160;&#160; =&gt; $subarticles_obj[$id]-&gt;getVar(&quot;art_title&quot;),     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &quot;time&quot;&#160;&#160;&#160;&#160;&#160;&#160;&#160; =&gt; $subarticles_obj[$id]-&gt;getTime($xoopsModuleConfig[&quot;timeformat&quot;]),     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &quot;image&quot;&#160;&#160;&#160;&#160;&#160;&#160;&#160; =&gt; $subarticles_obj[$id]-&gt;getImage(),     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &quot;counter&quot;&#160;&#160;&#160; =&gt; $subarticles_obj[$id]-&gt;getVar(&quot;art_counter&quot;),     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &quot;comments&quot;&#160;&#160;&#160; =&gt; $subarticles_obj[$id]-&gt;getVar(&quot;art_comments&quot;),     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &quot;trackbacks&quot;=&gt; $subarticles_obj[$id]-&gt;getVar(&quot;art_trackbacks&quot;)     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; );     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; if(!empty($xoopsModuleConfig[&quot;display_summary&quot;])){     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; $_article[&quot;summary&quot;] = $subarticles_obj[$id]-&gt;getSummary(true);     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; }     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; $subcatarticles[$id] = $_article;     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; unset($_article);     <br />&#160;&#160;&#160; } </p>
<p>&#160;&#160;&#160; //End Add    <br />&#160;&#160;&#160; $subcategories[] = array(     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &quot;id&quot;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; =&gt; $cat-&gt;getVar(&quot;cat_id&quot;),     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &quot;title&quot;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; =&gt; $cat-&gt;getVar(&quot;cat_title&quot;),     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &quot;articles&quot;&#160;&#160;&#160;&#160;&#160;&#160;&#160; =&gt; @intval($counts_article[$cat-&gt;getVar(&quot;cat_id&quot;)]),     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &quot;categories&quot;&#160;&#160;&#160; =&gt; @intval($counts_category[$cat-&gt;getVar(&quot;cat_id&quot;)]),     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &quot;subcatart&quot;&#160; =&gt; $subcatarticles     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; );     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; //Add By XuYong 获取子栏目下给定篇数文章     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; unset($subcatarticles);     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; //End Add     <br />}     <br />unset($criteria);     <br />$criteria = new CriteriaCompo(new Criteria(&quot;ac.ac_feature&quot;, 0, &quot;&gt;&quot;));     <br />$criteria-&gt;setSort(&quot;ac.ac_feature&quot;); </p>
<p>2、修改模板文件article_category.html文件，134行附近修改如下：</p>
<p>&lt;{if count($categories) gt 0}&gt;    <br />&lt;div id=&quot;category&quot; class=&quot;article-category&quot;&gt; </p>
<p>&#160;&#160;&#160; &lt;{foreachq item=cat name=cat from=$categories}&gt;    <br />&#160;&#160;&#160; &lt;div class=&quot;category-header tdbg4&quot; stype=&quot;width:80%&quot;&gt;     <br />&lt;span class=&quot;sizscolor&quot;&gt;&lt;b&gt;&lt;a href=&quot;&lt;{$<a href="http://xuplus.com/article/tag/xoops" class="st_tag internal_tag" rel="tag" title="标签 XOOPS 下的日志">xoops</a>_url}&gt;/modules/&lt;{$<a href="http://xuplus.com/article/tag/xoops" class="st_tag internal_tag" rel="tag" title="标签 XOOPS 下的日志">xoops</a>_dirname}&gt;/view.category.php&lt;{$smarty.const.URL_DELIMITER}&gt;c&lt;{$cat.id}&gt;/list&quot;&gt;&lt;{$cat.title}&gt;&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;     <br />&#160;&#160;&#160; &lt;/div&gt; </p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;{if count($cat.subcatart) gt 0}&gt;    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;div id=&quot;article_&lt;{$cat.id}&gt;&quot; class=&quot;article-article&quot;&gt;     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;table width=&quot;95%&quot; border=&quot;0&quot; align=&quot;center&quot; cellspacing=&quot;0&quot;&gt;     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;{foreachq item=article from=$cat.subcatart}&gt;     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;tr class=&quot;tdlist&quot;&gt;     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;td&#160; width=&quot;86%&quot; height=&quot;24&quot; class=&quot;tdlist&quot;&gt;&#183;&lt;a href=&quot;&lt;{$xoops_url}&gt;/modules/&lt;{$xoops_dirname}&gt;/view.article.php&lt;{$smarty.const.URL_DELIMITER}&gt;&lt;{$article.id}&gt;&quot;&gt;&lt;{$article.title}&gt;&lt;/a&gt;     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;{if $article.image}&gt;&lt;img src=&quot;&lt;{$xoops_url}&gt;/modules/&lt;{$xoops_dirname}&gt;/images/image.gif&quot; width=&quot;12px&quot; alt=&quot;&quot; /&gt;&lt;{/if}&gt;     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/td&gt;     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;td width=&quot;14%&quot; height=&quot;2&quot; class=&quot;tdlist&quot;&gt;&lt;{$article.time|date_format:&quot;%y-%d-%m&quot;}&gt;&lt;/td&gt;     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/tr&gt;     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;{/foreach}&gt;     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/table&gt;     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/div&gt;     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;{/if}&gt;     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;div class=&quot;article-section-title&quot;&gt;     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;span class=&quot;subject&quot;&gt; &lt;/span&gt;     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;span class=&quot;navigation&quot;&gt;&lt;a href=&quot;&lt;{$xoops_url}&gt;/modules/&lt;{$xoops_dirname}&gt;/view.category.php&lt;{$smarty.const.URL_DELIMITER}&gt;c&lt;{$cat.id}&gt;/list&quot;&gt;&lt;{$smarty.const._MORE}&gt;&lt;/a&gt;     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/span&gt;     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/div&gt;     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;div class=&quot;clear&quot;&gt;&lt;/div&gt;     <br />&#160;&#160;&#160; &lt;{/foreach}&gt; </p>
<p>&lt;/div&gt;    <br />&lt;{/if}&gt;</p>
<p>其中有些样式和一些修改是根据当前需要改的，需要根据自身情况调整。</p>
<p>效果demo；</p>
<p><a href="http://xuplus.com/uploads/2007/12/view-category-hack-demo.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="430" alt="view_category_hack_demo" src="http://xuplus.com/uploads/2007/12/view-category-hack-demo-thumb.jpg" width="505" border="0" /></a> </p>
<p>&#160;</p>
<p>Hack后的iview.category.php和模板文件下载：<iframe style="border-right: #dde5e9 1px solid; padding-right: 0px; border-top: #dde5e9 1px solid; padding-left: 0px; padding-bottom: 0px; margin: 3px; border-left: #dde5e9 1px solid; width: 240px; padding-top: 0px; border-bottom: #dde5e9 1px solid; height: 66px; background-color: #ffffff" marginwidth="0" marginheight="0" src="http://cid-2b707ffec38c35d2.skydrive.live.com/embedrowdetail.aspx/Public/%e7%bd%91%e7%bb%9c%e5%85%b1%e4%ba%ab/view_category_hack_withsubcatart.rar" frameborder="0" scrolling="no"></iframe></p>

	标签： <a href="http://xuplus.com/article/tag/article%e6%a8%a1%e5%9d%97" title="article模块" rel="tag">article模块</a>, <a href="http://xuplus.com/article/tag/hack" title="Hack" rel="tag">Hack</a>, <a href="http://xuplus.com/article/tag/xoops" title="XOOPS" rel="tag">XOOPS</a><br />
]]></content:encoded>
			<wfw:commentRss>http://xuplus.com/article/2007/12/a79.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Xoops中weblinks模组1.13版简体中文UTF8字符集乱码解决及语言包</title>
		<link>http://xuplus.com/article/2007/12/a76.html</link>
		<comments>http://xuplus.com/article/2007/12/a76.html#comments</comments>
		<pubDate>Wed, 26 Dec 2007 13:10:00 +0000</pubDate>
		<dc:creator>Dominic</dc:creator>
				<category><![CDATA[XOOPS]]></category>
		<category><![CDATA[utf8]]></category>
		<category><![CDATA[weblinks]]></category>
		<category><![CDATA[乱码]]></category>

		<guid isPermaLink="false">http://xuplus.com/article/2007/12/a76.html</guid>
		<description><![CDATA[今天xoops.org.cn上有人说道weblinksV1.13版本在用UTF8字符集的时候碰到乱码和RSS、ATOM输出乱码的问题，发现手上的一个小东西也存在这样的问题，虽然weblinks模组现在http://ohwada.net推出了1.82.1版本的weblinks模组，但需要装他们的happy_linux模组，而且目前还没有一个简体中文语言包，也就不想升级到新的weblinks模组了。在培训的间隙，花了点时间分析了以下问题，然来是从简体中文gb2312字符集语言包转换成UTF8语言包时候，虽然可以使用了，但是缺少了关键的UTF8转换处理函数（UTF8是不需要再转换的），导致本身就是utf8的字符串被二次编码，就导致乱码了。 解决办法是在weblinks_language_convert.php文件中加入utf8转换函数。需要清除cache目录中对应的缓存文件。 &#160; //Add By Xuyong //utf8 字符集不需要转化 //End Add function convert_from_utf8($text) { &#160;&#160;&#160; return ($text); } function convert_to_utf8($text) { &#160;&#160;&#160; return ($text); } 完整utf8语言包： 标签： utf8, weblinks, 乱码]]></description>
			<content:encoded><![CDATA[<p>今天<a href="http://xoops.org.cn" target="_blank">xoops.org.cn</a>上有人说道weblinksV1.13版本在用UTF8字符集的时候碰到乱码和RSS、ATOM输出乱码的问题，发现手上的一个小东西也存在这样的问题，虽然weblinks模组现在<a title="http://ohwada.net" href="http://ohwada.net">http://ohwada.net</a>推出了1.82.1版本的weblinks模组，但需要装他们的happy_linux模组，而且目前还没有一个简体中文语言包，也就不想升级到新的weblinks模组了。在培训的间隙，花了点时间分析了以下问题，然来是从简体中文gb2312字符集语言包转换成UTF8语言包时候，虽然可以使用了，但是缺少了关键的UTF8转换处理函数（UTF8是不需要再转换的），导致本身就是utf8的字符串被二次编码，就导致乱码了。</p>
<p>解决办法是在weblinks_language_convert.php文件中加入utf8转换函数。需要清除cache目录中对应的缓存文件。</p>
<p>&#160;</p>
<blockquote><p>//Add By Xuyong      <br />//<a href="http://xuplus.com/article/tag/utf8" class="st_tag internal_tag" rel="tag" title="标签 utf8 下的日志">utf8</a> 字符集不需要转化       <br />//End Add       <br />function convert_from_utf8($text)       <br />{       <br />&#160;&#160;&#160; return ($text);       <br />}       <br />function convert_to_utf8($text)       <br />{       <br />&#160;&#160;&#160; return ($text);       <br />} </p>
<p>完整utf8语言包：<iframe style="border-right: #dde5e9 1px solid; padding-right: 0px; border-top: #dde5e9 1px solid; padding-left: 0px; padding-bottom: 0px; margin: 3px; border-left: #dde5e9 1px solid; width: 240px; padding-top: 0px; border-bottom: #dde5e9 1px solid; height: 26px; background-color: #ffffff" marginwidth="0" marginheight="0" src="http://cid-2b707ffec38c35d2.skydrive.live.com/embedrow.aspx/Public/%e7%bd%91%e7%bb%9c%e5%85%b1%e4%ba%ab/weblinksv1.13_schinese_utf8.rar" frameborder="0" scrolling="no"></iframe></p>
</blockquote>

	标签： <a href="http://xuplus.com/article/tag/utf8" title="utf8" rel="tag">utf8</a>, <a href="http://xuplus.com/article/tag/weblinks" title="weblinks" rel="tag">weblinks</a>, <a href="http://xuplus.com/article/tag/%e4%b9%b1%e7%a0%81" title="乱码" rel="tag">乱码</a><br />
]]></content:encoded>
			<wfw:commentRss>http://xuplus.com/article/2007/12/a76.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>hibernate.cfg.xml位置及JDBC配置</title>
		<link>http://xuplus.com/article/2007/12/a68.html</link>
		<comments>http://xuplus.com/article/2007/12/a68.html#comments</comments>
		<pubDate>Sat, 08 Dec 2007 01:48:21 +0000</pubDate>
		<dc:creator>Dominic</dc:creator>
				<category><![CDATA[Web应用]]></category>
		<category><![CDATA[Hibernate]]></category>
		<category><![CDATA[Hibernate JDBC配置]]></category>

		<guid isPermaLink="false">http://xuplus.com/article/2007/12/a68.html</guid>
		<description><![CDATA[项目需要构建一个Java环境，使用Hibernate作为数据持久层，一兄弟按照网上的说法配置了hibernate，结果搞了几天都没搞好，总是报错“Could not find datasource”，最后还是我自己动手在自己机器上配个环境才引导他弄好。 要配好Hibernate首先的弄清楚Java在寻找hibernate.cfg.xml这个文件的时候在哪些目录中寻找，Java将在以下目录中寻找hibernate.cfg.xml这个文件：webappsname/WEB-INF/classes/TOMCATHOME/TOMCATHOME/lib 所以我们的hibernate.cfg.xml务必放在webapp的WEB-INF/classes/目录下了，放在其他目录下都不是很合适。 另外就是关于hibernate.cfg.xml中的jdbc配置了，网上的说法各异，其实最简单的就是在hibernate.cfg.xml中直接使用jdbc配置了，如下：&#60;?xml version=”1.0&#8243;&#160; encoding=”utf-8&#8243;?&#62;&#60;!DOCTYPE hibernate-configuration PUBLIC “-//Hibernate/Hibernate Configuration DTD 3.0//EN” “http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd”&#62;&#60;hibernate-configuration&#62;&#160;&#160;&#160; &#60;session-factory&#62;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#60;property name=”hibernate.connection.driver_class”&#62;com.mysql.jdbc.Driver&#60;/property&#62; &#160;&#160;&#160;&#160;&#160;&#160;&#160; &#60;property name=”hibernate.connection.url”&#62;jdbc:mysql://localhost/test&#60;/property&#62; &#160;&#160;&#160;&#160;&#160;&#160;&#160; &#60;property name=”hibernate.connection.username”&#62;root&#60;/property&#62; &#160;&#160;&#160;&#160;&#160;&#160;&#160; &#60;property name=”hibernate.connection.password” /&#62; &#160;&#160;&#160;&#160;&#160;&#160;&#160; &#60;property name=”show_sql”&#62;false&#60;/property&#62; &#160;&#160;&#160;&#160;&#160;&#160;&#160; &#60;property name=”dialect”&#62;org.hibernate.dialect.MySQLDialect&#60;/property&#62; &#160;&#160;&#160;&#160;&#160;&#160;&#160; &#60;mapping resource=”hb/Cat.hbm.xml” /&#62; &#160;&#160;&#160; &#60;/session-factory&#62;&#60;/hibernate-configuration&#62; 更改其中的driverclass和connection.url、username、password和dialect，再添加一些mapping就可以了，需要注意的是property节点的name属性中最好在前面加上hibernate。有些文章说使用Tomcat的JNDI，不建议这么做。同时要注意的是在hibernate.cfg.xml不要同时使用datasource和连接字符串两种配置（那个兄弟非要使用两种配置结果来不成功），因为没有必要。 其实从部署的角度来看的话，就应该是这样的，首先在生产环境下，很多时候是没有办法拿到Tomcat的管理权限的是配不了JNDI的，而且要去配JNDI无形增加的部署的难度，在hibernate.cfg.xml中配置连接字符串就很方便部署（Hibernate要是像.net中那样支持连接字符串加密就好了）。hibernate.cfg.xml存放的位置也是一样的，放在WEB-INF/classes/目录下，部署的时候只要拷贝webapp整个目录就可以完成部署了。 网上的文章用来做参考最好，很多东西还得靠自己领会，特别是碰到问题的时候，尽心书不如无书嘛（也别太相信我写的，说不定那天不管用了。^_^）。 附：使用Tomcat JNDI 数据源配置方法&#60;?xml version=”1.0&#8243;&#160; encoding=”utf-8&#8243; ?&#62;&#60;!DOCTYPE hibernate-configuration PUBLIC “-//Hibernate/Hibernate Configuration DTD [...]]]></description>
			<content:encoded><![CDATA[<p>项目需要构建一个Java环境，使用Hibernate作为数据持久层，一兄弟按照网上的说法配置了hibernate，结果搞了几天都没搞好，总是报错“Could not find datasource”，最后还是我自己动手在自己机器上配个环境才引导他弄好。</p>
<p>要配好Hibernate首先的弄清楚Java在寻找hibernate.cfg.xml这个文件的时候在哪些目录中寻找，Java将在以下目录中寻找hibernate.cfg.xml这个文件：<br />webappsname/WEB-INF/classes/<br />TOMCATHOME/<br />TOMCATHOME/lib</p>
<p>所以我们的hibernate.cfg.xml务必放在webapp的WEB-INF/classes/目录下了，放在其他目录下都不是很合适。</p>
<p>另外就是关于hibernate.cfg.xml中的jdbc配置了，网上的说法各异，其实最简单的就是在hibernate.cfg.xml中直接使用jdbc配置了，如下：<br />&lt;?xml version=”1.0&#8243;&nbsp; encoding=”utf-8&#8243;?&gt;<br />&lt;!DOCTYPE <a href="http://xuplus.com/article/tag/hibernate" class="st_tag internal_tag" rel="tag" title="标签 Hibernate 下的日志">hibernate</a>-configuration PUBLIC “-//<a href="http://xuplus.com/article/tag/hibernate" class="st_tag internal_tag" rel="tag" title="标签 Hibernate 下的日志">Hibernate</a>/Hibernate Configuration DTD 3.0//EN” “<a href="http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd&quot;">http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd”</a>&gt;<br />&lt;hibernate-configuration&gt;<br />&nbsp;&nbsp;&nbsp; &lt;session-factory&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name=”hibernate.connection.driver_class”&gt;com.mysql.jdbc.Driver&lt;/property&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name=”hibernate.connection.url”&gt;jdbc:mysql://localhost/test&lt;/property&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name=”hibernate.connection.username”&gt;root&lt;/property&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name=”hibernate.connection.password” /&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name=”show_sql”&gt;false&lt;/property&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name=”dialect”&gt;org.hibernate.dialect.MySQLDialect&lt;/property&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;mapping resource=”hb/Cat.hbm.xml” /&gt; <br />&nbsp;&nbsp;&nbsp; &lt;/session-factory&gt;<br />&lt;/hibernate-configuration&gt;</p>
<p>更改其中的driverclass和connection.url、username、password和dialect，再添加一些mapping就可以了，需要注意的是property节点的name属性中最好在前面加上hibernate。有些文章说使用Tomcat的JNDI，不建议这么做。同时要注意的是在hibernate.cfg.xml不要同时使用datasource和连接字符串两种配置（那个兄弟非要使用两种配置结果来不成功），因为没有必要。</p>
<p>其实从部署的角度来看的话，就应该是这样的，首先在生产环境下，很多时候是没有办法拿到Tomcat的管理权限的是配不了JNDI的，而且要去配JNDI无形增加的部署的难度，在hibernate.cfg.xml中配置连接字符串就很方便部署（Hibernate要是像.net中那样支持连接字符串加密就好了）。hibernate.cfg.xml存放的位置也是一样的，放在WEB-INF/classes/目录下，部署的时候只要拷贝webapp整个目录就可以完成部署了。</p>
<p>网上的文章用来做参考最好，很多东西还得靠自己领会，特别是碰到问题的时候，尽心书不如无书嘛（也别太相信我写的，说不定那天不管用了。^_^）。</p>
<p>附：使用Tomcat JNDI 数据源配置方法<br />&lt;?xml version=”1.0&#8243;&nbsp; encoding=”utf-8&#8243; ?&gt;<br />&lt;!DOCTYPE hibernate-configuration PUBLIC “-//Hibernate/Hibernate Configuration DTD 3.0//EN” “<a href="http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd&quot;">http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd”</a>&gt;<br />&lt;hibernate-configuration&gt;<br />&nbsp;&nbsp;&nbsp; &lt;session-factory&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name=”hibernate.connection.datasource”&gt;java:comp/env/jdbc/odbcq&lt;/property&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name=”show_sql”&gt;false&lt;/property&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name=”dialect”&gt;org.hibernate.dialect.MySQLDialect&lt;/property&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;mapping resource=”hb/Cat.hbm.xml” /&gt; <br />&nbsp;&nbsp;&nbsp; &lt;/session-factory&gt;<br />&lt;/hibernate-configuration&gt;</p>

	标签： <a href="http://xuplus.com/article/tag/hibernate" title="Hibernate" rel="tag">Hibernate</a>, <a href="http://xuplus.com/article/tag/hibernate-jdbc%e9%85%8d%e7%bd%ae" title="Hibernate JDBC配置" rel="tag">Hibernate JDBC配置</a><br />
]]></content:encoded>
			<wfw:commentRss>http://xuplus.com/article/2007/12/a68.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>用XOOPS构建专题门户社区网站——安徽车市网</title>
		<link>http://xuplus.com/article/2007/08/a60.html</link>
		<comments>http://xuplus.com/article/2007/08/a60.html#comments</comments>
		<pubDate>Mon, 27 Aug 2007 07:40:30 +0000</pubDate>
		<dc:creator>Dominic</dc:creator>
				<category><![CDATA[XOOPS]]></category>
		<category><![CDATA[网站管理]]></category>

		<guid isPermaLink="false">http://xuplus.com/?p=60</guid>
		<description><![CDATA[因合作原因，已经于2007年8月份退出了安徽车市网团队，其团队新开发人员可能是更喜欢phpcms，抛弃了XOOPS，于2008年1月15日完成用phpcms替换XOOPS。至此，安徽车市网和XOOPS无关，和dominic无关。  此文发表于CSDN：http://news.csdn.net/n/20070827/107973.html 2007年初“车行江淮网”决定改版，目标是“将原来小型网站转换成一个综合性汽车专题门户网站和本地汽车社区网站”。我们在进行技术分析时认为，要实现这个目标就需要一个包含内容管理可自由扩展的系统，一个拥有强大的用户管理、页面风格布局管理的系统，一个有基本的文章管理、百科（Wiki）、社区、论坛、图片管理的系统。在综合评估了ASP.Net、JSP、PHP等语言平台下十多种系统之后，我们被XOOPS的面向对象的可扩展智能建站思想吸引，在阅读了几个系统核心源代码之后，发现XOOPS的核心在面向对象方面实现的最彻底，于是XOOPS成为改版“车行江淮网”的不二选择。改版之后的网站命名为“安徽车市网”(http://www.ahcarmarket.com) “安徽车市网”以符合中文习惯的Article文章管理模块为基础，利用Article模块向外提供了富有Web 2.0元素的汽车资讯服务，最大程度地面向搜索引擎优化，并通过MediaWiki模块提供专门的汽车百科服务。充分利用XOOPS中强大的主题、风格、区块（局部）概念和功能，辅以Page模块自由布局功能和区块皮肤概念，完美实现各个页面的局部自定义显示而不需要太多额外工作量，XOOPS中优良的缓存设计又很好的提供了页面显示速度。 利用XOOPS优秀的可扩展性，“安徽车市网”被打造成一个集资讯、报价、汽车资料、汽车百科、论坛、博客、汽车图库、相册、广告服务、展览服务等多项服务为一身的汽车专题门户社区网站；利用XOOPS优良的架构，“安徽车市网”将通过利用反向代理等技术实现廉价的快速网站访问。XOOPS在不断完善、不断发展壮大，是构建多功能、多服务的门户网站或者社区网站的最佳选择！ 标签： XOOPS]]></description>
			<content:encoded><![CDATA[<p><font color="#ff0000"><strong>因合作原因，已经于2007年8月份退出了安徽车市网团队，其团队新开发人员可能是更喜欢phpcms，抛弃了XOOPS，于2008年1月15日完成用phpcms替换XOOPS。至此，安徽车市网和XOOPS无关，和dominic无关。</strong> </font></p>
<p><font color="#ff0000">此文发表于CSDN：</font><a href="http://news.csdn.net/n/20070827/107973.html"><font color="#ff0000">http://news.csdn.net/n/20070827/107973.html</font></a></p>
<p>2007年初“车行江淮网”决定改版，目标是“将原来小型网站转换成一个综合性汽车专题门户网站和本地汽车社区网站”。我们在进行技术分析时认为，要实现这个目标就需要一个包含内容管理可自由扩展的系统，一个拥有强大的用户管理、页面风格布局管理的系统，一个有基本的文章管理、百科（Wiki）、社区、论坛、图片管理的系统。在综合评估了ASP.Net、JSP、PHP等语言平台下十多种系统之后，我们被XOOPS的面向对象的可扩展智能建站思想吸引，在阅读了几个系统核心源代码之后，发现XOOPS的核心在面向对象方面实现的最彻底，于是XOOPS成为改版“车行江淮网”的不二选择。改版之后的网站命名为“安徽车市网”(<a href="http://www.ahcarmarket.com">http://www.ahcarmarket.com</a>)</p>
<p>“安徽车市网”以符合中文习惯的Article文章管理模块为基础，利用Article模块向外提供了富有Web 2.0元素的汽车资讯服务，最大程度地面向搜索引擎优化，并通过MediaWiki模块提供专门的汽车百科服务。充分利用XOOPS中强大的主题、风格、区块（局部）概念和功能，辅以Page模块自由布局功能和区块皮肤概念，完美实现各个页面的局部自定义显示而不需要太多额外工作量，XOOPS中优良的缓存设计又很好的提供了页面显示速度。</p>
<p>利用XOOPS优秀的可扩展性，“安徽车市网”被打造成一个集资讯、报价、汽车资料、汽车百科、论坛、博客、汽车图库、相册、广告服务、展览服务等多项服务为一身的汽车专题门户社区网站；利用XOOPS优良的架构，“安徽车市网”将通过利用反向代理等技术实现廉价的快速网站访问。XOOPS在不断完善、不断发展壮大，是构建多功能、多服务的门户网站或者社区网站的最佳选择！</p>

	标签： <a href="http://xuplus.com/article/tag/xoops" title="XOOPS" rel="tag">XOOPS</a><br />
]]></content:encoded>
			<wfw:commentRss>http://xuplus.com/article/2007/08/a60.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>PHPMailer类发送中文邮件兼谈解决XOOPS中文发送邮件乱码</title>
		<link>http://xuplus.com/article/2007/08/a57.html</link>
		<comments>http://xuplus.com/article/2007/08/a57.html#comments</comments>
		<pubDate>Tue, 07 Aug 2007 05:25:41 +0000</pubDate>
		<dc:creator>Dominic</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[XOOPS]]></category>

		<guid isPermaLink="false">http://xuplus.com/?p=57</guid>
		<description><![CDATA[xoops.org.cn论坛上又有人问xoops发送中文邮件乱码的问题。domecc给出了一个临时办法，还提供一个网址http://www.thedevlog.com/dev/log-29.html来对utf8编码系统做修正。 其实PHPMailer已经是非常成熟的PHP类了（当然需要打上前一段时间出现的bug的补丁），对于邮件头和邮件体的编码处理已经非常好了，http://www.thedevlog.com/dev/log-29.html中提到修改EncodeHeader并编码，实际上EncodeHeader后面的代码就是完成将头部编码的功能，所以不需要修改该函数。 要成功实现发送中文邮件，设置phpmailer类两个值即可。 $mail = new PHPMailer(); $mail-&#62;CharSet = “UTF-8&#8243;; // 设置字符集编码，GB2312 GBK $mail-&#62;Encoding = “base64&#8243;;//设置文本编码方式 …… 这样保证了邮件标题和正文内容全部不会乱码，当然邮件内容的字符集需要和给定的CharSet内容一致。 回过头来看看xoops中为什么邮件乱码，在xoops中发送邮件首先我们使用了具体语言的xoopsmailerlocal.php文件中XoopsMailerLocal类，而XoopsMailerLocal类继承自class\xoopsmailer.php中的XoopsMailer类，而XoopsMailer类的multimailer成员指向自class\mail\xoopsmultimailer.php中的XoopsMultiMailer类的实体，XoopsMultiMailer类是从PHPMailer派生的。 问题就出在XoopsMailer的构造函数上。在XoopsMultiMailer类的构造函数中（xoopsmultimailer.php中177行）指定了CharSet值为strtolower( _CHARSET )，这样做本来在绝大多数邮件系统中均不会出现乱码，但在XoopsMailer类的sendMail方法（xoopsmailer.php中378行）却重新指定了字符集和文本编码方式： $this-&#62;multimailer-&#62;CharSet = $this-&#62;charSet;         $this-&#62;multimailer-&#62;Encoding = $this-&#62;encoding; 这样导致前面在构造multimailer的时候指定了字符集为XOOPS系统字符集strtolower( _CHARSET )（utf-8或者gb2312），到sendMail方法中却换成了XoopsMailer的成员charSet的值，而XoopsMailer的构造函数并没有让charSet随系统变化，而是取默认值：iso-8859-1。邮件客户端收到邮件按照iso-8859-1来显示邮件内容当然会乱码。所以我们只要正确的给XoopsMailer类实体赋给正确字符集（_CHARSET）即可。 解决办法是： 打开htdocs\class\xoopsmailer.php ，137行附近 $this-&#62;multimailer = new XoopsMultiMailer(); $this-&#62;reset(); 后面添加一行： $this-&#62;charSet = strtolower( _CHARSET ); $this-&#62;encoding = &#8216;base64&#8242;; 更完美的解决办法是： 打开htdocs\language\schinese\xoopsmailerlocal.php和htdocs\language\schinese_utf8\xoopsmailerlocal.php 修改为： &#60;?php class XoopsMailerLocal [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://xuplus.com/article/tag/xoops" class="st_tag internal_tag" rel="tag" title="标签 XOOPS 下的日志">xoops</a>.org.cn论坛上又有人问xoops发送中文邮件乱码的问题。domecc给出了一个临时办法，还提供一个网址<a href="http://www.thedevlog.com/dev/log-29.html" title="http://www.thedevlog.com/dev/log-29.html">http://www.thedevlog.com/dev/log-29.html</a>来对utf8编码系统做修正。</p>
<p>其实PHPMailer已经是非常成熟的PHP类了（当然需要打上前一段时间出现的bug的补丁），对于邮件头和邮件体的编码处理已经非常好了，<a href="http://www.thedevlog.com/dev/log-29.html" title="http://www.thedevlog.com/dev/log-29.html">http://www.thedevlog.com/dev/log-29.html<font color="#333333">中提到修改EncodeHeader</font></a>并编码，实际上EncodeHeader后面的代码就是完成将头部编码的功能，所以不需要修改该函数。</p>
<p>要成功实现发送中文邮件，设置phpmailer类两个值即可。</p>
<blockquote><p>$mail = new PHPMailer();<br />
$mail-&gt;CharSet = “UTF-8&#8243;; // 设置字符集编码，GB2312 GBK<br />
$mail-&gt;Encoding = “base64&#8243;;//设置文本编码方式<br />
……</p></blockquote>
<p>这样保证了邮件标题和正文内容全部不会乱码，当然邮件内容的字符集需要和给定的CharSet内容一致。</p>
<p>回过头来看看xoops中为什么邮件乱码，在xoops中发送邮件首先我们使用了具体语言的xoopsmailerlocal.php文件中XoopsMailerLocal类，而XoopsMailerLocal类继承自class\xoopsmailer.php中的XoopsMailer类，而XoopsMailer类的multimailer成员指向自class\mail\xoopsmultimailer.php中的XoopsMultiMailer类的实体，XoopsMultiMailer类是从PHPMailer派生的。</p>
<p>问题就出在XoopsMailer的构造函数上。在XoopsMultiMailer类的构造函数中（xoopsmultimailer.php中177行）指定了CharSet值为strtolower( _CHARSET )，这样做本来在绝大多数邮件系统中均不会出现乱码，但在XoopsMailer类的sendMail方法（xoopsmailer.php中378行）却重新指定了字符集和文本编码方式：</p>
<blockquote><p>$this-&gt;multimailer-&gt;CharSet = $this-&gt;charSet;<br />
        $this-&gt;multimailer-&gt;Encoding = $this-&gt;encoding;</p></blockquote>
<p>这样导致前面在构造multimailer的时候指定了字符集为XOOPS系统字符集strtolower( _CHARSET )（utf-8或者gb2312），到sendMail方法中却换成了XoopsMailer的成员charSet的值，而XoopsMailer的构造函数并没有让charSet随系统变化，而是取默认值：iso-8859-1。邮件客户端收到邮件按照iso-8859-1来显示邮件内容当然会乱码。所以我们只要正确的给XoopsMailer类实体赋给正确字符集（_CHARSET）即可。</p>
<p>解决办法是：</p>
<blockquote><p>打开htdocs\class\xoopsmailer.<a href="http://xuplus.com/article/tag/php" class="st_tag internal_tag" rel="tag" title="标签 PHP 下的日志">php</a> ，137行附近<br />
$this-&gt;multimailer = new XoopsMultiMailer();<br />
$this-&gt;reset();<br />
后面添加一行：<br />
$this-&gt;charSet = strtolower( _CHARSET );<br />
$this-&gt;encoding = &#8216;base64&#8242;;</p></blockquote>
<p>更完美的解决办法是：</p>
<blockquote><p>打开htdocs\language\schinese\xoopsmailerlocal.php和htdocs\language\schinese_<a href="http://xuplus.com/article/tag/utf8" class="st_tag internal_tag" rel="tag" title="标签 utf8 下的日志">utf8</a>\xoopsmailerlocal.php 修改为：<br />
&lt;?php<br />
class XoopsMailerLocal extends XoopsMailer {</p>
<p>    function XoopsMailerLocal(){<br />
        $this-&gt;XoopsMailer();<br />
        $this-&gt;charSet = strtolower( _CHARSET );<br />
        $this-&gt;encoding = &#8216;base64&#8242;;<br />
    }<br />
}<br />
?&gt;</p></blockquote>
<p>实则是xoops 中文版bug。</p>
<p>另外，为什么要指定encoding呢，这里涉及到email的原理，email产生的年代用7bit就足够表示所有ASCII字符可打印字符了，email发展到全世界之后，多字节语种的需要，需要使用8bit或者16bit或者更多bit来表示一个完整的字，但老式的网络设备和一些邮件系统并不能很好的处理不是7bit的内容或者并不能很好处理多字节的文本内容，这样就需要将文本做一个编码，base64和quoted-printable便是email中用来解决这个问题的最流行方法。email中附件都是用base64来编码具体内容的，用base64编码之后的邮件除非文本内容和指定字符集不一致或者本身就是乱码，否则不会出现乱码的。</p>
<p>当时给ceiea做Windows下邮件系统时候对email做了全面的分析，还是有些用处的。</p>
<p>[tags]PHPMailer,<a href="http://xuplus.com/article/tag/%e4%b8%ad%e6%96%87" class="st_tag internal_tag" rel="tag" title="标签 中文 下的日志">中文</a>,邮件,XOOPS[/tags]</p>

	标签： <a href="http://xuplus.com/article/tag/php" title="PHP" rel="tag">PHP</a>, <a href="http://xuplus.com/article/tag/xoops" title="XOOPS" rel="tag">XOOPS</a><br />
]]></content:encoded>
			<wfw:commentRss>http://xuplus.com/article/2007/08/a57.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>[Hack]将artile模组中的文章的关键词加入到HTML的Meta头中</title>
		<link>http://xuplus.com/article/2007/08/a56.html</link>
		<comments>http://xuplus.com/article/2007/08/a56.html#comments</comments>
		<pubDate>Wed, 01 Aug 2007 10:12:39 +0000</pubDate>
		<dc:creator>Dominic</dc:creator>
				<category><![CDATA[XOOPS]]></category>
		<category><![CDATA[article]]></category>
		<category><![CDATA[Hack]]></category>
		<category><![CDATA[关键词]]></category>

		<guid isPermaLink="false">http://xuplus.com/?p=56</guid>
		<description><![CDATA[HTML页面的keywords Meta是非常重要的一个Meta，它提供给搜索引擎以指引，告诉当前页面的主要内容，虽然目前很多搜索引擎均不在把把keywords作为唯一标示，但其重要性还是显著的。XOOPS中可以在后台设置Meta Keywords，通过Smarty变量xoops_meta_keywords写入HTML页面，但这种方式导致所有页面的这个Meta头都一样，影响了keywords Meta的效果，修改article模组的view.article.php文件和主题模板文件即可达到即兼顾系统设置和页面个性化keywords Meta的目的，我们将发布文章的录入的tag显示在HTML Meta头中。 首先修改htdocs\modules\article\view.article.php文件289行附近， 将原来的 if(@include_once XOOPS_ROOT_PATH.”/modules/tag/include/tagbar.php”){     $xoopsTpl-&#62;assign(&#8216;tagbar&#8217;, tagBar($article_obj-&#62;getVar(“art_keywords”, “n”))); } 修改成： $extra_meta_keywords = $article_obj-&#62;getVar(“art_keywords”, “n”);//Modifyed By XuYong 添加tag到html的meta标签 if(@include_once XOOPS_ROOT_PATH.”/modules/tag/include/tagbar.php”){     $xoopsTpl-&#62;assign(&#8216;tagbar&#8217;, tagBar($article_obj-&#62;getVar(“art_keywords”, “n”)));     if(!empty($extra_meta_keywords))$extra_meta_keywords = str_replace(tag_get_delimiter(), “,”, $extra_meta_keywords);//Modifyed By XuYong 添加tag到html的meta标签 } $xoopsTpl -&#62; assign(“extra_meta_keywords”,$extra_meta_keywords);//Modifyed By XuYong 添加tag到html的meta标签  即通过增加extra_meta_keywords Smarty变量达到个性化keywords Meta 的目的。 再修改站点所用到的主题模板文件theme.html，将原来的 &#60;meta name=”keywords” content=”&#60;{$xoops_meta_keywords}&#62;” /&#62;  修改成 [...]]]></description>
			<content:encoded><![CDATA[<p>HTML页面的keywords Meta是非常重要的一个Meta，它提供给搜索引擎以指引，告诉当前页面的主要内容，虽然目前很多搜索引擎均不在把把keywords作为唯一标示，但其重要性还是显著的。XOOPS中可以在后台设置Meta Keywords，通过Smarty变量xoops_<a href="http://xuplus.com/article/tag/meta" class="st_tag internal_tag" rel="tag" title="标签 META 下的日志">meta</a>_keywords写入HTML页面，但这种方式导致所有页面的这个Meta头都一样，影响了keywords Meta的效果，修改article模组的view.<a href="http://xuplus.com/article/tag/article" class="st_tag internal_tag" rel="tag" title="标签 article 下的日志">article</a>.php文件和主题模板文件即可达到即兼顾系统设置和页面个性化keywords Meta的目的，我们将发布文章的录入的tag显示在HTML Meta头中。</p>
<p>首先修改htdocs\modules\article\view.article.php文件289行附近，</p>
<p>将原来的</p>
<blockquote><p>if(@include_once <a href="http://xuplus.com/article/tag/xoops" class="st_tag internal_tag" rel="tag" title="标签 XOOPS 下的日志">XOOPS</a>_ROOT_PATH.”/modules/<a href="http://xuplus.com/article/tag/tag" class="st_tag internal_tag" rel="tag" title="标签 Tag 下的日志">tag</a>/include/tagbar.<a href="http://xuplus.com/article/tag/php" class="st_tag internal_tag" rel="tag" title="标签 PHP 下的日志">php</a>”){<br />
    $xoopsTpl-&gt;assign(&#8216;tagbar&#8217;, tagBar($article_obj-&gt;getVar(“art_keywords”, “n”)));<br />
}</p></blockquote>
<p>修改成：</p>
<blockquote><p>$extra_meta_keywords = $article_obj-&gt;getVar(“art_keywords”, “n”);//Modifyed By XuYong 添加tag到html的meta标签<br />
if(@include_once XOOPS_ROOT_PATH.”/modules/tag/include/tagbar.php”){<br />
    $xoopsTpl-&gt;assign(&#8216;tagbar&#8217;, tagBar($article_obj-&gt;getVar(“art_keywords”, “n”)));<br />
    if(!empty($extra_meta_keywords))$extra_meta_keywords = str_replace(tag_get_delimiter(), “,”, $extra_meta_keywords);//Modifyed By XuYong 添加tag到html的meta标签<br />
}<br />
$xoopsTpl -&gt; assign(“extra_meta_keywords”,$extra_meta_keywords);//Modifyed By XuYong 添加tag到html的meta标签</p></blockquote>
<p> 即通过增加extra_meta_keywords Smarty变量达到个性化keywords Meta 的目的。</p>
<p>再修改站点所用到的主题模板文件theme.html，将原来的</p>
<blockquote><p>&lt;meta name=”keywords” content=”&lt;{$xoops_meta_keywords}&gt;” /&gt;</p></blockquote>
<p> 修改成</p>
<blockquote><p>&lt;meta name=”keywords” content=”&lt;{$extra_meta_keywords}&gt;,&lt;{$xoops_meta_keywords}&gt;” /&gt;</p></blockquote>

	标签： <a href="http://xuplus.com/article/tag/article" title="article" rel="tag">article</a>, <a href="http://xuplus.com/article/tag/hack" title="Hack" rel="tag">Hack</a>, <a href="http://xuplus.com/article/tag/xoops" title="XOOPS" rel="tag">XOOPS</a>, <a href="http://xuplus.com/article/tag/%e5%85%b3%e9%94%ae%e8%af%8d" title="关键词" rel="tag">关键词</a><br />
]]></content:encoded>
			<wfw:commentRss>http://xuplus.com/article/2007/08/a56.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[Hack]让article模组显示的文章打印功能和RSS输出功能使用站点Logo</title>
		<link>http://xuplus.com/article/2007/08/a55.html</link>
		<comments>http://xuplus.com/article/2007/08/a55.html#comments</comments>
		<pubDate>Wed, 01 Aug 2007 09:53:40 +0000</pubDate>
		<dc:creator>Dominic</dc:creator>
				<category><![CDATA[XOOPS]]></category>
		<category><![CDATA[article]]></category>
		<category><![CDATA[Hack]]></category>

		<guid isPermaLink="false">http://xuplus.com/?p=55</guid>
		<description><![CDATA[article模组中显示的文章的时候下面的工具箱中的打印功能输出页面头部会打印个图片，而这个图片却是article模组xoops_version.php中配置的模块图片，打印出来实在是有些刺眼，RSS输出的地方也是这样。还是改成站点的Logo图片比较好 首先修改htdocs\modules\article\print.php文件90行处， 将原来的 $print_data["image"] = XOOPS_URL . “/modules/” . $xoopsModule-&#62;getVar(“dirname”) . “/” . $xoopsModule-&#62;getInfo( &#8216;image&#8217; );  修改成： $print_data["image"] = XOOPS_URL . “/images/logo.jpg”;//Modified By XuYong 采用站点Logo 再修改htdocs\modules\article\xml.php 284行附近， 将原来的 “url”            =&#62; XOOPS_URL.”/modules/”.$GLOBALS["artdirname"].”/”.$xoopsModule-&#62;getInfo(“image”), 修改成： “url”            =&#62; XOOPS_URL.”/images/logo.jpg”, 其中Logo的具体路径要根据实际情况调整。 标签： article, Hack, XOOPS]]></description>
			<content:encoded><![CDATA[<p>article模组中显示的文章的时候下面的工具箱中的打印功能输出页面头部会打印个图片，而这个图片却是article模组xoops_version.php中配置的模块图片，打印出来实在是有些刺眼，RSS输出的地方也是这样。还是改成站点的Logo图片比较好</p>
<p>首先修改htdocs\modules\<a href="http://xuplus.com/article/tag/article" class="st_tag internal_tag" rel="tag" title="标签 article 下的日志">article</a>\print.php文件90行处，</p>
<p>将原来的</p>
<blockquote><p>$print_data["image"] = <a href="http://xuplus.com/article/tag/xoops" class="st_tag internal_tag" rel="tag" title="标签 XOOPS 下的日志">XOOPS</a>_URL . “/modules/” . $xoopsModule-&gt;getVar(“dirname”) . “/” . $xoopsModule-&gt;getInfo( &#8216;image&#8217; );</p></blockquote>
<p> 修改成：</p>
<blockquote><p>$print_data["image"] = XOOPS_URL . “/images/logo.jpg”;//Modified By XuYong 采用站点Logo</p></blockquote>
<p>再修改htdocs\modules\article\xml.<a href="http://xuplus.com/article/tag/php" class="st_tag internal_tag" rel="tag" title="标签 PHP 下的日志">php</a> 284行附近，</p>
<p>将原来的</p>
<blockquote><p>“url”            =&gt; XOOPS_URL.”/modules/”.$GLOBALS["artdirname"].”/”.$xoopsModule-&gt;getInfo(“image”),</p></blockquote>
<p>修改成：</p>
<blockquote><p>“url”            =&gt; XOOPS_URL.”/images/logo.jpg”,</p></blockquote>
<p>其中Logo的具体路径要根据实际情况调整。</p>

	标签： <a href="http://xuplus.com/article/tag/article" title="article" rel="tag">article</a>, <a href="http://xuplus.com/article/tag/hack" title="Hack" rel="tag">Hack</a>, <a href="http://xuplus.com/article/tag/xoops" title="XOOPS" rel="tag">XOOPS</a><br />
]]></content:encoded>
			<wfw:commentRss>http://xuplus.com/article/2007/08/a55.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[Hack]解决article模组中添加文章时使用html标签导致段落换行不正确的问题</title>
		<link>http://xuplus.com/article/2007/08/a54.html</link>
		<comments>http://xuplus.com/article/2007/08/a54.html#comments</comments>
		<pubDate>Wed, 01 Aug 2007 09:22:23 +0000</pubDate>
		<dc:creator>Dominic</dc:creator>
				<category><![CDATA[XOOPS]]></category>
		<category><![CDATA[article]]></category>
		<category><![CDATA[Hack]]></category>

		<guid isPermaLink="false">http://xuplus.com/?p=54</guid>
		<description><![CDATA[article模组发布文章是在编辑器下面有几个选项：“使用HTML标签”、“使用表情图”、“启用Xoops内置码”、“启用换行符(如果启用HTML标签，建议关闭) ”，一般都是选中状态（可能有配置项，但是好像默认是都选中），不明白的是为什么里面都提示“如果启用HTML标签，建议关闭”了就是不把第一个和第四个做成反选（加个Javascript控制一下就可以了），直接导致发布文章之后文章显示会换行2次，在HTML源代码中可以看到在行跟行之间出现了&#60;BR&#62;&#60;BR&#62;2次，导致行与行之间多出一个br。 解决办法：编辑htdocs\modules\article\edit.article.php文件111行， 将原来的 $dobr = $article_obj-&#62;isNew() &#124;&#124; $newpage; 改成： //Modified By XuYong 根据 $dohtml 调整$dobr默认值 if($dohtml==0) {     $dobr = $article_obj-&#62;isNew() &#124;&#124; $newpage; } else {     $dobr = 0; }  这样设置了“使用HTML标签”就会自动关闭“启用换行符”了。 标签： article, Hack, XOOPS]]></description>
			<content:encoded><![CDATA[<p>article模组发布文章是在编辑器下面有几个选项：“使用HTML标签”、“使用表情图”、“启用Xoops内置码”、“启用换行符(如果启用HTML标签，建议关闭) ”，一般都是选中状态（可能有配置项，但是好像默认是都选中），不明白的是为什么里面都提示“如果启用HTML标签，建议关闭”了就是不把第一个和第四个做成反选（加个Javascript控制一下就可以了），直接导致发布文章之后文章显示会换行2次，在HTML源代码中可以看到在行跟行之间出现了&lt;BR&gt;&lt;BR&gt;2次，导致行与行之间多出一个br。</p>
<p>解决办法：编辑htdocs\modules\<a href="http://xuplus.com/article/tag/article" class="st_tag internal_tag" rel="tag" title="标签 article 下的日志">article</a>\edit.<a href="http://xuplus.com/article/tag/article" class="st_tag internal_tag" rel="tag" title="标签 article 下的日志">article</a>.php文件111行，</p>
<p>将原来的</p>
<blockquote><p>$dobr = $article_obj-&gt;isNew() || $newpage;</p></blockquote>
<p>改成：</p>
<blockquote><p>//Modified By XuYong 根据 $dohtml 调整$dobr默认值<br />
if($dohtml==0)<br />
{<br />
    $dobr = $article_obj-&gt;isNew() || $newpage;<br />
}<br />
else<br />
{<br />
    $dobr = 0;<br />
}</p></blockquote>
<p> 这样设置了“使用HTML标签”就会自动关闭“启用换行符”了。</p>

	标签： <a href="http://xuplus.com/article/tag/article" title="article" rel="tag">article</a>, <a href="http://xuplus.com/article/tag/hack" title="Hack" rel="tag">Hack</a>, <a href="http://xuplus.com/article/tag/xoops" title="XOOPS" rel="tag">XOOPS</a><br />
]]></content:encoded>
			<wfw:commentRss>http://xuplus.com/article/2007/08/a54.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>linux下常用查看Apache状态语句</title>
		<link>http://xuplus.com/article/2007/07/a52.html</link>
		<comments>http://xuplus.com/article/2007/07/a52.html#comments</comments>
		<pubDate>Fri, 27 Jul 2007 13:41:50 +0000</pubDate>
		<dc:creator>Dominic</dc:creator>
				<category><![CDATA[Web应用]]></category>
		<category><![CDATA[apache 状态]]></category>

		<guid isPermaLink="false">http://xuplus.com/?p=52</guid>
		<description><![CDATA[收集linux下查看常用apache状态语句： 1、查看Apache的并发请求数及其TCP连接状态： netstat -n &#124; awk &#8216;/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}&#8217; 返回结果一般如下： SYN_RECV 28 CLOSE_WAIT 1 TIME_WAIT 9 ESTABLISHED 4 LAST_ACK 1 FIN_WAIT1 1 这里SYN_RECV表示正在等待处理的请求数；ESTABLISHED表示正常数据传输状态；TIME_WAIT表示处理完毕，等待超时结束的请求数。 2、查看apache运行进程数（prefork模式） ps -ef &#124; grep apache2 &#124; wc -l 返回的数字就是apache进程数，如果系统中apache文件名是httpd则执行 ps -ef &#124; grep httpd &#124; wc -l （待续） 标签： apache 状态]]></description>
			<content:encoded><![CDATA[<p>收集linux下查看常用apache状态语句：</p>
<p>1、查看Apache的并发请求数及其TCP连接状态：</p>
<blockquote><p>netstat -n | awk &#8216;/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}&#8217;</p></blockquote>
<p>返回结果一般如下：</p>
<blockquote><p>SYN_RECV 28<br />
CLOSE_WAIT 1<br />
TIME_WAIT 9<br />
ESTABLISHED 4<br />
LAST_ACK 1<br />
FIN_WAIT1 1</p></blockquote>
<p>这里SYN_RECV表示正在等待处理的请求数；ESTABLISHED表示正常数据传输状态；TIME_WAIT表示处理完毕，等待超时结束的请求数。</p>
<p>2、查看apache运行进程数（prefork模式）</p>
<blockquote><p>ps -ef | grep <a href="http://xuplus.com/article/tag/apache" class="st_tag internal_tag" rel="tag" title="标签 apache 下的日志">apache</a>2 | wc -l</p></blockquote>
<p>返回的数字就是apache进程数，如果系统中apache文件名是httpd则执行</p>
<blockquote><p>ps -ef | grep httpd | wc -l</p></blockquote>
<p>（待续）</p>

	标签： <a href="http://xuplus.com/article/tag/apache-%e7%8a%b6%e6%80%81" title="apache 状态" rel="tag">apache 状态</a><br />
]]></content:encoded>
			<wfw:commentRss>http://xuplus.com/article/2007/07/a52.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>配置Apache2启用mod_expires模块给文件添加Expires头</title>
		<link>http://xuplus.com/article/2007/07/a51.html</link>
		<comments>http://xuplus.com/article/2007/07/a51.html#comments</comments>
		<pubDate>Fri, 27 Jul 2007 13:17:45 +0000</pubDate>
		<dc:creator>Dominic</dc:creator>
				<category><![CDATA[Web应用]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[expires]]></category>
		<category><![CDATA[http头]]></category>

		<guid isPermaLink="false">http://xuplus.com/?p=51</guid>
		<description><![CDATA[使用YSlow发现所在服务器上传输出来的文件Expires头都置为Expires: Thu, 19 Nov 1981 08:52:00 GMT了，非常奇怪的一个时间（莫非apache或者php某个开发人员是这个时候出生的），YSlow给出了加载expires模块的建议。 加载expires模块之后，编辑httpd.conf加入如下配置： # enable expirations ExpiresActive On # expire GIF images after a day from the time they were accessed ExpiresByType image/gif image/jpg A86400 # HTML documents are good for a hour from the  the time they were accessed ExpiresByType text/html M3600 # expire all default from the time they were [...]]]></description>
			<content:encoded><![CDATA[<p>使用YSlow发现所在服务器上传输出来的文件Expires头都置为Expires: Thu, 19 Nov 1981 08:52:00 GMT了，非常奇怪的一个时间（莫非apache或者php某个开发人员是这个时候出生的），YSlow给出了加载expires模块的建议。</p>
<p>加载expires模块之后，编辑httpd.conf加入如下配置：</p>
<blockquote><p># enable expirations<br />
ExpiresActive On<br />
# expire GIF images after a day from the time they were accessed<br />
ExpiresByType image/gif image/jpg A86400<br />
# HTML documents are good for a hour from the  the time they were accessed<br />
ExpiresByType text/html M3600<br />
# expire all default from the time they were accessed<br />
ExpiresDefault “A7200&#8243;</p></blockquote>

	标签： <a href="http://xuplus.com/article/tag/apache" title="apache" rel="tag">apache</a>, <a href="http://xuplus.com/article/tag/expires" title="expires" rel="tag">expires</a>, <a href="http://xuplus.com/article/tag/http%e5%a4%b4" title="http头" rel="tag">http头</a><br />
]]></content:encoded>
			<wfw:commentRss>http://xuplus.com/article/2007/07/a51.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>配置Apache2启用deflate压缩加快传输</title>
		<link>http://xuplus.com/article/2007/07/a50.html</link>
		<comments>http://xuplus.com/article/2007/07/a50.html#comments</comments>
		<pubDate>Fri, 27 Jul 2007 13:07:51 +0000</pubDate>
		<dc:creator>Dominic</dc:creator>
				<category><![CDATA[Web应用]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[deflate]]></category>

		<guid isPermaLink="false">http://xuplus.com/?p=50</guid>
		<description><![CDATA[今天下载了Yahoo的给Firefox开发的YSlow插件，这个插件确实不错，能够给出不少优化建议，发现所在主机没有开启deflate压缩。 首先加载mod_deflate。 在httpd.conf中加入 &#60;Location /&#62; # Insert filter SetOutputFilter DEFLATE # Netscape 4.x has some problems&#8230; BrowserMatch ^Mozilla/4 gzip-only-text/html # Netscape 4.06-4.08 have some more problems BrowserMatch ^Mozilla/4\.0[678] no-gzip # MSIE masquerades as Netscape, but it is fine # BrowserMatch \bMSIE !no-gzip !gzip-only-text/html # NOTE: Due to a bug in mod_setenvif up to Apache 2.0.48 [...]]]></description>
			<content:encoded><![CDATA[<p>今天下载了Yahoo的给Firefox开发的YSlow插件，这个插件确实不错，能够给出不少优化建议，发现所在主机没有开启deflate压缩。</p>
<p>首先加载mod_<a href="http://xuplus.com/article/tag/deflate" class="st_tag internal_tag" rel="tag" title="标签 deflate 下的日志">deflate</a>。</p>
<p>在httpd.conf中加入</p>
<blockquote><p>&lt;Location /&gt;</p>
<blockquote><p># Insert filter<br />
SetOutputFilter DEFLATE</p>
<p># Netscape 4.x has some problems&#8230;<br />
BrowserMatch ^Mozilla/4 gzip-only-text/html</p>
<p># Netscape 4.06-4.08 have some more problems<br />
BrowserMatch ^Mozilla/4\.0[678] no-gzip</p>
<p># MSIE masquerades as Netscape, but it is fine<br />
# BrowserMatch \bMSIE !no-gzip !gzip-only-text/html</p>
<p># NOTE: Due to a bug in mod_setenvif up to <a href="http://xuplus.com/article/tag/apache" class="st_tag internal_tag" rel="tag" title="标签 apache 下的日志">Apache</a> 2.0.48<br />
# the above regex won&#8217;t work. You can use the following<br />
# workaround to get the desired effect:<br />
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html</p>
<p># Don&#8217;t compress images<br />
SetEnvIfNoCase Request_URI .(?:gif|jpe?g|png|exe|bmp|mp3|rar|zip|swf|cab|t?gz|bz2|sit)$ no-gzip dont-vary<br />
SetEnvIfNoCase Request_URI \.pdf$ no-gzip dont-vary</p>
<p># Make sure proxies don&#8217;t deliver the wrong content<br />
Header append Vary User-Agent env=!dont-vary</p></blockquote>
<p>&lt;/Location&gt;</p></blockquote>
<p>再重启apache即可，/etc/init.d/apache2 restart</p>
<p>经过port80software的在线检测，首页大小从91977 bytes压缩到13376 bytes，传输速度提高6.8X，传输速度从原来12.832 s缩减到1.866 s。</p>
<p>如果修改配置之后提示“Invalid command &#8216;Header&#8217;, perhaps mis-spelled or defined by a module not included in the server configuration”，则加载Header模块即可，不过最好还是在编译apache模块时直接加上&#8211;enable-deflate &#8211;enable-headers就省事多了。</p>

	标签： <a href="http://xuplus.com/article/tag/apache" title="apache" rel="tag">apache</a>, <a href="http://xuplus.com/article/tag/deflate" title="deflate" rel="tag">deflate</a><br />
]]></content:encoded>
			<wfw:commentRss>http://xuplus.com/article/2007/07/a50.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[Hack]让Article模组子分类的文章可以加入到上级分类的专题中</title>
		<link>http://xuplus.com/article/2007/07/a49.html</link>
		<comments>http://xuplus.com/article/2007/07/a49.html#comments</comments>
		<pubDate>Thu, 26 Jul 2007 01:54:01 +0000</pubDate>
		<dc:creator>Dominic</dc:creator>
				<category><![CDATA[XOOPS]]></category>
		<category><![CDATA[article]]></category>
		<category><![CDATA[Hack]]></category>

		<guid isPermaLink="false">http://xuplus.com/?p=49</guid>
		<description><![CDATA[当在article的某个分类添加了一个专题之后，目前的限制了将该分类下级分类的文章添加到这个专题中，这点限制在我看来不是很合理，作为拥有下级分类的分类，从隶属关系上讲下级分类的文章也应当属于该分类的，而且作为拥有下级分类的文章，这个分类所直接隶属的文章应当非常少，只有放到其下所有分类都不合适的时候，才放入该分类中。 修改htdocs\modules\article\cp.article.php文件212行附近， 原来为： unset($subCategories_obj); if(!empty($category_id)){ $criteria = new CriteriaCompo(new Criteria("top_expire", time(), "&#62;")); $topics_obj =&#38; $topic_handler-&#62;getByCategory($category_id, $xoopsModuleConfig["topics_max"], 0, $criteria, array("top_title")); if(count($topics_obj)&#62;0) foreach($topics_obj as $id=&#62;$topic){ $topics[] = array( 修改为： unset($subCategories_obj); if(!empty($category_id)){ $criteria = new CriteriaCompo(new Criteria("top_expire", time(), "&#62;")); //Hack by XuYong 子分类的文章可以加入到上级分类的专题中 $category_pid= 0; if(!empty($category_id))$category_pid = $category_obj-&#62;getVar("cat_pid"); // $topics_obj =&#38; $topic_handler-&#62;getByCategory($category_id, $xoopsModuleConfig["topics_max"], 0, $criteria, array("top_title")); $topics_obj =&#38; [...]]]></description>
			<content:encoded><![CDATA[<p>当在article的某个分类添加了一个专题之后，目前的限制了将该分类下级分类的文章添加到这个专题中，这点限制在我看来不是很合理，作为拥有下级分类的分类，从隶属关系上讲下级分类的文章也应当属于该分类的，而且作为拥有下级分类的文章，这个分类所直接隶属的文章应当非常少，只有放到其下所有分类都不合适的时候，才放入该分类中。</p>
<p>修改htdocs\modules\<a href="http://xuplus.com/article/tag/article" class="st_tag internal_tag" rel="tag" title="标签 article 下的日志">article</a>\cp.<a href="http://xuplus.com/article/tag/article" class="st_tag internal_tag" rel="tag" title="标签 article 下的日志">article</a>.php文件212行附近，</p>
<p>原来为：</p>
<pre class="csharpcode">    unset($subCategories_obj);
    <span class="kwrd">if</span>(!empty($category_id)){
        $criteria = <span class="kwrd">new</span> CriteriaCompo(<span class="kwrd">new</span> Criteria(<span class="str">"top_expire"</span>, time(), <span class="str">"&gt;"</span>));
        $topics_obj =&amp; $topic_handler-&gt;getByCategory($category_id, $xoopsModuleConfig[<span class="str">"topics_max"</span>], 0, $criteria, array(<span class="str">"top_title"</span>));
        <span class="kwrd">if</span>(count($topics_obj)&gt;0) <span class="kwrd">foreach</span>($topics_obj <span class="kwrd">as</span> $id=&gt;$topic){
            $topics[] = array(</pre>
<style type="text/css">  .csharpcode, .csharpcode pre  {  	font-size: small;  	color: black;  	font-family: consolas, "Courier New", courier, monospace;  	background-color: #ffffff;  	/*white-space: pre;*/  }  .csharpcode pre { margin: 0em; }  .csharpcode .rem { color: #008000; }  .csharpcode .kwrd { color: #0000ff; }  .csharpcode .str { color: #006080; }  .csharpcode .op { color: #0000c0; }  .csharpcode .preproc { color: #cc6633; }  .csharpcode .asp { background-color: #ffff00; }  .csharpcode .html { color: #800000; }  .csharpcode .attr { color: #ff0000; }  .csharpcode .alt  {  	background-color: #f4f4f4;  	width: 100%;  	margin: 0em;  }  .csharpcode .lnum { color: #606060; }</style>
<p><font size="2">修改为：</font></p>
<pre class="csharpcode">    unset($subCategories_obj);
    <span class="kwrd">if</span>(!empty($category_id)){
        $criteria = <span class="kwrd">new</span> CriteriaCompo(<span class="kwrd">new</span> Criteria(<span class="str">"top_expire"</span>, time(), <span class="str">"&gt;"</span>));
        <span class="rem">//<a href="http://xuplus.com/article/tag/hack" class="st_tag internal_tag" rel="tag" title="标签 Hack 下的日志">Hack</a> by XuYong 子分类的文章可以加入到上级分类的专题中</span>
        $category_pid= 0;
        <span class="kwrd">if</span>(!empty($category_id))$category_pid = $category_obj-&gt;getVar(<span class="str">"cat_pid"</span>);
        <span class="rem">//        $topics_obj =&amp; $topic_handler-&gt;getByCategory($category_id, $xoopsModuleConfig["topics_max"], 0, $criteria, array("top_title"));</span>
                $topics_obj =&amp; $topic_handler-&gt;getByCategory($category_pid, $xoopsModuleConfig[<span class="str">"topics_max"</span>], 0, $criteria, array(<span class="str">"top_title"</span>));
        <span class="rem">//End Hack</span>
        <span class="kwrd">if</span>(count($topics_obj)&gt;0) <span class="kwrd">foreach</span>($topics_obj <span class="kwrd">as</span> $id=&gt;$topic){
            $topics[] = array(</pre>
<style type="text/css">  .csharpcode, .csharpcode pre  {  	font-size: small;  	color: black;  	font-family: consolas, "Courier New", courier, monospace;  	background-color: #ffffff;  	/*white-space: pre;*/  }  .csharpcode pre { margin: 0em; }  .csharpcode .rem { color: #008000; }  .csharpcode .kwrd { color: #0000ff; }  .csharpcode .str { color: #006080; }  .csharpcode .op { color: #0000c0; }  .csharpcode .preproc { color: #cc6633; }  .csharpcode .asp { background-color: #ffff00; }  .csharpcode .html { color: #800000; }  .csharpcode .attr { color: #ff0000; }  .csharpcode .alt  {  	background-color: #f4f4f4;  	width: 100%;  	margin: 0em;  }  .csharpcode .lnum { color: #606060; }</style>

	标签： <a href="http://xuplus.com/article/tag/article" title="article" rel="tag">article</a>, <a href="http://xuplus.com/article/tag/hack" title="Hack" rel="tag">Hack</a>, <a href="http://xuplus.com/article/tag/xoops" title="XOOPS" rel="tag">XOOPS</a><br />
]]></content:encoded>
			<wfw:commentRss>http://xuplus.com/article/2007/07/a49.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[Hack]更改article模组输出feed时时间不对的缺陷</title>
		<link>http://xuplus.com/article/2007/07/a48.html</link>
		<comments>http://xuplus.com/article/2007/07/a48.html#comments</comments>
		<pubDate>Thu, 26 Jul 2007 01:32:10 +0000</pubDate>
		<dc:creator>Dominic</dc:creator>
				<category><![CDATA[XOOPS]]></category>
		<category><![CDATA[article]]></category>
		<category><![CDATA[feed]]></category>
		<category><![CDATA[Hack]]></category>
		<category><![CDATA[时区]]></category>

		<guid isPermaLink="false">http://xuplus.com/?p=48</guid>
		<description><![CDATA[服务时区设置为+8，在命令行行下显示正常，XOOPS中设置服务器所在时区为+0800，可article输出的feed时时间却怎么也不对，导致outlookRSS订阅中显示的文章时间也不对均为GMT+1600时区，哪有这样的时区哦，时区范围GMT-1200～GMT+1200。 修改方法如下： 1、修改htdocs\modules\article\class\feedcreator.class.php文件中739行附近FeedDate类的构造函数FeedDate如下： 1: function FeedDate($dateString="") { 2: $tzOffset = 0; 3: if ($dateString=="") $dateString = date("r"); 4:   5: //if (is_integer($dateString)) { 6: if (is_numeric($dateString)) { 7: $this-&#62;unix = $dateString; 8: return; 9: } 10: //Hack By XuYong 调整日期格式 11: if (preg_match("~(?:(?:Mon&#124;Tue&#124;Wed&#124;Thu&#124;Fri&#124;Sat&#124;Sun),\\s+)?(\\d{1,2})\\s+([a-zA-Z]{3})\\s+(\\d{4})\\s+(\\d{2}):(\\d{2}):(\\d{2})\\s+(.*)~",$dateString,$matches)) { 12: $months = Array("Jan"=&#62;1,"Feb"=&#62;2,"Mar"=&#62;3,"Apr"=&#62;4,"May"=&#62;5,"Jun"=&#62;6,"Jul"=&#62;7,"Aug"=&#62;8,"Sep"=&#62;9,"Oct"=&#62;10,"Nov"=&#62;11,"Dec"=&#62;12); 13: $this-&#62;unix = gmmktime($matches[4],$matches[5],$matches[6],$months[$matches[2]],$matches[1],$matches[3]); 14: if (substr($matches[7],0,1)=='+' [...]]]></description>
			<content:encoded><![CDATA[<p>服务时区设置为+8，在命令行行下显示正常，XOOPS中设置服务器所在时区为+0800，可article输出的feed时时间却怎么也不对，导致outlookRSS订阅中显示的文章时间也不对均为GMT+1600<a href="http://xuplus.com/article/tag/%e6%97%b6%e5%8c%ba" class="st_tag internal_tag" rel="tag" title="标签 时区 下的日志">时区</a>，哪有这样的时区哦，时区范围GMT-1200～GMT+1200。</p>
<p>修改方法如下：</p>
<p>1、修改htdocs\modules\<a href="http://xuplus.com/article/tag/article" class="st_tag internal_tag" rel="tag" title="标签 article 下的日志">article</a>\class\feedcreator.class.php文件中739行附近FeedDate类的构造函数FeedDate如下：</p>
<p style="font-size: 8pt; margin: 20px 0px 10px; overflow: auto; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border: gray 1px solid; padding: 4px">
<p style="font-size: 8pt; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px">
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px"><span style="color: #606060">   1:</span> <span style="color: #0000ff">function</span> FeedDate($dateString=<span style="color: #006080">""</span>) {</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px"><span style="color: #606060">   2:</span>     $tzOffset = 0;</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px"><span style="color: #606060">   3:</span>     <span style="color: #0000ff">if</span> ($dateString==<span style="color: #006080">""</span>) $dateString = date(<span style="color: #006080">"r"</span>);</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px"><span style="color: #606060">   4:</span>  </pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px"><span style="color: #606060">   5:</span>     <span style="color: #008000">//if (is_integer($dateString)) {</span></pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px"><span style="color: #606060">   6:</span>     <span style="color: #0000ff">if</span> (is_numeric($dateString)) {</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px"><span style="color: #606060">   7:</span>         $<span style="color: #0000ff">this</span>-&gt;unix = $dateString;</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px"><span style="color: #606060">   8:</span>         <span style="color: #0000ff">return</span>;</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px"><span style="color: #606060">   9:</span>     }</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px"><span style="color: #606060">  10:</span>    <span style="color: #008000">//<a href="http://xuplus.com/article/tag/hack" class="st_tag internal_tag" rel="tag" title="标签 Hack 下的日志">Hack</a> By XuYong 调整日期格式</span></pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px"><span style="color: #606060">  11:</span>     <span style="color: #0000ff">if</span> (preg_match(<span style="color: #006080">"~(?:(?:Mon|Tue|Wed|Thu|Fri|Sat|Sun),\\s+)?(\\d{1,2})\\s+([a-zA-Z]{3})\\s+(\\d{4})\\s+(\\d{2}):(\\d{2}):(\\d{2})\\s+(.*)~"</span>,$dateString,$matches)) {</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px"><span style="color: #606060">  12:</span>         $months = Array(<span style="color: #006080">"Jan"</span>=&gt;1,<span style="color: #006080">"Feb"</span>=&gt;2,<span style="color: #006080">"Mar"</span>=&gt;3,<span style="color: #006080">"Apr"</span>=&gt;4,<span style="color: #006080">"May"</span>=&gt;5,<span style="color: #006080">"Jun"</span>=&gt;6,<span style="color: #006080">"Jul"</span>=&gt;7,<span style="color: #006080">"Aug"</span>=&gt;8,<span style="color: #006080">"Sep"</span>=&gt;9,<span style="color: #006080">"Oct"</span>=&gt;10,<span style="color: #006080">"Nov"</span>=&gt;11,<span style="color: #006080">"Dec"</span>=&gt;12);</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px"><span style="color: #606060">  13:</span>         $<span style="color: #0000ff">this</span>-&gt;unix = gmmktime($matches[4],$matches[5],$matches[6],$months[$matches[2]],$matches[1],$matches[3]);</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px"><span style="color: #606060">  14:</span>         <span style="color: #0000ff">if</span> (substr($matches[7],0,1)==<span style="color: #006080">'+'</span> OR substr($matches[7],0,1)==<span style="color: #006080">'-'</span>) {</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px"><span style="color: #606060">  15:</span>             $tzOffset = (substr($matches[7],0,3) * 60 + substr($matches[7],-2)) * 60;</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px"><span style="color: #606060">  16:</span>         } <span style="color: #0000ff">else</span> {</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px"><span style="color: #606060">  17:</span>             <span style="color: #0000ff">if</span> (strlen($matches[7])==1) {</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px"><span style="color: #606060">  18:</span>                 $oneHour = 3600;</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px"><span style="color: #606060">  19:</span>                 $ord = ord($matches[7]);</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px"><span style="color: #606060">  20:</span>                 <span style="color: #0000ff">if</span> ($ord &lt; ord(<span style="color: #006080">"M"</span>)) {</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px"><span style="color: #606060">  21:</span>                     $tzOffset = (ord(<span style="color: #006080">"A"</span>) - $ord - 1) * $oneHour;</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px"><span style="color: #606060">  22:</span>                 } elseif ($ord &gt;= ord(<span style="color: #006080">"M"</span>) AND $matches[7]!=<span style="color: #006080">"Z"</span>) {</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px"><span style="color: #606060">  23:</span>                     $tzOffset = ($ord - ord(<span style="color: #006080">"M"</span>)) * $oneHour;</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px"><span style="color: #606060">  24:</span>                 } elseif ($matches[7]==<span style="color: #006080">"Z"</span>) {</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px"><span style="color: #606060">  25:</span>                     $tzOffset = 0;</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px"><span style="color: #606060">  26:</span>                 }</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px"><span style="color: #606060">  27:</span>             }</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px"><span style="color: #606060">  28:</span>             <span style="color: #0000ff">switch</span> ($matches[7]) {</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px"><span style="color: #606060">  29:</span>                 <span style="color: #0000ff">case</span> <span style="color: #006080">"UT"</span>:</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px"><span style="color: #606060">  30:</span>                 <span style="color: #0000ff">case</span> <span style="color: #006080">"GMT"</span>:    $tzOffset = 0;</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px"><span style="color: #606060">  31:</span>             }</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px"><span style="color: #606060">  32:</span>         }</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px"><span style="color: #606060">  33:</span></pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px"><span style="color: #606060">  34:</span>         $tzOffset += date(<span style="color: #006080">"Z"</span>,0);</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px"><span style="color: #606060">  35:</span>         $<span style="color: #0000ff">this</span>-&gt;unix += $tzOffset;</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px"><span style="color: #606060">  36:</span>  </pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px"><span style="color: #606060">  37:</span>         <span style="color: #0000ff">if</span> (TIME_ZONE!=<span style="color: #006080">""</span>)</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px"><span style="color: #606060">  38:</span>         {</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px"><span style="color: #606060">  39:</span>             $server_TZ = abs(intval($GLOBALS[<span style="color: #006080">'xoopsConfig'</span>][<span style="color: #006080">'server_TZ'</span>] * 3600.0));</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px"><span style="color: #606060">  40:</span>             $<span style="color: #0000ff">this</span>-&gt;unix += ($server_TZ - date(<span style="color: #006080">"Z"</span>, 0)) % 43200;</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px"><span style="color: #606060">  41:</span>         }</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px"><span style="color: #606060">  42:</span>  </pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px"><span style="color: #606060">  43:</span>         <span style="color: #0000ff">return</span>;</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px"><span style="color: #606060">  44:</span>     }</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px"><span style="color: #606060">  45:</span>     <span style="color: #0000ff">if</span> (preg_match(<span style="color: #006080">"~(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2}):(\\d{2})(.*)~"</span>,$dateString,$matches)) {</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px"><span style="color: #606060">  46:</span>         $<span style="color: #0000ff">this</span>-&gt;unix = gmmktime($matches[4],$matches[5],$matches[6],$matches[2],$matches[3],$matches[1]);</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px"><span style="color: #606060">  47:</span>         <span style="color: #0000ff">if</span> (substr($matches[7],0,1)==<span style="color: #006080">'+'</span> OR substr($matches[7],0,1)==<span style="color: #006080">'-'</span>) {</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px"><span style="color: #606060">  48:</span>             $tzOffset = (substr($matches[7],0,3) * 60 + substr($matches[7],-2)) * 60;</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px"><span style="color: #606060">  49:</span>         } <span style="color: #0000ff">else</span> {</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px"><span style="color: #606060">  50:</span>             <span style="color: #0000ff">if</span> ($matches[7]==<span style="color: #006080">"Z"</span>) {</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px"><span style="color: #606060">  51:</span>                 $tzOffset = 0;</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px"><span style="color: #606060">  52:</span>             }</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px"><span style="color: #606060">  53:</span>         }</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px"><span style="color: #606060">  54:</span>         $tzOffset += date(<span style="color: #006080">"Z"</span>,0);</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px"><span style="color: #606060">  55:</span>         $<span style="color: #0000ff">this</span>-&gt;unix += $tzOffset;</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px"><span style="color: #606060">  56:</span>  </pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px"><span style="color: #606060">  57:</span>         <span style="color: #0000ff">if</span> (TIME_ZONE!=<span style="color: #006080">""</span>)</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px"><span style="color: #606060">  58:</span>         {</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px"><span style="color: #606060">  59:</span>             $server_TZ = abs(intval($GLOBALS[<span style="color: #006080">'xoopsConfig'</span>][<span style="color: #006080">'server_TZ'</span>] * 3600.0));</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px"><span style="color: #606060">  60:</span>             $<span style="color: #0000ff">this</span>-&gt;unix += ($server_TZ - date(<span style="color: #006080">"Z"</span>, 0)) % 43200;</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px"><span style="color: #606060">  61:</span>         }</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px"><span style="color: #606060">  62:</span>         <span style="color: #0000ff">return</span>;</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px"><span style="color: #606060">  63:</span>     }</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px"><span style="color: #606060">  64:</span>     $<span style="color: #0000ff">this</span>-&gt;unix = 0;</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px"><span style="color: #606060">  65:</span> }</pre>
<p><font size="3">2、修改htdocs\modules\article\class\xml.php文件58行，</font></p>
<p><font size="3">原来为：</font></p>
<p>$TIME_ZONE = $prefix.date(“H:i”, $server_TZ);</p>
<p><font size="3">修改为：</font></p>
<p>$TIME_ZONE = $prefix.date(“H:i”, ($server_TZ &#8211; date(“Z”, 0)) % 43200); //Hack By XuYong 调整时区显示，防止出现+1600时区</p>

	标签： <a href="http://xuplus.com/article/tag/article" title="article" rel="tag">article</a>, <a href="http://xuplus.com/article/tag/feed" title="feed" rel="tag">feed</a>, <a href="http://xuplus.com/article/tag/hack" title="Hack" rel="tag">Hack</a>, <a href="http://xuplus.com/article/tag/xoops" title="XOOPS" rel="tag">XOOPS</a>, <a href="http://xuplus.com/article/tag/%e6%97%b6%e5%8c%ba" title="时区" rel="tag">时区</a><br />
]]></content:encoded>
			<wfw:commentRss>http://xuplus.com/article/2007/07/a48.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[Fixed]Article模组取某个分类的子分类时出错的Bug</title>
		<link>http://xuplus.com/article/2007/07/a47.html</link>
		<comments>http://xuplus.com/article/2007/07/a47.html#comments</comments>
		<pubDate>Thu, 26 Jul 2007 01:08:25 +0000</pubDate>
		<dc:creator>Dominic</dc:creator>
				<category><![CDATA[XOOPS]]></category>
		<category><![CDATA[article]]></category>
		<category><![CDATA[Bug Fixed]]></category>

		<guid isPermaLink="false">http://xuplus.com/?p=47</guid>
		<description><![CDATA[当我们使用XOOPS的article模组时，如果我们想获取某个分类的所有子分类时，会发现取到的数据有可能不是我们所需要的，返回的却是所有分类，当然这个Bug只存在于article模组1.0版本中，下个版本中可能会被修正。（不知道D.J.什么时候出下个版本呢） 修改htdocs\modules\article\class\category.php文件中378行附近， 原来为： $category_array = $tree-&#62;getAllChild(0); 修改之后： $category_array = $tree-&#62;getAllChild($pid);//Modifyed By XuYong 没有使用$pid，导致没有起到任何作用 即可。 标签： article, Bug Fixed, XOOPS]]></description>
			<content:encoded><![CDATA[<p>当我们使用XOOPS的article模组时，如果我们想获取某个分类的所有子分类时，会发现取到的数据有可能不是我们所需要的，返回的却是所有分类，当然这个Bug只存在于article模组1.0版本中，下个版本中可能会被修正。（不知道D.J.什么时候出下个版本呢）</p>
<p>修改htdocs\modules\<a href="http://xuplus.com/article/tag/article" class="st_tag internal_tag" rel="tag" title="标签 article 下的日志">article</a>\class\category.php文件中378行附近，</p>
<p>原来为：</p>
<p>$category_array = $tree-&gt;getAllChild(0);</p>
<p>修改之后：</p>
<p>$category_array = $tree-&gt;getAllChild($pid);<span class="rem">//Modifyed By XuYong 没有使用$pid，导致没有起到任何作用</span></p>
<style type="text/css">  .csharpcode, .csharpcode pre  {  	font-size: small;  	color: black;  	font-family: consolas, "Courier New", courier, monospace;  	background-color: #ffffff;  	/*white-space: pre;*/  }  .csharpcode pre { margin: 0em; }  .csharpcode .rem { color: #008000; }  .csharpcode .kwrd { color: #0000ff; }  .csharpcode .str { color: #006080; }  .csharpcode .op { color: #0000c0; }  .csharpcode .preproc { color: #cc6633; }  .csharpcode .asp { background-color: #ffff00; }  .csharpcode .html { color: #800000; }  .csharpcode .attr { color: #ff0000; }  .csharpcode .alt  {  	background-color: #f4f4f4;  	width: 100%;  	margin: 0em;  }  .csharpcode .lnum { color: #606060; }</style>
<p>即可。</p>

	标签： <a href="http://xuplus.com/article/tag/article" title="article" rel="tag">article</a>, <a href="http://xuplus.com/article/tag/bug-fixed" title="Bug Fixed" rel="tag">Bug Fixed</a>, <a href="http://xuplus.com/article/tag/xoops" title="XOOPS" rel="tag">XOOPS</a><br />
]]></content:encoded>
			<wfw:commentRss>http://xuplus.com/article/2007/07/a47.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>XOOPS中修正获取真实用户名的Bug (Fixed)</title>
		<link>http://xuplus.com/article/2007/07/a46.html</link>
		<comments>http://xuplus.com/article/2007/07/a46.html#comments</comments>
		<pubDate>Wed, 25 Jul 2007 23:53:26 +0000</pubDate>
		<dc:creator>Dominic</dc:creator>
				<category><![CDATA[XOOPS]]></category>
		<category><![CDATA[Bug Fix]]></category>

		<guid isPermaLink="false">http://xuplus.com/?p=46</guid>
		<description><![CDATA[调用XOOPS中返回用户姓名时，通过getUnameFromId返回用户姓名时，如果希望返回用户真实姓名时，但是当用户没有填写真实姓名的时候返回的将会是空串，下面这个Hack就用于解决这个问题，当用户没有填写真实姓名时返回用户登录名。 htdocs\kernel\user.php文件，139行附近将getUnameFromId函数做如下修改即可： 原函数： 1: function getUnameFromId( $userid, $usereal = 0 ) 2: { 3: $userid = intval($userid); 4: $usereal = intval($usereal); 5: if ($userid &#62; 0) { 6: $member_handler =&#38; xoops_gethandler('member'); 7: $user =&#38; $member_handler-&#62;getUser($userid); 8: if (is_object($user)) { 9: $ts =&#38; MyTextSanitizer::getInstance(); 10: if ( $usereal ) { 11: return $ts-&#62;htmlSpecialChars($user-&#62;getVar('name')); 12: } else [...]]]></description>
			<content:encoded><![CDATA[<p>调用XOOPS中返回用户姓名时，通过getUnameFromId返回用户姓名时，如果希望返回用户真实姓名时，但是当用户没有填写真实姓名的时候返回的将会是空串，下面这个Hack就用于解决这个问题，当用户没有填写真实姓名时返回用户登录名。</p>
<p>htdocs\kernel\user.php文件，139行附近将getUnameFromId函数做如下修改即可：</p>
<p>原函数：</p>
<p style="font-size: 8pt; margin: 20px 0px 10px; overflow: auto; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border: gray 1px solid; padding: 4px">
<p style="font-size: 8pt; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px">
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px"><span style="color: #606060">   1:</span> <span style="color: #0000ff">function</span> getUnameFromId( $userid, $usereal = 0 )</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px"><span style="color: #606060">   2:</span> {</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px"><span style="color: #606060">   3:</span>     $userid = intval($userid);</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px"><span style="color: #606060">   4:</span>     $usereal = intval($usereal);</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px"><span style="color: #606060">   5:</span>     <span style="color: #0000ff">if</span> ($userid &gt; 0) {</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px"><span style="color: #606060">   6:</span>         $member_handler =&amp; <a href="http://xuplus.com/article/tag/xoops" class="st_tag internal_tag" rel="tag" title="标签 XOOPS 下的日志">xoops</a>_gethandler(<span style="color: #006080">'member'</span>);</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px"><span style="color: #606060">   7:</span>         $user =&amp; $member_handler-&gt;getUser($userid);</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px"><span style="color: #606060">   8:</span>         <span style="color: #0000ff">if</span> (is_object($user)) {</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px"><span style="color: #606060">   9:</span>             $ts =&amp; MyTextSanitizer::getInstance();</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px"><span style="color: #606060">  10:</span>             <span style="color: #0000ff">if</span> ( $usereal ) {</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px"><span style="color: #606060">  11:</span>                 <span style="color: #0000ff">return</span> $ts-&gt;htmlSpecialChars($user-&gt;getVar(<span style="color: #006080">'name'</span>));</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px"><span style="color: #606060">  12:</span>             } <span style="color: #0000ff">else</span> {</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px"><span style="color: #606060">  13:</span>                 <span style="color: #0000ff">return</span> $ts-&gt;htmlSpecialChars($user-&gt;getVar(<span style="color: #006080">'uname'</span>));</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px"><span style="color: #606060">  14:</span>             }</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px"><span style="color: #606060">  15:</span>         }</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px"><span style="color: #606060">  16:</span>     }</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px"><span style="color: #606060">  17:</span>     <span style="color: #0000ff">return</span> $GLOBALS[<span style="color: #006080">'xoopsConfig'</span>][<span style="color: #006080">'anonymous'</span>];</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px"><span style="color: #606060">  18:</span> }</pre>
<p>修改之后函数为：</p>
<p style="font-size: 8pt; margin: 20px 0px 10px; overflow: auto; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border: gray 1px solid; padding: 4px">
<p style="font-size: 8pt; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px">
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px"><span style="color: #606060">   1:</span> <span style="color: #0000ff">function</span> getUnameFromId( $userid, $usereal = 0 )</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px"><span style="color: #606060">   2:</span>     {</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px"><span style="color: #606060">   3:</span>         $userid = intval($userid);</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px"><span style="color: #606060">   4:</span>         $usereal = intval($usereal);</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px"><span style="color: #606060">   5:</span>         <span style="color: #0000ff">if</span> ($userid &gt; 0) {</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px"><span style="color: #606060">   6:</span>             $member_handler =&amp; xoops_gethandler(<span style="color: #006080">'member'</span>);</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px"><span style="color: #606060">   7:</span>             $user =&amp; $member_handler-&gt;getUser($userid);</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px"><span style="color: #606060">   8:</span>             <span style="color: #0000ff">if</span> (is_object($user)) {</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px"><span style="color: #606060">   9:</span>                 $ts =&amp; MyTextSanitizer::getInstance();</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px"><span style="color: #606060">  10:</span>                 <span style="color: #0000ff">if</span> ( $usereal ) {</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px"><span style="color: #606060">  11:</span>                     <span style="color: #0000ff">if</span>(trim($user-&gt;getVar(<span style="color: #006080">'name'</span>)) != <span style="color: #006080">''</span>) {</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px"><span style="color: #606060">  12:</span>                         <span style="color: #0000ff">return</span> $ts-&gt;htmlSpecialChars($user-&gt;getVar(<span style="color: #006080">'name'</span>));</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px"><span style="color: #606060">  13:</span>                     } <span style="color: #0000ff">else</span> {</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px"><span style="color: #606060">  14:</span>                         <span style="color: #0000ff">return</span> $ts-&gt;htmlSpecialChars($user-&gt;getVar(<span style="color: #006080">'uname'</span>));</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px"><span style="color: #606060">  15:</span>                     }</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px"><span style="color: #606060">  16:</span>                 } <span style="color: #0000ff">else</span> {</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px"><span style="color: #606060">  17:</span>                     <span style="color: #0000ff">return</span> $ts-&gt;htmlSpecialChars($user-&gt;getVar(<span style="color: #006080">'uname'</span>));</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px"><span style="color: #606060">  18:</span>                 }</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px"><span style="color: #606060">  19:</span>             }</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px"><span style="color: #606060">  20:</span>         }</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: white; border-style: none; padding: 0px"><span style="color: #606060">  21:</span>         <span style="color: #0000ff">return</span> $GLOBALS[<span style="color: #006080">'xoopsConfig'</span>][<span style="color: #006080">'anonymous'</span>];</pre>
<pre style="font-size: 8pt; margin: 0em; overflow: visible; width: 100%; color: black; line-height: 12pt; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4; border-style: none; padding: 0px"><span style="color: #606060">  22:</span>     }</pre>

	标签： <a href="http://xuplus.com/article/tag/bug-fix" title="Bug Fix" rel="tag">Bug Fix</a>, <a href="http://xuplus.com/article/tag/xoops" title="XOOPS" rel="tag">XOOPS</a><br />
]]></content:encoded>
			<wfw:commentRss>http://xuplus.com/article/2007/07/a46.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[Hack]给XOOPS的Transfer服务书签应用增加几种在线书签</title>
		<link>http://xuplus.com/article/2007/07/a45.html</link>
		<comments>http://xuplus.com/article/2007/07/a45.html#comments</comments>
		<pubDate>Wed, 25 Jul 2007 23:53:10 +0000</pubDate>
		<dc:creator>Dominic</dc:creator>
				<category><![CDATA[XOOPS]]></category>
		<category><![CDATA[Hack]]></category>
		<category><![CDATA[Transfer]]></category>
		<category><![CDATA[书签]]></category>

		<guid isPermaLink="false">http://xuplus.com/?p=45</guid>
		<description><![CDATA[xoops中的transfer API非常好，但是其书签功能中支持的在线书签服务实在太少，我添加了几种现在流行的在线书签服务，当然我们还可以添加更多。 修改htdocs\Frameworks\transfer\plugin\bookmark\language\schinese_utf8.php文件如下，支持google书签、美味书签、Sina Vivi、365Key、BlogChina、Poco、Sohu、天极、和讯、QQ、百度。如果采用gb2312编码或者gbk编码则编辑htdocs\Frameworks\transfer\plugin\bookmark\language\schinese.php这个文件。 &#60;?php /** * Transfer handler for XOOPS * * This is intended to handle content intercommunication between modules as well as components * There might need to be a more explicit name for the handle since it is always confusing * * @copyright The XOOPS project http://www.xoops.org/ * @license http://www.fsf.org/copyleft/gpl.html GNU [...]]]></description>
			<content:encoded><![CDATA[<p>xoops中的transfer API非常好，但是其书签功能中支持的在线书签服务实在太少，我添加了几种现在流行的在线书签服务，当然我们还可以添加更多。</p>
<p>修改htdocs\Frameworks\<a href="http://xuplus.com/article/tag/transfer" class="st_tag internal_tag" rel="tag" title="标签 Transfer 下的日志">transfer</a>\plugin\bookmark\language\schinese_<a href="http://xuplus.com/article/tag/utf8" class="st_tag internal_tag" rel="tag" title="标签 utf8 下的日志">utf8</a>.php文件如下，支持google书签、美味书签、Sina Vivi、365Key、BlogChina、Poco、Sohu、天极、和讯、QQ、百度。如果采用gb2312编码或者gbk编码则编辑htdocs\Frameworks\<a href="http://xuplus.com/article/tag/transfer" class="st_tag internal_tag" rel="tag" title="标签 Transfer 下的日志">transfer</a>\plugin\bookmark\language\schinese.php这个文件。</p>
<pre class="csharpcode">&lt;?<a href="http://xuplus.com/article/tag/php" class="st_tag internal_tag" rel="tag" title="标签 PHP 下的日志">php</a>
<span class="rem">/**</span>
<span class="rem"> * Transfer handler for <a href="http://xuplus.com/article/tag/xoops" class="st_tag internal_tag" rel="tag" title="标签 XOOPS 下的日志">XOOPS</a></span>
<span class="rem"> *</span>
<span class="rem"> * This is intended to handle content intercommunication between modules as well as components</span>
<span class="rem"> * There might need to be a more explicit name for the handle since it is always confusing</span>
<span class="rem"> *</span>
<span class="rem"> * @copyright    The XOOPS project http://www.xoops.org/</span>
<span class="rem"> * @license        http://www.fsf.org/copyleft/gpl.html GNU public license</span>
<span class="rem"> * @author        Taiwen Jiang (phppp or D.J.) &lt;php_pp@hotmail.com&gt;</span>
<span class="rem"> * @since        3.00</span>
<span class="rem"> * @version        $Id$</span>
<span class="rem"> * @package        Frameworks::transfer</span>
<span class="rem"> */</span> 

define(<span class="str">"_MD_TRANSFER_BOOKMARK"</span>, <span class="str">"<a href="http://xuplus.com/article/tag/%e4%b9%a6%e7%ad%be" class="st_tag internal_tag" rel="tag" title="标签 书签 下的日志">书签</a>"</span>);
define(<span class="str">"_MD_TRANSFER_BOOKMARK_DESC"</span>, <span class="str">"添加到书签"</span>); 

<span class="rem">/* Chinese */</span>
define(<span class="str">"_MD_TRANSFER_BOOKMARK_ITEMS"</span>,
    <span class="str">"&lt;span id=\"<a href="http://xuplus.com/article/tag/article" class="st_tag internal_tag" rel="tag" title="标签 article 下的日志">article</a>-bookmarkit\"&gt;&lt;ul class=\"list-bookmark\" id=\"bookmarkit\"&gt;"</span>
    . <span class="str">"&lt;li&gt;&lt;a href=\"javascript:void(google = window.open('http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;title=' + encodeURIComponent('%1\$s')+ '&amp;bkmk=' + encodeURIComponent('%2\$s') , 'google')); google.focus();\"&gt;[&lt;strong style='color:red'&gt;Google&lt;/strong&gt;]&lt;/a&gt;  &lt;/li&gt;"</span>
. <span class="str">"&lt;li&gt;&lt;a title=\"Delicious\" href=\"javascript:void(delicious=window.open('http://del.icio.us/post?url='+encodeURIComponent('%2\$s')+'&amp;title='+encodeURIComponent('%1\$s'), 'delicious'));delicious.focus();\"&gt;[&lt;strong style='color:#0000FF'&gt;del.icio.us&lt;/strong&gt;]&lt;/a&gt;  &lt;/li&gt;"</span>
. <span class="str">"&lt;li&gt;&lt;a href=\"javascript:void(vivi = window.open('http://vivi.sina.com.cn/collect/icollect.php?pid=28&amp;title=' + encodeURIComponent('%1\$s') + '&amp;url=' + encodeURIComponent('%2\$s') + '&amp;desc=' + encodeURIComponent(t), 'vivi')); vivi.focus();\"&gt;[&lt;strong style='color:red'&gt;新浪 VIVI&lt;/strong&gt;]&lt;/a&gt;  &lt;/li&gt;"</span>
. <span class="str">"&lt;li&gt;&lt;a href=\"javascript:void(365key = window.open('http://www.365key.com/storeit.aspx?t=' + encodeURIComponent('%1\$s') +'&amp;u=' + encodeURIComponent('%2\$s') + '&amp;c=' + encodeURIComponent(t), 'keyit')); 365key.focus();\"&gt;[&lt;strong style='color:#a287be'&gt;365k&lt;/strong&gt;&lt;strong style='color:#00CC00'&gt;e&lt;/strong&gt;&lt;strong style='color:#9575B6'&gt;y&lt;/strong&gt;]&lt;/a&gt;  &lt;/li&gt;"</span>
. <span class="str">"&lt;li&gt;&lt;a href=\"javascript:void(blogchina = window.open('http://blogmark.blogchina.com/jsp/key/quickaddkey.jsp?k=' + encodeURI('%1\$s') + '&amp;u='+encodeURI('%2\$s') + '&amp;c='+encodeURI(t), 'blogchina')); keyit.focus();\"&gt;[&lt;strong style='color:#74B779'&gt;博采中心&lt;/strong&gt;]&lt;/a&gt;  &lt;/li&gt;"</span>
. <span class="str">"&lt;li&gt;&lt;a href=\"javascript:void(poco = window.open('http://my.poco.cn/fav/storeIt.php?t=' + encodeURIComponent('%1\$s') + '&amp;u=' + encodeURIComponent('%2\$s') + '&amp;c=' + encodeURIComponent(t), 'keyit')); poco.focus();\"&gt;[&lt;strong style='color:#29B5DE'&gt;Poco&lt;/strong&gt;]&lt;/a&gt;  &lt;/li&gt;"</span>
. <span class="str">"&lt;li&gt;&lt;a href=\"javascript:void(sohu = window.open('http://z.sohu.com/storeit.do?t=' + encodeURIComponent('%1\$s') + '&amp;u=' + encodeURIComponent('%2\$s') +'&amp;c=' + encodeURIComponent(t), 'sohu')); sohu.focus();\"&gt;[&lt;strong style='color:#505050'&gt;SOHU狐摘&lt;/strong&gt;]&lt;/A&gt;  &lt;/li&gt;"</span>
. <span class="str">"&lt;li&gt;&lt;a href=\"javascript:void(yesky = window.open('http://hot.yesky.com/dp.aspx?t=' + encodeURIComponent('%1\$s') + '&amp;u=' + encodeURIComponent('%2\$s') + '&amp;c=' + encodeURIComponent(t) + '&amp;st=2', 'yesky')); yesky.focus();\"&gt;[&lt;strong style='color:#99CF17'&gt;天极&lt;/strong&gt;&lt;strong style='color:#FF7F00'&gt;网摘&lt;/strong&gt;]&lt;/a&gt;  &lt;/li&gt;"</span>
. <span class="str">"&lt;li&gt;&lt;a href=\"javascript:void(hexun = window.open('http://bookmark.hexun.com/post.aspx?title=' + encodeURIComponent(t) + '&amp;url=' + encodeURIComponent(u) + '&amp;excerpt=' + encodeURIComponent(e), 'HexunBookmark')); hexun.focus();\"&gt;[&lt;strong style='color:#3366CC'&gt;和讯网摘&lt;/strong&gt;]&lt;/a&gt;  &lt;/li&gt;"</span>
. <span class="str">"&lt;li&gt;&lt;a href=\"javascript:void(qq = window.open('http://shuqian.qq.com/post?title=' + encodeURIComponent('%1\$s')+ '&amp;uri=' + encodeURIComponent('%2\$s') +'&amp;jumpback=2&amp;noui=1', 'qq')); qq.focus();\"&gt;[QQ&lt;strong style='color:#74B779'&gt;书签&lt;/strong&gt;]&lt;/a&gt;  &lt;/li&gt;"</span>
. <span class="str">"&lt;li&gt;&lt;a href=\"javascript:void(baidu = window.open('http://cang.baidu.com/do/add?it=' + encodeURIComponent('%1\$s')+ '&amp;iu=' + encodeURIComponent('%2\$s') +'&amp;dc=&amp;fr=ien#nw=1'', 'baidu')); baidu.focus();\"&gt;[&lt;strong style='color:red'&gt;百度搜藏&lt;/strong&gt;]&lt;/a&gt;  &lt;/li&gt;"</span>
. <span class="str">"&lt;/ul&gt;&lt;/span&gt;"</span>
    );
?&gt;</pre>
<style type="text/css">    .csharpcode, .csharpcode pre  {  	font-size: small;  	color: black;  	font-family: consolas, "Courier New", courier, monospace;  	background-color: #ffffff;  	/*white-space: pre;*/  }  .csharpcode pre { margin: 0em; }  .csharpcode .rem { color: #008000; }  .csharpcode .kwrd { color: #0000ff; }  .csharpcode .str { color: #006080; }  .csharpcode .op { color: #0000c0; }  .csharpcode .preproc { color: #cc6633; }  .csharpcode .asp { background-color: #ffff00; }  .csharpcode .html { color: #800000; }  .csharpcode .attr { color: #ff0000; }  .csharpcode .alt  {  	background-color: #f4f4f4;  	width: 100%;  	margin: 0em;  }  .csharpcode .lnum { color: #606060; }</style>

	标签： <a href="http://xuplus.com/article/tag/hack" title="Hack" rel="tag">Hack</a>, <a href="http://xuplus.com/article/tag/transfer" title="Transfer" rel="tag">Transfer</a>, <a href="http://xuplus.com/article/tag/xoops" title="XOOPS" rel="tag">XOOPS</a>, <a href="http://xuplus.com/article/tag/%e4%b9%a6%e7%ad%be" title="书签" rel="tag">书签</a><br />
]]></content:encoded>
			<wfw:commentRss>http://xuplus.com/article/2007/07/a45.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[Hack]在XOOPS的article模组中显示完整文章标题</title>
		<link>http://xuplus.com/article/2007/07/a44.html</link>
		<comments>http://xuplus.com/article/2007/07/a44.html#comments</comments>
		<pubDate>Wed, 25 Jul 2007 23:51:17 +0000</pubDate>
		<dc:creator>Dominic</dc:creator>
				<category><![CDATA[XOOPS]]></category>
		<category><![CDATA[article]]></category>
		<category><![CDATA[Hack]]></category>
		<category><![CDATA[title属性]]></category>
		<category><![CDATA[模组]]></category>

		<guid isPermaLink="false">http://xuplus.com/?p=44</guid>
		<description><![CDATA[D.J.老大开发的article非常好用，其中有一个小缺陷：当我们获取文章列表时一般会对文章标题截取给定长度，但是当我们这样做之后，文章列表中文章标题是被截断了，但是对应A标签的title属性中也使用了截断之后的文字。这样导致的结果是当我们把鼠标移动到文章标题上面的时候，并不能看到完整的标题。 解决办法如下： 1、修改htdocs\modules\article\blocks\block.php和blocks.article.php文件，在162行附近加入如下行代码 $_art["art_fulltitle"] = $_art["art_title"];//Modifyed By XuYong 修改之后完整代码为： $_art["art_fulltitle"] = $_art["art_title"];//Modifyed By XuYong if(!empty($options[3])){ $_art["art_title"] = xoops_substr($_art["art_title"], 0, $options[3]); } 2、在对应的模板文件中使用art_fulltitle来显示超链接的title属性。可修改article_block_article.html文件如下： &#60;ul class="blkList"&#62; &#60;{foreach item=article from=$block.articles name=art}&#62; &#60;li&#62;&#60;span class="blkTime"&#62;&#60;{$article.time}&#62;&#60;/span&#62;&#60;a href="&#60;{$xoops_url}&#62;/modules/&#60;{$block.dirname}&#62;/view.article.php&#60;{$smarty.const.URL_DELIMITER}&#62;&#60;{$article.art_id}&#62;/c&#60;{$article.cat_id}&#62;" target="_blank" title="&#60;{$article.art_fulltitle}&#62;"&#62;&#60;{$article.art_title&#124;smartTruncate:19}&#62;&#60;/a&#62;&#60;/li&#62; &#60;{/foreach}&#62; &#60;/ul&#62; 标签： article, Hack, title属性, XOOPS, 模组]]></description>
			<content:encoded><![CDATA[<p>D.J.老大开发的article非常好用，其中有一个小缺陷：当我们获取文章列表时一般会对文章标题截取给定长度，但是当我们这样做之后，文章列表中文章标题是被截断了，但是对应A标签的title属性中也使用了截断之后的文字。这样导致的结果是当我们把鼠标移动到文章标题上面的时候，并不能看到完整的标题。</p>
<p>解决办法如下：</p>
<p>1、修改htdocs\modules\<a href="http://xuplus.com/article/tag/article" class="st_tag internal_tag" rel="tag" title="标签 article 下的日志">article</a>\blocks\block.php和blocks.<a href="http://xuplus.com/article/tag/article" class="st_tag internal_tag" rel="tag" title="标签 article 下的日志">article</a>.php文件，在162行附近加入如下行代码</p>
<pre class="csharpcode">     $_art[<span class="str">"art_fulltitle"</span>] = $_art[<span class="str">"art_title"</span>];//Modifyed By XuYong</pre>
<style type="text/css">  .csharpcode, .csharpcode pre  {  	font-size: small;  	color: black;  	font-family: consolas, "Courier New", courier, monospace;  	background-color: #ffffff;  	/*white-space: pre;*/  }  .csharpcode pre { margin: 0em; }  .csharpcode .rem { color: #008000; }  .csharpcode .kwrd { color: #0000ff; }  .csharpcode .str { color: #006080; }  .csharpcode .op { color: #0000c0; }  .csharpcode .preproc { color: #cc6633; }  .csharpcode .asp { background-color: #ffff00; }  .csharpcode .html { color: #800000; }  .csharpcode .attr { color: #ff0000; }  .csharpcode .alt  {  	background-color: #f4f4f4;  	width: 100%;  	margin: 0em;  }  .csharpcode .lnum { color: #606060; }</style>
<p>修改之后完整代码为：</p>
<pre class="csharpcode">            $_art[<span class="str">"art_fulltitle"</span>] = $_art[<span class="str">"art_title"</span>];<span class="rem">//Modifyed By XuYong</span>
        <span class="kwrd">if</span>(!empty($options[3])){
            $_art[<span class="str">"art_title"</span>] = <a href="http://xuplus.com/article/tag/xoops" class="st_tag internal_tag" rel="tag" title="标签 XOOPS 下的日志">xoops</a>_substr($_art[<span class="str">"art_title"</span>], 0, $options[3]);
        }</pre>
<style type="text/css">  .csharpcode, .csharpcode pre  {  	font-size: small;  	color: black;  	font-family: consolas, "Courier New", courier, monospace;  	background-color: #ffffff;  	/*white-space: pre;*/  }  .csharpcode pre { margin: 0em; }  .csharpcode .rem { color: #008000; }  .csharpcode .kwrd { color: #0000ff; }  .csharpcode .str { color: #006080; }  .csharpcode .op { color: #0000c0; }  .csharpcode .preproc { color: #cc6633; }  .csharpcode .asp { background-color: #ffff00; }  .csharpcode .html { color: #800000; }  .csharpcode .attr { color: #ff0000; }  .csharpcode .alt  {  	background-color: #f4f4f4;  	width: 100%;  	margin: 0em;  }  .csharpcode .lnum { color: #606060; }</style>
<p>2、在对应的模板文件中使用art_fulltitle来显示超链接的title属性。可修改article_block_article.html文件如下：</p>
<pre class="csharpcode"><span class="kwrd">&lt;</span><span class="html">ul</span> <span class="attr">class</span><span class="kwrd">="blkList"</span><span class="kwrd">&gt;</span>
  <span class="kwrd">&lt;</span>{foreach item=article from=$block.articles name=art}<span class="kwrd">&gt;</span>
  <span class="kwrd">&lt;</span><span class="html">li</span><span class="kwrd">&gt;&lt;</span><span class="html">span</span> <span class="attr">class</span><span class="kwrd">="blkTime"</span><span class="kwrd">&gt;&lt;</span>{$article.time}<span class="kwrd">&gt;&lt;/</span><span class="html">span</span><span class="kwrd">&gt;&lt;</span><span class="html">a</span> <span class="attr">href</span>="&lt;{$<span class="attr">xoops_url</span>}<span class="kwrd">&gt;</span>/modules/<span class="kwrd">&lt;</span>{$block.dirname}<span class="kwrd">&gt;</span>/view.article.<a href="http://xuplus.com/article/tag/php" class="st_tag internal_tag" rel="tag" title="标签 PHP 下的日志">php</a><span class="kwrd">&lt;</span>{$smarty.const.URL_DELIMITER}<span class="kwrd">&gt;&lt;</span>{$article.art_id}<span class="kwrd">&gt;</span>/c<span class="kwrd">&lt;</span>{$article.cat_id}<span class="kwrd">&gt;</span>" target="_blank" title="<span class="kwrd">&lt;</span>{$article.art_fulltitle}<span class="kwrd">&gt;</span>"<span class="kwrd">&gt;&lt;</span>{$article.art_title|smartTruncate:19}<span class="kwrd">&gt;&lt;/</span><span class="html">a</span><span class="kwrd">&gt;&lt;/</span><span class="html">li</span><span class="kwrd">&gt;</span>
  <span class="kwrd">&lt;</span>{/foreach}<span class="kwrd">&gt;</span>
<span class="kwrd">&lt;/</span><span class="html">ul</span><span class="kwrd">&gt;</span></pre>
<style type="text/css">  .csharpcode, .csharpcode pre  {  	font-size: small;  	color: black;  	font-family: consolas, "Courier New", courier, monospace;  	background-color: #ffffff;  	/*white-space: pre;*/  }  .csharpcode pre { margin: 0em; }  .csharpcode .rem { color: #008000; }  .csharpcode .kwrd { color: #0000ff; }  .csharpcode .str { color: #006080; }  .csharpcode .op { color: #0000c0; }  .csharpcode .preproc { color: #cc6633; }  .csharpcode .asp { background-color: #ffff00; }  .csharpcode .html { color: #800000; }  .csharpcode .attr { color: #ff0000; }  .csharpcode .alt  {  	background-color: #f4f4f4;  	width: 100%;  	margin: 0em;  }  .csharpcode .lnum { color: #606060; }</style>

	标签： <a href="http://xuplus.com/article/tag/article" title="article" rel="tag">article</a>, <a href="http://xuplus.com/article/tag/hack" title="Hack" rel="tag">Hack</a>, <a href="http://xuplus.com/article/tag/title%e5%b1%9e%e6%80%a7" title="title属性" rel="tag">title属性</a>, <a href="http://xuplus.com/article/tag/xoops" title="XOOPS" rel="tag">XOOPS</a>, <a href="http://xuplus.com/article/tag/%e6%a8%a1%e7%bb%84" title="模组" rel="tag">模组</a><br />
]]></content:encoded>
			<wfw:commentRss>http://xuplus.com/article/2007/07/a44.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[Hack]让article模组中显示用户真实姓名</title>
		<link>http://xuplus.com/article/2007/07/a43.html</link>
		<comments>http://xuplus.com/article/2007/07/a43.html#comments</comments>
		<pubDate>Wed, 25 Jul 2007 23:50:39 +0000</pubDate>
		<dc:creator>Dominic</dc:creator>
				<category><![CDATA[XOOPS]]></category>
		<category><![CDATA[article]]></category>
		<category><![CDATA[Hack]]></category>
		<category><![CDATA[模组]]></category>

		<guid isPermaLink="false">http://xuplus.com/?p=43</guid>
		<description><![CDATA[目前XOOPS中article模组显示的都是文章发布者的登录名，有些时候显示真实姓名可能更恰当，特别是当提交者是单位的时候，这里提一个临时解决方案，最佳方案是放到配置项中由管理员配置显示。 修改htdocs\modules\article\class\article.php文件中的getAuthor函数如下即可： function &#38;getAuthor($retrieveUname = false) { $author["uid"] = $this-&#62;getVar("uid"); if($retrieveUname){ $author["name"] = XoopsUser::getUnameFromId($author["uid"],1) ; } return $author; } 配合XOOPS中修正获取真实用户名的Bug (Fixed) 效果更好。 标签： article, Hack, XOOPS, 模组]]></description>
			<content:encoded><![CDATA[<p>目前XOOPS中article模组显示的都是文章发布者的登录名，有些时候显示真实姓名可能更恰当，特别是当提交者是单位的时候，这里提一个临时解决方案，最佳方案是放到配置项中由管理员配置显示。</p>
<p>修改htdocs\modules\<a href="http://xuplus.com/article/tag/article" class="st_tag internal_tag" rel="tag" title="标签 article 下的日志">article</a>\class\<a href="http://xuplus.com/article/tag/article" class="st_tag internal_tag" rel="tag" title="标签 article 下的日志">article</a>.php文件中的getAuthor函数如下即可：</p>
<pre class="csharpcode"><span class="kwrd">function</span> &amp;getAuthor($retrieveUname = <span class="kwrd">false</span>)
    {
        $author[<span class="str">"uid"</span>] = $<span class="kwrd">this</span>-&gt;getVar(<span class="str">"uid"</span>);
        <span class="kwrd">if</span>($retrieveUname){
            $author[<span class="str">"name"</span>] = XoopsUser::getUnameFromId($author[<span class="str">"uid"</span>],1) ;
        }
        <span class="kwrd">return</span> $author;
    }</pre>
<style type="text/css">.csharpcode, .csharpcode pre  {  	font-size: small;  	color: black;  	font-family: consolas, "Courier New", courier, monospace;  	background-color: #ffffff;  	/*white-space: pre;*/  }  .csharpcode pre { margin: 0em; }  .csharpcode .rem { color: #008000; }  .csharpcode .kwrd { color: #0000ff; }  .csharpcode .str { color: #006080; }  .csharpcode .op { color: #0000c0; }  .csharpcode .preproc { color: #cc6633; }  .csharpcode .asp { background-color: #ffff00; }  .csharpcode .html { color: #800000; }  .csharpcode .attr { color: #ff0000; }  .csharpcode .alt  {  	background-color: #f4f4f4;  	width: 100%;  	margin: 0em;  }  .csharpcode .lnum { color: #606060; }</style>
<p>配合<a rel="bookmark" href="http://xuplus.com/article/2007/07/a46.html" title="到《XOOPS中修正获取真实用户名的Bug (Fixed)》的永久链接">XOOPS中修正获取真实用户名的Bug (Fixed) </a>效果更好。</p>

	标签： <a href="http://xuplus.com/article/tag/article" title="article" rel="tag">article</a>, <a href="http://xuplus.com/article/tag/hack" title="Hack" rel="tag">Hack</a>, <a href="http://xuplus.com/article/tag/xoops" title="XOOPS" rel="tag">XOOPS</a>, <a href="http://xuplus.com/article/tag/%e6%a8%a1%e7%bb%84" title="模组" rel="tag">模组</a><br />
]]></content:encoded>
			<wfw:commentRss>http://xuplus.com/article/2007/07/a43.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>XOOPS开发工作可以告一段落了</title>
		<link>http://xuplus.com/article/2007/07/a42.html</link>
		<comments>http://xuplus.com/article/2007/07/a42.html#comments</comments>
		<pubDate>Wed, 25 Jul 2007 05:30:05 +0000</pubDate>
		<dc:creator>Dominic</dc:creator>
				<category><![CDATA[XOOPS]]></category>
		<category><![CDATA[模组]]></category>

		<guid isPermaLink="false">http://xuplus.com/?p=42</guid>
		<description><![CDATA[前段时间在家的时候帮朋友改版了网站——安徽车市（http://www.ahcarmarket.com），用的是XOOPS 2.0.16的UTF-8版。2003年的时候做安徽大中专毕业生就业信息网的时候用了XOOPS，后来在给一个朋友弄他们公司网站的时候也用了XOOPS，个人感觉XOOPS还是非常强大的一个Portal（个人觉得比CMS更贴切）。安徽车市的开发工作将移交给一个小伙来完成，今后很长一段时间内应该不会从事XOOPS的开发了，XOOPS这么好的东西也开始没落了，社区人员越来越少，新版本的发布也越来越少了。 这次开发安徽车市采用了一下模组： article文章模组作为 资讯中心，修正了UTF-8下pdf输出乱码的问题 auto汽车信息及报价 未开发完成 googlemaps地图，更改为中文地图，准备用于企业标注和电子地图 mediawiki维基，作为汽车百科 newbb论坛 Openads广告管理，自己集成Openads（原PHPAdsNews） page页面布局模组，自己更改了一些东西，适用于UTF8环境和防止用户误操作和页面静态化。 protector保护模组 securityimage图片验证码 sitemap站点地图，有修改，主动生成sitemap.xml文件， smartobject smartprofile system系统管理 tag标签， tinycontent用于站点介绍 xcgal相册模组，用于汽车图库 xmmemberstats会员管理 准备用上addresses，后台也做了一些美化。 hack和优化了相当多的内容，有时间整理一下再发布吧。里面最为满意的模组就是article和tag模组集合使用，加上URL重写，可以产生大量的链接，这个网站做到了2500篇左右的文章（还没有大量使用tag）加上5000左右的汽车信息连接页面（这个没有集成transfer和tag，对于链接数没有什么贡献），在baidu上面拥有13800个链接，在google上面拥有15000多个链接，在yahoo上面有8000多个连接。 Page模组也非常好，完全可以实现主题、布局、区块、皮肤的应用。 其实这个网站还有一些开发工作没有开发完成，这个月上班之后就没有投入精力了，转交给别人之后，应该不会再从事XOOPS的开发工作了 标签： XOOPS, 模组]]></description>
			<content:encoded><![CDATA[<p><font size="2">前段时间在家的时候帮朋友改版了网站——</font><a target="_blank" href="http://www.ahcarmarket.com/"><font size="2">安徽车市</font></a><font size="2">（</font><a href="http://www.ahcarmarket.com"><font size="2">http://www.ahcarmarket.com</font></a><font size="2">），用的是XOOPS 2.0.16的UTF-8版。2003年的时候做</font><a target="_blank" href="http://www.ahbys.com/"><font size="2">安徽大中专毕业生就业信息网</font></a><font size="2">的时候用了XOOPS，后来在给一个朋友弄他们公司网站的时候也用了XOOPS，个人感觉XOOPS还是非常强大的一个Portal（个人觉得比CMS更贴切）。安徽车市的开发工作将移交给一个小伙来完成，今后很长一段时间内应该不会从事XOOPS的开发了，XOOPS这么好的东西也开始没落了，社区人员越来越少，新版本的发布也越来越少了。</font></p>
<p><font size="2">这次开发</font><a target="_blank" href="http://www.ahcarmarket.com"><font size="2">安徽车市</font></a><font size="2">采用了一下模组：<br />
article文章模组作为 资讯中心，修正了UTF-8下pdf输出乱码的问题<br />
auto汽车信息及报价 未开发完成<br />
googlemaps地图，更改为中文地图，准备用于企业标注和电子地图<br />
mediawiki维基，作为汽车百科<br />
newbb论坛<br />
Openads广告管理，自己集成Openads（原PHPAdsNews）<br />
page页面布局模组，自己更改了一些东西，适用于UTF8环境和防止用户误操作和页面静态化。<br />
protector保护模组<br />
securityimage图片验证码<br />
sitemap站点地图，有修改，主动生成sitemap.xml文件，<br />
smartobject<br />
smartprofile<br />
system系统管理<br />
tag标签，<br />
tinycontent用于站点介绍<br />
xcgal相册模组，用于汽车图库<br />
xmmemberstats会员管理<br />
准备用上addresses，后台也做了一些美化。</font></p>
<p><font size="2">hack和优化了相当多的内容，有时间整理一下再发布吧。里面最为满意的模组就是article和tag模组集合使用，加上URL重写，可以产生大量的链接，这个网站做到了2500篇左右的文章（还没有大量使用tag）加上5000左右的汽车信息连接页面（这个没有集成transfer和tag，对于链接数没有什么贡献），在baidu上面拥有13800个链接，在google上面拥有15000多个链接，在yahoo上面有8000多个连接。</font></p>
<p><font size="2">Page模组也非常好，完全可以实现主题、布局、区块、皮肤的应用。</font></p>
<p><font size="2">其实这个网站还有一些开发工作没有开发完成，这个月上班之后就没有投入精力了，转交给别人之后，应该不会再从事XOOPS的开发工作了</font></p>

	标签： <a href="http://xuplus.com/article/tag/xoops" title="XOOPS" rel="tag">XOOPS</a>, <a href="http://xuplus.com/article/tag/%e6%a8%a1%e7%bb%84" title="模组" rel="tag">模组</a><br />
]]></content:encoded>
			<wfw:commentRss>http://xuplus.com/article/2007/07/a42.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>XOOPS的Page模组UTF-8字符编码下的使用方法</title>
		<link>http://xuplus.com/article/2007/06/a38.html</link>
		<comments>http://xuplus.com/article/2007/06/a38.html#comments</comments>
		<pubDate>Mon, 25 Jun 2007 07:06:14 +0000</pubDate>
		<dc:creator>Dominic</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[XOOPS]]></category>
		<category><![CDATA[Page]]></category>
		<category><![CDATA[UTF 8]]></category>
		<category><![CDATA[xajax]]></category>
		<category><![CDATA[中文]]></category>

		<guid isPermaLink="false">http://xuplus.com/?p=38</guid>
		<description><![CDATA[文明猪汉化了非常好用的Page模组，其功能强大得过了头，充分体现了数据展现分离思想，将Xoops中原本主题、布局、区块的概念扩充到主题、布局、区块、皮肤，将原来相对固定的布局方式更改为随意布局的形式（如果可以直接拖动就更完美了），将然来局限于系统提供的区块提升到可以随意创建区块和随意利用区块的高度，但是目前Page模组仅仅只能使用GB2312编码上，如果网站采用UTF-8编码这不能利用这个Page模组。之前就找到了解决的办法，这次乘解决xajax中文显示的问题一并写出来吧。 其实这个bug是由xajax库引起的（参见我另外一篇文章：PHP中xajax库中文问题及提示返回XML文件无效的解决办法 ），解决办法是： 将page目录下所有文件全部采用UTF-8无BOM格式保存（当然语言文件不必要），至少server/page.server.php这个文件需要采用UTF-8无BOM格式保存（UltraEdit 操作方法：F12或另存为界面中格式下拉框选择‘UTF-8－无 BOM’），index.php这个也需要UTF-8无BOM格式保存，另外建立对应的UTF-8编码的语言文件。再将Framework目录下xajax目录下所有的php文件全部使用UTF-8无BOM格式保存。一般即可。 之前的一个项目中使用了UTF-8格式的Page模组，这个模组的UTF-8格式支持包还是让文明猪来发布吧，不过有需要的也可以联系我。   标签： Page, PHP, UTF 8, xajax, XOOPS, 中文]]></description>
			<content:encoded><![CDATA[<p><font size="3">文明猪汉化了非常好用的Page模组，其功能强大得过了头，充分体现了数据展现分离思想，将Xoops中原本主题、布局、区块的概念扩充到主题、布局、区块、皮肤，将原来相对固定的布局方式更改为随意布局的形式（如果可以直接拖动就更完美了），将然来局限于系统提供的区块提升到可以随意创建区块和随意利用区块的高度，但是目前Page模组仅仅只能使用GB2312编码上，如果网站采用UTF-8编码这不能利用这个Page模组。之前就找到了解决的办法，这次乘解决xajax中文显示的问题一并写出来吧。</font></p>
<p><font size="3">其实这个bug是由xajax库引起的（参见我另外一篇文章：<a href="http://xuplus.com/article/2007/06/a35.html">PHP中xajax库中文问题及提示返回XML文件无效的解决办法 </a>），解决办法是：</font></p>
<p><font size="3">将page目录下所有文件全部采用UTF-8无BOM格式保存（当然语言文件不必要），至少server/<a href="http://xuplus.com/article/tag/page" class="st_tag internal_tag" rel="tag" title="标签 Page 下的日志">page</a>.server.php这个文件需要采用UTF-8无BOM格式保存（UltraEdit 操作方法：F12或另存为界面中格式下拉框选择‘UTF-8－无 BOM’），index.php这个也需要UTF-8无BOM格式保存，另外建立对应的UTF-8编码的语言文件。再将Framework目录下xajax目录下所有的php文件全部使用UTF-8无BOM格式保存。一般即可。</font></p>
<p><font size="3">之前的一个项目中使用了UTF-8格式的Page模组，这个模组的UTF-8格式支持包还是让文明猪来发布吧，不过有需要的也可以联系我。</font></p>
<p> </p>

	标签： <a href="http://xuplus.com/article/tag/page" title="Page" rel="tag">Page</a>, <a href="http://xuplus.com/article/tag/php" title="PHP" rel="tag">PHP</a>, <a href="http://xuplus.com/article/tag/utf-8" title="UTF 8" rel="tag">UTF 8</a>, <a href="http://xuplus.com/article/tag/xajax" title="xajax" rel="tag">xajax</a>, <a href="http://xuplus.com/article/tag/xoops" title="XOOPS" rel="tag">XOOPS</a>, <a href="http://xuplus.com/article/tag/%e4%b8%ad%e6%96%87" title="中文" rel="tag">中文</a><br />
]]></content:encoded>
			<wfw:commentRss>http://xuplus.com/article/2007/06/a38.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP中xajax库中文问题及提示返回XML文件无效的解决办法</title>
		<link>http://xuplus.com/article/2007/06/a37.html</link>
		<comments>http://xuplus.com/article/2007/06/a37.html#comments</comments>
		<pubDate>Mon, 25 Jun 2007 06:31:26 +0000</pubDate>
		<dc:creator>Dominic</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[xajax]]></category>
		<category><![CDATA[中文]]></category>
		<category><![CDATA[编码]]></category>

		<guid isPermaLink="false">http://xuplus.com/?p=37</guid>
		<description><![CDATA[xajax是PHP下一个非常好的ajax框架，虽然xajax自己说自己是一个库(Library)，但是我觉得它更像一个框架（Framework）。xajax是一个开源的 PHP 类库 它能够让你黏合HTML、CSS、Javascript和PHP，并可以结合Smarty模板系统使用。 在运用Xoops的Page模组的时候，发现其不能和中文正常工作，特别是不能和UTF-8编码的页面一起工作，昨天在利用这个实现DataGrid的时候发现完全不能正常工作了，一直报“the XML response that was returned from the server is invalid”这个错误，Google了一下，发现不少人也有这个问题。结合之前解决Xoops的Page模组（感谢文明猪）的UTF-8使用问题的方法，终于发现了完美解决xajax库使用中文的方法。 如果页面采用GB2312或GBK作为编码或字符集，一般网络上面提到的方法可以解决：需要注意的是common.php、server.php及server.php用到的php文件（特别是生成数据的文件）全部不要使用UTF-8编码格式保存而使用ASCII格式保存。同时server.php输出的数据内容最好也采用gb2312编码。 在common.php前面定义 define(&#8216;XAJAX_DEFAULT_CHAR_ENCODING&#8217;,'GB2312&#8242;); 再在调用时使用： $xajax = new xajax(); $xajax-&#62;decodeUTF8InputOn(); 或者 $xajax = new xajax(&#8216;gb2312&#8242;); $xajax-&#62;setCharEncoding(); $xajax-&#62;decodeUTF8InputOn(); $objResponse = new xajaxResponse(&#8216;gb2312&#8242;); 如果页面采用UTF-8字符集的话，网上一些人说使用UTF-8格式编码就可以了，实际上即使全部使用UTF-8编码也不能正常工作，还是会报错：“the XML response that was returned from the server is invalid”。联想到之前在IE下碰到UTF-8 BOM Bug（文章：IE下页面无端端空出一行及utf8页面无法显示的解决方法 ），会不会这个地方服务器传回的XML文件中也包含多个UTF-8 BOM内容呢？通过ethereal截获数据包发现，服务器返回的内容中还真是包含了多个UTF-8 BOM，可能还是IE使用的Microsoft XML Parser的UTF-8 BOM Bug吧。这样解决办法就出来了：所有页面全部采用UTF8编码并使用无UTF-8 [...]]]></description>
			<content:encoded><![CDATA[<p><span style="font-size: small;">xajax是PHP下一个非常好的ajax框架，虽然xajax自己说自己是一个库(Library)，但是我觉得它更像一个框架（Framework）。xajax是一个开源的 <a href="http://xuplus.com/article/tag/php" class="st_tag internal_tag" rel="tag" title="标签 PHP 下的日志">PHP</a> 类库 它能够让你黏合HTML、CSS、Javascript和PHP，并可以结合Smarty模板系统使用。</span></p>
<p><span style="font-size: small;">在运用Xoops的Page模组的时候，发现其不能和中文正常工作，特别是不能和UTF-8编码的页面一起工作，昨天在利用这个实现DataGrid的时候发现完全不能正常工作了，一直报“the XML response that was returned from the server is invalid”这个错误，Google了一下，发现不少人也有这个问题。结合之前解决Xoops的Page模组（感谢文明猪）的UTF-8使用问题的方法，终于发现了完美解决xajax库使用中文的方法。</span></p>
<p><span style="font-size: small;">如果页面采用GB2312或GBK作为编码或字符集，一般网络上面提到的方法可以解决：需要注意的是common.php、server.php及server.php用到的php文件（特别是生成数据的文件）全部不要使用UTF-8编码格式保存而使用ASCII格式保存。同时server.php输出的数据内容最好也采用gb2312<a href="http://xuplus.com/article/tag/%e7%bc%96%e7%a0%81" class="st_tag internal_tag" rel="tag" title="标签 编码 下的日志">编码</a>。<br />
在common.php前面定义<br />
define(&#8216;<a href="http://xuplus.com/article/tag/xajax" class="st_tag internal_tag" rel="tag" title="标签 xajax 下的日志">XAJAX</a>_DEFAULT_CHAR_ENCODING&#8217;,'GB2312&#8242;);<br />
再在调用时使用：<br />
$xajax = new xajax();<br />
$xajax-&gt;decodeUTF8InputOn();<br />
或者<br />
$xajax = new xajax(&#8216;gb2312&#8242;);<br />
$xajax-&gt;setCharEncoding();<br />
$xajax-&gt;decodeUTF8InputOn();<br />
$objResponse = new xajaxResponse(&#8216;gb2312&#8242;); </span></p>
<p><span style="font-size: small;">如果页面采用UTF-8字符集的话，网上一些人说使用UTF-8格式编码就可以了，实际上即使全部使用UTF-8编码也不能正常工作，还是会报错：“the XML response that was returned from the server is invalid”。联想到之前在IE下碰到UTF-8 BOM Bug（文章：<a href="http://xuplus.com/article/2007/04/a6.html">IE下页面无端端空出一行及utf8页面无法显示的解决方法 </a>），会不会这个地方服务器传回的XML文件中也包含多个UTF-8 BOM内容呢？通过ethereal截获数据包发现，服务器返回的内容中还真是包含了多个UTF-8 BOM，可能还是IE使用的Microsoft XML Parser的UTF-8 BOM Bug吧。这样解决办法就出来了：所有页面全部采用UTF8编码并使用无UTF-8 BOM保存（UltraEdit 操作方法：F12或另存为界面中格式下拉框选择‘UTF-8－无 BOM’），页面包括xajax库文件、common.php文件、server.php文件。供访问的页面也可以使用无UTF-8 BOM保存。</span></p>
<p><span style="font-size: small;">有时候返回的参数（特别是中文部分）被url编码了，这个时候需要我们将返回的数据使用Urldecode进行处理，以便能够正常完成后面的数据库操作。 </span></p>
<p><span style="font-size: small;">最新xajax 0.25下载地址：<a title="http://prdownloads.sourceforge.net/xajax/xajax_0.2.5.zip?download" href="http://prdownloads.sourceforge.net/xajax/xajax_0.2.5.zip?download">http://prdownloads.sourceforge.net/xajax/xajax_0.2.5.zip?download</a></span></p>
<p><span style="font-size: small;">xajax中文手册（HonestQiao第一版，FlyingHail修改版） <a href="http://www.flyinghail.net/?p=44">http://www.flyinghail.net/?p=44</a></span></p>
<p><span style="font-size: small;">UTF-8 BOM解释：”EF BB BF” 这三个字节就叫BOM，BOM的全称叫做”Byte Order Mard”。在UTF-8文件中常用BOM来表明这个文件是UTF-8文件，而BOM的本意实在UTF-16中用来表示高低字节序列的。</span></p>
<p><span style="font-size: small;">另外，PHP网站上说使用&#8211;enable-zend-multibyte可以解决这类问题，不过没有尝试，并且预计在PHP 6.0中会对Unicode做完美的支持。</span></p>

	标签： <a href="http://xuplus.com/article/tag/php" title="PHP" rel="tag">PHP</a>, <a href="http://xuplus.com/article/tag/xajax" title="xajax" rel="tag">xajax</a>, <a href="http://xuplus.com/article/tag/%e4%b8%ad%e6%96%87" title="中文" rel="tag">中文</a>, <a href="http://xuplus.com/article/tag/%e7%bc%96%e7%a0%81" title="编码" rel="tag">编码</a><br />
]]></content:encoded>
			<wfw:commentRss>http://xuplus.com/article/2007/06/a37.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>《CSS禅意花园》一书中提及的有用链接</title>
		<link>http://xuplus.com/article/2007/06/a36.html</link>
		<comments>http://xuplus.com/article/2007/06/a36.html#comments</comments>
		<pubDate>Mon, 25 Jun 2007 05:40:08 +0000</pubDate>
		<dc:creator>Dominic</dc:creator>
				<category><![CDATA[Web应用]]></category>
		<category><![CDATA[读书]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[摘要]]></category>
		<category><![CDATA[有用链接]]></category>
		<category><![CDATA[禅意花园]]></category>

		<guid isPermaLink="false">http://xuplus.com/?p=36</guid>
		<description><![CDATA[整理《CSS禅意花园》一书中提及一些有用链接，主要是从Note和Tips以及附录中摘要出来。 CSS一些资料参考页面： XHTML 1.0中可以使用的所有HTML元素：http://w3schools.com/xhtml/xhtml_reference.asp 避免Windows下IE中可能出现文档样式短暂失效问题：空script元素或使用link，http://www.bluerobot.com/web/css/fouc.asp CSS签名（CSS Signature），应用到body元素上的id。利用这个用户自定义的样式表可以覆盖页面中的部分甚至所有CSS样式。参见：http://archivist.incutio.com/viewlist/css-discuss/13291 CSS2选择器：http://www.w3c.org/TR/CSS21/selector.html CSS3选择器：http://www.w3c.org/TR/css3-selectors 图像替换技术详细使用方法以及使用中各种问题：http://www.stopdesign.com/articles/replace_text/ Windows平台下IE7以下版本会将某些浮动元素的水平外边距值加倍，可为该元素应用display:inline属性来解决，具体见：http://www.positioniseverything.net/explorer/doubled-margin.html 关于使用负外边距的解决方案请参考Ryan Brill的示例：http://www.alistapart.com/articles/negativemargins IE7以下版本正常显示PNG图像透明度信息的技巧：http://webfx.eae.net/dhtmlpngbehavior/pngbehavior.html以及http://www.alistapart.com/articles/pngopacity IE5中CSS盒模型修正方法：http://tantek.com/CSS/Examples/boxmodelhack.html Paul Sowden的切换样式表的方法:http://www.alistapart.com/articles/alternate Web Developer Extension插件下载地址：http://www.chrispederick.com/firefox/webdeveloper/index.php 修复IE6 不支持max-width的方案：http://www.svendtofte.com/code/max_width_in_ie 正确清除浮动的方法：http://www.complexspiral.com/publications/containing-floats 为元素应用内边距或边框来避免外边距重叠：http://www.andybudd.com/archives/2003/11/no_margin_for_error IE下min-width或min-height实现方式：http://mezzoblue.com/archives/2004/09/16/minheight_fi IE没有完整显示内容(Peekaboo bug)解决方案： [tag]CSS[/tag] [tag]禅意花园[/tag] [tag]有用链接[/tag] http://www.positioniseverything.net/explorer/peekaboo.html CSS设计类站点： CSS Discuss 邮件列表：http://www.css-discuss.org CSS at MaxDesign 特别关注于列表、浮动等问题：http://css.maxdesign.com.au CSS/Web Standards Links Andy Budd的CSS文章、技术以及缺陷修复列表，更新频繁：http://www.andybudd.com/links/cssweb_standards Holy CSS Zeldman CSS相关资源列表：http://www.dezwozhere.com/links.html Position Is Everything CSS布局方面解决方案站点：http://www.positioniseverything.net 标签： CSS, 摘要, [...]]]></description>
			<content:encoded><![CDATA[<p><font size="3">整理《CSS禅意花园》一书中提及一些有用链接，主要是从Note和Tips以及附录中摘要出来。</font></p>
<p><font size="3">CSS一些资料参考页面：</font></p>
<ul>
<li><font size="3">XHTML 1.0中可以使用的所有HTML元素：<a href="http://w3schools.com/xhtml/xhtml_reference.asp">http://w3schools.com/xhtml/xhtml_reference.asp</a></font></li>
<li><font size="3">避免Windows下IE中可能出现文档样式短暂失效问题：空script元素或使用link，<a href="http://www.bluerobot.com/web/css/fouc.asp">http://www.bluerobot.com/web/css/fouc.asp</a></font></li>
<li><font size="3">CSS签名（<a href="http://xuplus.com/article/tag/css" class="st_tag internal_tag" rel="tag" title="标签 CSS 下的日志">CSS</a> Signature），应用到body元素上的id。利用这个用户自定义的样式表可以覆盖页面中的部分甚至所有CSS样式。参见：<a href="http://archivist.incutio.com/viewlist/css-discuss/13291">http://archivist.incutio.com/viewlist/css-discuss/13291</a></font></li>
<li><font size="3">CSS2选择器：<a href="http://www.w3c.org/TR/CSS21/selector.html">http://www.w3c.org/TR/CSS21/selector.html</a></font></li>
<li><font size="3">CSS3选择器：<a href="http://www.w3c.org/TR/css3-selectors">http://www.w3c.org/TR/css3-selectors</a></font></li>
<li><font size="3">图像替换技术详细使用方法以及使用中各种问题：<a href="http://www.stopdesign.com/articles/replace_text/">http://www.stopdesign.com/articles/replace_text/</a></font></li>
<li><font size="3">Windows平台下IE7以下版本会将某些浮动元素的水平外边距值加倍，可为该元素应用display:inline属性来解决，具体见：<a href="http://www.positioniseverything.net/explorer/doubled-margin.html">http://www.positioniseverything.net/explorer/doubled-margin.html</a></font></li>
<li><font size="3">关于使用负外边距的解决方案请参考Ryan Brill的示例：<a href="http://www.alistapart.com/articles/negativemargins">http://www.alistapart.com/articles/negativemargins</a></font></li>
<li><font size="3">IE7以下版本正常显示PNG图像透明度信息的技巧：<a href="http://webfx.eae.net/dhtmlpngbehavior/pngbehavior.html以及http://www.alistapart.com/articles/pngopacity">http://webfx.eae.net/dhtmlpngbehavior/pngbehavior.html以及http://www.alistapart.com/articles/pngopacity</a></font></li>
<li><font size="3">IE5中CSS盒模型修正方法：<a href="http://tantek.com/CSS/Examples/boxmodelhack.html">http://tantek.com/CSS/Examples/boxmodelhack.html</a></font></li>
<li><font size="3">Paul Sowden的切换样式表的方法:<a href="http://www.alistapart.com/articles/alternate">http://www.alistapart.com/articles/alternate</a></font></li>
<li><font size="3">Web Developer Extension插件下载地址：<a href="http://www.chrispederick.com/firefox/webdeveloper/index.php">http://www.chrispederick.com/firefox/webdeveloper/index.php</a></font></li>
<li><font size="3">修复IE6 不支持max-width的方案：<a href="http://www.svendtofte.com/code/max_width_in_ie">http://www.svendtofte.com/code/max_width_in_ie</a></font></li>
<li><font size="3">正确清除浮动的方法：<a href="http://www.complexspiral.com/publications/containing-floats">http://www.complexspiral.com/publications/containing-floats</a></font></li>
<li><font size="3">为元素应用内边距或边框来避免外边距重叠：<a href="http://www.andybudd.com/archives/2003/11/no_margin_for_error">http://www.andybudd.com/archives/2003/11/no_margin_for_error</a></font></li>
<li><font size="3">IE下min-width或min-height实现方式：<a href="http://mezzoblue.com/archives/2004/09/16/minheight_fi">http://mezzoblue.com/archives/2004/09/16/minheight_fi</a></font></li>
<li><font size="3">IE没有完整显示内容(Peekaboo bug)解决方案：
<p style="display: inline; margin: 0px; padding: 0px" contentEditable="false" id="0767317B-992E-4b12-91E0-4F059A8CECA8:3bb0c160-82f9-44a8-b86b-1afa93fcfaa7" class="wlWriterSmartContent">[<a href="http://xuplus.com/article/tag/tag" class="st_tag internal_tag" rel="tag" title="标签 Tag 下的日志">tag</a>]CSS[/<a href="http://xuplus.com/article/tag/tag" class="st_tag internal_tag" rel="tag" title="标签 Tag 下的日志">tag</a>] [<a href="http://xuplus.com/article/tag/tag" class="st_tag internal_tag" rel="tag" title="标签 Tag 下的日志">tag</a>]<a href="http://xuplus.com/article/tag/%e7%a6%85%e6%84%8f%e8%8a%b1%e5%9b%ad" class="st_tag internal_tag" rel="tag" title="标签 禅意花园 下的日志">禅意花园</a>[/<a href="http://xuplus.com/article/tag/tag" class="st_tag internal_tag" rel="tag" title="标签 Tag 下的日志">tag</a>] [<a href="http://xuplus.com/article/tag/tag" class="st_tag internal_tag" rel="tag" title="标签 Tag 下的日志">tag</a>]<a href="http://xuplus.com/article/tag/%e6%9c%89%e7%94%a8%e9%93%be%e6%8e%a5" class="st_tag internal_tag" rel="tag" title="标签 有用链接 下的日志">有用链接</a>[/<a href="http://xuplus.com/article/tag/tag" class="st_tag internal_tag" rel="tag" title="标签 Tag 下的日志">tag</a>]</p>
<p></font></li>
<li><a href="http://www.positioniseverything.net/explorer/peekaboo.html">http://www.positioniseverything.net/explorer/peekaboo.html</a></li>
</ul>
<p><font size="3">CSS设计类站点：</font></p>
<ul>
<li><font size="3">CSS Discuss 邮件列表：<a href="http://www.css-discuss.org">http://www.css-discuss.org</a></font></li>
<li><font size="3">CSS at MaxDesign 特别关注于列表、浮动等问题：<a href="http://css.maxdesign.com.au">http://css.maxdesign.com.au</a></font></li>
<li><font size="3">CSS/Web Standards Links Andy Budd的CSS文章、技术以及缺陷修复列表，更新频繁：<a href="http://www.andybudd.com/links/cssweb_standards">http://www.andybudd.com/links/cssweb_standards</a></font></li>
<li><font size="3">Holy CSS Zeldman CSS相关资源列表：<a href="http://www.dezwozhere.com/links.html">http://www.dezwozhere.com/links.html</a></font></li>
<li><font size="3">Position Is Everything CSS布局方面解决方案站点：<a href="http://www.positioniseverything.net">http://www.positioniseverything.net</a></font></li>
</ul>

	标签： <a href="http://xuplus.com/article/tag/css" title="CSS" rel="tag">CSS</a>, <a href="http://xuplus.com/article/tag/%e6%91%98%e8%a6%81" title="摘要" rel="tag">摘要</a>, <a href="http://xuplus.com/article/tag/%e6%9c%89%e7%94%a8%e9%93%be%e6%8e%a5" title="有用链接" rel="tag">有用链接</a>, <a href="http://xuplus.com/article/tag/%e7%a6%85%e6%84%8f%e8%8a%b1%e5%9b%ad" title="禅意花园" rel="tag">禅意花园</a><br />
]]></content:encoded>
			<wfw:commentRss>http://xuplus.com/article/2007/06/a36.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tag（标签）的选取方法</title>
		<link>http://xuplus.com/article/2007/06/a32.html</link>
		<comments>http://xuplus.com/article/2007/06/a32.html#comments</comments>
		<pubDate>Wed, 20 Jun 2007 15:53:32 +0000</pubDate>
		<dc:creator>Dominic</dc:creator>
				<category><![CDATA[Web应用]]></category>
		<category><![CDATA[Tag]]></category>
		<category><![CDATA[关键词]]></category>
		<category><![CDATA[标签]]></category>
		<category><![CDATA[选取]]></category>

		<guid isPermaLink="false">http://xuplus.com/?p=32</guid>
		<description><![CDATA[Tag即标签，是目前web2.0中应用比较多的一种应用，通常可以理解为文章分类和关键词。Tag数量没有太多的限制，使用Tag对于在搜索引擎搜索结果上将非常有好处，一般可以增加搜索结果数量和质量。 Tag的选取方法： 1、 Tag词语不要太宽泛，选择的词语应该比较具体，有针对性。例如：汽车这个关键词就不是很好。 2、 Tag词语也不适于太长太特殊，2-4汉字为佳。 3、 文章中出现次数较多的作为第一个。 4、 兄弟栏目如果关系非常紧密，其常用Tag词语也可以作为Tag词语。例如：某汽车网站违章查询栏目，合肥的违章查询Tag为交通违法，淮南的违章查询Tag为电子警察，那么其它违章查询栏目也可以加入这两个Tag词语。 5、 挖掘热门关键词，可以根据搜索引擎结果来看。例如交通违章、违章查询这是某汽车网站违章查询栏目查询次数最多的关键词，那么我们就需要将这两个作为这个栏目所有文章的关键词。 标签： Tag, 关键词, 标签, 选取]]></description>
			<content:encoded><![CDATA[<p><font size="3">Tag即标签，是目前web2.0中应用比较多的一种应用，通常可以理解为文章分类和关键词。Tag数量没有太多的限制，使用Tag对于在搜索引擎搜索结果上将非常有好处，一般可以增加搜索结果数量和质量。<br />
Tag的选取方法：<br />
1、 Tag词语不要太宽泛，选择的词语应该比较具体，有针对性。例如：汽车这个关键词就不是很好。<br />
2、 Tag词语也不适于太长太特殊，2-4汉字为佳。<br />
3、 文章中出现次数较多的作为第一个。<br />
4、 兄弟栏目如果关系非常紧密，其常用Tag词语也可以作为Tag词语。例如：某汽车网站违章查询栏目，合肥的违章查询Tag为交通违法，淮南的违章查询Tag为电子警察，那么其它违章查询栏目也可以加入这两个Tag词语。<br />
5、 挖掘热门关键词，可以根据搜索引擎结果来看。例如交通违章、违章查询这是某汽车网站违章查询栏目查询次数最多的关键词，那么我们就需要将这两个作为这个栏目所有文章的关键词。</font></p>

	标签： <a href="http://xuplus.com/article/tag/tag" title="Tag" rel="tag">Tag</a>, <a href="http://xuplus.com/article/tag/%e5%85%b3%e9%94%ae%e8%af%8d" title="关键词" rel="tag">关键词</a>, <a href="http://xuplus.com/article/tag/%e6%a0%87%e7%ad%be" title="标签" rel="tag">标签</a>, <a href="http://xuplus.com/article/tag/%e9%80%89%e5%8f%96" title="选取" rel="tag">选取</a><br />
]]></content:encoded>
			<wfw:commentRss>http://xuplus.com/article/2007/06/a32.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>用Meta标签让网页产生渐变效果</title>
		<link>http://xuplus.com/article/2007/06/a29.html</link>
		<comments>http://xuplus.com/article/2007/06/a29.html#comments</comments>
		<pubDate>Wed, 06 Jun 2007 08:47:31 +0000</pubDate>
		<dc:creator>Dominic</dc:creator>
				<category><![CDATA[Web应用]]></category>
		<category><![CDATA[META]]></category>
		<category><![CDATA[渐变]]></category>
		<category><![CDATA[滤镜]]></category>

		<guid isPermaLink="false">http://xuplus.com/?p=29</guid>
		<description><![CDATA[今天才发现Meta标签有动态滤镜的功能。在页面的HTML代码的Head头中加入以下两行，再看看效果就知道了。 &#60;Meta http-equiv=”Page-Enter” Content=”blendTrans(Duration=0.5)”&#62; &#60;Meta http-equiv=”Page-Exit” Content=”blendTrans(Duration=0.5)”&#62;  http-equiv可以取值：”Site-Enter” , “Site-Exit” , “Page-Exit” , “Page-Enter”。 这里的blendTrans其实就是一种动态滤镜效果，当然还有其他的方法也可以产生这种动态滤镜效果： &#60;Meta http-equiv=”Page-Enter” Content=”revealTrans(Duration=x, Transition=y)”&#62; &#60;Meta http-equiv=”Page-Exit” Content=”revealTrans(Duration=x, Transition=y)”&#62;  Duration　　表示滤镜特效的持续时间(单位：秒) ，Transition　滤镜类型。表示使用哪种特效，取值为0-23。表示的意思如下： 0 矩形缩小 1 矩形扩大 2 圆形缩小 3 圆形扩大 4 下到上刷新 5 上到下刷新 6 左到右刷新 7 右到左刷新 8 竖百叶窗 9 横百叶窗 10 错位横百叶窗 11 错位竖百叶窗 12 点扩散 13 左右到中间刷新 14 中间到左右刷新 [...]]]></description>
			<content:encoded><![CDATA[<p><font size="3">今天才发现Meta标签有</font><font size="3">动态滤镜的功能。在页面的HTML代码的Head头中加入以下两行，再看看效果就知道了。</font></p>
<p><font size="3">&lt;<a href="http://xuplus.com/article/tag/meta" class="st_tag internal_tag" rel="tag" title="标签 META 下的日志">Meta</a> http-equiv=”<a href="http://xuplus.com/article/tag/page" class="st_tag internal_tag" rel="tag" title="标签 Page 下的日志">Page</a>-Enter” Content=”blendTrans(Duration=0.5)”&gt;<br />
&lt;Meta http-equiv=”Page-Exit” Content=”blendTrans(Duration=0.5)”&gt;  </font></p>
<p><font size="3">http-equiv可以取值：”Site-Enter” , “Site-Exit” , “Page-Exit” , “Page-Enter”。</font></p>
<p><font size="3">这里的blendTrans其实就是一种动态滤镜效果，当然还有其他的方法也可以产生这种动态滤镜效果：</font></p>
<p><font size="3">&lt;Meta http-equiv=”Page-Enter” Content=”revealTrans(Duration=x, Transition=y)”&gt;<br />
&lt;Meta http-equiv=”Page-Exit” Content=”revealTrans(Duration=x, Transition=y)”&gt;  </font></p>
<p><font size="3">Duration　　表示滤镜特效的持续时间(单位：秒) ，Transition　滤镜类型。表示使用哪种特效，取值为0-23。表示的意思如下： </font></p>
<p align="center">
<table border="1" align="center" width="258" cellPadding="1" cellSpacing="1">
<tr>
<td>0</td>
<td>矩形缩小</td>
</tr>
<tr>
<td>1</td>
<td>矩形扩大</td>
</tr>
<tr>
<td>2</td>
<td>圆形缩小</td>
</tr>
<tr>
<td>3</td>
<td>圆形扩大</td>
</tr>
<tr>
<td>4</td>
<td>下到上刷新</td>
</tr>
<tr>
<td>5</td>
<td>上到下刷新</td>
</tr>
<tr>
<td>6</td>
<td>左到右刷新</td>
</tr>
<tr>
<td>7</td>
<td>右到左刷新</td>
</tr>
<tr>
<td>8</td>
<td>竖百叶窗</td>
</tr>
<tr>
<td>9</td>
<td>横百叶窗</td>
</tr>
<tr>
<td>10</td>
<td>错位横百叶窗</td>
</tr>
<tr>
<td>11</td>
<td>错位竖百叶窗</td>
</tr>
<tr>
<td>12</td>
<td>点扩散</td>
</tr>
<tr>
<td>13</td>
<td>左右到中间刷新</td>
</tr>
<tr>
<td>14</td>
<td>中间到左右刷新</td>
</tr>
<tr>
<td>15</td>
<td>中间到上下</td>
</tr>
<tr>
<td>16</td>
<td>上下到中间</td>
</tr>
<tr>
<td>17</td>
<td>右下到左上</td>
</tr>
<tr>
<td>18</td>
<td>右上到左下</td>
</tr>
<tr>
<td>19</td>
<td>左上到右下</td>
</tr>
<tr>
<td>20</td>
<td>左下到右上</td>
</tr>
<tr>
<td>21</td>
<td>横条</td>
</tr>
<tr>
<td>22</td>
<td>竖条</td>
</tr>
<tr>
<td>23</td>
<td>以上22种随机选择一种</td>
</tr>
</table>

	标签： <a href="http://xuplus.com/article/tag/meta" title="META" rel="tag">META</a>, <a href="http://xuplus.com/article/tag/%e6%b8%90%e5%8f%98" title="渐变" rel="tag">渐变</a>, <a href="http://xuplus.com/article/tag/%e6%bb%a4%e9%95%9c" title="滤镜" rel="tag">滤镜</a><br />
]]></content:encoded>
			<wfw:commentRss>http://xuplus.com/article/2007/06/a29.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

