91麻豆精品国产91久久久久久,成人免费无遮挡无码黄漫视频,中文字幕一区二区人妻,适合晚上观看的电影,四虎在线观看

我們的使命

助力跨境賣(mài)家高效建立全球銷售網(wǎng)絡(luò)

喜報(bào)2021年我司獲《江蘇省國(guó)家高新技術(shù)企業(yè)》認(rèn)定

分類目錄

文章標(biāo)簽

熱門(mén)推薦

相關(guān)咨訊

opencart最小訂單,magento頁(yè)面布局

2022-10-17 11:06:26 - 米境通跨境電商

    
    剛?cè)腴T(mén)magento的開(kāi)發(fā)者容易吧布局和視圖給混淆.本文將看看Magento的Layout/Block的做法,并告訴您如何將其融入Magento的MVC的世界觀。

    與許多流行的MVC系統(tǒng)相比,Magento的執(zhí)行控制器不通過(guò)數(shù)據(jù)對(duì)象到視圖或在視圖對(duì)象中設(shè)置屬性(只有少數(shù)例外)。相反,視圖組件直接引用系統(tǒng)模型來(lái)獲得它需要顯示的信息。

    這樣的設(shè)計(jì)決策的后果之一是,視圖分成塊和模板。塊是PHP對(duì)象,模板是包含HTML和PHP(在這里PHP作為模板語(yǔ)言)“原始”的PHP文件(帶.phtml擴(kuò)展名)的組合。每一個(gè)塊都和一個(gè)唯一的模板文件綁定。在模板文件phtml中,“$this”就是指該模板文件對(duì)應(yīng)的塊對(duì)象。

    一個(gè)簡(jiǎn)單的例子

    看一個(gè)默認(rèn)的產(chǎn)品模板的文件

    app/design/frontend/base/default/template/catalog/product/list.phtml

    你會(huì)看到下面的PHP模板代碼。

    getLoadedProductCollection()?>

    count()):?>

    __("Therearenoproductsmatchingtheselection.")?>

   


    ...

    getLoadedProductCollectionmethod方法可以在改模板的Block的class中找到。Mage_Catalog_Block_Product_List找到如圖所示

    File:app/code/core/Mage/Catalog/Block/Product/List.php

    ...

    publicfunctiongetLoadedProductCollection()

    {

    return$this->_getProductCollection();

    }

    ...

    塊的_getProductCollection方法實(shí)例化模型,并讀取它們的數(shù)據(jù),其結(jié)果返回給模板。

    嵌套塊

    Magento把視圖分離成塊和模板的真正強(qiáng)大之處在于“getChildHtml”方法。這個(gè)方法可以讓你實(shí)現(xiàn)在塊中嵌套塊的功能。頂層的塊調(diào)用第二層的塊,然后是第三層……這就是Magento如何輸出HTML的。

    塊調(diào)用塊調(diào)用塊是如何為您的網(wǎng)頁(yè)的整個(gè)HTML布局中創(chuàng)建的。看看一列布局模板。

    File:app/design/frontend/base/default/template/page/one-column.phtml

   

   

   

    getChildHtml('head')?>

   

    getBodyClass()?$this->getBodyClass():''?>">

    getChildHtml('content')?>

    getChildHtml('before_body_end')?>

    getAbsoluteFooter()?>

   

    模板本身只有11行代碼。然而,每次調(diào)用$this->getChildHtml(…)將包含和引入另一個(gè)塊。使用getChildHtml將依次引入另外一個(gè)塊的HTML內(nèi)容,直到最底層的塊。

    Magento布局文件

    到這里,塊和模板你大概已經(jīng)熟悉了,但你可能有以下疑問(wèn)

    Magento怎么知道在一個(gè)頁(yè)面上要用那些塊?

    Magento怎么知道哪一個(gè)塊是頂層塊?

    $this->getChildHtml(…)”里面的參數(shù)是什么意思?塊的名字嗎?

    Magento引入了布局對(duì)象(LayoutObject)來(lái)解決上面的那些問(wèn)題。布局對(duì)象(或者說(shuō)布局文件)就是一個(gè)XML文件,定義了一個(gè)頁(yè)面包含了哪些塊,并且定義了哪個(gè)塊是頂層塊。

    上次我們是直接從我們的操作方法中輸出內(nèi)容。這一次,讓我們?yōu)槲覀兊腍elloWorld模塊,一個(gè)簡(jiǎn)單的HTML模板。

    首先,創(chuàng)建一個(gè)文件:

    app/design/frontend/base/default/layout/local.xml

    包含以下內(nèi)容

   

   

   

   


   

    創(chuàng)建模板文件

    app/design/frontend/base/default/template/jbw/helloworld/simple_page.phtml

    加入以下內(nèi)容

   
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

   

   

    HelloWorld

   

    body{

    background-color:#f00;

    }

   

   

   

   

   

    最后,我們要在執(zhí)行控制器里面調(diào)用布局文件,開(kāi)始輸出HTML。我們需要添加兩個(gè)方法到操作方法。

    publicfunctionindexAction(){

    //removeourpreviousecho

    //echo'HelloIndex!';

    $this->loadLayout();

    $this->renderLayout();

    }

    清空Magento緩存并加載你的HelloWorld器頁(yè)面(URL“http://exmaple.com/helloworld/index/index”)。現(xiàn)在,你應(yīng)該可以看到一個(gè)明顯的紅色背景,并且simple_page.phtml的HTML源代碼和你打開(kāi)網(wǎng)站的源碼一樣。

    這是怎么回事呢?

    也許你看到這里一頭霧水,沒(méi)關(guān)系,我們來(lái)慢慢解釋

    首先,你要安裝一個(gè)LayoutViewer模塊。這類似于你建的HelloWorld的文章,可以讓我們看一些Magento的內(nèi)部在Yljtest模塊一個(gè)模塊。

    一旦你安裝了這個(gè)模塊(類似于你如何設(shè)置Yljtest模塊),請(qǐng)?jiān)L問(wèn)以下網(wǎng)址

    http://example.com/helloworld/index/index?showLayout=page

    這是你正在請(qǐng)求頁(yè)面的布局XML文件,它由,標(biāo)簽組成.當(dāng)你調(diào)用方法控制器中的loadLayout時(shí),Magento將

    生成布局的XML文件

    為每一個(gè)標(biāo)簽生成一個(gè)Block類,查找使用標(biāo)簽的type屬性的類作為一個(gè)全局性的配置路徑,并將其保存在布局對(duì)象internal_blocks數(shù)組中,使用標(biāo)簽的name屬性為數(shù)組的key。

    如果標(biāo)簽包含一個(gè)輸出屬性,它的值將被添加到布局對(duì)象的internal_output數(shù)組中。

    然后,當(dāng)你在你的動(dòng)作控制器調(diào)用renderLayout方法是,Magento將在_output數(shù)組中遍歷所有的塊,使用輸出屬性的值作為一個(gè)回調(diào)方法。這始終是toHtml,以及起點(diǎn)輸出將是塊的模板。

    以下各節(jié)將介紹如何塊被實(shí)例化,這個(gè)布局文件是如何產(chǎn)生的,并且完成了輸出過(guò)程。

    Magento塊實(shí)例化

    在布局文件中,標(biāo)簽有一個(gè)“type”屬性,這個(gè)屬性其實(shí)是一個(gè)URI

   
   
    Magento就是通過(guò)這個(gè)URI是用來(lái)查找塊對(duì)應(yīng)的類名。這個(gè)URI分為兩部分,第一部分“page”是用來(lái)在全局配置中查找一個(gè)基本類名,第二部分“html”或者“template_link”將被添加到基本類名后面生成一個(gè)具體的將被實(shí)例化的類名。

    我們以“page/html”為例。首先Magento在全局配置中找到節(jié)點(diǎn)

    global/blocks/page

    找到

   

    Mage_Page_Block

   


    這里我們拿到了一個(gè)基本類名“Mage_Page_Block”,然后添加“html”到基本類名后面,我們就得到最終的塊對(duì)象的類名

    “Mage_Page_Block_Html”。塊的類名在Magento中被稱為(GroupedClassNames),這些類都用相似的方法被實(shí)例化。

    如果我們創(chuàng)建一個(gè)已經(jīng)存在的且具有相同名稱的塊的塊,新的塊實(shí)例將取代原來(lái)的實(shí)例。這時(shí)我們的引用(reference)文件從local.xom中。

   

   

   

   


   

    在這里,塊“root”被我們用替換了,指向了一個(gè)不同的模板文件。

    references的使用

    將掛鉤于一個(gè)指定name的xml塊中。節(jié)點(diǎn)將作為子塊來(lái)被父塊引用。

   

   

   

   

   


   

   

    在不同的布局文件:

   

   

   

   

   

   


   

   

    盡管rootblock是在一個(gè)單獨(dú)的XML配置文件中聲明,新的block作為子塊添加塊。Magento最初創(chuàng)建一個(gè)名為root的page/html塊。我們?nèi)匀豢梢杂胷eference來(lái)分配新塊some.other.block.name來(lái)作為root的子塊。

    布局文件是如何生成的

    現(xiàn)在我們對(duì)布局文件已經(jīng)有所了解了,但是這個(gè)布局文件是那里來(lái)的呢?要回答這個(gè)問(wèn)題,我們得引入Magento中的另外兩個(gè)概念,句柄(Handle)和包布局(PackageLayout)。

    句柄

    Magento會(huì)為每一個(gè)頁(yè)面請(qǐng)求生成幾個(gè)不同的操作。我們的LayoutView模塊可以顯示這些處理器

    http://example.com/helloworld/index/index?showLayout=handles

    您應(yīng)該看到(根據(jù)你的配置),類似于下面的清單

    default

    STORE_bare_us

    THEME_frontend_default_default

    helloworld_index_index

    customer_logged_out

    所有這些是一個(gè)句柄。我們可以在Magento系統(tǒng)的不同的地方配置句柄。這兩個(gè)我們要注意的是default和helloworld_index_index?!癲efault”句柄是Magento的默認(rèn)句柄,參與每一個(gè)請(qǐng)求的處理。該helloworld_index_index手柄是由路由名稱(HelloWorld),動(dòng)作控制器的名稱(index),和動(dòng)作控制器動(dòng)作方法(index)組合成一個(gè)字符串創(chuàng)建。這意味著,在動(dòng)作控制器的每個(gè)方法都有它關(guān)聯(lián)的句柄。

    請(qǐng)記住,“index”是Magento默認(rèn)的動(dòng)作控制器和操作方法,所以下面的請(qǐng)求

    http://example.com/helloworld/?showLayout=handles

    同時(shí)將產(chǎn)生一個(gè)手柄名為helloworld_index_index

    包布局

    包布局和我們以前講過(guò)的全局配置有些相似。它是一個(gè)巨大的XML文檔包含了Magento所有的布局配置。我們可以通過(guò)以LayoutView模塊來(lái)查看包布局,請(qǐng)求一下URL

    http://example.com/helloworld/index/index?showLayout=package

    這可能需要一段時(shí)間來(lái)加載。如果您的瀏覽器呈現(xiàn)XML時(shí)卡死了,嘗試文本格式(txt)

    http://example.com/helloworld/index/index?showLayout=package&showLayoutFormat=text

    你應(yīng)該可以看到一個(gè)非常大的XML文件。這是包布局。這個(gè)XML文件是通過(guò)結(jié)合所有的XML布局文件的內(nèi)容形成當(dāng)前的主題(或包)創(chuàng)建的。如果是默認(rèn)安裝,在以下目錄

    app/design/frontend/base/default/layout/

    幕后有全局配置的區(qū)域包含所有文件名的節(jié)點(diǎn)加載相應(yīng)區(qū)域。一旦在配置中列出的文件被合并,Magento的合并將在最后一個(gè)XML文件中,引用(reference)。在這里,你能夠自定義添加到您的Magento安裝文件。

    結(jié)合句柄和包布局

    所以,如果你看一下包布局,你會(huì)看到一些熟悉的標(biāo)記,如and,但他們都被標(biāo)簽包圍著,例如

   

   

    etc...

    這些就是操作標(biāo)簽。對(duì)于每個(gè)特定的請(qǐng)求來(lái)說(shuō),針對(duì)這個(gè)請(qǐng)求的布局文件是由包布局中所有和這個(gè)請(qǐng)求相關(guān)的操作標(biāo)簽組成的。比如我們上面的例子,和請(qǐng)求相關(guān)的操作標(biāo)簽如下

   

   

   

   

   

    有一個(gè)額外的標(biāo)簽,你需要注意包布局,標(biāo)簽可以讓你有另一個(gè)句柄的標(biāo)簽。例如

   

   

   

   

   


    這段代碼的意思是,如果一個(gè)請(qǐng)求包含了“customer_acount_index“,那么這個(gè)請(qǐng)求的布局文件也應(yīng)該包含“customer_account”句柄標(biāo)簽

    運(yùn)用我們所學(xué)

    好了,理論講完了。讓我們回到我們之前做過(guò)的,了解我們現(xiàn)在要做什么,添加

   

   

   

   


   


    我們來(lái)看local.xml,我們已經(jīng)用不同的塊覆蓋了“root”標(biāo)簽。把這個(gè)放在句柄里,這個(gè)句柄是我們已經(jīng)確保了在系統(tǒng)中每一個(gè)頁(yè)面請(qǐng)求將被覆蓋。這可能不是我們想要的。

    如果你到你的Magento網(wǎng)站任何其他網(wǎng)頁(yè),你會(huì)發(fā)現(xiàn)他們要么空白,或具有相同的紅色背景在你的helloworld頁(yè)面。讓我們改變你的文件local.xml,因此只適用于這個(gè)HelloWorld頁(yè)面。我們將通過(guò)改變默認(rèn)的,而使用完整的動(dòng)作名稱句柄(helloworld_index_index)做到這一點(diǎn)。

   

   

   

   


   


    清空Magento緩存,并重新請(qǐng)求magento的各個(gè)頁(yè)面,你應(yīng)該發(fā)現(xiàn)都恢復(fù)正常了,但是針對(duì)”helloworld”模塊的請(qǐng)求頁(yè)面還是我們自定義的那個(gè)。

    眼下這僅適用于我們的index操作方法。讓我們把它添加到goodbye動(dòng)作方法為好。在動(dòng)作控制器,修改goodbye的動(dòng)作,如

    publicfunctiongoodbyeAction(){

    $this->loadLayout();

    $this->renderLayout();

    }

    如果加載了下面的URL,你會(huì)發(fā)現(xiàn)你得到仍然是默認(rèn)Magento布局。

    http://example.com/helloworld/index/goodbye

    WeneedtoaddaHandleforthefullactionname(helloworld_index_goodbye)toourlocal.xmlfile.Ratherthanspecifyanew,letsusetheupdatetagtoincludethehelloworld_index_indexHandle.我們需要添加一個(gè)句柄全動(dòng)作名稱(helloworld_index_goodbye)到我們的local.xml文件。而不是指定一個(gè)新的,允許使用更新標(biāo)記來(lái)包含helloworld_index_index手柄。

   

   

   

   

   


   

    加載以下頁(yè)面(清除Magento緩存后)現(xiàn)在應(yīng)該產(chǎn)生相同的結(jié)果。

    http://example.com/helloworld/index/index

    http://example.com/helloworld/index/goodbye

    開(kāi)始輸出和getChildHtml

    Inastandardconfiguration,outputstartsontheBlocknamedroot(becauseithasanoutputattribute).We’veoverriddenroot’sTemplatewithourown在標(biāo)準(zhǔn)配置中,輸出開(kāi)始于名為root塊(因?yàn)樗幸粋€(gè)output輸出屬性)。我們用我們自己的覆蓋root模板

    template="jbw/helloworld/simple_page.phtml"

    模板是從當(dāng)前主題的root文件夾引用的。在這種情況下,這是

    app/design/frontend/base/default

    所以我們需要深入到我們的自定義頁(yè)面。大多數(shù)Magento模板存儲(chǔ)在

    app/design/frontend/base/default/templates

    結(jié)合我們的完整路徑

    app/design/frontend/base/default/templates/jbw/helloworld/simple_page.phtml

    添加內(nèi)容塊

    一個(gè)簡(jiǎn)單的紅色的頁(yè)面是很無(wú)聊的。讓我們添加一些內(nèi)容到這個(gè)網(wǎng)頁(yè)。改變你的在local.xml文件,所以它看起來(lái)像下面的

   

   

   

   


   

    We’readdinganewBlocknestedwithinourroot.ThisisaBlockthat’sdistributedwithMagento,andwilldisplayacustomerregistrationform.BynestingthisBlockwithinourrootBlock,we’vemadeitavailabletobepulledintooursimple_page.htmlTemplate.Next,we’llusetheBlock’sgetChildHtmlmethodinoursimple_page.phtmlfile.Editsimple_page.htmlsoitlookslikethis

    我們?cè)黾右粋€(gè)新的模塊嵌套在我們的root。這是一個(gè)Magento分布式,并會(huì)顯示客戶登記表的block。在我們的root塊中嵌套這個(gè)block,我們已經(jīng)將其提放進(jìn)了我們的simple_page.html模板。接下來(lái),我們將在我們的simple_page.phtml文件中使用塊的getChildHtml方法。編輯simple_page.html,所以它看起來(lái)是這樣的

   

    getChildHtml('customer_form_register');?>

   

    ClearyourMagentocacheandreloadthepageandyoushouldseethecustomerregistrationformonyourredbackground.MagentoalsohasaBlocknamedtop.links.Let’stryincludingthat.Changeyoursimple_page.htmlfilesoitreads清空Magento緩存并刷新頁(yè)面,你會(huì)看到你的紅色背景的客戶登記表。Magento的也有一個(gè)叫塊top.links。讓我們嘗試包含他。改變你的simple_page.html文件,以便它讀取

   

   

Links



    getChildHtml('top.links');?>

   

    Whenyoureloadthepage,you’llnoticethatyour

Links

titleisrendering,butnothingisrenderingfortop.links.That’sbecausewedidn’taddittolocal.xml.ThegetChildHtmlmethodcanonlyincludeBlocksthatarespecifiedassub-BlocksintheLayout.ThisallowsMagentotoonlyinstantiatetheBlocksitneeds,andalsoallowsyoutosetdifferenceTemplatesforBlocksbasedoncontext.當(dāng)你刷新頁(yè)面,你會(huì)發(fā)現(xiàn),你的

Links

標(biāo)題顯示出來(lái)了,但top.links什么都沒(méi)有顯示。這是因?yàn)槲覀儧](méi)有將它添加到local.xml中。該getChildHtml方法只能包括被指定為子塊的布局塊。這樣Magento只實(shí)例化它需要的塊,并且還允許您設(shè)置不同的模板基于上下文塊。

    讓我們添加top.links到我們的local.xml

   

   

   

   

   


   

    清除緩存,并重新加載頁(yè)面。您現(xiàn)在應(yīng)該看到top.links模塊。

    Timeforaction

    在我們總結(jié)這一刻之前,我們還有一個(gè)更重要的概念”覆蓋“,那就是標(biāo)簽,andthatisthetag.UsingthetagenablesustocallpublicPHPmethodsoftheblockclasses.Soinsteadofchangingthetemplateoftherootblockbyreplacingtheblockinstancewithourown,wecanuseacalltosetTemplateinstead.使用標(biāo)簽,使我們能夠調(diào)用該塊類的公共PHP方法。而不是通過(guò)替換我們自己的塊實(shí)例來(lái)更改root塊的模板,我們可以用一個(gè)調(diào)用方法setTemplate來(lái)代替。

   

   

   

       

       

   

   


   

   

    ThislayoutXMLwillfirstsetthetemplatepropertyoftherootblock,andthenwilladdthetwoblocksweuseaschildblocks.Onceweclearthecache,theresultshouldlookjustasbefore.Thebenefitofusingtheisthesameblockinstanceisusedthatwascreatedearlier,andallotherparent/childassociationsstillexist.Forthatreasonthisisamoreupgradeproofwayofimplementingourchanges.這種布局的XML將首先設(shè)置root塊的模板屬性,然后將增加我們的兩個(gè)子塊。一旦我們清除緩存,結(jié)果看起來(lái)應(yīng)該像以前一樣。使用的好處是同一個(gè)塊實(shí)例可以用前面創(chuàng)建過(guò)的,和所有其他的父/子關(guān)聯(lián)仍然存在。出于這個(gè)原因,這是我們一個(gè)重要的變化升級(jí)方式。

    Allargumentstotheaction’smethodneedtobewrappedinanindividualchildnodeofthetag.Thenameofthatnodedoesn’tmatter,onlytheorderofthenodes.Wecouldhavewrittentheactionnodefromthepreviousexampleasfollowswiththesameeffect.

    該操作的方法的所有參數(shù)需要被包裹在標(biāo)簽的單個(gè)子節(jié)點(diǎn)。該節(jié)點(diǎn)的名字也沒(méi)關(guān)系,僅僅是節(jié)點(diǎn)的順序。我們可以寫(xiě)上一示例的具有相同的效果節(jié)點(diǎn)如下。

        jbw/helloworld/simple_page.phtml

        這只是為了說(shuō)明這一行動(dòng)的說(shuō)法,節(jié)點(diǎn)名是任意的。

    原文鏈接:http://www.52xiaotu.com/magento-4-layout-block/
    聯(lián)系我們
  • 24H客服
  • 聯(lián)系電話:16651690460(龍經(jīng)理)
  • 微信咨詢:
南京天遙路聯(lián)網(wǎng)絡(luò)科技有限公司,版權(quán)所有 Copyright By ?米境通ERP4.0,2015-2025,蘇ICP備:蘇ICP備15044100號(hào)-4, 蘇公網(wǎng)安備:32011402011043