标簽/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 .
大家都知道, 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 .

随着文章的增多, 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 " >(路楊)</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( /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 .