ทำความเข้าใจ Magento Block และ Block Type


105

ฉันแค่อยากเข้าใจความหมายของ

 <block type="page/html" name="root" output="toHtml" template="example/view.phtml">

ฉันได้รับข้อมูลอ้างอิงมากมายจาก Google และเข้าใจหลาย ๆ อย่างเกี่ยวกับเรื่องนี้ แต่ฉันยังไม่เข้าใจรูปแบบของtype="page/html"วิธีการสร้างประเภทสำหรับโมดูลที่กำหนดเองของฉัน

กรุณาอธิบาย

type="A/B"

แจ้งให้เราทราบว่า A และ B มาจากไหน?

คำตอบ:


126

Aเป็นโมดูลนามแฝง ในกรณีpageนี้ย่อมาจากMage_Page_Block(ถูกกำหนดไว้ในapp/code/core/Mage/Page/etc/config.xmlกรณีที่คุณต้องการดู)

Bเป็นชื่อชั้นเมื่อเทียบกับนามแฝงตัวอักษรแรกของแต่ละคำเป็นตัวพิมพ์ใหญ่ ในกรณีนี้htmlจะกลายเป็นHtmlและต่อท้ายนามแฝงที่แก้ไขแล้วดังนั้นจึงเป็นMage_Page_Block_Htmlเช่นนั้น สิ่งนี้อาจพบในไฟล์app/code/core/Mage/Page/Block/Html.phpเนื่องจากชื่อคลาสแปลโดยตรงไปยังตำแหน่งใน Magento

คุณใช้นามแฝงแบบจำลองแทนชื่อแทนบล็อกหรือpageไม่Mage_Page_Model? สิ่งเดียวกันนี้ก็เกิดขึ้นกับแบบจำลองทรัพยากรและผู้ช่วยเหลือเช่นกัน โมดูลของคุณเองจะต้องกำหนดเหล่านี้ในมันตั้งค่าถ้ามันคือการมีบล็อกรุ่นและผู้ช่วย


@ clockworkgeek ขอบคุณมาก. คำตอบของคุณมีประโยชน์มากสำหรับฉัน
Anup_Tripathi

คุณช่วยฉันได้ตัน ขอบคุณ.
สุมิตรมาลิก

คำอธิบายที่ดี
Jalpesh Patel

จะเป็นอย่างไรหากเป็นบล็อกที่เขียนซ้ำ / แทนที่ฉันจะกำหนดและใช้ประเภทบล็อกได้อย่างไร
Vicky Dev

@VickyDev คุณไม่จำเป็นต้องทำอะไรที่แตกต่างเนื่องจากบล็อกใหม่จะเป็นลูกหลานของบล็อกเก่าและเข้ากันได้ คุณทำได้และควรแสร้งทำเป็นว่าไม่มีอยู่จริง
clockworkgeek

158

เพื่อความเข้าใจเพิ่มเติมเกี่ยวกับประเภทบล็อก magento ต่อไปนี้เป็นประเภทบล็อกในตัวซึ่งใช้กันอย่างแพร่หลายในการจัดวาง

  1. core/template: บล็อกนี้แสดงเทมเพลตที่กำหนดโดย  template แอตทริบิวต์ core/templateส่วนใหญ่ของบล็อกที่กำหนดไว้ในรูปแบบเป็นประเภทหรือชนิดย่อยของ 
  2. page/html: นี่คือประเภทย่อยของ  core/template และกำหนดบล็อกรูท บล็อกอื่น ๆ ทั้งหมดเป็นบล็อกย่อยของบล็อกนี้
  3. page/html_head: กำหนดส่วนหัว HTML ของหน้าซึ่งมีองค์ประกอบรวมถึง JavaScript, CSS และอื่น ๆ
  4. page/html_header: กำหนดส่วนหัวของหน้าที่มีโลโก้เว็บไซต์ลิงก์บนสุด ฯลฯ
  5. page/template_links: บล็อกนี้ใช้เพื่อสร้างรายการลิงก์ ลิงก์ที่มองเห็นได้ในส่วนท้ายและส่วนหัวใช้ประเภทบล็อกนี้
  6. core/text_list: บล็อกบางคนชอบ  contentleftright ฯลฯ core/text_listเป็นประเภท เมื่อแสดงบล็อกเหล่านี้บล็อกลูกทั้งหมดจะแสดงผลโดยอัตโนมัติโดยไม่จำเป็นต้องเรียกใช้getChildHtml() เมธอด
  7. page/html_wrappersetHtmlTagNameบล็อกนี้จะใช้ในการสร้างบล็อกเสื้อคลุมซึ่งทำให้บล็อกของเด็กภายในชุดแท็กโดยการดำเนินการ แท็กเริ่มต้นคือ  <div> หากไม่มีการตั้งค่าองค์ประกอบ
  8. page/html_breadcrumbs: บล็อกนี้กำหนดเบรดครัมบ์บนหน้า
  9. page/html_footer: กำหนดพื้นที่ส่วนท้ายของหน้าที่มีลิงก์ส่วนท้ายข้อความลิขสิทธิ์เป็นต้น
  10. core/messages: บล็อกนี้แสดงข้อความแสดงข้อผิดพลาด / ความสำเร็จ / ประกาศ
  11. page/switch: บล็อกนี้สามารถใช้สำหรับภาษาหรือตัวสลับร้านค้า

นี่คือรายการประเภทบล็อกที่ใช้กันทั่วไปเท่านั้น มีบล็อกประเภทอื่น ๆ อีกมากมายที่ใช้ในการใช้งานธีมขั้นสูง


แล้ว: {{block type = "cms / block" block_id = "terms"}}
daslicht

5
@daslicht ได้กล่าวไว้แล้วในคำตอบว่า: นี่คือรายการประเภทบล็อกที่ใช้กันทั่วไปเท่านั้น มีบล็อกประเภทอื่น ๆ อีกมากมายที่ใช้ในการใช้งานธีมขั้นสูง
Kamesh Jungi

ขอบคุณ. เป็นประโยชน์จริงๆ
arqam

8
<block type="page/html" name="root" output="toHtml" template="example/view.phtml">

เพจคือ FrontendName ที่กำหนดในetc/config.xmlไฟล์ html คือชื่อคลาสบล็อก

รายละเอียดเพิ่มเติม:

ในบรรทัดนี้type(type="page/html")กำหนดชื่อคลาสบล็อกที่เกี่ยวข้องกับชื่อของคุณtemplate(template="example/view.phtml">)และเป็นชื่อเฉพาะสำหรับแต่ละบล็อก

ก่อนอื่นให้ดูโครงสร้างโฟลเดอร์

app> local> namespace> modulename> etc> config.xml

เราตั้ง FrontendName = 'mymodule'

app> local> namespace> modulename> Block > hello.php

ใน hello.php คุณสร้างฟังก์ชัน

   class namespace_modulename_Block_Data extends Mage_Core_Block_Template
   {
    public function mydata()
        {
            $data = "Block is called";
            return $data;
         }     
}   

และตอนนี้มาที่หน้า xml เลย์เอาต์ของคุณ:

<block type="mymodule/data" name="xyz" template="example/view.phtml"> ที่นี่ mydata คือชื่อส่วนหน้า

แล้วมาที่เทมเพลตของคุณ

หน้า template / example / view.phtml

ที่นี่คุณสามารถเรียกใช้ฟังก์ชัน mydata () ได้โดยตรง

ชอบ

<div>
<?php echo $this->mydata(); ?>
</div>

ตอนนี้คุณสามารถรับผลลัพธ์ของคุณในเบราว์เซอร์ "Block is called"


คุณตั้งชื่อบล็อก hello.php แต่ชื่อของคลาสบล็อกคือ 'namespace_modulename_Block_Data' ไม่ควรเป็น Hello ต่อท้ายชื่อหรือไม่?
Rai Ehtisham

5

ฉันไม่รู้เกี่ยวกับประเภท "B" แต่ "A" อ้างถึงแท็กชื่อโมดูลของคุณในตัวอย่าง config.xml ใน config.xml:

<A><!-- script --></A>

ไม่คุณไม่ผิด แต่"<!-- script -->"อาจจะสับสน ขอชี้แจง: ตามคำตอบข้างต้นนี่คือนามแฝงซึ่งประกอบด้วยสองส่วนส่วนแรก ("A") คือนามแฝงที่คุณกำหนดให้กับคลาสของโมดูลของคุณในโมดูลของconfig.xmlคุณส่วนที่สองคือพา ธ ที่สัมพันธ์กับ ค่าของโหนด สิ่งเหล่านี้รวมกัน ("A" + ตัวพิมพ์ใหญ่ "B") จะถูกแปลเป็นชื่อคลาสโดยใช้ส่วนแรก (ค่าของโหนด "A") ตรงตามที่คุณกำหนดไว้ (ดูตัวพิมพ์ใหญ่ / ตัวพิมพ์เล็กหากคุณไม่ต้องการชั่วโมง ของความทุกข์ทรมาน) และส่วนที่สองเป็นตัวพิมพ์ใหญ่หลังขีดล่าง ดังนั้นเริ่มต้นด้วยตัวอย่าง A / B ด้วยบล็อกและกำหนดค่านี้:

<config>
  ...
  <global>
    <blocks>
      <A>Vendor_Module_Block</A>
    </blocks>
  </global>
  ...
</config>

ในการรันไทม์A/Bจะได้รับการแก้ไขโดยการตั้งค่าคุณภาพเยี่ยมVendor_Module_Block_Bซึ่งก็จะรวมโดย AUTOLOAD public/app/local/Vendor/Module/Block/B.phpจากเส้นทางต่อไปนี้: เพื่อให้ได้ผมแนะนำให้เข้าใจดีกว่าที่คุณจะดูที่การMage_Core_Model_Config::getGroupedClassName(), และMage_Core_Model_Config::getModelInstance()Varien_Autoload::autoload()


3

ฉันไม่รู้เกี่ยวกับประเภท "B" แต่ "A" อ้างถึงแท็กชื่อโมดูลของคุณใน config.xml

ตัวอย่างในไฟล์ config.xml:

<A><!-- script --></A>

nb: หวังว่าคงไม่ผิด ..

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.