标签/Tag为[Template]的文章

[MT Hack]修改模板来完成MT的AJAX提交评论 ,

曾经,本站在MT3时代,曾经写过以AJAX提交评论预览 的帖子。

那个也是通过修改模板+自写js实现,没有对MT的源代码进行任何修改,绿色无污染,不影响升级。

后来,通过自己摸索,也实现了 ajax 方式提交评论。但是一直都没有写出教程,今天有点时间。特意写出分享之。

具体效果见本站评论提交(预览和发表)。

言归正传,要实现 ajax 方式首先要定义一系列 js 函数。 由于 本站已经迁移到了 JQuery 平台,所以在改写 mt.js 需要先加入 JQ 支持,即加入:

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>

[MT 模板]MT 4.x/5.x 之Search Results 官方默认版本的两处小错误。 ,

This is a SiteLog for Easun.org.
大家都知道, MT 4.x/5.x 的搜索所有返回多页的时候,翻页(仅仅是 PreviousNext 链接)其实是支持 ajax 的,但是实际使用中,翻页结果往往是直接跳出页面,而非ajax获取。

今天抽空看了看 系统模板中的 【Search Results】 模板代码,发现貌似有两处错误,这个应该是导致 ajax 方式经常意外跳出的原因。特意发出来,以供同好者分享。

第一处是 <div id="search-results">...</div> 的反复嵌套,看 js 来看, 是通过给<div id="search-results"></div> 块中插入新内容来更新页面的,但是 ajax 返回的数据居然还有一个 <div id="search-results">? 显然是模板错误,JS返回的模板不应该再用 <div id="search-results"> 块定义。具体抓图如下:
20120220_2.png
知道原因了,解决办法很简单: 删除图中 <mt:SetVarTemplate id="search_results" name="search_results">...</mt:SetVarTemplate>中嵌套的 <div id="search-results"> (图中69行)和 最后一个 </div> (88 行),然后找到 <$mt:Var name="search_results"$>,改成

<div id="search-results"><$mt:Var name="search_results"$></div>


第2处,是 加载完本页后,自动1000 毫秒后获取下一页数据的 js 程序有错,代码为下:
var timer = window.setTimeout("getResults(" + <$mt:CurrentPage$> + ")", 1*1000);

抓图:

20120220_1.png

呃, + <$mt:CurrentPage$> + ,官方真以为 <$mt:CurrentPage$> 是js变量啊。还 + 呢。修改成:

var timer = window.setTimeout("getResults(<$mt:CurrentPage$> )", 1*1000);

修改完后,直接搜索一个返回好多页的文件,略微等待(等待后台获取下一页数据成功),点击 Next, OK ,成功了。
因为每页默认有20个条目返回,所以如果真正的搜素者,当看完这20个的时候,点 Next 的时候,次页数据早以后台传输完成,则直接 通过 js 显示,一般不会出现因为没有数据而跳出成普通模式的问题。

PS: MT 搜索模板的 ajax 机制是载于当前页后, 设定一个定时器,后台获取下一页数据存储于js 数组,当 Next 或者 Previous 的时候,直接从 js 数据中提取,如果提取失败,则会直接跳出,以普通模式向后台获取数据。 所以,只有 PreviousNext 链接 是 ajax 的 。

--EOF--

[SiteLog]MT归档页面变更以及Tags搜索页面cache机制的变更 ,

This is a SiteLog for Easun.org.

随着文章的增多, Movable Type归档页和按照分类归档页是越来越没有意义了。抽点时间干脆彻底改写模板(Template)而重构页面显示。
改写的结果是 归档页 全部显示所有日志的标题和回复数目。照分类归档页 不在显示最近的几篇文章的概要而也是显示该分类下的所有所有日志的标题和回复数目。
具体样式可以参考 归档页分类 [MT相关] 的文章归档 来看看效果。
Movable Type的静态发布,成也萧何,败也萧何啊。

另外,就是对本站的 Tags 搜索进行了全部重构。 Movable Type 程序的负荷一直在与 mt-search.cgi 。 早在08年底,由于 mt-search.cgi 的效率问题 ,就直接禁止了通过mt-search.cgi来用关键字搜索本站,而改成了 Google Custom Search 。 Tags 搜索也自己写了 Perl 脚本来文本cache mt-search.cgi返回的结果。
但是,最近发现,当初的文本cache机制大有问题。主要表现在下:

  1.  不能自动更新 cache。导致部分cache返回结果的还是2009年初。
  2. 对于返回数据大于一页的Tags搜索页面仅仅是显示第一页。不能翻页。


改写后这些问题都解决了。
主要流程是:
点击 tag 后, 检测是否存在 cache后生成的 html 文件? 如果有并且文件是2天内的,则直接输出现成的 html文本;如果没有或者过期,则交给mt-search.cgi并且同时生成新的cache文本。分页的 tag 返回页面,用 tag/page 来表示分页。彻底静态化。
同理,后台搜索的 Search Results 模板(Template)做了大量的细致修改,以满足搜索返回的要求。
至于静态化,是通过.htaccess 进行重定位。代码如下:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !.html
RewriteCond %{REQUEST_URI} !(.*)/$
#RewriteCond %{REQUEST_FILENAME}.html !-f
RewriteRule ^(.*)$ /cgi-bin/mtos/tags_do.cgi/$1 [L]


具体演示参见以下链接:

另: Movable Type 已经 5.12 了。 升级还是不升级。这比较纠结。。。。

--EOF--

[MT Tips]如何让某个日志在Blog首页固顶?

貌似最简单的办法就是修改日期到一个很遥远的日期,比如 AnySQL 那样:) 但是带来的问题的很多,比如导致Feed阅读器犯糊涂或者影响搜索引擎的收录等等,更糟糕的是对于 日志来说,最主要的就是发布日期。

也许大家都已经发现了,我的主页模仿 MT Forum 搞了一个固顶日志(也是为了风格统一)出来,这个固顶日志是后台通过自己设置实现的。是怎么设置的。答案是利用 <mt:Entries> 的tags 功能。
具体概念代码如下:
<mt:Entries tag="@top" sort_by="authored_on"
sort_order="descend" limit="1" blog_ids="1,5">
dosthing.....
</mt:Entries>
这样我们只要要在固定的主题 加上 tag ,tag 名字为 @top 就可以了。
PS: @开头的tag属于隐藏 tag,不会在发布页面显示出来。

[MT4 Template]Category Archives List ,

有朋友来Email问我的 Category Archives (按Category归档) 页面(比如这个页面)左边出现的 本分类的所有文章 |All Category Articles 是怎么样出来的。
因为这个问题貌似有好几个朋友问,所以在此共享下:)

MT4 开始,貌似 按Category归档 页面就只显示最近的若干文章而不是象MT3.x系列一样全部显示,其实是个节省资源的好办法,so 我把该Category的所有文章按照文章标题全部显示出来。
代码如下(注意只能在 Archive Templates 中 的 Blog Entry Listing 中用,不然希奇古怪的结果哦):

[Tips]MT4系列模板中的一些小技巧

MT 4 模板功能强大,从代码分析来看,加了一系列小的功能,并没有从默认的模板(Template)中体现出来:)
这些功能,有些来自MT4程序本身,有些来自自带的插件(plugin),还是挺实用的,如果再结合 MTIF ,MTElse, MTUnless 等模板自身的选择流程,肯定让设计界面的朋友心动:)
我简单的说两个自己偶然发现的,抛砖引玉。

1. MTIfCommenterIsEntryAuthor
这个标签目的是判断回复评论的人是否就是这个主题的发布者:) 我偶然发现这个标签,然后Blog中我回复别人评论的回复就可以自己定义不同的样式了:)简单用法如下:

<MTIfCommenterIsEntryAuthor>Show sth.</MTIfCommenterIsEntryAuthor>
,当然,需要注意的这个标签应该在 MTComments 嵌套之中使用:)实例可以参考本站的评论处我自己的评论样式.

2. 在 MTOtherBlog 中使用 加 include_blogs 参数的 MTInclude
这个功能是由插件 MultiBlog 2.0带来的,不可否认,MultiBlog是个很优秀的插件(plugin),但是,也不能不说MultiBlog使用文档实在写的太含糊。她的文档貌似仅仅为了 写而写。大家一般都用他来做多个Blog文章的输出,但是其实他的功能还很多,比如:在一个MT Blog 中调用另外一个同系统的Blog的模块,这个就是 MTInclude 的include_blogs 参数了,但是使用这个参数必须在 MTOtherBlog 或者 MTMultiBlog 的 嵌套中使用,不然系统会找不到模块,另外,这个模块如果有 IF,Else 或者 SetVar 的设置,将会调用本来属于的那个Blog的设置。
简单例子如下(本Blog的id为2,要调用id=1的Blog的模块 Nav_Main):

<MTOtherBlog include_blogs="1">
<$MTInclude include_blogs="1" module="Nav_Main"$>
</MTOtherBlog>

OK,我目前发现的就这两个,你呢?不妨共享之。

--EOF--

[随笔]MT 4.0 杂谈 - 模板篇

升级到 MT 4.0 好几天了,模板依然用的 3.3x系列的。不是不升级模板,而是在 MT 4.0 默认模板基础上测试和重新设计风格而已:)

MT 4.0 模板设计的很优秀,在测试中发现了一些不同和技巧,特和大家共享之。

一: 强大的 MTIf 和 MTSetVar。
因为有了SetVar 和 if ,模板也有了简单的判断和设定功能。所以MT4.0模板才变的更加简单和模块化。通过在主模板顶部设定不同变量的数值,可以方便而简单让模板生成的页面任意在 3栏,2栏变化,也可以方便让侧边栏显示或不显示某个模块。实在是节省了设计人员的工作量。仔细研究每个主模板顶部变量(SetVar)的设定,会让你受益非浅。
我的页面上面的导航条自动加重原来靠自己写的插件实现的,在现在MT 模板中完全可以利用 MTSetVar 和 MTif 实现,简单介绍如下:
修改头部模块(导航条),假设名字为 "Header" 为:

<div id="header">
<h1><a href="/" accesskey="1" title="Return to HomePage of easun.org" >Easun.org(路杨)</a></h1><h3><$MTBlogName encode_html="1"$></h3>
<h2><$MTBlogDescription$><a href="/links.html" title="Some Good Sites">链接</a></h2>
<ul>
<li id="top_ossu"><a href="/ossu/" title="Go to Easun OS Switch Utility HomePage">软件站</a></li>
<li id="top_perl"><a href="/perl/" title="Perl Site">Perl Site</a></li>
<li id="top_blog_bookmarks" <MTIf name="blog_bookmarks">class="notice"</MTIf>><a href="/Bookmarks/" title="Easun's Bookmarks,朋友的Blog RSS聚合">Bookmarks</a></li>
<li id="top_blog_tags" <MTIf name="blog_tags">class="notice"</MTIf>><a href="/blog/tag/" title="Tag cloud of Easun's WebBlog">Tags</a></li>
<li id="top_blog_archives" <MTIf name="archive_index">class="notice"</MTIf>><a href="<$MTLink template="archive_index"$>" title="Easun's All Articles Archives">Articles</a></li>
<li id="top_blog_index" <MTUnless name="is_not_blog">class="notice"</MTUnless>><a href="<$MTLink template="main_index"$>" title="Easun's Blog">WebBlog</a></li>
<li id="top_blog_home" <MTIf name="site_home">class="notice"</MTIf>><a href="/" title="Easun's HomePage">Home</a></li>
</ul>
</div>

在一般情况下,WebBlog 都是粗的,如果要加粗其他页面,比如Site Home 页面,只需要在此模板顶部写入:

<MTSetVar name="site_home" value="1">
<MTSetVar name="is_not_blog" value="1">
。。。
<$MTInclude module="Header"$>

就可以了:) 是不是被专门写插件处理方便多了? 呵呵。

二。 按分类归档有所变化。
这次MT4.0的重建速度要比以前版本快了很多,但是我怀疑和 "按分类归档" 有所变化。 以前"按分类归档" 是个大问题,严重拖慢速度,因为要重写的数据太多了。
这次, MT 默认模板对 "按分类归档" 只输出最近的几篇文章(就像Blog首页那样),所以节省了大量时间。但是作为补偿, MT4 推出了新的归档类型: Category Monthly Archives(分类的按月归档),这个主意的确不错,既方便了读者,也节约了重建速度。

三。大量的 SetVar 和 if 让生成的最终页面空行空格大量增多。
这个也许是模板化的代价,也许是 官方 的疏忽?虽然不影响什么。但是给人感觉很不舒服,我自己修改了下程序,让 MT 自动对页面进行了空格/空行压缩,但是发现速度明显变慢。。也算一郁闷事情吧:)


--EOF--

[MT4 Hack]针对MT4模板的HTML压缩修改 ,

升级到 MT 4,模板模块化了,但是大量的 SetVar 和 if 让生成的最终页面空行空格大量增多,让人看到实在不爽,小修改了代码,让 MT 程序在发布/重建页面的时候对最终代码进行空格/行的压缩。
办法如下,找到并打开 lib/MT/Template.pm文件,找到 sub build {...},在此函数下面添加以下 Perl 代码

sub easun_html_reduce
{
my ($tmpl ,$res)= @_;
$$res =~ s!\s*\n\s*!\n!isg;
$$res =~ s!(\r|\t|\f| )+! !isg;
return 1;
}

然后转到sub build {...}代码的最后一行
return $res;

在这个之前添加
$tmpl->easun_html_reduce(\$res);

到此完成Hack,保存后重建整个Blog吧:) 相信看见空格和空行明显减少了 :P

--EOF--

MT 4 RC1 试用小记 ,

Movable Type 4 终于告别了 beta7 ,但是却迎来了 RC,而且是 RC1。笑ing,估计少不了RC2,RC3。。 到真正的 Release 估计还需要等几天。看来这次 update 真是耗费了 6A 的精力。

周末有空,把测试blog( http://easun.org/temp/mt4/ )升级到了 RC1,也真正的测试了一番,今年由于工作比较忙碌,前几个beta版本虽然也安装了,但是却没有彻底测试,这次一并测试了 :P RC1的确要成熟的多了:)

对于 MT4 系列,其实对我来说最大的亮点如下:

1.Page 的定义:
页面功能。说实在的,在以前版本中这个功能依旧有,只是你需要在 Index Templates 中直接建立新Template而已,这样产生的页面重头开始写起,没有固定的样式和结构。也不可以对之发表评论和引用通告。 而 MT4 系列中,提出了 Page 的定义,说白了就是创立了一个不会出现在归档页面的“Blog文章”而已,可以接受评论和引用通告,可以设定共同的Template来规划相同的样式和结构。 说实在的,对我来说,这个功能最大的好处就是让我的 “Index Templates” List 显的清爽,因为我的 Index Templates List 现在实在太长了(建立了N个页面:P).

2.发表文章的“所见即所得(WYSIWYG)”样式和编辑Template的“代码加色”:
“所见即所得(WYSIWYG)”就不用说了,更重要的是 编辑Template的“代码加色”,实在是方便了很多:) 你说呢?

3.导出的格式包含了tags
好不容易来临的功能,当初可是耗费了精力,还专门给6A写了 email :) 当然,这次 MT 的备份方式不再只是 "导出",还有了"Buckup",可以备份包括Templates,Users在内的所有信息。比"导出"方便多了 :P

[MT]MT4, Template Tag 的改进是进步还是后退?

MT beta 3 也出来了。
6A 花了数月时间推出的这个较大改动的版本如同给 Blog 界投放一个深水炸弹,一时间,叫好的有,因为Bug而对 MT 失望的也有,甚至有因为升级而导致原来的 Database 完蛋的。。

作为 MT 使用者,我也测试了新版本。结论是这次的 beta 的确是个 beta 。也许是 6A 一向表现的太稳健了,原来的bata版本基本都是很稳定了,所以很多人急的升级,导致问题多多。

不说这个了,通过测试,我发现 MT 4b 对 Template Tag 的处理有了很多变化,一个最重要的,我认为也是很危险的变化就是: MT 在build的时候不在对 Template 中出现的不存在的 Template Tag 做 忽略 处理,而是直接停止 build .