模版的預處理 template preprocess in Drupal 6.x
繼續 Drupal templates 的深度遊
Preprocess 是一個在你的theme 之內的 template.php 內的一組函數
用"一組" 的原因是因為一個theme 是可以有很多 preprocess function
正確來講, 一個 hook 便已經可以有10個 preprocess function (當然, 和 hook 一樣, 不用也是可以的)
而preprocess 的真正功用是,
- 為 templates 提供更多的變數以供使用
- 為hook 提供更多的template suggestion
第一點的功能很明顯, 因為 drupal 內建的 preprocess function (無錯, Drupal core 都是使用 preprocess 的)沒法為你的theme 的特殊性供你需要的變數
你便可以使用preprocess function:
<?php
//template.php 中提供一個 $foo_list 陣列
function yourtheme_preprocess_foo(&$vars) {
$vars['foo_list'] = array(
'list item 1',
'list item 2',
'list item 3',
);
}
//sites/all/themes/yourtheme/foo.tpl.php 中便可以使用:
print $foo_list;
?>
待續 template suggestions......
ref:
preprocess functions http://drupal.org/node/223430
進階 views 模版(二): HTML 列表 Complex views templating, part 2, table, HTML list templates
Attachment | Size |
---|---|
theming-views2-1.png | 7.05 KB |
theming-views2-2.png | 17.9 KB |
續 part1
補一下 table 顯示之下的 theming.
假如你的 table 有4個 fields, views 的 theming information 便有6個 templates:
1個 display 的 tpl (page 或block)
1個 style tpl, 包含了 <table>
每1個 field 都可以有一個自己的 tpl (詳見 attachment)
HTML list (ul, ol) 也是同樣的情況
display + style tpl, 外加每個field 一個tpl
也可以做 field by field 的 tpl, 修改 <ul>
的class, <li>
多個 span 之類
最後, 雖然和 views 無關, 但pager 也經常由 views 產生
但 views 的 pager 都是使用 core 的pager, theme_pager()
theme 的時候沒有 tpl, 要在 template.php 修改, 或者使用preprocess 提供 tpl
進階 views 模版(一): 簡介, 設定, tpl 檔 Complex views templating, part 1, intro, config, tpl
Attachment | Size |
---|---|
views-theming2.png | 47.33 KB |
views-theming1.png | 17.07 KB |
views 的 theming/templating 是Drupal theming 的高級班了
之前一直沒有信心將這個部份的教做好, 但這次都要挑戰一下難度, 唯有試試用多一點圖片展示了
首先, 我們常用的theme developer 是不能夠幫我們查出 tpl 的檔名的 (但仍可以看到可用的 vars)
因為 views 的 templating 機制雖和 Drupal core 的極相似, 但卻是views 自己定義的
主要是為了應付更複雜, 更多變的情況
但也不需要擔心, 概念上, 操作上都和我們一向做的非常相似
既然theme developer 不適用, views 有自己的 tpl suggestion: Basic settings 內的 Theme: information(下圖1)
上圖二便是 tpl suggestions, 而粗體則是現正在使用的 tpl 檔
你可以看到, 一個views 便有三個為一組的 tpl,
而其實如果你使用 "fields" 的話, 你的 views display 更由四個 tpl 組成
我們看看三個 tpl 各自負責那一部份的 output:
你會發現, display output 和 row style output 重叠了
那是因為我正在使用 "unformatted", 如果你用 "table" 或者 "unordered list"
row style output 便會改變成 table, ul tags 了
假如你鎖定了某一個 tpl, 你可以從 views 內建的 code 開始
你只要點一下 "display output", 你便會得到views 自己內建的 tpl code了
而且內建的 code comment 都很清楚, 只是需要更多變數的話, 還是使用 theme developer 點一下就好了.
待續..
iPhone opera mini deep review from developer view, and my guesses.
As soon as a break through app, Opera mini lands, I find it exciting in both:
- browsers war happens in iPhone, too
- it is VERY FAST
I am not going to write a user level review, but from developer/technical point of view. Starting from least mentioned in media:
2 zoom levels only
You may not discovered that, opera just have 2 zoom level, a overview and closed view. You may not discover because it calculates the zoom level so actuate, and you barely need a third zoom level. Try it yourself!
I am neutral about this implementation, as far as it calculates correctly over 99% of webpage. But I have a wild guess from this observation, that it is the critical point that made opera so fast, by only saving 2 static image.
This wild guess can be further prove by looking at some "auto changing" sites, like http://berlintwitterwall.com. In normal browser(even in iPhone's safari, although very slow), this site scroll horizontally and popping new tweets, while in opera, the site is static.
vertical/horizontal switching do not render page again
In iPhone's safari, by flipping the phone vertically and horizontally, the page render again to fit the monitor width. This also do not apply to opera. you will see a large white space if you flip from horizontal to vertical position. But if you reload the page, the page will render again and fit your phone's orientation.
If my guess is correct, I even have a wilder guess that the 2 static image may actually render on opera's server, not on the iPhone. and Changing orientation do not trigger another request/do not render the page again!
overflow:auto
This is another side evidence that opera mini is actually showing a static image, but not just "ignoring continuous javascript". Many sites define a finite height of a div. By applying a css property "overflow:auto", if the content within the div is actually having a height larger than the defined value, a scroll bar take place. http://inmediahk.net on the right sidebar had an example. In opera, the scroll bar do not appear again. (similar behavior with overflow:hidden)(This actually also apply to safari)
alternative rendering logic for zoom level fitting
The images best explain what I want to say. The rendering logic align image and text to the same width so in closer level zooming, the image and text will fit the screen beautifully. (sorry no guess here ^^)
super fast tabbed browsing, bandwidth saving
Also no special observation here, but above 2 points worth mention again. The switching between tabs in super fast, like desktop speed! (maybe because just switching 2 image?). And bandwidth saving by opera turbo is a famous function of opera, even in desktop version.
user-friendly-ness (speed dial setup)
lastly, an improvement needed. Setting up the 9 speed dials is very difficult through UI. You cannot save the current page as speed dial, but you have to open a new speed dial tab, and press the thumbnail and type the URL to edit it.....
svn 概念, 初階使用
UPDATE: 2011-01-09 SVN merge
UPDATE: 2010-04-13 images added
ORG: 2009-06-13
svn 是一個管理源碼的工具
它提供一個容許多人協作的平台, 幫助一個多人開發的團隊管理代碼
同時提供一個保存多版本的功能 (version-ing)
而我因為多數都自己一個開發, 主要為了 versioning 而使用 svn
但因為有多個開發機器
為了保持代碼在多個機器中同步, 都會使用 svn
我在 windows 機是使用 TortoiseSVN GUI client
ubuntu 上使用 nautilussvn
使用上, 介面上都很類似, 都很好用
先談一下 svn 的概念
svn server 是指在 remote 上的server
大家都將大家的code 上傳 (commit) 到這個中央的server
而開發機則是 client端 (當然, 他們其實可以在同一部機器上)
而 head 是指最新的一組檔案的集合, 統稱 head version
trunk 一般指 server 上的 head.
從日常使用次數最多的功能開始介紹
checkout
從server 上下載源碼(即 server 上己經建立好, 設定好)
在本機(即開發機上)建立一個拷貝
是在開發機上開始建立一個新的 project 的方法
完成便可以開始改動源碼, 開發的工作了
可以從 code.google.com 隨便選一個 project 使可以checkout了 (source tab 便可以找到 svn url, 例)
commit / add
commit 是指將本機的源碼上載到 svn server 上(要已經checkout 過的檔案)
例如已經checkout 過的 project,
在改動源碼之後, 資料夾上使會有一個紅色的X, 代表需要 commit
而如果你有權力 commit, 便可以上載到 svn server 上了
而每一個commit 都儲存到 server 上, 之後的任何時候都可以調用, 還原等等 (就算commit 再覆寫過都可以)
而 add 則是新增一個沒有 svn 的檔案到 svn server.
commit 的策略是, 每午飯之前, 下班之前都commit, 原因在討論 update 之後再研究
update
如果我 checkout 了一個 project, 但 project code 在svn server 上有其他人 commit 了中
我應該如何更新我的 code 令自己和svn server 同步?
答案是 update.
svn 會幫我們從 server 上下載, 而且萬一需要覆寫一個我們正在修改的檔案(即一個衝突 conflict 發生了),
svn 會嘗試幫我們合併, 確保同事做的修改和我們的修改都正確的保存
如果開發團隊同意了午飯前, 下班前commit 當日的源碼,
update 的策略便是 上班的第一件事, 和午飯後的第一件事了.
change log, diff
每一次的commit 都會留下記錄在 server 上 (change log)
並有一個唯一的 版本(version) id
我們任何時候都可以將任何兩個 commit 比較
並還原, 合併任何兩個檔案
svn 在處理 conflict 的時候, 不一定能自動合併
這時 svn 會要求我們做手動合併, diff 工具都會協助我們分析兩個衝突檔案的內容的
tag / branch
這是一個進階使用者的題目, 請先確保你試過, 用過上面的功能再繼續
head 便是一個等殊tag, 這個tag 是會隨著commit 而移動
而我可以因應需求tag 一個 2009-06-08 tag
標記這些便是 09年 6月 8日 的源碼, 主要是為了方便日後的調用 (稱為日期tag)
而branch 其實和 tag 類似, 但 checkout 了 branch 的話, 你的 commit 會指定為 commit 到這個 branch,
而不是一般的主線
這樣, 你就可以將你的重大更新, refactoring 開一個 branch, 完成再 merge
令自己的重大更新的開發代碼不會干擾其他同事的開發
指令上在 GUI 都好簡單, checkout/update 了以後, 直接在資料夾上右鍵->tag/branch 便可以了
安裝 svn server @ubuntu
首先安裝 SVN
sudo apt-get install subversion
安裝 svn 在 Apache 使用的套件
sudo apt-get install libapache2-svn
進階的權限便自己 google 一下了
Project setup
安裝完便要建立一個 trunk,
而一般的資料夾習慣是:
SVN-ROOT
-PROJECT-NAME1
--trunk
--tags
--branches
-PROJECT-NAME2
--trunk
--tags
--branches
建立 SVN-ROOT 到 /home/svn:
sudo svnadmin create /home/svn
建立 PROJECT-NAME1:
GUI:
在開發資料夾 (例 /var/www) checkout file:///home/svn
checkout 後建立 trunk, branches, tags 三個資料夾
commit 三個資料夾
再 del 三個資料夾, 然後 checkout trunk
便可以開始 add了
conclusion
會使用 svn 工具絕對是其中一個進階程序員的指標 (包括 tag/branch)
工具看似複雜, 但其實真正做起來只是很簡單的概念, 但用文字真的比較難以表達
找一個人教一教, 十分鐘便什麼都懂了.
version control 的工具其實還有 cvs, git 等, 概念有一點不同
但一般的操作反而很類似, 舉一反三就是了
但svn 都不是萬能
sql server 中設定很多的 cms (drupal 便是一個明顯例子) 如何做 version control?
mysqldump + commit?
有高手能解答嗎?
Attachment | Size |
---|---|
checkout.png | 6.97 KB |
commit.png | 9.68 KB |
update.png | 10.21 KB |