<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>潘魏增 &#187; perl</title>
	<atom:link href="http://panweizeng.com/archives/tag/perl/feed" rel="self" type="application/rss+xml" />
	<link>http://panweizeng.com</link>
	<description>活在回忆里,细数时间下过的蛋.</description>
	<lastBuildDate>Sun, 29 Aug 2010 17:03:11 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1-alpha</generator>
		<item>
		<title>Sina的CMS模型</title>
		<link>http://panweizeng.com/archives/133</link>
		<comments>http://panweizeng.com/archives/133#comments</comments>
		<pubDate>Mon, 14 Apr 2008 16:38:54 +0000</pubDate>
		<dc:creator>Pan</dc:creator>
				<category><![CDATA[学习]]></category>
		<category><![CDATA[cms]]></category>
		<category><![CDATA[perl]]></category>

		<guid isPermaLink="false">http://panweizeng.com/archives/133</guid>
		<description><![CDATA[在代码层次上看，SinaCMS是使用C++编码的，模板取数据的时候则使用了perl脚本。SinaCMS里面频道、项目和模板是结合在一起的，他们三者的关系是： 1.一个频道就是一个项目，在数据库里面体现就是一个数据库，比如说新闻中心，对应一个名为news的数据库； 2.一个频道会有若干个模板，例如首页，新闻页，这些在数据库中体现为相关的表； 3.模板需要定义模板域，模板域有表单类型模板域(Form)和应用类型模板域(Application)两种类型，前者面向编辑的提供数据界面接口功能，后者面向技术支持人员提供高级的二次开发功能。模板域在数据库中就是模板表中相对应的数据扩展字段，例如Form::TextField对应的就是text字段，数据由编辑录入，Application::SQLResult 也是text字段，存储的则是执行Perl脚本执行后的结果。模板的内容存储在另外的字段中。 不难看出，SinaCMS具有极其强大的灵活性。因为它的数据库结构是项目建立以后构建模板的时候才确定的。各个频道，例如资讯频道、财经频道和汽车频道，可以拥有完全不同的数据库结构，不同频道的特殊需求也可以完全定制。另外可以看出SinaCMS里面的模板是最主要的模型，承担了确定数据表结构、文章发布和管理以及配置频道参数等等功能。 我们来看CMS系统中常见的新闻页，频道首页和列表页在SinaCMS中是怎么实现的。 编辑上文章时，先找到该频道的新闻页，然后在下面录入文章，录入完毕后点击发布，系统会根据模板的内容去获取相关的字段内容，根据模板的属性最后发布成相应的静态文件，其间如果和其他模板有相关关系（在新闻页模板域中定义Application::PostInPage），则会去触发相应的模板（例如首页和列表页）更新。 在首页模板的区块中，可以分为动态和静态两种。对于需要经常更新的静态区块，可以独立出来做成一个模板，静态区块就相当于该模板下的一篇(有且仅有一篇)文章，当然也可以在首页中新建一个Form::TextField的模板域。动态区块例如动态新闻列表，则可以在首页中新建一个Application::SQLResult的模板域，通过执行perl脚本获取内容填充，然后在首页模板内容引用该模板域，当然同样也可以新建一个只包含一个Application::SQLResult域的模板。 对于列表页，首先列表页的分页值可以存储在列表页的模板域中，也可以保存在某个模板中。分页在处理时，会通过perl脚本来执行分页算法。最终所有列表页都是列表页模板下的一个文档集。 在一个项目中，为了提高发布效率，还会存在若干的临时存储表和归档表（其实就是一些模板啦）。例如在首页的动态新闻列表，就有可能建一个临时存储数据的模板，这时如果频繁更新首页或者含有动态新闻列表的模板时，无疑将减轻数据库的压力。新闻单页的模板在处理时可以就保存最近一个月内的文章，尤其在文章数据增长较快的频道，这时就很有必要。那么以前的文章就需要转储到一个归档表中，作为查询和偶尔更新某篇文章使用。 SinaCMS中的频道路径path（例如资讯>大陆>正文）是通过模板处理的，在模板的模板域中会用perl来处理相关的逻辑。子频道和专题也是通过模板来实现的，它会通过新增一个模板来建立子频道和专题之间的关系。 至此，我们可以了解到SinaCMS中使用了非常多的冗余字段来存储本来需要多表联合查询的数据，这无疑提高了文章的发布效率。 在其他的CMS中，模板只是独立概念中的一个，而在SinaCMS中，万事万物皆模板。 其实我理解也不是很透，所以以后有时间我会再对本文做一些更新。]]></description>
			<content:encoded><![CDATA[<p>在代码层次上看，SinaCMS是使用C++编码的，模板取数据的时候则使用了perl脚本。SinaCMS里面频道、项目和模板是结合在一起的，他们三者的关系是：</p>
<p>1.一个频道就是一个项目，在数据库里面体现就是一个数据库，比如说新闻中心，对应一个名为news的数据库；<br />
2.一个频道会有若干个模板，例如首页，新闻页，这些在数据库中体现为相关的表；<br />
3.模板需要定义模板域，模板域有表单类型模板域(Form)和应用类型模板域(Application)两种类型，前者面向编辑的提供数据界面接口功能，后者面向技术支持人员提供高级的二次开发功能。模板域在数据库中就是模板表中相对应的数据扩展字段，例如Form::TextField对应的就是text字段，数据由编辑录入，Application::SQLResult<br />
也是text字段，存储的则是执行Perl脚本执行后的结果。模板的内容存储在另外的字段中。</p>
<p><strong>不难看出，SinaCMS具有极其强大的灵活性。因为它的数据库结构是项目建立以后构建模板的时候才确定的。各个频道，例如资讯频道、财经频道和汽车频道，可以拥有完全不同的数据库结构，不同频道的特殊需求也可以完全定制。另外可以看出SinaCMS里面的模板是最主要的模型，承担了确定数据表结构、文章发布和管理以及配置频道参数等等功能。</strong></p>
<p>我们来看CMS系统中常见的新闻页，频道首页和列表页在SinaCMS中是怎么实现的。</p>
<p>编辑上文章时，先找到该频道的新闻页，然后在下面录入文章，录入完毕后点击发布，系统会根据模板的内容去获取相关的字段内容，根据模板的属性最后发布成相应的静态文件，其间如果和其他模板有相关关系（在新闻页模板域中定义Application::PostInPage），则会去触发相应的模板（例如首页和列表页）更新。</p>
<p>在首页模板的区块中，可以分为动态和静态两种。对于需要经常更新的静态区块，可以独立出来做成一个模板，静态区块就相当于该模板下的一篇(有且仅有一篇)文章，当然也可以在首页中新建一个Form::TextField的模板域。动态区块例如动态新闻列表，则可以在首页中新建一个Application::SQLResult的模板域，通过执行perl脚本获取内容填充，然后在首页模板内容引用该模板域，当然同样也可以新建一个只包含一个Application::SQLResult域的模板。</p>
<p>对于列表页，首先列表页的分页值可以存储在列表页的模板域中，也可以保存在某个模板中。分页在处理时，会通过perl脚本来执行分页算法。最终所有列表页都是列表页模板下的一个文档集。</p>
<p>在一个项目中，为了提高发布效率，还会存在若干的临时存储表和归档表（其实就是一些模板啦）。例如在首页的动态新闻列表，就有可能建一个临时存储数据的模板，这时如果频繁更新首页或者含有动态新闻列表的模板时，无疑将减轻数据库的压力。新闻单页的模板在处理时可以就保存最近一个月内的文章，尤其在文章数据增长较快的频道，这时就很有必要。那么以前的文章就需要转储到一个归档表中，作为查询和偶尔更新某篇文章使用。</p>
<p>SinaCMS中的频道路径path（例如资讯>大陆>正文）是通过模板处理的，在模板的模板域中会用perl来处理相关的逻辑。子频道和专题也是通过模板来实现的，它会通过新增一个模板来建立子频道和专题之间的关系。</p>
<p>至此，我们可以了解到SinaCMS中使用了非常多的冗余字段来存储本来需要多表联合查询的数据，这无疑提高了文章的发布效率。</p>
<p>在其他的CMS中，模板只是独立概念中的一个，而在SinaCMS中，<strong>万事万物皆模板</strong>。</p>
<p>其实我理解也不是很透，所以以后有时间我会再对本文做一些更新。</p>
]]></content:encoded>
			<wfw:commentRss>http://panweizeng.com/archives/133/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>给MT增加简单的AntiSpam功能</title>
		<link>http://panweizeng.com/archives/106</link>
		<comments>http://panweizeng.com/archives/106#comments</comments>
		<pubDate>Tue, 02 Oct 2007 09:57:54 +0000</pubDate>
		<dc:creator>Pan</dc:creator>
				<category><![CDATA[动态]]></category>
		<category><![CDATA[MovableType]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[spam]]></category>

		<guid isPermaLink="false">http://www.panweizeng.com/archives/106</guid>
		<description><![CDATA[1.修改MT目录/lib/MT/App/Comments.pm文件 找到 require MT::Blog; my $blog = MT::Blog->load($entry->blog_id); my $text = $q->param(&#8216;text&#8217;) &#124;&#124; &#8221;; $text =~ s/^s+&#124;s+$//g; if ($text eq &#8221;) { return $app->handle_error($app->translate(&#8220;Comment text is required.&#8221;)); } 在下面增加 # # AntiSpam Begin # 把“安全码”替换成自己想要的字串 # my $spam_keyword = &#8220;安全码&#8220;; my $spam_ref_keyword = $q->param(&#8216;spam_ref_keyword&#8217;); if ($spam_keyword ne $spam_ref_keyword) { return $app->handle_error($app->translate(&#8220;Wrong or missing Security Code.&#8221;)); [...]]]></description>
			<content:encoded><![CDATA[<p><strong>1.修改MT目录/lib/MT/App/Comments.pm文件</strong><br />
找到<br />
require MT::Blog;<br />
my $blog = MT::Blog->load($entry->blog_id);</p>
<p>my $text = $q->param(&#8216;text&#8217;) || &#8221;;<br />
$text =~ s/^s+|s+$//g;<br />
if ($text eq &#8221;) {<br />
return $app->handle_error($app->translate(&#8220;Comment text is required.&#8221;));<br />
}<br />
在下面增加<br />
#<br />
# AntiSpam Begin<br />
# 把“安全码”替换成自己想要的字串<br />
#<br />
my $spam_keyword = &#8220;<strong>安全码</strong>&#8220;;<br />
my $spam_ref_keyword = $q->param(&#8216;spam_ref_keyword&#8217;);<br />
if ($spam_keyword ne $spam_ref_keyword) {<br />
	return $app->handle_error($app->translate(&#8220;Wrong or missing Security Code.&#8221;));<br />
}<br />
#<br />
# AntiSpam End<br />
#<br />
<strong>2.如果用了中文版本，则修改MT目录/lib/MT/L10N/zh_cn.pm</strong><br />
找到<br />
&#8216;No entries could be found.&#8217; => &#8216;未找到日记。&#8217;,<br />
增加<br />
## AntiSpam<br />
&#8216;Wrong or missing Security Code.&#8217; => &#8216;错误的验证码。&#8217;,<br />
<strong>3.在单页归档模板中增加一个输入框</strong><br />
&lt;input id=&#8221;spam_ref_keyword&#8221; name=&#8221;spam_ref_keyword&#8221; size=&#8221;25&#8243; /&gt;</p>
<p>最后重建所有的单页归档，这样就基本就能挡住机器人的垃圾留言。</p>
]]></content:encoded>
			<wfw:commentRss>http://panweizeng.com/archives/106/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
