Блок формы Magento не отображается

1

Я пытаюсь создать реальную сетку, основанную на модели пурпурного цвета. Все работает хорошо на прочитанной части, но форма для редактирования не отображается, и у меня нет ошибок в журналах. Я заметил, что моя функция _prepareForm никогда не вызывается, но я не знаю, почему.

Мой вызов формы в контроллере:

public function editAction()
{
    $this->_initAction();

    // Get id if available
    $id  = $this->getRequest()->getParam('contact_request_id');
    $model = Mage::getModel('whatever_booking/contactRequest');

    if ($id) {
        // Load record
        $model->load($id);

        // Check if record is loaded
        if (!$model->getId()) {
            Mage::getSingleton('adminhtml/session')->addError($this->__('This Contact Request no longer exists.'));
            $this->_redirect('*/*/');

            return;
        }
    }

    $this->_title($model->getId() ? $model->getName() : $this->__('New Contact Request'));

    $data = Mage::getSingleton('adminhtml/session')->getContactRequestData(true);
    if (!empty($data)) {
        $model->setData($data);
    }

    Mage::register('whatever_booking', $model);

    $this->_addBreadcrumb($id ? $this->__('Edit Contact Request') : $this->__('New Contact Request'), $id ? $this->__('Edit Contact Request') : $this->__('New Contact Request'));
    $block = $this->getLayout()->createBlock('whatever_booking/adminhtml_contactRequest_edit')->setData('action', $this->getUrl('*/*/save'));
    $this->getLayout()->getBlock('content')->append($block);

    $this->renderLayout();
} 

protected function _initAction()
{
    $this->loadLayout()
        ->_setActiveMenu('customer/ContactRequest')
        ->_title($this->__('Whatever Booking'))->_title($this->__('Contact Request'));

    return $this;
}

И моя форма:

class Whatever_Booking_Block_Adminhtml_ContactRequest_Edit_Form extends Mage_Adminhtml_Block_Widget_Form
{
    /**
     * Init class
     */
    public function _construct()
    {
        parent::_construct();
        $this->setId('whatever_booking_contactRequest_form');
        $this->setTitle($this->__('Contact Request Information'));
        //when i var dump here i see that my controller called this function
    }

    protected function _prepareForm()
    {
        var_dump('here');
        die; // this var dump is never reached
    }
}

блок редактирования

class Whatever_Booking_Block_Adminhtml_ContactRequest_Edit extends Mage_Adminhtml_Block_Widget_Form_Container
{
    /**
     * Init class
     */
    public function _construct()
    {
        $this->_blockGroup = 'whatever_booking';
        $this->_controller = 'adminhtml_contactRequest';

        parent::_construct();

        $this->_updateButton('save', 'label', $this->__('Save Request'));
        $this->_updateButton('delete', 'label', $this->__('Delete Request'));
    }

    /**
     * Get Header text
     *
     * @return string
     */
    public function getHeaderText()
    {
        if (Mage::registry('contact_request')->getId()) {
            return $this->__('Edit Request');
        }
        else {
            return $this->__('New Request');
        }
    }

    protected function _prepareLayout()
    {
        // mage log is passing here when i display one
        return parent::_prepareLayout();
    }
  • 1
    Ваш контроллер, кажется, пропустил вызов $ this-> loadlayout (), это в _initaction ()?
  • 0
    Я отредактировал пост с помощью _initAction, и да, он там называется, так что это не проблема :)
Теги:
magento

2 ответа

1

Быстрое исправление: в вашем контроллере загружайте форму напрямую, однако лучше пройти мимо контейнера раньше, вы все равно можете назвать это так:

  $this->loadLayout(array('default', 'adminhtml_contactRequest_edit_form'))
       ->_setActiveMenu('customer/ContactRequest');

затем в вашем файле xml бронирования для макета:

<layout>
    <adminhtml_contactRequest_edit_form>
        <reference name="content">
            <block type="whatever_booking/adminhtml_contactRequest_edit_form" name="aeschbachbooking.form" />
        </reference>
    </adminhtml_contactRequest_edit_form>
</layout>
  • 0
    Кажется, это работает, но, как вы сказали, лучше пройти мимо контейнера. Я буду ждать, чтобы увидеть, если кто-то заставит его работать с контейнером. Спасибо
  • 0
    Также у меня нет кнопок контейнера, если я достигаю непосредственно формы
0

В действии вашего контроллера вы добавляете блок редактирования, а не блок формы:

<?php
// ...
    $block = $this->getLayout()->createBlock('whatever_booking/adminhtml_contactRequest_edit')->setData('action', $this->getUrl('*/*/save'));
// ...

Является ли это Whatever_Booking_Block_Adminhtml_ContactRequest_Edit блоком надлежащего Mage_Adminhtml_Block_Widget_Form_Container? Контейнер формы отвечает за поиск правильной формы для загрузки. Он делает это в своей функции _prepareLayout:

protected function _prepareLayout()
{
    if ($this->_blockGroup && $this->_controller && $this->_mode) {
        $this->setChild('form', $this->getLayout()->createBlock($this->_blockGroup . '/' . $this->_controller . '_' . $this->_mode . '_form'));
    }
    return parent::_prepareLayout();
}

Кроме того, я задаюсь вопросом, выбрасывает ли Camel-обсаженная часть ContactRequest бросок Magento для цикла. Попробуйте сделать эту часть вашего блока Contactrequest и посмотреть, работает ли это (вам придется переименовать свою папку и т.д.).

  • 0
    Привет, мой Whither_Booking_Block_Adminhtml_ContactRequest_Edit расширяет Mage_Adminhtml_Block_Widget_Form_Container. Я попытался переопределить _prepareLayout, чтобы посмотреть, вызывается ли он, и да, мой код проходит через эту функцию (просто вызывая ее родителя) в Whwhat_Booking_Block_Adminhtml_ContactRequest_Edit
  • 0
    что касается случая с верблюдом, я думаю, что он проходит хорошо, потому что я пришел в этой форме из сетки и ее контейнера с сеткой, которые имели одинаковую структуру Whwhat_Booking_Block_ContactRequest и Whwhat_Booking_Block_Adminhtml_ContactRequest_Grid, так что я думаю, что это не проблема, либо Magento не привносит проблему со случаем верблюда в этом площадь, это просто не хорошо использовать подчеркивание :)
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню