Drupal6 pro Drupal development(專業開發指南)TheThemeSystem主_第1頁
Drupal6 pro Drupal development(專業開發指南)TheThemeSystem主_第2頁
免費預覽已結束,剩余35頁可下載查看

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、drupal6 pro drupal development(專業開發指南)thethemesystem主 drupal6 pro drupal development(專業開發指南)thethemesystem主題系統 第8章 主題系統 如 果你想修改drupal生成的html或者其它標識字體,那么你需要深化的了解主題系統的各個組成部分。主題系統是個優雅的架構,它使你無需核心代碼,就 可以得到想要的外觀;但是它也有一個很長的學習曲線,特殊是你想要完全定制一個站點主題,以與其它drupal站點區分開來,那么你還是需要費點功夫的。 我將向你敘述主題系統的工作原理,以及向你展現隱蔽在drupal核

2、心之中的一些最佳實踐。首先要記住的是:不要通過編輯模塊文件內部的html來轉變你 站點的外觀。假如這樣做了,你僅僅創建了一個對你個人適用的內容管理系統,這樣你就會失去開源軟件系統最大的優勢之一-社區的支持。覆寫,而不 是修改! 主題系統的組成 主題系統由多個抽象層次所組成:模板語言,主題引擎和主題。 模板語言和主題引擎 主題 安裝主題 構建一個phptemplate主題 使用已有的html和css文件 為你的主題創建一個.info文件 為你的主題創建一個.info文件(1) 理解模板文件 theme()函數介紹 theme()工作原理概覽 覆寫可主題化的項目 覆寫主題函數 覆寫模板文件 添加和

3、操縱模板變量 適用于全部模板的變量 drupal6 pro drupal development(專業開發指南)thethemesystem主題系統 page.tpl.php page.tpl.php(1) node.tpl.php node.tpl.php(1) block.tpl.php comment.tpl.php box.tpl.php 其它的.tpl.php文件 多頁面模板 高級drupal主題化 注冊表是如何構建的 逐步分析theme()函數 逐步分析theme()函數(1) 定義新的區塊區域 總結模板語言和主題引擎 主題系統可以使用多個模板語言。smarty, phptal,

4、和phptemplate都可以與drupal集成,用來向模板文件中添加動態數據。為了使用這些語言,需要一個叫做主題引擎的包裝器,用來在模板語言和drupal之間進行交互。你可以在/project/theme+engines中找到對應模板語言的主題引擎。安裝主題引擎其實很簡潔,只需要通過將相應主題引擎的名目放置到你站點的主題引擎名目下面就可以了。假如僅用于單個站點,使用名目 sites/sitename/themes/engines;假如用于多個drupal站點,則使用名目sites/all/themes/engines,如圖8-1所示。 drupal社區創建了一個自己的引擎,特地對drupal

5、作了優化。它就是 phptemplate,它使用php作為模板語言,這樣它就不需要中間層的 解析環節了,而其它模板語言經常需要這一環節。這是drupal最常用的模板引擎,它是drupal自帶的。它位于themes/engines /phptemplate,如圖8-2所示: drupal6 pro drupal development(專業開發指南)thethemesystem主題系統 圖8-1 為drupal添加定制主題引擎的名目結構 圖8-1 drupal核心主題引擎的名目結構。這個位置特地用于放置核心主題引擎。 留意 完全可以不使用模板語言,而簡潔的使用純php 的模板文件。假如你是熱衷于

6、追求速度,或者可能僅僅是想熬煎一下你的設計人員,那么你可以不使用主題引擎而僅僅整個主題包裝在php函數中,比如使用函數 themename_page()和themename_node()來代替模板文件。一個基于php主題的示例,可參看 themes/chameleon/chameleon.theme。 當你安裝好一個主題引擎后,你不會看到你的站點有了任何轉變。這是由于,主題引擎僅僅是一個接口庫,在它被使用以前,你仍舊需要安裝一個依靠于該主題引擎的drupal主題。 要使用哪一個模板語言呢?假如你正在轉換一個遺留站點,那么可能使用以前的模板語言會更便利一些;或許你的設計團隊更傾向于使用所見即所得

7、的編輯器,這樣 phptal應當是個更好的選擇,由于它可以阻擋這些編輯器對模板的破壞。你可以發覺,大多數的文檔和支持都是關于phptemplate的,假如你是從 頭開頭建立一個站點的話,那么從長期的維護和社區支持這兩個方面來看,phptemplate應當是最好的選擇。 主題 drupal6 pro drupal development(專業開發指南)thethemesystem主題系統 用drupal的行話來說,主題就是一組負責你站點外觀的文件。你可以從 /project/themes下載第3方 主題,或者你可以自己動手創建一個主題,后者正是你在本章將要學習的。作為一個web設計者,主題由你所

8、熟識的大部分內容所組成:樣式表,圖 片,javascript文件,等等。你將發覺,在drupal主題和純html站點之間的區分就是模板文件。這些文件一般都包含大段的靜態html,和 一些小段的用來插入動態內容的代碼。它們負責你站點的一個特定部分的外觀。模板文件的語法依靠于它所使用的主題引擎。例如,列表8-1,8-2,8-3列 出了3個模板文件的代碼片段,它們輸出的內容是一樣但是包含的模板文件內容卻完全不同。 列表 8-1. smarty div id=top-nav if count($secondary_links) ul id=secondary foreach from=$seconda

9、ry_links item=link li$link/li /foreach /ul /if if count($primary_links) ul id=primary foreach from=$primary_links item=link li$link/li /foreach /ul /if /div 列表 8-2. phptal div id=top-nav ul tal:condition=php:is_array(secondary_links) id=secondary li tal:repeat=link secondary_links tal:content=linkse

10、condary link/li /ul ul tal:condition=php:is_array(primary_links) id=primary li tal:repeat=link primary_links tal:content=linkprimary link/li /ul /div 列表 8-3. phptemplate div id=top-nav drupal6 pro drupal development(專業開發指南)thethemesystem主題系統 ?php if (count($secondary_links) : ? ul id=secondary ?php

11、foreach ($secondary_links as $link): ? li?php print $link?/li ?php endforeach; ? /ul ?php endif; ? ?php if (count($primary_links) : ? ul id=primary ?php foreach ($primary_links as $link): ? li?php print $link?/li ?php endforeach; ? /ul ?php endif; ? /div 每一個模板文件,由于它所使用的模板語言的不同,所以看起來也各不相同。模板文件的擴展名指明白

12、它所使用的模板語言,也就是它所依靠的主題引擎(參看表8-1) 表8-1 模板文件的擴展名指出了它所依靠的模板語言。 模板文件 主題引擎擴展 .theme php .tpl.php phptemplate* .tal phptal .tpl smarty * phptemplate是drupal的默認主題引擎 安裝主題 為了讓一個新的主題顯示在drupal 管理界面中,你需要把它放到 sites/all/themes下面。這樣不僅你的drupal站點可以使用這個主題,一個多站點系統中的全部站點都可以使 用該主題。假如你的是個多站點系統,而你又想把這個主題僅僅用在特定站點上,那么你可以把它放到 s

13、ites/sitename/themes下面。你可以在你的站點安裝多個主題,主題的安裝過程和模塊的基本相同。將主題文件放到相應的位置后,導航到管理界面“管理 站點構建 主題”。你可以安裝多個主題,也可以一次啟用多個主題。這意味著什么?通過啟用多個主題,用戶可以在他們的個人資料頁面上,從已啟用的主題中選擇一個作為他們自己的主題。在用戶訪問站點時,就會使用所選的主題了。 當 下載或者創建一個新的主題時,將新建主題和核心主題以及第3方主題區分開來是個很好的習慣。我們推舉在你的themes文件夾下面創建兩個文件夾。將自定 義主題放到文件夾custom下,而將從下載下來的第3方的 drupal6 pro

14、 drupal development(專業開發指南)thethemesystem主題系統 主題放到drupal-contrib下。不過這個實踐不是特殊重要,不 像模塊名目下面那樣特殊注意這點,由于一個站點的主題一般只有幾個,但是模塊的數量卻有許多。 構建一個phptemplate主題 創建一個主題,可以有多種方式,這取決于你的起始材料。假定你的設計者已經為你的站點供應了html 和css文件。那么將設計者的設計轉化為一個drupal主題,究竟難不難呢?它實際上不是很難,而且你能夠輕易的完成工作的80%。不過還有 20%-最終的難點了-它是drupal主題制作高手與新手的分水嶺。首先讓我們從簡

15、潔的部分開頭。這里有個概括: 1. 為站點創建或修改html文件。 2. 為站點創建或修改css文件。 3. 創建一個.info文件,來向drupal描述你的新主題。 4. 根據drupal的標準為文件命名。 5. 在你的模板中,插入可用的變量。 6. 為單獨的節點類型,區塊,等等創建模板文件。 留意 假如你從頭開頭設計你的主題,那么在開放源代碼web設計站點里面有許多特別好的設計可供借鑒(留意這些是html和css設計,而不是drupal主題)。 使用已有的html和css文件 我們假設你已經有了html頁面和css樣式,如列表8-4和8-5中所給出的,現在讓你將它們轉化為一個drupal主

16、題。明顯在一個實際的項目中,你所用到的文件應當比這些更具體;我們在這里介紹的是方法,所以示例簡潔了一些。 列表 8-4. page.html html head titlepage title/title link rel=stylesheet href=global.css type=text/css / /head body div id=container div id=header h1header/h1 /div div id=sidebar-left p drupal6 pro drupal development(專業開發指南)thethemesystem主題系統 lorem i

17、psum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut. /p /div div id=main h2subheading/h2 p lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut. /p /div div id=footer footer /div /div /body /html 列表 8-5. global

18、.css #container width: 90%; margin: 10px auto; background-color: #fff; color: #333; border: 1px solid gray; line-height: 130%; #header padding: .5em; background-color: #ddd; border-bottom: 1px solid gray; #header h1 padding: 0; margin: 0; #sidebar-left float: left; width: 160px; margin: 0; padding:

19、1em; drupal6 pro drupal development(專業開發指南)thethemesystem主題系統 #main margin-left: 200px; border-left: 1px solid gray; padding: 1em; max-width: 36em; #footer clear: both; margin: 0; padding: .5em; color: #333; background-color: #ddd; border-top: 1px solid gray; #sidebar-left p margin: 0 0 1em 0; #main

20、 h2 margin: 0 0 .5em 0; 該設計如圖8-3所示 圖8-3 在轉化為drupal主題以前的設計 讓我們將這個新主題叫作greyscale,在文件夾sites/all/themes/custom下面創建一個子文件夾greyscale。假如 sites/all/themes/custom文件夾不存在的話,那么你需要新建一個。將page.html和global.css復制到 greyscale文件夾下面。接下來,將page.html重命名為page.tpl.php,這樣它將作為一個新的頁面模板,為drupal的每個頁 面服務了。 為你的主題創建一個.info文件 drupal6

21、pro drupal development(專業開發指南)thethemesystem主題系統 每個主題都需要包含一個文件,用來向drupal 描述它的力量。這個文件就是主題的.info文件。由于我們把我們的主題叫作greyscale,所以我們的.info文件就被命名為 。創建文件 sites/all/themes/custom/greyscale/,并輸入列 表8-6所示的10行代碼。 列表 8-6.主題的.info文件 ; $id$ name = greyscale core = 6.x engine = phptemplate regionsleft = left sidebar ;

22、we do not have a right sidebar. ; regionsright = right sidebar regionscontent = content regionsheader = header regionsfooter = footer 假如我們想要更簡單一些的話,那么我們可以在我們的.info文件中為drupal供應更多的信息。讓我們看看這個文件都可以包含哪些信息,如列表8-7所示。 列表 8-7.帶有更多信息的.info文件 ; $id$ ; name and core are required; all else is optional. name = gr

23、eyscale description = demurely grey tableless theme. screenshot = screenshot.png core = 6.x engine = phptemplate regionsleft = left sidebar ; we do not have a right sidebar ; regionsright = right sidebar regionscontent = content regionsheader = header regionsfooter = footer ; features not commented

24、out here appear as checkboxes ; on the theme configuration page for this theme. features = logo features = name features = slogan features = mission drupal6 pro drupal development(專業開發指南)thethemesystem主題系統 features = node_user_picture features = comment_user_picture features = search features = favi

25、con features = primary_links features = secondary_links ; stylesheets can be declared here or, for more ; control, be added by drupal_add_css() in template.php. ; add a stylesheet for media=all: stylesheetsall = mystylesheet.css ; add a stylesheet for media=print: stylesheetsprint = printable.css ;

26、add a stylesheet for media=handheld: stylesheetshandheld = smallscreen.css ; add a stylesheet for media=screen, projection, tv: stylesheetsscreen, projection, tv = screen.css ; override an existing drupal stylesheet with our own ; (in this case the forum module's stylesheet): stylesheetsall = fo

27、rum.css ; javascript files can be declared here or, for more ; control, be added by drupal_add_js() in template.php. ; scripts.js is added automatically (just like style.css ; is added automatically to stylesheets). scripts = custom.js ; php version is rarely used; you might need it if your ; templa

28、tes have code that uses very new php features. php = 5.2.0 ; themes may be based on other themes; for example, they ; may simply override some of the parent theme's css. ; see the minnelli theme at themes/garland/minnelli for ; an example of a theme that does this in drupal core. base theme = ga

29、rland 由于greyscale主題現在有了一個.info文件(列表8-6所給的簡潔的那個)和一個page.tpl.php文件,所以你就可以在管理界面中啟用它了。導航到“管理 站點構建 主題”,將它設置為默認主題。 為你的主題創建一個.info文件(1) drupal6 pro drupal development(專業開發指南)thethemesystem主題系統 恭喜恭喜!現在你應當可以實際的看到你的設計了。外部的樣式表還沒有加載進來(我們將在后面爭論它),訪問你的站點中的任何頁面,都會一而再再而三的顯示同一個頁面,盡管如此,這也是一個了不起的開頭!由于訪問你的站點中的任何頁面,都會顯示

30、page.tpl.php 中的靜態html內容,所以現在你無法進入管理界面了。我們將你關到了drupal站點的門外面!哎喲。一不當心被關到了門外面,對于初學者來說,這是常 遇到的事情,下面我們將向你敘述如何解決這個問題。一種方案是對剛才啟用的主題進行重命名。在這種狀況下,你可以簡潔的將greyscale重命名為 greyscale_,這樣你就可以重新返回站點到里面了。那是一個快速解決方法,但是由于你知道問題的真正所在(也就是,我們還沒有包含動態內容),這 里給出另一種方案:你可以向page.tpl.php中添加適當的變量,從而顯示drupal的動態內容而不是前面的靜態內容。 每一個phptem

31、plate模板文件-比如page.tpl.php,node.tpl.php,block.tpl.php等等-都有一組動態內容的變量傳遞給它們使用。打開 page.tpl.php將相應的靜態內容替換為相應的drupal變量。不要擔憂,我很快就會對這些變量進行講解。 html head title?php print $head_title ?/title link rel=stylesheet href=global.css type=text/css / /head body div id=container div id=header h1?php print $site_name ?/h1

32、 ?php print $header ? /div ?php if ($left): ? div id=sidebar-left ?php print $left ? /div ?php endif; ? div id=main ?php print $breadcrumb ? h2?php print $title ?/h2 ?php print $content ? /div div id=footer ?php print $footer_message ? ?php print $footer ? /div drupal6 pro drupal development(專業開發指南)

33、thethemesystem主題系統 /div ?php print $closure ? /body /html 重新加載頁面,你將發覺,變量被來drupal的內容替換了。你將留意到沒有加載global.css樣式表,這是由于指向該文件的路徑不對。你可以手工的調整它的路徑,或者你可以采納drupal的方式來完成它,這樣更加敏捷并且具有其它好處。 首 先,將global.css重命名為style.css。依據規定,drupal將自動的查找每個主題下面的style.css文件。一旦找到了這個文 件,那么drupal會將其添加到變量$styles里面,從而被傳遞給page.tpl.php.讓我們使

34、用下面的信息來更新 page.tpl.php。 html head title?php print $head_title ?/title ?php print $styles ? /head . 保存你的修改并重新加載頁面。瞧!假如你查看頁面的源代碼的話,你將留意到,其它啟用的模塊所帶有的樣式表也被加載了進來,這些都是通過變量$styles實現的: html head titleexample | drupal 6/title link type=text/css rel=stylesheet media=all href=modules/node/node.css?f / link typ

35、e=text/css rel=stylesheet media=all href=modules/system/defaults.css?f / link type=text/css rel=stylesheet media=all href=modules/system/system.css?f / link type=text/css rel=stylesheet media=all href=modules/system/system-menus.css?f / link type=text/css rel=stylesheet media=all href=modules/user/u

36、ser.css?f / link type=text/css rel=stylesheet media=all href=sites/all/themes/greyscale/style.css?f / /head . 通過將你的css文件命名為style.css,這樣drupal就可以使用它的css預處理引擎來對它進行處理,以消退css文件中全部的空白和換行, 另外,它還將它們合并到了一起(drupal沒有使用多個樣式表),作為一個文件供應給掃瞄器。關于這一特性的更多細節,參看第22章。 drupal6 pro drupal development(專業開發指南)thethemesystem

37、主題系統 留意 drupal在樣式表url的后面添加了偽查詢字符串(在前面例子中的 “?f”),這樣就可以掌握緩存了。當需要的時候,它可以修改字符串,比如運行update.php以后,或者在管理界面“管理 站點構建 性能”中清空了緩存以后。 在你將global.css重命名為style.css以后,刷新掃瞄器,你將看到一個與圖8-3中主題類似的主題,它包含了頁首,頁腳,和左邊欄。嘗試一下,導航到“管理 站點構建 區塊”,將“在線用戶”區塊指定到左邊欄。 除了前面提到的這些變量以外,還有更多的變量可以添加到page.tpl.php和其它模板文件中。讓我們深化的學習一下!假如你沒有動手實現前面所給

38、的例子,那么你可以掃瞄一下themes名目中所帶有的核心主題,看看在這些主題中,變量是如何使用的。 理解模板文件 一些主題包含各種模板文件,而有些僅包含page.tpl.php。那么你如何知道,你可以創建哪些drupal能夠識別的模板文件呢?創建模板文件時,所遵循的命名商定有哪些?在接下來的部分中,我將向你講解使用模板文件的各種技能。 大圖 page.tpl.php是全部其它模板文件的祖宗,它負責站點的整體布局。其它模板文件被插入到了page.tpl.php中,如圖8-4所說明的。 drupal6 pro drupal development(專業開發指南)thethemesystem主題系統

39、 圖8-4其它的模板被插入到了page.tpl.php文件中 在頁面的構建期間,圖8-4中block.tpl.php和node.tpl.php的插入是由主題系統自動完成的。還記不記得,你在前面的例子中創建的 page.tpl.php文件?好的,變量$content包含了調用node.tpl.ph的輸出,而$left包含了調用block.tpl.php 的輸出。讓我們看看它是怎么工作的。 讓我們向greyscale主題中添加一個節點模板文件。我們在這里沒有從頭創建一個,而是拷貝drupal的默認節點模板文件;也就是,假如一個主題中 找不到node.tpl.php文件的話,所使用的節點模板文件。將

40、 modules/node/node.tpl.php拷貝到sites/all /themes/custom/greyscale/node.tpl.php。然后訪問“管理 站點構建 模塊”頁面,這樣就會重新構建主題注冊表。在重新構建的過程中,drupal將找到sites/all/themes/custom/greyscale/node.tpl.php文件,并且從現在起,它將使用這個文件作為節點模板。導航到“創建內容 page”,來創建一個節點(只輸入標題和主體字段就可以了)。現在你可以對你的node.tpl.php文件做一點小的修改(比如在它的最終面加上“你好嗎!”)。現在你節點的顯示,就使用了

41、你修改的模板文件。 對于block.tpl.php,方法是一樣的(你可以在 modules/system/block.tpl.php找到默認的區塊模板文件),對于drupal中的其它模板,也同樣適用。 drupal6 pro drupal development(專業開發指南)thethemesystem主題系統 theme()函數介紹 當drupal想要為一個可主題化的項目(比如節點,區 塊,面包屑,評論,或者用戶簽名)生成一些html輸出時,它將查找用來為該項目生成html的主題函數或者模板文件。drupal的全部部分,基本上都 是可主題化的,這意味著,對于為該項目實際生成的html,你可

42、以進行覆寫。我們一會兒看一些例子。 提示 在drupal中,可主題化的項目的列表,可參看/api/group/themeable/6。 theme()工作原理概覽 當一個簡潔的節點頁面顯示時,比如/?q=node/3,都發生了什么呢,這里給出了大致的總結: 1. drupal的菜單系統收到了懇求,并將掌握權轉交給節點模塊。 2. 在構建了節點數據結構以后,調用theme('node', $node, $teaser, $page)。這將查找合適的主題函數或者模板文件,定義模板文件中所用的各種變量,應用該模板,為節點生成最終的html。(假如有多個節點正在被顯 示,比如一個日志,

43、那么對于每個節點都會調用一遍這個流程。) 3. 假如啟用了評論模塊,節點的評論也將被轉化為html,并追加在節點的html后面。 4. 這樣就返回了一團html(在index.php中,它就是變量$return),使用theme('page', $return),這樣就再次傳遞給了theme()函數。 5. 在處理頁面模板以前,drupal 作了一些預處理,比如,找出有哪些區域可用,以及在每個區域中顯示哪些區塊。通過調用theme('blocks', $region),將每個區塊轉化為html,theme('blocks', $region)是用

44、來定義區塊變量并應用區塊模板的。在這里,你應當可以開頭看到一個模式了。 6. 最終,drupal定義了很多供頁面模板使用的變量,并將其應用到頁面模板中去。 現在,從前面的列表中,你應當能夠熟悉到theme()函數在drupal中的重要地位。它負責運行預處理函數,來設置模板中所用的變量;它將主題函數的 調用,分發給合適的函數或者查找合適的模板文件。而輸出的結果就是html。這一流程的圖示可參看圖8-5。我們將在后面更深化的學習一下,這個函數是如 何工作的。現在,應當不難理解,當drupal想將一個節點轉化為html時,就會調 drupal6 pro drupal development(專業開發

45、指南)thethemesystem主題系統 用theme('node')。依據所啟用的主 題,theme_node()將用來生成html,或者使用一個名為node.tpl.php的模板文件來生成html。 可以在多個層次上,對這個流程進行覆寫。例如,主題可以覆寫內置的主題函數,所以,當調用theme('node')時,那么將會調用 greyscale_node(),而不是默認的theme_node()。模板文件也有命名商定,我們將在后對它進行講解,所以,模板文件node- story.tpl.php將特地負責story類型的節點。 覆寫可主題化的項目 drupa

46、l的主題系統背后的核心哲理和鉤子系統的類似。通過遵循命名規范,就可以標識出哪些函數是主題相關的函數,它們負責格式化并返回你站點的內容,或者使用模板文件負責輸出html內容。 覆寫主題函數 正如你看到的,可主題化的項目是通過它們的函數名來標識的,每個函數名前都帶有前綴“theme_”, 或者還可以通過模板文件來標識。這一命名規范使得drupal能夠為全部的可主題化函數創建一個函數覆寫機制。這樣,設計者就可以指示drupal執行一 個具有更高優先級的自定義函數,從而替代開發者在模塊中給出的默認的主題函數,或者替代drupal的默認模板文件。例如,讓我們檢查一下,在構建站點的 面包屑時該流程是怎么工

47、作的。 打開includes/theme.inc文件,并檢查里面的函數。這里的很多函數都以theme_開頭,這就告知人們它們是可以被覆寫的。特殊的,我們看看 theme_breadcrumb(): /* * return a themed breadcrumb trail. * * param $breadcrumb * an array containing the breadcrumb links. * return a string containing the breadcrumb output. */ function theme_breadcrumb($breadcrumb) if

48、 (!empty($breadcrumb) return 'div class=breadcrumb'. implode(' ', $breadcrumb) .'/div' 這個函數掌握著drupal中面包屑導航條的html輸出。當前,它在面包屑的每一項之間添加了一個向右的雙箭頭分隔符()。假定你想將div標簽改為span標簽,并使用星號(*)來代替雙箭頭()。那么你該怎么辦呢?一種方式是在theme.inc中修改這個函數,保存,并調用。這樣也能達到目的。(別!別!千萬別這樣做!)。我們有更好的方式。 drupal6 pro drupal dev

49、elopment(專業開發指南)thethemesystem主題系統 你有沒有見過drupal核心中是怎么調用這些主題函數的?你永久都不會看到直接調用theme_breadcrumb()的狀況。替代的,它通常包裝在關心函數theme()中。你期望這樣調用這個函數: theme_breadcrumb($breadcrumb) 但實際不是這樣。替代的,你將看到開發者這樣調用: theme('breadcrumb', $breadcrumb); 這個通用的theme()函數負責初始化主題層,并將函數調用分發到合適的位置,這使得我們能夠以更優雅的方式來解決我們的問題。圖8-5展現了通過

50、調用theme(),指示drupal根據下面的次序查來找相應的面包屑函數。 假定你使用的主題為greyscale,,它是基于phptemplate的主題,那么drupal將會查找下面的函數(我們暫且忽視一下breadcrumb.tpl.php): greyscale_breadcrumb() phptemplate_breadcrumb() sites/all/themes/custom/greyscale/breadcrumb.tpl.php theme_breadcrumb() 我們看到函數phptemplate_breadcrumb()可以覆寫內置的面包屑函數,那么我們要把這個函數放到哪

51、里呢? 很簡潔,那就是你主題的template.php文件,在這里你可以覆寫drupal的默認主題函數,攔截和創建傳遞給模板文件的自定義變量. 留意 在做這些練習的時候,不要使用garland作為當前主題,由于garland已經有了一個template.php文件.替代的,在這里可以使用greyscale或者bluemarine. 為了修改drupal的面包屑,創建文件sites/all /themes/custom/greyscale/template.ph,并將theme.inc中的 theme_breadcrumb()函數復制 并粘貼到該文件里面。記住要包含?php標簽。還有對函數要進行

52、重命名,將theme_breadcrumb改為 phptemplate_breadcrumb。接著,導航到“管理 站點構建 模塊”以重新構建主題注冊表,這樣drupal就能夠找到你的新函數了。 ?php /* * return a themed breadcrumb trail. * * param $breadcrumb * an array containing the breadcrumb links. * return a string containing the breadcrumb output. drupal6 pro drupal development(專業開發指南)thethemesystem主題系統 */ function phptemplate_breadcrumb($breadcrumb) if (!empty($breadcrumb) return 'span class=breadcrumb'. implode(' * ', $breadcrumb) .'/span' 當下一次drupal需要生成面包屑時,它就會首先找到你的函數,并使用它來代替默認的theme_bre

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論