久久内射,爱上碰,国产xj一区免费,快播日韩久久久

我們的使命

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

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

分類目錄

文章標簽

熱門推薦

相關(guān)咨訊

opencart最小訂單,magento頁面布局

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

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

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

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

    一個簡單的例子

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

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

    你會看到下面的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ù)據(jù),其結(jié)果返回給模板。

    嵌套塊

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

    塊調(diào)用塊調(diào)用塊是如何為您的網(wǎng)頁的整個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(…)將包含和引入另一個塊。使用getChildHtml將依次引入另外一個塊的HTML內(nèi)容,直到最底層的塊。

    Magento布局文件

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

    Magento怎么知道在一個頁面上要用那些塊?

    Magento怎么知道哪一個塊是頂層塊?

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

    Magento引入了布局對象(LayoutObject)來解決上面的那些問題。布局對象(或者說布局文件)就是一個XML文件,定義了一個頁面包含了哪些塊,并且定義了哪個塊是頂層塊。

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

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

    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)用布局文件,開始輸出HTML。我們需要添加兩個方法到操作方法。

    publicfunctionindexAction(){

    //removeourpreviousecho

    //echo'HelloIndex!';

    $this->loadLayout();

    $this->renderLayout();

    }

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

    這是怎么回事呢?

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

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

    一旦你安裝了這個模塊(類似于你如何設(shè)置Yljtest模塊),請訪問以下網(wǎng)址

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

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

    生成布局的XML文件

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

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

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

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

    Magento塊實例化

    在布局文件中,標簽有一個“type”屬性,這個屬性其實是一個URI

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

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

    global/blocks/page

    找到

   

    Mage_Page_Block

   


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

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

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

   

   

   

   


   

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

    references的使用

    將掛鉤于一個指定name的xml塊中節(jié)點將作為子塊來被父塊引用。

   

   

   

   

   


   

   

    在不同的布局文件:

   

   

   

   

   

   


   

   

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

    布局文件是如何生成的

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

    句柄

    Magento會為每一個頁面請求生成幾個不同的操作。我們的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

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

    請記住,“index”是Magento默認的動作控制器和操作方法,所以下面的請求

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

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

    包布局

    包布局和我們以前講過的全局配置有些相似。它是一個巨大的XML文檔包含了Magento所有的布局配置。我們可以通過以LayoutView模塊來查看包布局,請求一下URL

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

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

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

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

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

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

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

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

   

   

    etc...

    這些就是操作標簽。對于每個特定的請求來說,針對這個請求的布局文件是由包布局中所有和這個請求相關(guān)的操作標簽組成的。比如我們上面的例子,和請求相關(guān)的操作標簽如下

   

   

   

   

   

    有一個額外的標簽,你需要注意包布局,標簽可以讓你有另一個句柄的標簽。例如

   

   

   

   

   


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

    運用我們所學

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

   

   

   

   


   


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

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

   

   

   

   


   


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

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

    publicfunctiongoodbyeAction(){

    $this->loadLayout();

    $this->renderLayout();

    }

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

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

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

   

   

   

   

   


   

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

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

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

    開始輸出和getChildHtml

    Inastandardconfiguration,outputstartsontheBlocknamedroot(becauseithasanoutputattribute).We’veoverriddenroot’sTemplatewithourown在標準配置中,輸出開始于名為root塊(因為它有一個output輸出屬性)。我們用我們自己的覆蓋root模板

    template="jbw/helloworld/simple_page.phtml"

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

    app/design/frontend/base/default

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

    app/design/frontend/base/default/templates

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

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

    添加內(nèi)容塊

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

   

   

   

   


   

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

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

   

    getChildHtml('customer_form_register');?>

   

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

   

   

Links



    getChildHtml('top.links');?>

   

    Whenyoureloadthepage,you’llnoticethatyour

Links

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

Links

標題顯示出來了,但top.links什么都沒有顯示。這是因為我們沒有將它添加到local.xml中。該getChildHtml方法只能包括被指定為子塊的布局塊。這樣Magento只實例化它需要的塊,并且還允許您設(shè)置不同的模板基于上下文塊。

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

   

   

   

   

   


   

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

    Timeforaction

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

   

   

   

       

       

   

   


   

   

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

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

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

        jbw/helloworld/simple_page.phtml

        這只是為了說明這一行動的說法,節(jié)點名是任意的。

    原文鏈接: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號-4, 蘇公網(wǎng)安備:32011402011043
日韩精品簧片| 久久久久久亚洲精品| 亚洲国产91色在线| 五月婷婷六月丁香成人| 久久久伊人| 美女视频黄的全免费视频网站| 丰满的少妇天堂2| 中文字幕67页| 性欧美精品久久久久久久| 五月丁香六月三级| 国产主播在线观看| 欧美日韩国产精品成人| 亚洲中国女厕嘘嘘40| 国产激情图片小说视频| 亚洲av日韩av天堂无码| 久久久精品蜜桃视频| 操你啦在线影院| 老色鬼永久视频网站| 久久久久x国产精品| 日韩无码不卡:| www.亚洲精品| 怡红院在线观看视频| 成人三级AV一区| 日韩av综合一区| A级片网站| 人妻日韩在线| 欧美A级黄片一区| 黄色自拍偷拍电影| 狠狠夜色午夜久久综合热| 一几毛片| 另类第一区| 色——情——乱——伦| 神马家庭影院| 亚洲第一大网站| 国产第一草草草电影院| 午夜福利九色| 日本一区二区免费看| 7月天堂婷婷| 操你拉欧美| 久久中文字幕人妻丝袜| 人人操人人嗨东京热|