Пользовательский контроллер модуля magento не может получить функцию toHtml () - PullRequest
2 голосов
/ 02 мая 2011

Мой пользовательский модуль предназначен для оплаты, у меня есть контроллер перенаправления, и вот скрипт

class Asurepay_Custompay_AsurepayController extends Mage_Core_Controller_Front_Action {

    protected $_order;

    public function getOrder() {
        if ($this->_order == null) {

        }
        return $this->_order;
    }

    public function indexAction(){
        echo "index test 1";
    }

    public function redirectAction(){
        $session = Mage::getSingleton('checkout/session');
        $session->setAsurepayCustompayQuoteId($session->getQuoteId());
        $this->getResponse()->setBody($this->getLayout()->createBlock('asurepay/redirect')->toHtml());
        $session->unsQuoteId();
        $session->unsRedirectUrl();
    }

}

Функция redirectAction () не может получить функцию toHtml ()

и вот ошибка:

Fatal error: Call to a member function toHtml() on a non-object in my code

в чем должна быть ошибка этого? У меня есть блок в ModuleName / Block / Redirect.php , и у меня есть toHtml (). или что должно быть причиной ошибки?

ЗАПРОШЕННЫЙ

Вот мой блок перенаправления, расположенный по адресу ModuleName / Block / Redirect.php

class Asurepay_Custompay_Block_Standard_Redirect extends Mage_Core_Block_Abstract {

    protected function _toHtml() {

        $asure = Mage::getModel("custompay/asure");
        $form = new Varien_Data_Form();

        $form = new Varien_Data_Form();
        $form->setAction($standard->getConfig()->getGateurl)
            ->setId('asurepay_custompay_checkout')
            ->setName('asurepay_custompay_checkout')
            ->setMethod('POST')
            ->setUseContainer(true);

        foreach ($standard->getStandardCheckoutFormFields() as $field=>$value) {
            $form->addField($field, 'hidden', array('name'=>$field, 'value'=>$value, 'size'=>200));
        }
        $html = '<html><body>';
        $html.= $this->__('You will be redirected to AsurePay in a few seconds.');
        $html.= $form->toHtml();
        $html.= '<script type="text/javascript">document.getElementById("asurepay_checkout").submit();</script>';
        $html.= '</body></html>';
        return $html;

    }
}

Ответы [ 2 ]

4 голосов
/ 02 мая 2011
$this->loadLayout();

В этот момент блоки еще не загружены.Вы должны вызвать загрузку макета и только после того, как вы сможете получить доступ к блокам, определенным в макете.

2 голосов
/ 02 мая 2011

Вот строка, которая вызывает у вас проблему

$this->getLayout()->createBlock('asurepay/redirect')->toHtml()

Давайте перепишем это, используя несвязанный синтаксис, чтобы прояснить ситуацию немного

$layout = $this->getLayout();
$block  = $layout->createBlock('asurepay/redirect');
$html   = $block->toHtml();

Когда PHP жалуется на

Fatal error: Call to a member function toHtml() on a non-object in my code

Это говорит о том, что переменная $block (результаты вызова createBlock) не является объектом. Это означает, что ваш звонок по createBlock по какой-то причине не удался.

Мое обоснованное предположение, что вы config.xml файл настроены неправильно. На основании вашего имени класса блока (Asurepay_Custompay_Block_Standard_Redirect) и стандартных соглашений в config.xml ваш псевдоним должен быть

$layout->createBlock('custompay/standard_redirect');

Однако, это предполагает config.xml установку что-то вроде

<config>
    <!-- ... -->
    <global>
        <blocks>
            <custompay>
                <class>Asurepay_Custompay_Block</class>
            </custompay>                
        </blocks>
    </global>
    <!-- ... -->
</config>

Если вы опубликуете содержимое ваших config.xml, люди смогут диагностировать вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...