版本2.5+的替代布局特性介紹。
Joomla1.5版本使用模板覆蓋系統(tǒng)引入了覆蓋核心布局的概念。Joomla2.5版本引入了一組特性,使站點(diǎn)管理員能夠更多地控制文章、聯(lián)系人、新聞提要和Web鏈接的顯示??晒┻x擇的布局有五種:
- 模塊
- 組件
- 類別
- 菜單項
- JLayouts
替代布局與模板覆蓋功能類似,但允許您有更多的選擇和控制。下面討論每種類型。
模塊可供選擇的布局
為模塊創(chuàng)建另一個布局類似于為模塊創(chuàng)建模板覆蓋。在這兩種情況下,創(chuàng)建一個名為templates/<your template>/html/<module name>例如,一個“mod_login”模板覆蓋或替代的beez5布局模板的文件夾將<templates/beez5/html/mod_login/
模板覆蓋和另一個布局之間有兩個重要的區(qū)別。第一個是文件名。對于模板覆蓋,您將調(diào)用該文件default.php匹配核心文件名。對于另一個布局,使用不同的名稱。唯一的規(guī)則是文件名不應(yīng)該有任何下劃線。這允許您擁有包含多個文件的復(fù)雜布局。要調(diào)用的初始文件是沒有下劃線的,并且從這個初始文件中調(diào)用的任何其他文件都將以這個名稱下劃線。例如,您可以調(diào)用最初的文件mynewlogin.php要求mynewlogin_1.php
第二個重要的區(qū)別是,與模板覆蓋文件不同,當(dāng)模塊使用該模板顯示模塊時,它會自動被調(diào)用,另一個布局文件只有在模塊管理器中作為參數(shù)選擇時才會調(diào)用。在版本2.5和之后的版本中,有一個新的參數(shù)被稱為替代布局,如下所示。

此參數(shù)將列出您在此模塊的模板文件夾中放置的任何文件(沒有下劃線)。您還可以使用模板的系統(tǒng)語言文件來翻譯文件名。例如,如果你添加了這條線。
TPL_BEEZ5_MOD_LOGIN_LAYOUT_NOLOGIN="Alt Login Layout"
到文件en-GB.tpl_beez5.sys.ini,它將轉(zhuǎn)換文件名nologin.php“Alt登錄布局”。
重要的是要理解,如果在模塊管理器屏幕中指定,模塊的另一個布局文件將被用于該模塊,而不考慮使用什么模板來顯示模塊所顯示的頁面。因此,管理員有責(zé)任確保在顯示該模塊的任何模板中,布局文件都能正常工作。
插件備選布局(覆蓋插件)
是的,可以覆蓋插件輸出。它非常有用,特別是對于內(nèi)容插件。然而,只有當(dāng)插件準(zhǔn)備好允許覆蓋時,你才能做到這一點(diǎn)。
Joomla提供了一個覆蓋插件的機(jī)制,但是這個功能不受所有插件的支持。
現(xiàn)在是Joomla 3.X的唯一插件。允許重寫的核心是Pagenavigation內(nèi)容插件,它在內(nèi)容組件的文章視圖中顯示前面/下一篇文章鏈接。可能會有第三方開發(fā)者的其他插件允許它,更多的核心插件將在未來被覆蓋。
您將會知道插件是什么時候被覆蓋的,因?yàn)樗幸粋€/tmpl/文件夾。
(開發(fā)人員注意:插件使用JPluginHelper::getLayoutPath())
插件覆蓋的例子
要在“beez3”模板中覆蓋Pagenavigation內(nèi)容插件的輸出,創(chuàng)建一個名為templates/beez3/html/plg_content_pagenavigation/的文件,復(fù)制原始布局文件(plugins/content/pagenavigation/tmpl/default.php)這個新文件夾。
現(xiàn)在您可以更改這個布局文件來覆蓋插件輸出。
需要注意的是,要構(gòu)建覆蓋布局,您需要在這條路徑中創(chuàng)建它:
templates/TEMPLATE-NAME/html/plg_PLUGIN-GROUP_PLUGIN-NAME/
例子:templates/beez3/html/plg_content_pagenavigation/
插件組是插件所屬的組,它是插件所在的第一個文件夾的名稱。
組件選擇布局
組件備選布局類似于上面討論的模塊布局。同樣,文件被放置在放置模板覆蓋文件的同一文件夾中。例如,為模板“beez5”創(chuàng)建一篇文章的替代布局,你可以在文件夾里放一個文件templates/beez5/html/com_content/article/。與模塊布局一樣,該文件不能被命名為與核心文件相同,也不能包含以名字命名的下劃線。此外,在此文件夾中不應(yīng)該有相同名稱的XML文件。(我們將在菜單項下討論XML文件。)
您可以在組件的選項窗口中設(shè)置組件布局的全局值。例如,在Article Manager選項窗口中,有一個用于替代布局的參數(shù),如下所示:

這將創(chuàng)建一個全局值,單個組件(文章、聯(lián)系人、新聞提要和Web鏈接)可以繼承。
與模塊布局一樣,組件布局在單獨(dú)的組件編輯屏幕中顯示為參數(shù)選項。例如,對于一篇文章,文章選項組中的參數(shù)顯示如下所示。

與其他參數(shù)一樣,使用全局設(shè)置將使用選項參數(shù)的設(shè)置。組件的默認(rèn)設(shè)置將使用組件的默認(rèn)布局。您為不同模板創(chuàng)建的替代布局在每個模板標(biāo)題下顯示。
可以轉(zhuǎn)換文件名,如下:
TPL_BEEZ5_COM_CONTENT_ARTICLE_LAYOUT_MYLAYOUT="Title Only No XML"
將翻譯一個名為“mylayout”的文件。php 僅非XML標(biāo)題。
一個布局可以有多個文件。初始文件必須以沒有下劃線的方式命名,而且任何其他文件都必須有下劃線。
組件替代布局可以與文章、聯(lián)系人或新聞提要一起使用。Web鏈接沒有單一組件的布局,因此沒有可供Web鏈接使用的替代布局。
組件備選布局只在滿足兩個條件時使用:(1)它們在組件參數(shù)中指定;并且(2)此特定組件沒有菜單項。例如,如果您有一個或多個類型“單篇文章”的菜單項設(shè)置為給定的文章,那么該文章的替代布局將不會被使用。相反,將使用菜單項中指定的布局。這與組件參數(shù)工作的一般方式是一致的,其中最具體的(在本例中是單條款菜單項)覆蓋了不太具體的(在本例中是文章參數(shù))。
類別選擇布局
類別備選布局與組件布局相同。指定布局文件的規(guī)則是相同的。唯一的區(qū)別是文件夾是類別文件夾,而不是組件文件夾。例如,beez5的一個聯(lián)系人類別的替代布局將進(jìn)入該文件夾。templates/beez5/html/com_contact/category
您可以在全局中設(shè)置類別布局,在每個組件的選項屏幕中。下面是聯(lián)系人管理器選項屏幕的示例:

當(dāng)您在下面所示的基本選項下添加或編輯類別管理器中的類別時,將出現(xiàn)類別替代布局。

類別備選布局可用于文章、聯(lián)系人、新聞提要和Web鏈接。
只與組件布局,分類布局將顯示如果)指定的類別在全局或類別參數(shù)和專門為這一類沒有菜單項(例如,列表聯(lián)系人分類,新聞類別,列出網(wǎng)頁鏈接在一個類別,類別列表,類別的博客)。
如果為這個特定類別設(shè)置了一個菜單項,則將使用該布局而不是其他類別布局。
深入到博客或列表
對于文章,我們有兩個核心布局:博客和列表。這兩個選項都顯示在“From Component”標(biāo)題下,在文章類別的布局參數(shù)中。因此,與其他布局選項一樣,您現(xiàn)在可以在全局(在文章管理器選項中顯示)或編輯單個文章類別時選擇博客或列表。

這意味著,與其他布局選項一樣,您可以控制文章類別鏈接是否向下延伸到博客或列表布局。需要理解的是,與其他布局參數(shù)一樣,這個選項只會在沒有類別的單類別菜單項時生效。
選擇菜單項
備選菜單項與其他菜單項有一個重要的區(qū)別。要創(chuàng)建一個菜單項備選布局,您必須包含一個與初始布局文件匹配的XML文件。例如,為了在beez5模板中創(chuàng)建一個名為“myarticle”的替代菜單項,您可以在其中創(chuàng)建兩個文件templates/beez5/html/com_content/article文件夾叫myarticle.php和myarticle.xml。如果您想要包含更多的布局文件,您可以在文件名中添加下劃線。
XML文件使用與核心菜單項XML文件相同的格式。這不僅允許您為這個菜單項創(chuàng)建一個定制的布局,而且還允許您創(chuàng)建自定義參數(shù)。例如,您可以隱藏一些參數(shù)或添加新的參數(shù)。
當(dāng)您在菜單管理器中選擇菜單項類型時,將出現(xiàn)替代菜單項,如下所示。

替代菜單項的使用和工作方式與標(biāo)準(zhǔn)菜單項相同。由于它們已經(jīng)基于定制的布局,所以模板覆蓋并不適用于其他菜單項。
如上所述,菜單項布局優(yōu)先于組件或類別替代布局。
在XML文件中使用以下標(biāo)記來完成替代菜單項的轉(zhuǎn)換。格式是"TPL_"<template name>_<component>_<view>_<menu item name>_<tag type>例如,下面的這些行將轉(zhuǎn)換名為“catmenuitem”的替代菜單項的標(biāo)題、選項和描述。
TPL_BEEZ5_COM_CONTENT_CATEGORY_VIEW_CATMENUITEM_TITLE="Beez5 Custom Category Layout" TPL_BEEZ5_COM_CONTENT_CATEGORY_VIEW_CATMENUITEM_OPTION="Beez5 Custom" TPL_BEEZ5_COM_CONTENT_CATEGORY_VIEW_CATMENUITEM_DESC="Description for beez5 custom category layout."
這些字符串必須加到language/en-GB/en-GB.tpl_beez5.sys.ini
catmenuitem.xml的開頭是
<?xml version="1.0" encoding="utf-8"?> <metadata> <layout title="TPL_BEEZ5_COM_CONTENT_CATEGORY_VIEW_CATMENUITEM_TITLE" option="TPL_BEEZ5_COM_CONTENT_CATEGORY_VIEW_CATMENUITEM_OPTION"> <help key = "JHELP_MENUS_MENU_ITEM_ARTICLE_SINGLE_ARTICLE" /> <message> <![CDATA[TPL_BEEZ5_COM_CONTENT_CATEGORY_VIEW_CATMENUITEM_DESC]]> </message> </layout>
控制可選菜單項的模板
正如上面所討論的,XML文件的存在使另一種布局成為菜單項。XML文件的格式與核心菜單項XML文件的格式相同。使用這個XML文件,您可以添加您希望為該菜單項包含的參數(shù)。它們可以與核心菜單項相同,也可以省略核心參數(shù)或添加新參數(shù)。注意,如果添加了新的參數(shù),這些參數(shù)可以在布局文件中使用,但不會在核心模型或視圖文件中使用。
還可以覆蓋核心參數(shù)的參數(shù)設(shè)置。其中一個例子是控制哪些模板可以顯示另一個菜單項布局。在某些情況下,您可能希望允許使用任何模板顯示自定義菜單項。在其他情況下,您可能希望將菜單項的布局限制為一個特定的模板。在這種情況下,您只需將以下參數(shù)添加到菜單項的XML文件中:
<fields> <field name=''"template_style_id"'' type=''"templatestyle"'' label=''"COM_MENUS_ITEM_FIELD_TEMPLATE_LABEL"'' description=''"COM_MENUS_ITEM_FIELD_TEMPLATE_DESC"'' filter=''"int"'' template=''"beez5"'' class=''"inputbox"''> </field> </fields>
這將覆蓋核心template_style_id參數(shù)。在本例中,設(shè)置與“beez5”相同的模板將限制用戶只選擇“beez5”模板的模板樣式。
JLayout布局覆蓋
Jlayout是Joomla的一個強(qiáng)大功能!Jlayout可以粗略地定義為微布局。它們是Joomla個人元素的微型布局頁面。例如,read more按鈕,intro圖像,完整的圖像,都是通過自己的JLayout控制的元素的例子。
如果我們深入到類別博客布局視圖中,您將會找到調(diào)用文章標(biāo)題、內(nèi)部圖像、介紹文本以及頁面其他相關(guān)部分的代碼。這就是使用JLayout調(diào)用元素時的樣子。
<?php echo JLayoutHelper::render('joomla.content.blog_style_default_item_title', $this->item); ?>
這個特殊的代碼調(diào)用了Joomla中的文章標(biāo)題!類別的博客。
為了幫助您理解這個特定元素的文件位置,它將有助于理解在游戲中有一個命名約定。看著joomla.content.blog_style_default_item_title他可以用/'s來替換,以理解目錄結(jié)構(gòu)。所有的jlayout最初都是在JOOMLAROOT/layout中找到的。使用命名約定,我們可以看到該文件將位于JOOMLAROOT/layouts/joomla/content/blog_style_default_item_title.php
讓我們來看一個例子。對于這個示例,我們將把intro圖像移到標(biāo)題上方,如果需要,還可以在其周圍添加一些額外的結(jié)構(gòu)。
您不應(yīng)該直接編輯JLayout文件,因?yàn)樵谌魏魏诵纳壠陂g,修改都將被覆蓋。更新JLayout的正確方法是找到要覆蓋的元素(比如intro_image),并將文件復(fù)制到模板中。然后,您應(yīng)該復(fù)制您想要覆蓋的元素的文件夾結(jié)構(gòu),它存在于Joomla的布局文件夾中父目錄templates/YOUR_TEMPLATE/html/。您只需要復(fù)制您需要避免站點(diǎn)的文件,并將引發(fā)問題的可能性降到最低。
一個關(guān)于intro_image的示例將在以下內(nèi)容中找到:JOOMLAROOT/layouts/joomla/content/intro_image.php
復(fù)制的文件將是:templates/YOUR_TEMPLATE/html/layouts/joomla/content/intro_image.php
作為一個簡單的例子,讓我們?yōu)閕ntro映像添加一個響應(yīng)性的圖像類。首先,打開我們剛剛放入的復(fù)制的JLayout文件templates/YOUR_TEMPLATE/html/layouts/joomla/content/intro_image.php。
查看以下路線
<div class="pull-<?php echo htmlspecialchars($imgfloat); ?> item-image">
讓我們添加響應(yīng)圖像類img-responsive現(xiàn)有的類。
<div class="pull-<?php echo htmlspecialchars($imgfloat); ?> item-image img-responsive">
好的,我們已經(jīng)添加了我們的類。讓我們保存并關(guān)閉文件。確保它被上傳到我們的網(wǎng)站。現(xiàn)在,如果我們刷新頁面,我們將看到在我們的intro圖像上的類img響應(yīng)。您剛剛使用了JLayout,考慮了您可以使用JLayouts做的所有其他偉大的事情嗎?
創(chuàng)建只出現(xiàn)在某些頁面上的新JLayout
您還可以創(chuàng)建新的JLayout文件。它們不需要基于現(xiàn)有的元素。只需將它們添加到YOUR_TEMPLATE/html/layouts/上面的目錄和Joomla將能夠找到他們。然后需要在代碼中引用新的JLayout。為了簡單起見,在本例中,我復(fù)制了一個現(xiàn)有的元素,并創(chuàng)建了自己的版本。
首先,我將為博客布局(而不是JLayout覆蓋)執(zhí)行一個標(biāo)準(zhǔn)的HTML模板覆蓋。您可以在這個頁面上找到如何做這個的方法。做一個模板覆蓋會增加一些文件到我的templates/YOUR_TEMPLATE/html文件夾中。我將創(chuàng)建一個新的JLayout,我只想在我的博客視圖中使用它。如果我只是為intro_image編輯JLayout,它會影響所有的intro_images,但我只想修改我的Category Blog視圖intro_images。
我要使用的文件是templates/YOUR_TEMPLATE/html/com_content/category/blog_item.php。在這個文件中,我找到了這條線索<?php echo JLayoutHelper::render('joomla.content.intro_image', $this->item); ?>調(diào)用JLayout元素。該特定代碼用于intro_image元素。
為了簡單起見,我復(fù)制了這個文件JOOMLAROOT/layouts/joomla/content/intro_image.php我把它放在templates/YOUR_TEMPLATE/html/layouts/joomla/content/我重命名intro_image_blog.php
現(xiàn)在打開模板覆蓋文件templates/YOUR_TEMPLATE/html/com_content/category/blog_item.php.我找到了<?php echo JLayoutHelper::render('joomla.content.intro_image', $this->item); ?>.我移除它,重新定位標(biāo)題上方的JLayout,然后使用我剛剛創(chuàng)建的JLayouttemplates/YOUR_TEMPLATE/html/layouts/joomla/content/intro_image_blog.php
現(xiàn)在我的新JLayout正在被使用,它已經(jīng)被定位在標(biāo)題之上。我現(xiàn)在可以做進(jìn)一步的修改,比如添加一個響應(yīng)性的圖像類,如果需要的話,變化只會在Category Blog視圖中反映出來。





