Magento Adminhtml createblock() de la Forme 'Mage_Core_Exception' Ivalid Type de Bloc
-
13-12-2019 - |
Question
Je veux créer mon propre site d'administration.
config.xml :
<config>
<modules>
<Mymodule_Test>
<version>0.1.0</version>
</Mymodule_Test>
</modules>
<global>
<helpers>
<test>
<class>Mymodule_Test_Helper</class>
</test>
</helpers>
</global>
<admin>
<routers>
<mymoduletest>
<use>admin</use>
<args>
<module>Mymodule_Test</module>
<frontName>mymoduletest</frontName>
</args>
</mymoduletest>
</routers>
</admin>
<adminhtml>
<layout>
<updates>
<test>
<file>test.xml</file>
</test>
</updates>
</layout>
</adminhtml>
</config>
adminhtml.xml:
<menu>
<test translate="title" module="test">
<title>Test</title>
<sort_order>300</sort_order>
<children>
<!-- child items go here -->
<show translate="title" module="test">
<title>SubTest</title>
<sort_order>10</sort_order>
<action>mymoduletest/adminhtml_show</action>
</show>
</children>
</test>
</menu>
controllers\Adminhtml\ShowController.php :
<?php Class Mymodule_Test_Adminhtml_ShowController extends Mage_Adminhtml_Controller_Action{
protected function _initAction()
{
$this->loadLayout();
$this->_setActiveMenu('test/show');
return $this;
}
public function indexAction()
{
$this->_initAction()
->_addContent($this->getLayout()->createBlock('Mymodule_Test_Block_Adminhtml_Show'))
->renderLayout();
}}
Block\Adminhtml\Show.php :
<?php class Mymodule_Test_Block_Adminhtml_Show extends Mage_Adminhtml_Block_Widget_Form_Container{
public function __construct()
{
parent::__construct();
$this->removeButton('back');
$this->removeButton('reset');
$this->removeButton('delete');
$this->removeButton('add');
$this->removeButton('save');
$this->removeButton('edit');
$this->setId('testContainer');
$this->_blockGroup = 'test';
$this->_controller = 'adminhtml';
$this->_mode = 'show';
$this->_headerText = 'TEST';
}}
Mon admin de la page montre la headText byt ux-je obtenir cette exception:
exception Mage_Core_Exception' avec le message " invalid type de bloc:Mage_Test_Block_Adminhtml_Show_Form " dans /var/www/html/magento/app/Mage.php:595
Et sur ma page admin ceci:
Erreur fatale:Appel à un membre de la fonction setData() sur boolean dans /var/www/html/magento/app/code/core/Mage/Adminhtml/Block/Widget/Form/Container.php sur la ligne 129
Pourquoi magento crée le bloc: Mage_Test_Block_Adminhtml_Show_Form et pas Mymodule_Test_Block_Adminhtml_Show_form ???
L'Block\Adminhtml\Show\Form.php :
<?php class Mymodule_Test_Block_Adminhtml_Show_Form extends Mage_Adminhtml_Block_Widget_Form {
public function __construct()
{
parent::__construct();
$this->setId('showGeneralForm');
$this->setTemplate('test/show.phtml');
}
protected function _beforeToHtml()
{
return parent::_beforeToHtml();
}}
La solution
ajoutez ce qui suit dans votre config.xml fichier dans <global>
tag
<blocks>
<test>
<class>Mymodule_Test_Block</class>
</test>
</blocks>
Autres conseils
Cela devrait être comme ceci:
dans votre config.xml
<config>
.....
<global>
.......
<blocks>
<test>
<class>Mymodule_Test_Block</class>
</test>
</blocks>
.......
</global>
.....
</config>
et dans votre contrôleur
public function indexAction()
{
$this->_initAction()
->_addContent($this->getLayout()->createBlock('test/adminhtml_show'))
->renderLayout();
}
Sur votre config.xml
fichier votre ne définissent pas la classe
Mais vous devez appeler le bloc de la classe à Mymodule_Test_Block_Adminhtml_Show
au ShowController.php
Comme par comme système magento,vous ne peut pas utiliser directement la classe nom sur createBlok fonction.
Besoin d'appeler le bloc de la classe par type de bloc
Donc, nécessité de définir type de bloc à xml
<global>
<blocks>
<test> <-- module block identifire -->
<class>Mymodule_Test_Block</class>
</test>
</blocks>
<helpers>
...
Que vous voulez l'appeler la classe Mymodule_Test_Block_Adminhtml_Show
alors
ce type de bloc doit être 'test/adminhtml_show'
Comme par comme système magento
test => Mymodule_Test_Block
adminhtml_show =>Adminhtml_Show
$this->getLayout()->createBlock('Mymodule_Test_Block_Adminhtml_Show')
changement de
$this->getLayout()->createBlock('test/adminhtml_show')