Magento 開發筆記3_PHP教程

來源:互聯網
上載者:User
我們在這個部分關注一下View裡Layouts和Blocks。 跟其他主流PHPMVC架構不一樣,magento 的ActionController不會把資料對象傳給view,也不會設定View對象裡的屬性。View是通過系統模組去擷取它所需要的資訊。 這個設計的結果是View被分為Blocks 和Templates。Blocks是PHP對象,Templates是PHP代碼和HTML的混合(也可以認為是PHP作為了模版語言)。每個Block綁定到一個Template檔案。在一個Phtml檔案裡,PHP的關鍵字$this會包含了對Temeplate對應Block的引用。 下面是一個快速的例子。查看模版檔案app/design/frontend/base/default/template/catalog/product/list.phtml 會看到如下的代碼 getLoadedProductCollection() ?> count()): ?> __("There are no products matching the selection.")?> 其中的getLoadedProudctController可以在對應的block檔案找到 app/code/core/Mage/Catalog/Block/Product/List.php public functiongetLoadedProductCollection() { return$this->_getProductCollection(); } 其中的_getProductCollection會執行個體化models,並取到資料給對應template。 內嵌BlockBlocks/Templates真正的強大的地方是getChildHtml方法。這可以讓我們包含次一級的Block/Template在主的Block/Template裡面(xml的格式) Blocks調用Blocks是會組成我們整個HTMLlayout。看一個例子 App/design/frotend/base/default/template/page/1column.phtml getChildHtml('head') ?> getChildHtml('content') ?> getChildHtml('before_body_end') ?> getAbsoluteFooter() ?> 該檔案不長,但是每個調用都是$this->getChildHtml(…),這會包含並渲染其他的block。這些block也可能會調用其他block 。 Layout 儘管Block和Template很好,但是你可能會有下面的疑問 1. 我怎麼告訴Magento哪個Block在頁面中使用? 2. 我們怎麼告訴Magento是初始的 3. 我怎麼告訴每個Block去調用下面的block 這時候就需要Layout對象了。Layout對象是Xml格式,定義一個頁面裡包含哪些Blocks,並且哪些Blocks負責渲染頁面。 之前的Hello World項目我們直接在Action Method上做的。這次我們建立一個簡單的HTMLtemplate來為該模組服務。 首先建立一個檔案 App/design/frontend/base/default/layout/local.xml 然後寫入下面的內容 然後再建立一個檔案 app/design/frontend/base/default/template/simple_page.phtml(注意和配置裡的template一致) 寫入以下內容 Untitled body { background-color:#f00; } 最後在Aciton Controller裡負責啟動layout過程。增加下面兩行代碼 public functionindexAction() { //remove our previous echo //echo'Hello Index!'; $this->loadLayout(); $this->renderLayout(); } 清除緩衝,重新載入Hello World controller頁面,可以看到頁面的背景hi紅色,並且Html源碼和simple_page.phtml也是對應的。 發生了什嗎?剛才的一切看上去很神秘。我們來仔細的看看這個過程。首先,我們想安裝Layoutviewer模組。這個模組和Configviewer很像。 一旦裝好了,就可以用下面的URL http://localhost/magento/helloworld/index/index?showLayout=page 這個是一個layout xml對應於請求的頁面。由 和 標籤組成。當你調用loadLaout方法時, 1. 產生一個Layout xml 2. 執行個體化 和下面的Block類。尋找用標籤name屬性的,在全域設定檔裡找到對應的,並儲存在Layout對象的internal_blocks數組裡。 3. 如果標籤包含了輸出屬性,它的值也加入到Layout對象的internal_blocks數組裡。 這樣一來,當我們在Action Controller裡調用renderLayout時,Mageno 會迭代_blocks數組裡所有的Blocks, 並把它對應的輸出屬性作為回呼函數。這相當於是向Html的轉化,意味著Block的Template就是輸出的起點。 下面的部分涉及到Block如何執行個體化,Layout檔案如何產生,還有output的結束。 Block執行個體化在LayoutXml裡,或者有個類型相當於是URI Mage_Page_Block 這樣我們就得到了MagePageBlock類。然後,URI的第二部分會加在它後面成為MagePageBlock_Html。這個類隨後就會唄執行個體化。 Blocks也是Magento裡的組類,所有的共用類似的執行個體化方法。後面會有該部分的詳細介紹。 和之間的不同我們談到了和都可以執行個體化Block,那他們有什麼不同呢。 先有 然後有 裡面的blocks不會替代blocks。相反,他們是增加,或者修改現有的blocks。上面的範例中,是插入了一個新的叫root的block到現有的rootblock中。這在Magento Layout中是未定義的。最終結果是老的被替換掉了,但是靠此來保證一致性是很糟的主意。 Layout 檔案如何產生到現在我們對Layout XML應該有比較清晰的認識了。但是Layout XML從何而來?要解答這個問題,我們需要引入兩個新的概念,Handles和Package Layout。 Handles Magento中的每個請求會產生幾個不同的Handles。Layoutview 模組就可以給我們用URL展示這些 http://localhost/magento/helloworld/index/index?showLayout=handles 我們會看到類似 1. 預設 2. STORE_bare_us 3. THEME_frontend_default_default 4. Helloworld_index_index 5. Customer_logged_out 這些每個都是一個Handle。Handle在Magento的很多地方會被設定。我們需要關注其中兩個地方:default和helloworld_index_index.。預設的Handle是每個請求都會出現的。而Helloworld_index_indexHandle是通過合并frontName(helloworld),Actioncontroller (index), 和Action Controller Action Method(index)而成。這意味這每個ActionController方法都可能對應一個Handle。 記住“index”是Magento對每個Action Controller和ActionMethods的預設,因此下面的請求 http://localhost/magento/helloworld/?showLayout=handles 同樣會產生Handle的名字交helloworld_index_index Package Layout 你可以認為PackageLayout等同於全域配置。他是一個大的XML檔案,包含了Magento內每個可能的Layout配置。讓我們看一下 http://localhost/magento/helloworld/index/index?showLayout=package 這個可能會載入一會。如果瀏覽器在xml下卡了,請換成text模式 http://localhost/magento/helloworld/index/index?showLayout=package&showLayoutFormat=text 你可以看到很大的XML檔案。這就是Package Layout。它是綜合了所有當前主題下XMLLayout的檔案。預設的安裝是 app/design/frontend/base/default/layout/ 在通用檔案裡面有個部分,節點中包含了所有要載入的名字。一旦設定檔中給出的檔案合并了,Magento會合并到上一個xml檔案,local.xml。這個可增加你想要的功能。 合并Hanldes和Packge Layout 如果你看到Package Layout, 你可以看到一些熟悉的標籤,例如和, 但是他們都類似這樣的標籤覆蓋 etc… 這些都是Handle標籤。一個請求的Layout是由所有匹配請求的Handles的Package Layout產生。因此,在上面的例子中,我們的layout是在下面的部分中產生 還有一個標籤需要我們注意。容許我們包含其他的Handle。例如 這意味這請求到customeraccountindex時,應該包含下面的和. 學以致用 看夠了理論,我們來回顧一下之前的工作。 這個意味著我們重寫了root標籤。而部分保證了每次請求都會發生。這可能並不是我們想要的效果。 如果訪問任意其他頁面,我們同樣是空白頁面,或者是紅色背景(之前helloworl頁面的那樣)。所以我們改進一下local.xml,確保它只用於helloworld頁面。修改如下 清除cache,這個時候你的其他頁面應該恢複了。 然後應用到googbye Aciton Method public function goodbyeAction() { $this->loadLayout(); $this->renderLayout(); } 這個時候載入http://localhost/magento/helloworld/index/goodbye 會發現還是blank頁面。這個時候我們需要在local.xml增加一個actionname, 內容如下 清楚cache,這個時候,下面兩個頁面會有同樣的效果了。 http://localhost/magento/helloworld/index/index http://localhost/magento/helloworld/index/goodbye 開始輸出並getChildHtml在標準的配置中,輸出的開始是root命名的Block(這個是輸出的特性)。我們已經重寫了root的模版 template=”simple_page.phtml” 模版會從當前或者base主題的主目錄裡得到,如 app/design/frontend/base/default/template 通常你可以添加模版到你自己的主題或者預設主題 app/design/frontend/default/default/template app/design/frontend/default/custom/template base目錄是最後才會去尋找的目錄,如果magento在其他主題下找不到,才會回到base目錄。可是,象之前提到的哪有,你不想加入到這樣的目錄,因為magento的更新會覆蓋他們。 增加內容block紅色的悲劇很無聊。所以我們在頁面上增加點內容。改變local.xml裡的,如下 我在root裡增加兩個內嵌的Block。Magento會分配它,並且展示一個客戶端註冊的頁面。在root裡內嵌這個Block,我們要在simple_page.html裡面顯式的調用。所以我們用Block的getChildHtml方法,如下 getChildHtml(‘customr_form_register’); ?> 清除Cache,重新載入頁面。這個時候我們看到了註冊頁面在紅色的背景上。下面還有一個Block叫top.links。添加如下

Links getChildHtml(‘top.links’); ?> 當我們重新載入頁面,就看到Links被渲染了,但是top.links沒有任何渲染。這是因為我們沒有在local.xml裡添加它。在Layout裡,getChildHtml只能包含顯示的作為子block的Blocks。這容許Magento執行個體化它想要的blocks,同時讓我們可以根據顯示內容為Block設定不同的模版 我們可以在local.xml裡為top.links增加Block 此時再清除cache,就可以看到top.links模組的效果了

http://www.bkjia.com/PHPjc/477872.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/477872.htmlTechArticle我們在這個部分關注一下View裡Layouts和Blocks。 跟其他主流PHPMVC架構不一樣,magento 的ActionController不會把資料對象傳給view,也不會設定View對象...

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.