2015-11-04 2 views
1

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

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

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()? – Mir

+0

Я отредактировал сообщение с моим _initAction, и да, он называется там, поэтому это не проблема :) –

ответ

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(); 
} 

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

+0

Привет, my Whatever_Booking_Block_Adminhtml_ContactRequest_Edit расширяет Mage_Adminhtml_Block_Widget_Form_Container. Я попытался переопределить _prepareLayout, чтобы проверить, вызван ли он, и да, мой код выполняет эту функцию (просто называя ее родительский элемент) в Whatever_Booking_Block_Adminhtml_ContactRequest_Edit –

+0

для случая с верблюдом. Думаю, это хорошо, потому что я пришел в эту форму из сетку и ее контейнер с сеткой, которые имели одинаковую структуру Whatever_Booking_Block_ContactRequest и Whatever_Booking_Block_Adminhtml_ContactRequest_Grid, поэтому я думаю, что это не проблема, так как Magento не создает проблемы с корпусом верблюда в этой области, просто бесполезно использовать символы подчеркивания :) –

+1

Можете ли вы включить редактируйте блок в своем вопросе? –

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

Также у меня нет кнопок контейнера, если я доберусь непосредственно до формы –