現(xiàn)在到了 Joomla! 1.5 平臺,前面這個方法不靈了。不過,Joomla! 開發(fā)團(tuán)隊早就給出了更好的方案,總結(jié)起來就是3個字母:MVC。
?
?
?
MVC 等幾個概念
????? MVC 是Model-View-Controller (模型-視圖-控制器)的縮寫。這是 Joomla! 1.5 采納的一種新型的 Web 程序編寫模式。 MVC 這三個字同時也蘊(yùn)含了一種理念:更加靈活的外觀設(shè)計。其中的 V 字母就是完美解決外觀布局問題的答案。
?
????? 長期以來,Joomla! 就因?yàn)槠渫庥^布局無法自由設(shè)計而遭詬病。現(xiàn)在,得益于MVC的幫助,徹底控制網(wǎng)頁外觀風(fēng)格的力量重新回到了模板設(shè)計人員的手中。
?
????? 首先弄清楚兩個概念:CSS 只能改變頁面“樣式”,例如顏色、字體、背景等等,它不能改變“布局”,也就是頁面上各種組成部分的 結(jié) 構(gòu) 。這是由 HTML 的輸出來控制的,例如文章展示為博客形式還是列表形式,就無法通過 CSS 來調(diào)整。以前如果要改變頁面的布局,就必須手動修改Joomla! 核心文件的 HTML 代碼。這樣會引發(fā)一個潛在風(fēng)險:當(dāng)你網(wǎng)站核心升級時,新的文件可能會覆蓋掉舊版本,從而使你的 Hack 結(jié)果消失。而 MVC 的出現(xiàn),使得這個煩惱一去不復(fù)返。設(shè)計人員再也不需要修改 Joomla! 的核心文件了,也不必?fù)?dān)心網(wǎng)站升級會抹殺個性化設(shè)計。
?
????? 我們姑且稱 MVC 中的 View 為“視圖”,擴(kuò)展套件在前臺呈現(xiàn)各種不同類型數(shù)據(jù)的方式就是它的視圖。但是它的外觀表現(xiàn)不止一種,我們稱之為不同的“布局”。舉例來 說,com_content 這個組件控制著文章系統(tǒng),它能夠呈現(xiàn)不同的數(shù)據(jù):文章,或者類別,或者單元。前臺形式可以是單篇文章展示,可以是多篇文章的標(biāo)題列表,可以是多篇文章的 Blog 形式排列。這就是說,com_content 組件的視圖有多種 布局 。也就是說,真正在前臺展示的是布局。
?
????? 那么,我們?nèi)绻淖兦芭_的 HTML 輸出,就只需修改布局。在進(jìn)行這個操作之前,我們必須記?。阂粋€組件可以有多種視圖,每個視圖又可以有多種布局。視圖包含了一系列固定的信息,而布局可以 通過不同的形式來展示這些信息。例如:文章組件(com_content)的“類別”視圖包含很多文章,這些文章可以用列表來顯示,也可以用表格來顯示 (可能還有其它形式),這就是說,類別視圖既有“列表”這種布局,也有“表格”這種布局。
?
????? 模塊就相對簡單多了。模塊一般都是以一種方式展示一種信息。因此模塊沒有視圖,它們只有布局。有些模塊作者甚至可以在后臺參數(shù)中為他的模塊提供幾種布局來 供選擇。例如:登錄模塊的“姓名”和“密碼”輸入框是垂直排列,還是水平排列,這就無法通過 CSS 來實(shí)現(xiàn),只能是不同的“布局”。
?
模板與布局
????? 接下來還要區(qū)分一下“模板”與“布局”的關(guān)系。模板主要是為網(wǎng)頁設(shè)定一個結(jié)構(gòu)框架。在這個框架之內(nèi),指定了組件和模塊的顯示位置。而在這些位置上,具體如 何展示信息,是由布局(模塊)或者視圖與布局的組合(組件)來決定的。
?
?
?
?
????? 上圖是 Joomla! 默認(rèn)模板 rhuk_milkyway 的結(jié)構(gòu)外觀(通過訪問 http://域名/index.php?tp=1?就能看到這些模塊位置)。你可以清楚地看到哪些模塊在哪個位置,以及組件在什么位置輸出。然而,“實(shí) 際上”這些位置將來輸出什么內(nèi)容,不是模板決定的,而是由“布局”決定的。
?
組件的輸出類型及布局的優(yōu)先性
????? 要理解布局的優(yōu)先性,我們先要理解組件的文件結(jié)構(gòu)。盡管一個組件有多個部分,分別負(fù)責(zé)不同的功能,我們只需要看看 /views 目錄下的文件。下面是 com_content 組件視圖目錄的一部分:
?
?
/components
|
?
?
????? 在 /views 目錄中,每一種視圖都有自己的目錄。com_content 組件還有另外三個視圖我們沒有列出來,它們是存檔(archive)、首頁(frontpage)和單元(section)。
輸出類型
????? 繼續(xù)上面的例子。在 /articles 目錄中有很多文件。與 /category 視圖目錄比較一下,就會發(fā)現(xiàn)都有一個共同文件就是 view.html.php。這就是我們所說的視圖文件。由于輸出類型不同,可以有多個不同的視圖文件。這些視圖文件的命名規(guī)律 是:view.output_type.php,這里 output_type 就是輸出類型,可以是 html、feed、pdf、raw?或者 error。當(dāng)我們需要該視圖的HTML輸出時,就會調(diào)用 view.html.php 文件;當(dāng)我們需要該視圖的 RSS 輸出時,就會調(diào)用 view.feed.php 文件。
?
????? 如果將全局設(shè)置中的SEF啟用、同時啟用Apache的 mod_rewrite 、啟用給URL添加后綴,那么這些不同輸出類型的影響就能從 URL 中看出來:
?
?
http://domain/sports.html
|
?
?
你網(wǎng)站上實(shí)際的 URL 可能與這些稍有不同,不過我們的重點(diǎn)是想說明:sports.html 結(jié)尾的URL 將調(diào)用 category 視圖的 view.html.php 文件來展示;sports.feed 結(jié)尾的URL 將調(diào)用 category 視圖的 view.feed.php 文件來展示 RSS 供稿內(nèi)容。提醒一下:目前還不能自定義 feed?和?pdf 輸出類型。但是你可以自定義 HTML 輸出類型,這正是布局起效的地方。
布局
????? 在每一個視圖目錄中,都有一個 /tmpl 目錄,這里面就是布局文件。這個目錄中的每一個 php 文件都代表一種布局。例如, article/tmpl/default.php 就代表文章的默認(rèn)布局; article/tmpl/form.php 就代表文章的編輯表單布局;category/tmpl/default.php 代表類別的默認(rèn)布局;category/tmpl/blog.php 代表該類別中的文章以博客形式展示的布局。
?
????? 當(dāng)添加新的菜單項目時,就能明顯看出組件的視圖與布局的關(guān)系。還用文章組件來舉例,當(dāng)我們創(chuàng)建新菜單項目時,點(diǎn)擊“文章”(其實(shí)就是 com_content 組件),就會看到如下的畫面。樹形分支顯示了每一種視圖以及該視圖的若干布局:
?
?
?
?
????? 你可能注意到了,盡管 /tmpl 目錄中還有其它文件,但是沒有在這個列表上出現(xiàn),例如 article 視圖的 pagebreak.php 文件。這是因?yàn)樵摬季值?XML 文件(本例中是 pagebreak.xml)中的命令隱藏了該布局(甚至可以是該視圖),不在這個列表中出現(xiàn)。關(guān)于這種隱藏命令另有教程介紹,此處不贅述。
?
????? 在理解并掌握了上述知識后,我們現(xiàn)在來實(shí)戰(zhàn)一下:創(chuàng)建自定義的優(yōu)先輸出的布局。
復(fù)制或者創(chuàng)建布局文件
????? 布局的優(yōu)先性只在當(dāng)前模板有效,而且想要優(yōu)先輸出的布局文件必須位于該模板的 /html 目錄中。例如,對于 rhuk_milkyway 模板來說,就位于 /templates/rhuk_milkyway/html/ 目錄中;對于 JA Purity 模板來說,就位于 /templates/ja_purity/html/ 目錄中;對于 Beez 模板來說,就位于 /templates/beez/html/ 目錄中。
?
????? (譯者注:本文所謂的“優(yōu)先輸出”是指,對于某個符合 MVC 設(shè)計結(jié)構(gòu)的組件來說,它已經(jīng)自帶若干布局;如果我們在當(dāng)前模板中重新設(shè)計了該組件的某些布局,則 Joomla! 1.5 會優(yōu)先使用模板文件夾中定義的布局,忽略組件自帶的布局。這就是“優(yōu)先輸出”。)
?
????? 再次強(qiáng)調(diào):當(dāng)你為某個模板創(chuàng)建了“優(yōu)先輸出”,該優(yōu)先性只在這個模板上有效,對其它模板就無效。例如,rhuk_milkyway 模板沒有任何組件的優(yōu)先輸出,當(dāng)你使用此模板時,所看到的前臺是各個組件的原樣輸出(組件作者所設(shè)定的);當(dāng)你使用 Beez 模板時,前臺幾乎每一個組件的外觀都已被該模板中定義的優(yōu)先輸出所控制(模板設(shè)計者個性化了);JA Purity 模板介于上述兩者之間,只有部分組件被創(chuàng)建了優(yōu)先輸出,而且也只是這些組件的部分視圖。
?
????? 布局優(yōu)先性的實(shí)現(xiàn)要求布局文件必須按照特定的方式來上傳。以 Beez 模板為例,我們可以在它目錄中看到下面的文件結(jié)構(gòu):
?
?
/templates
|
?
?
從這里可以看出組件“優(yōu)先輸出”的文件結(jié)構(gòu)很簡單:/模板名稱//html/com_組件_名稱/視圖_名稱/布局_文件_名稱.php 。我們來看一個例子:
?
????? rhuk_milkyway 模板沒有任何組件的優(yōu)先輸出,如果我們想要對文章的默認(rèn)布局進(jìn)行優(yōu)先輸出設(shè)計,就這樣做:
????? 首先將 /components/com_content/views/article/tmpl/default.php 這個文件復(fù)制到這個模板的目錄中(需要創(chuàng)建 html 目錄因?yàn)樵瓉頉]有),最后實(shí)現(xiàn) /templates/rhuk_milkyway/html/com_content/article/default.php 這個結(jié)構(gòu)。
?
????? 如果我們還想要對類別視圖的博客布局進(jìn)行優(yōu)先輸出設(shè)計,就需要將 /components/com_content/views/category/tmpl/blog.php 這個文件復(fù)制到 /templates/rhuk_milkyway/html/com_content/category/blog.php 這個位置。
?
????? 在完成了文件復(fù)制之后,你就可以按照需求來修改這些文件,以實(shí)現(xiàn)你的個性化設(shè)計方案。
子布局的優(yōu)先輸出
????? 在某些視圖目錄中,可以看到某些布局擁有一些文件名前半部分相同的文件。以 category 視圖為例,其 blog 布局實(shí)際上由三部分組成:一個主布局 blog.php ,兩個子布局 blog_item.php 和 blog_links.php。研究一下 blog.php 文件的代碼,就能發(fā)現(xiàn)它是如何通過 loadTemplate 方法來調(diào)用這兩種子布局的:
?
echo $this->loadTemplate('item'); ?// or echo $this->loadTemplate('links');? |
?
?
????? 在加載子布局時,視圖已經(jīng)知道你所處的上層布局是什么,因此無需寫全前綴(在本例中,你只需在代碼中寫 item,而不用寫 blog_item)。
?
????? 我們在這里專門討論子布局是想說明:當(dāng)你只想對某個子布局實(shí)現(xiàn)優(yōu)先輸出時,無需完全復(fù)制那一系列文件。例如,你對 Joomla! 本身的 blog 布局很滿意,但是想自定義 item 這個子布局的輸出樣式,那么就只需復(fù)制 /components/com_content/views/category/tmpl/blog_item.php 這個文件到 /templates/rhuk_milkyway/html/com_content/category/blog_item.php?這里即可。當(dāng) Joomla! 1.5 處理該視圖時,會自動從組件本身的目錄(com_content)中讀取 blog 布局定義,同時從當(dāng)前模板的目錄中讀取 blog_item.php? 定義的子布局。
?
????? 本文基本上是官方文檔《 理解 Joomla! 1.5 的 模板輸出優(yōu)先性 》(作者:Andrew Eddie)的翻譯,如果你喜歡看英文原版,可以點(diǎn)擊這個鏈接去閱讀。該文檔中還提到對模塊的布局進(jìn)行“優(yōu)先輸出”處理的方法,本文未轉(zhuǎn)載。有興趣的用戶 可以去看原版。
用優(yōu)先輸出來解決我們的問題
????? 本文開始提到的 szyyw08 在論壇的那個問題 ,就可以通過對 com_content 組件的?frontpage 視圖進(jìn)行“優(yōu)先輸出”設(shè)計來解決。
?
????? 另外,我還想起來很多人在論壇都尋找一種“中國式風(fēng)格”的首頁布局:新聞按照類別列出標(biāo)題,頭條新聞標(biāo)題的左側(cè)有縮略圖(或者每一個標(biāo)題左側(cè)都有);在同 一個類別中列出指定數(shù)量的標(biāo)題之后,顯示“更多……”鏈接;首頁上按分欄排列多個這樣的新聞列表模塊,或者通過“標(biāo)簽頁”的形式組合屬于相同大類別的小類 別;等等……
?
????? 這樣的問題,同樣可以通過自己設(shè)計 frontpage 視圖來實(shí)現(xiàn)。采用“優(yōu)先輸出”的方法,我們可以設(shè)計好自己喜歡的視圖布局,然后可以上傳到任何一個 Joomla! 1.5 網(wǎng)站去實(shí)現(xiàn)同樣的風(fēng)格,也不用擔(dān)心核心升級會影響這種個性化風(fēng)格。
?
????? 最后我提醒想要開發(fā) Joomla! 擴(kuò)展的高手:強(qiáng)烈建議你在開發(fā)組件或者模塊時遵照 MVC 模式來編程。
?
附上api文檔
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
