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();
}}
Était-ce utile?

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')
Licencié sous: CC-BY-SA avec attribution
Non affilié à magento.stackexchange
scroll top