Magento โมดูลบล็อกที่กำหนดเองใหม่


12

ฉันใช้ Magento รุ่น1.8.1.0

ฉันกำลังพยายามสร้างโมดูลบล็อกที่กำหนดเองใหม่ซึ่งฉันจะใช้สำหรับสร้างโฮมเพจใหม่

  • Namespace: Crusader
  • โมดูล: CLHomePage
  • ประเภท Block: บ้านครูเสด
  • Class: Qwerty (ตอนนี้กำลังทดสอบอยู่)
  • แพ็คเกจการออกแบบ: สงคราม
  • ธีม: ค่าเริ่มต้น

นี่คือสิ่งที่ฉันมี:

\ แอป \ etc \ โมดูล \ Crusader_All.xml

<?xml version="1.0"?>
<config>
    <modules>
        <Crusader_CLHomePage>
            <active>true</active>
            <codePool>local</codePool>
        </Crusader_CLHomePage>
    </modules>
</config>

\ แอป \ รหัส \ ท้องถิ่น \ สงคราม \ CLHomePage \ etc \ config.xml

<?xml version="1.0"?>
<config> 
    <modules>
        <Crusader_CLHomePage>
            <version>0.0.1</version>
        </Crusader_CLHomePage>
    </modules>
    <global>
        <blocks>
            <crusaderhome>
                <class>Crusader_CLHomePage_Block</class>
            </crusaderhome>
        </blocks>
    </global>
</config>

\ แอป \ รหัส \ ท้องถิ่น \ สงคราม \ CLHomePage \ บล็อก \ Qwerty.php

<?php
class Crusader_CLHomePage_Block_Qwerty extends Mage_Core_Block_Template
{
    // Methods (optional)
}
?>

\ app ที่ออกแบบ \ \ ส่วนหน้า \ สงคราม \ เริ่มต้น \ รูปแบบ \ local.xml

<?xml version="1.0" ?>
<layout>
    <cms_index_index>
        <reference name="content">
            <block type="core/template" name="homepage" template="crusader/home.phtml">
                <block type="crusaderhome/qwerty" name="homeads" as="homeads" template="crusader/homeads.phtml" />
            </block>
        </reference>
    </cms_index_index>
</layout>

\ app ที่ออกแบบ \ \ ส่วนหน้า \ สงคราม \ เริ่มต้น \ แม่แบบ \ สงคราม \ home.phtml

<div id="home">
<p>Home Wrapper</p>
<?php echo $this->getChildHtml('homeads'); ?>
</div>

\ app ที่ออกแบบ \ \ ส่วนหน้า \ สงคราม \ เริ่มต้น \ แม่แบบ \ สงคราม \ homeads.phtml

<p>Adverts</p>

ขณะนี้มีการดังกล่าวข้างต้นในสถานที่ที่หน้าแรกของฉันแสดงให้เห็นเพียงแค่ "บ้าน Wrapper" เพื่อให้เนื้อหาของhome.phtmlจะปรากฏ homeads.phtmlแต่ไม่ใช่เนื้อหาของ

ถ้าฉันเปลี่ยนประเภทบล็อกเป็นhomeadsเป็นcore/templateมันใช้งานได้และฉันเห็นทั้ง "Home Wrapper" และ "Adverts" ดังนั้นฉันรู้ว่าปัญหาคือสิ่งที่จะทำอย่างไรกับการอ้างอิงถึงประเภทบล็อกใหม่ของฉัน (เรียกว่าบ้านครูเสด)

ฉันทำอะไรผิดที่นี่ .. ?

แก้ไข

หลังจากคำแนะนำในคำตอบฉันได้อัปเดตบางไฟล์ดังนี้ แต่ก็ยังไม่ทำงาน:

\ แอป \ etc \ โมดูล \ Crusader_Home.xml

<?xml version="1.0"?>
<config>
    <modules>
        <Crusader_Home>
            <active>true</active>
            <codePool>local</codePool>
        </Crusader_Home>
    </modules>
</config>

\ แอป \ รหัส \ ท้องถิ่น \ สงคราม \ Home \ etc \ config.xml

<?xml version="1.0"?>
<config> 
    <modules>
        <Crusader_Home>
            <version>1.0.0</version>
        </Crusader_Home>
    </modules>
    <global>
        <blocks>
            <crusader_home>
                <class>Crusader_Home_Block</class>
            </crusader_home>
        </blocks>
    </global>
</config>

\ แอป \ รหัส \ ท้องถิ่น \ สงคราม \ Home \ บล็อก \ Qwerty.php

<?php
class Crusader_Home_Block_Qwerty extends Mage_Core_Block_Template
{
    // Methods (optional)
}
?>

\ app \ design \ frontend \ crusader \ default \ layout \ local.xml (ง่ายต่อการใช้เพียงหนึ่งบล็อกแทนบล็อกซ้อนที่ฉันเคยลองก่อนหน้านี้)

<?xml version="1.0" ?>
<layout>
    <cms_index_index>
        <reference name="content">
            <block type="crusader_home/qwerty" name="homepage" template="crusader/home.phtml" />
        </reference>
    </cms_index_index>
</layout>

\ app ที่ออกแบบ \ \ ส่วนหน้า \ สงคราม \ เริ่มต้น \ แม่แบบ \ สงคราม \ home.phtml

<p>Home</p>

ดังนั้นฉันจึงยังอยู่ในตำแหน่งที่ไม่มีอะไรแสดง

หลังจากได้รับแจ้งจาก @FabianBlechschmidt ฉันได้เปิดใช้งานการบันทึกและแสดงใน exception.log:

2014-04-09T14:04:54+00:00 ERR (3): 
exception 'Mage_Core_Exception' with message 'Invalid block type: Crusader_Home_Block_Qwerty' in W:\stores\magento-dev\app\Mage.php:595
Stack trace:
#0 W:\stores\magento-dev\includes\src\__default.php(27744): Mage::throwException('Invalid block t...')
#1 W:\stores\magento-dev\includes\src\__default.php(27686): Mage_Core_Model_Layout->_getBlockInstance('crusader_home/q...', Array)
#2 W:\stores\magento-dev\includes\src\__default.php(27721): Mage_Core_Model_Layout->createBlock('crusader_home/q...', 'homepage')
#3 W:\stores\magento-dev\includes\src\__default.php(27488): Mage_Core_Model_Layout->addBlock('crusader_home/q...', 'homepage')
#4 W:\stores\magento-dev\includes\src\__default.php(27454): Mage_Core_Model_Layout->_generateBlock(Object(Mage_Core_Model_Layout_Element), Object(Mage_Core_Model_Layout_Element))
#5 W:\stores\magento-dev\includes\src\__default.php(27459): Mage_Core_Model_Layout->generateBlocks(Object(Mage_Core_Model_Layout_Element))
#6 W:\stores\magento-dev\includes\src\__default.php(13895): Mage_Core_Model_Layout->generateBlocks()
#7 W:\stores\magento-dev\includes\src\__default.php(11274): Mage_Core_Controller_Varien_Action->generateLayoutBlocks()
#8 W:\stores\magento-dev\includes\src\__default.php(11213): Mage_Cms_Helper_Page->_renderPage(Object(Mage_Cms_IndexController), 'home')
#9 W:\stores\magento-dev\app\code\core\Mage\Cms\controllers\IndexController.php(45): Mage_Cms_Helper_Page->renderPage(Object(Mage_Cms_IndexController), 'home')
#10 W:\stores\magento-dev\includes\src\__default.php(13969): Mage_Cms_IndexController->indexAction()
#11 W:\stores\magento-dev\includes\src\__default.php(18331): Mage_Core_Controller_Varien_Action->dispatch('index')
#12 W:\stores\magento-dev\includes\src\__default.php(17865): Mage_Core_Controller_Varien_Router_Standard->match(Object(Mage_Core_Controller_Request_Http))
#13 W:\stores\magento-dev\includes\src\__default.php(20465): Mage_Core_Controller_Varien_Front->dispatch()
#14 W:\stores\magento-dev\app\Mage.php(684): Mage_Core_Model_App->run(Array)
#15 W:\stores\magento-dev\index.php(176): Mage::run('crusadergifts', 'store')
#16 {main}

ความคิดใด ๆ ที่เกิดขึ้น .. ?

แก้ไขครั้งที่ 2

@ Malachy พบคำตอบ ... มันเป็นคอมไพเลอร์ ฉันปิดการใช้งานคอมไพเลอร์และดูเหมือนว่าจะทำงานตอนนี้


ฉันถือว่าคุณพิมพ์ผิดที่ไหนสักแห่งให้ตรวจสอบตัวพิมพ์ใหญ่ / ตัวพิมพ์เล็กของชื่อไฟล์ ไฟล์ดูดี คุณล้างแคชการกำหนดค่าหรือไม่
Fabian Blechschmidt

@FabianBlechschmidt ฉันได้ตรวจสอบตัวพิมพ์ใหญ่ / ตัวพิมพ์เล็กในรหัสและชื่อไฟล์ - ดูโอเคกับฉัน ทุกอย่างข้างต้นถูกวางจากไฟล์ของฉัน ฉันได้ปิดแคชทั้งหมดในขณะนี้และฉันเพิ่งล้างแคชทั้งหมดและลองอีกครั้ง - ยังไม่ทำงาน
สตีเฟ่นล่าสุด

คุณตรวจสอบ system.log และ exception.log หรือไม่ หากไม่มีอะไรในนั้นฉันจะเริ่มต้นการดีบักใน MAge_Core_Model_Config-> getGroupedClassName () นอกเหนือจากนี้: โปรดดูในบทแนะนำการดีบักที่ดีเยี่ยมและรายงานกลับมา
Fabian Blechschmidt

ฉันไม่ได้ใช้บันทึกก่อนหน้านี้ ฉันเปิดใช้งานพวกเขาแล้วและ exception.log กำลังแสดง:exception 'Mage_Core_Exception' with message 'Invalid block type: Crusader_Home_Block_Qwerty'
สตีเฟ่นล่าสุด

ฉันได้อัปเดตชื่อโมดูลตามคำตอบอื่น ๆ ที่นี่แล้วดังนั้นชื่อประเภทบล็อก (CLHomePage -> Home)
สตีเฟ่นล่าสุด

คำตอบ:


11

ฉันพบว่าสิ่ง XML ทั้งหมดเป็นเรื่องยากดังนั้นฉันจึงเห็นใจกับสาเหตุของคุณที่นี่

ดูเหมือนว่าฉันมีความไม่ตรงกันกับชื่อคลาสและ XML บล็อกของคุณ

กล่าวคือ

class Crusader_CLHomePage_Block_Qwerty extends Mage_Core_Block_Template

และ

    <block type="core/template" name="homepage" template="crusader/home.phtml">
        <block type="crusaderhome/qwerty" name="homeads" as="homeads" template="crusader/homeads.phtml" />
    </block>

เริ่มจากประเภทบล็อกแล้วย้อนกลับ ฉันคิดว่าที่นี่ฉันคาดหวังว่าจะเห็นสิ่งที่ชอบ

<block type="crusader_home/qwerty" ...

และประเภทนั้นจะหมายถึงวีโอไอพีกับชั้นเรียน

Crusader_Home_Block_Qwerty extends Mage_Core_Block_Template

การทำงานต่อไปที่จะย้อนกลับไปที่การเปลี่ยนแปลงนี้แอปพลิเคชันไฟล์ \ code \ local \ Crusader \ CLHomePage \ etc \ config.xml จะต้องได้รับการแก้ไขเป็นบางอย่างเช่น

<global>
    <blocks>
        <crusader_home>
            <class>Crusader_Home_Block</class>
        </crusader_home>
    </blocks>
</global>

โดยให้คะแนนวีโอไอพีกับคลาสทั้งหมดที่เริ่มต้น 'Crusader_Home_Block_ *' และตอนนี้ฉันคิดว่าคุณต้องเปลี่ยนชื่อโมดูลของคุณ Crusader_Home แทน Crusader_CLHomePage และเปลี่ยนชื่อโฟลเดอร์ตามลำดับ ...

และ / แต่ฉันขอแนะนำให้คุณเปลี่ยนชื่อโมดูลของคุณ ใช้ตัวพิมพ์ใหญ่เพียงตัวเดียวในตอนเริ่มต้นของชื่อโมดูลไม่ใช่สามตัวและห้ามใส่ตัวพิมพ์ใหญ่ตรงกลางของชื่อเช่นกัน

คุณอาจต้องการดูเครื่องมือที่มีอยู่สำหรับสร้างโมดูล ฉันพบว่ามีประโยชน์มากสำหรับการหลีกเลี่ยงข้อผิดพลาดในการพิมพ์ ฉันจะใช้อย่างใดอย่างหนึ่งโดยคนที่ฉลาดมากที่ MGT พาณิชย์ (มันมีความเรียบง่ายด้านข้าง) และหนึ่งนี้เป็นทั้งหมดที่ครอบคลุมและชิ้นส่วนที่น่าอัศจรรย์ของการเข้ารหัสโดยซอฟท์แวไหม

*** แก้ไขตามความคิดเห็นด้านล่าง

นอกจากนี้จากบันทึกข้อผิดพลาดฉันคิดว่าปัญหาคือ Magento ไม่สามารถหาไฟล์คลาสของคุณได้ ดังนั้นโปรดตรวจสอบแคชกำลังฟื้นฟูหรือปิดแคช XML โดยเฉพาะอย่างยิ่งและที่คอมไพเลอร์จะปิดหรือเปิดใช้อีกครั้ง


ขอบคุณฉันได้ลองคำแนะนำของคุณแล้ว ฉันได้เปลี่ยนชื่อโมดูลเป็น 'บ้าน' และอัปเดตข้อมูลอ้างอิงและโฟลเดอร์ทั้งหมด ยังไม่ทำงาน ฉันจะแก้ไขคำถามของฉันเพื่อแสดงการเปลี่ยนแปลง
สตีเฟ่นล่าสุด

1
มันดูดีขึ้นอย่างแน่นอน ฉันสงสัยว่ายังมีข้อผิดพลาดในการพิมพ์ส่อเสียดอยู่หรือไม่ จากบันทึกข้อผิดพลาดฉันคิดว่าปัญหาคือ Magento ไม่สามารถหาไฟล์คลาสของคุณได้ ดังนั้นตรวจสอบแคชอีกครั้งหรือรีเฟรชโดยเฉพาะ แคช XML และคอมไพเลอร์ปิดหรือเปิดใช้งานอีกครั้ง มันจะไม่เป็นปัญหาการอนุญาตไฟล์หรือไม่
Malachy

1
คุณพูดถึงคำวิเศษ - ผู้ชม ... ฉันปิดการใช้งานตัวรวบรวมและดูเหมือนว่าจะใช้งานได้ในขณะนี้ ขอบคุณ! หากคุณเพิ่มนี่เป็นคำตอบฉันจะยอมรับให้คุณ! :-)
Stephen เมื่อ

จริงๆแล้วมันไม่ใช่แค่คอมไพเลอร์ XML ดั้งเดิมของคุณ<block type="crusaderhome/qwerty"ไม่ถูกต้อง วิธีแก้ไขคือให้ a) แก้ไข XML และ b) re-compile
Malachy

-1

ตอบคำถามของคุณตั้งแต่แรก

    <block type="core/template" name="homepage" template="crusader/home.phtml">
       <block type="crusaderhome/qwerty" name="homeads" as="homeads" template="crusader/homeads.phtml" />
    </block>

ควรแทนที่ด้วย

<block type="core/template" name="homepage" template="crusader/home.phtml"></block>
<block type="crusaderhome/qwerty" name="homeads" as="homeads" 
template="crusader/homeads.phtml" />

เพราะ homeads ไม่ใช่ลูกของหน้าแรก ฉันคิดว่ามันจะใช้ได้


ขอบคุณ! ฉันเคยลองทำมาก่อนโดยไม่มีโชค สิ่งที่ผู้ปกครอง / เด็กทำงานได้ดีเมื่อประเภทบล็อกเป็นหลัก / แม่แบบ (แทนที่จะเป็นประเภทบล็อกที่กำหนดเองของฉัน) ดังนั้นปัญหาของฉันจึงไม่ใช่ตำแหน่งบล็อก
สตีเฟ่นล่าสุด

-1

ฉันมีปัญหาเดียวกันและแก้ไขได้โดยแทนที่รหัสต่อไปนี้ใน config.xml

<global>
    <blocks>
        <crusaderhome>
            <class>Crusader_CLHomePage_Block</class>
        </crusaderhome>
    </blocks>
</global>

สำหรับสิ่งนี้

<global>
    <blocks>
        <crusader_clhomepage>
            <class>Crusader_CLHomePage_Block</class>
        </crusader_clhomepage>
    </blocks>
</global>

มันควรจะแก้ปัญหา

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