Magento — Adminhtml — Пустая форма редактирования, не отображающая данные в полях ввода редактирования

Я использую Magento 1.9.0.1 и работаю над расширением.

Прямо сейчас я застрял на части создания формы администратора. Позволь мне показать тебе.

Вот таблица сетки на пользовательской странице, которую я создал в администраторе, выбирая данные из пользовательской таблицы MySQL, которая называется VivasIndustries_SmsNotification:

введите описание изображения здесь

Когда я нажимаю на строку с результатом, вот что я получаю:

введите описание изображения здесь

Как вы можете видеть поля ввода Receiver, Phone and Date пустые, но они не должны быть пустыми. Это форма редактирования, и эти поля должны содержать данные, напечатанные в строке таблицы таблицы. Кроме того, когда я нажимаю сохранить, он должен сохранить отредактированные данные, но это не работает.

Итак, позвольте мне показать вам, что я сделал до сих пор:

Я имею в: /app/code/community/VivasIndustries/SmsNotification/etc/config.xml:

<?xml version="1.0"?>
<config>
<modules>
<VivasIndustries_SmsNotification>
<version>0.1.0</version>
</VivasIndustries_SmsNotification>
</modules>
<global>
<models>
<smsnotification>
<class>VivasIndustries_SmsNotification_Model</class>
<resourceModel>vivasindustries_smsnotification_resource</resourceModel>
</smsnotification>
<vivasindustries_smsnotification_resource>
<class>VivasIndustries_SmsNotification_Model_Resource</class>
<entities>
<smsnotification>
<table>VivasIndustries_SmsNotification</table>
</smsnotification>
</entities>
</vivasindustries_smsnotification_resource>
</models>
<resources>
<smsnotification_setup>
<setup>
<module>VivasIndustries_SmsNotification</module>
</setup>
<connection>
<use>core_setup</use>
</connection>
</smsnotification_setup>
<smsnotification_read>
<connection>
<use>core_read</use>
</connection>
</smsnotification_read>
<smsnotification_write>
<connection>
<use>core_write</use>
</connection>
</smsnotification_write>
</resources>
<events>
<sales_order_save_after>
<observers>
<vivasindustries_smsnotification>
<class>smsnotification/observer</class>
<method>orderSaved</method>
</vivasindustries_smsnotification>
</observers>
</sales_order_save_after>
</events>
<helpers>
<smsnotification>
<class>VivasIndustries_SmsNotification_Helper</class>
</smsnotification>
</helpers>
<blocks>
<smsnotification>
<class>VivasIndustries_SmsNotification_Block</class>
</smsnotification>
</blocks>
</global>
<adminhtml>
<acl>
<resources>
<all>
<title>Allow Everything</title>
</all>
<admin>
<children>
<system>
<children>
<config>
<children>
<vivas>
<title>Vivas - All</title>
</vivas>
</children>
</config>
</children>
</system>
</children>
</admin>
</resources>
</acl>
<layout>
<updates>
<smsnotification>
<file>smsnotification.xml</file>
</smsnotification>
</updates>
</layout>
</adminhtml>
<admin>
<routers>
<adminhtml>
<args>
<modules>
<VivasIndustries_SmsNotification before="Mage_Adminhtml">VivasIndustries_SmsNotification_Adminhtml</VivasIndustries_SmsNotification>
</modules>
</args>
</adminhtml>
</routers>
</admin>
</config>

Вот что у меня есть в: /app/code/community/VivasIndustries/SmsNotification/controllers/Adminhtml/SmsorderstatusesController.php:

<?php

class VivasIndustries_SmsNotification_Adminhtml_SmsorderstatusesController extends Mage_Adminhtml_Controller_Action
{
public function indexAction()
{
$this->_title($this->__('SMS Center'))->_title($this->__('SMS Center'));
$this->loadLayout();
$this->_setActiveMenu('vivassms');
$this->_addContent($this->getLayout()->createBlock('smsnotification/adminhtml_sms_status'));
$this->renderLayout();
}

public function gridAction()
{
$this->loadLayout();
$this->getResponse()->setBody(
$this->getLayout()->createBlock('smsnotification/adminhtml_sms_status_grid')->toHtml()
);
}

public function newAction()
{
$this->loadLayout();
$this->_setActiveMenu('vivassms');
$this->renderLayout();
}

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

// Get id if available
$id  = $this->getRequest()->getParam('id');
$model = Mage::getModel('smsnotification/smsnotification');$this->_initAction()
->_addBreadcrumb($id ? $this->__('Edit Baz') : $this->__('New Baz'), $id ? $this->__('Edit Baz') : $this->__('New Baz'))
->_addContent($this->getLayout()->createBlock('smsnotification/adminhtml_sms_status_edit')->setData('action', $this->getUrl('*/*/save')))
->renderLayout();
}

protected function _initAction()
{
$this->loadLayout()
// Make the active menu match the menu config nodes (without 'children' inbetween)
->_setActiveMenu('vivassms')
->_title($this->__('SMS Rule'))->_title($this->__('SMS Center'))
->_addBreadcrumb($this->__('SMS Rule'), $this->__('SMS Rule'));

return $this;
}protected function _isAllowed()
{
return Mage::getSingleton('admin/session')->isAllowed('sales/foo_bar_baz');
}
}

Вот что у меня есть в: /app/code/community/VivasIndustries/SmsNotification/Model/Smsnotification.php:

<?php
class VivasIndustries_SmsNotification_Model_Smsnotification extends Mage_Core_Model_Abstract
{
public function _construct()
{
parent::_construct();
$this->_init('smsnotification/smsnotification');
}

}

Вот что у меня есть в: /app/code/community/VivasIndustries/SmsNotification/Block/Adminhtml/Sms/Status.php:

<?php

class VivasIndustries_SmsNotification_Block_Adminhtml_Sms_Status extends Mage_Adminhtml_Block_Widget_Grid_Container
{
public function __construct()
{
$this->_blockGroup = 'smsnotification';
$this->_controller = 'adminhtml_sms_status';
$this->_headerText = Mage::helper('smsnotification')->__('Send SMS on Order Status Changes');
$this->_addButtonLabel = Mage::helper('smsnotification')->__('Create new SMS Rule');
parent::__construct();
}

protected function _prepareLayout()
{
$this->setChild( 'grid',
$this->getLayout()->createBlock( $this->_blockGroup.'/' . $this->_controller . '_grid',
$this->_controller . '.grid')->setSaveParametersInSession(true) );
return parent::_prepareLayout();
}}

Вот что у меня есть в: /app/code/community/VivasIndustries/SmsNotification/Block/Adminhtml/Sms/Status/Grid.php:

<?php

class VivasIndustries_SmsNotification_Block_Adminhtml_Sms_Status_Grid extends Mage_Adminhtml_Block_Widget_Grid
{
public function __construct()
{
parent::__construct();
$this->setId('smsnotification_grid');
$this->setDefaultSort('id');
$this->setDefaultDir('DESC');
$this->setSaveParametersInSession(true);
$this->setUseAjax(true);
}protected function _prepareCollection()
{
$collection = Mage::getResourceModel('smsnotification/smsnotification_collection');
$this->setCollection($collection);
return parent::_prepareCollection();
}protected function _prepareColumns()
{
$this->addColumn('id', array(
'header'    => Mage::helper('smsnotification')->__('ID'),
'align'     =>'right',
'width'     => '50px',
'index'     => 'id',
));

$this->addColumn('Receiver', array(
'header'    => Mage::helper('smsnotification')->__('Receiver'),
'align'     =>'left',
'index'     => 'Receiver',
));

$this->addColumn('Phone', array(
'header'    => Mage::helper('smsnotification')->__('Phone'),
'align'     =>'left',
'index'     => 'Phone',
));

$this->addColumn('Date', array(
'header'    => Mage::helper('smsnotification')->__('Date'),
'align'     =>'left',
'index'     => 'Date',

));return parent::_prepareColumns();
}

public function getRowUrl($row)
{
return $this->getUrl('*/*/edit', array('id'=>$row->getId()));
}
}

Вот что у меня есть в: /app/code/community/VivasIndustries/SmsNotification/Block/Adminhtml/Sms/Status/Edit.php:

<?php
class VivasIndustries_SmsNotification_Block_Adminhtml_Sms_Status_Edit extends Mage_Adminhtml_Block_Widget_Form_Container
{
protected function _construct()
{
$this->_blockGroup = 'smsnotification';
$this->_controller = 'adminhtml_sms_status';$this->_mode = 'edit';

$newOrEdit = $this->getRequest()->getParam('id')
? $this->__('Edit')
: $this->__('New');
$this->_headerText =  $newOrEdit . ' ' . $this->__('SMS Rule');
}
}

Вот что у меня есть в: /app/code/community/VivasIndustries/SmsNotification/Block/Adminhtml/Sms/Status/Edit/Form.php:

<?php
class VivasIndustries_SmsNotification_Block_Adminhtml_Sms_Status_Edit_Form extends Mage_Adminhtml_Block_Widget_Form
{
protected function _prepareForm()
{
// Instantiate a new form to display our brand for editing.
$form = new Varien_Data_Form(array(
'id' => 'edit_form',
'action' => $this->getUrl(
'smsorderstatuses/edit',
array(
'_current' => true,
'continue' => 0,
)
),
'method' => 'post',
));
$form->setUseContainer(true);
$this->setForm($form);

// Define a new fieldset. We need only one for our simple entity.
$fieldset = $form->addFieldset(
'general',
array(
'legend' => $this->__('Brand Details')
)
);

$brandSingleton = Mage::getSingleton(
'smsnotification/smsnotification'
);

// Add the fields that we want to be editable.
$this->_addFieldsToFieldset($fieldset, array(
'Receiver' => array(
'label' => $this->__('Receiver'),
'input' => 'text',
'required' => true,
),
'Phone' => array(
'label' => $this->__('Phone'),
'input' => 'text',
'required' => true,
),
'Date' => array(
'label' => $this->__('Date'),
'input' => 'text',
'required' => true,
),
));

return $this;
}

protected function _addFieldsToFieldset(
Varien_Data_Form_Element_Fieldset $fieldset, $fields)
{
$requestData = new Varien_Object($this->getRequest()
->getPost('smsnotificationData'));

foreach ($fields as $name => $_data) {
if ($requestValue = $requestData->getData($name)) {
$_data['value'] = $requestValue;
}

// Wrap all fields with brandData group.
$_data['name'] = "brandData[$name]";

// Generally, label and title are always the same.
$_data['title'] = $_data['label'];

// If no new value exists, use the existing brand data.
if (!array_key_exists('value', $_data)) {
$_data['value'] = $this->_getSms()->getData($name);
}

// Finally, call vanilla functionality to add field.
$fieldset->addField($name, $_data['input'], $_data);
}

return $this;
}

protected function _getSms()
{
if (!$this->hasData('brand')) {
// This will have been set in the controller.
$smsnotification = Mage::registry('current_brand');

// Just in case the controller does not register the brand.
if (!$smsnotification instanceof
VivasIndustries_SmsNotification_Model_Smsnotification) {
$smsnotification = Mage::getModel(
'smsnotification/smsnotification'
);
}

$this->setData('smsnotification', $smsnotification);
}

return $this->getData('smsnotification');
}
}

У меня есть две проблемы, для которых мне нужно, чтобы вы мне помогли, пожалуйста:

  1. В полях редактирования не отображаются данные, когда они должны отображаться, а функция сохранения не работает.
  2. Когда я редактирую строку Delete функция не работает. Где моя ошибка?
  3. Когда я нажимаю Create new SMS Rule я перенаправлен на пустую страницу. newAction функция полностью неверна. Не могу вставить новые данные в таблицу mysql VivasIndustries_SmsNotification,

Пожалуйста, дайте мне подробный ответ помощи.

Заранее спасибо!

0

Решение

1] Я дам вам мой код, который включает в себя большинство функций в форме редактирования. Изменить в зависимости от вашего блока / модели / помощника. «AI» = NameSpace и «Hi = ModuleName». Попробуйте приведенный ниже код в своем form.php. Это сгенерирует поля редактирования с данными.

<?php

class AI_Hi_Block_Adminhtml_Hi_Edit_Form extends Mage_Adminhtml_Block_Widget_Form
{

public function __construct()
{
parent::__construct();
$this->setId('hi_form');
$this->setTitle(Mage::helper('hi')->__('User Information'));
}

protected function _prepareForm()
{
$model = Mage::registry('hi');

$form = new Varien_Data_Form(
array('id' => 'edit_form', 'action' => $this->getData('action'), 'method' => 'post','enctype' => 'multipart/form-data')
);

$form->setHtmlIdPrefix('hi');

$fieldset = $form->addFieldset('base_fieldset', array('legend'=>Mage::helper('hi')->__('User Information'), 'class' => 'fieldset-wide'));

if ($model->getId()) {
$fieldset->addField('id', 'hidden', array(
'name' => 'id',
));
}

$fieldset->addField('fname', 'text', array(
'name'      => 'fname',
'label'     => Mage::helper('hi')->__('First Name'),
'title'     => Mage::helper('hi')->__('First Name'),
'required'  => true,
));

$fieldset->addField('lname', 'text', array(
'name'      => 'lname',
'label'     => Mage::helper('hi')->__('Last Name'),
'title'     => Mage::helper('hi')->__('Last Name'),
'required'  => true,
));$fieldset->addField('address', 'textarea', array(
'name'      => 'address',
'label'     => Mage::helper('hi')->__('Address'),
'title'     => Mage::helper('hi')->__('Address'),
'required'  => false
));

$fieldset->addField('country_id', 'select', array(
'label'     => Mage::helper('hi')->__('Country'),
'class'     => 'required-entry',
'required'  => true,
'name'      => 'country_id',
'onclick' => "",
'onchange' => "",
'value'  => '1',
'values' => array('India' => 'India','USA' => 'USA', 'UK' => 'UK'),
'disabled' => false,
'readonly' => false,
'tabindex' => 1
));

$fieldset->addField('gender', 'radios', array(
'label'     => Mage::helper('hi')->__('Gender'),
'name'      => 'gender',
'onclick' => "",
'onchange' => "",
'value'  => '1',
'values' => array(
array('value'=>'Male','label'=>'Male'),
array('value'=>'Female','label'=>'Female'),
array('value'=>'Unspecified','label'=>'Unspecified'),
),
'disabled' => false,
'readonly' => false,
'tabindex' => 1
));

$fieldset->addField('hobby', 'checkboxes', array(
'label'     => Mage::helper('hi')->__('Hobbies'),
'name'      => 'hobby[]',
'values' => array(
array('value'=>'Music','label'=>'Music'),
array('value'=>'Reading','label'=>'Reading'),
array('value'=>'Writing','label'=>'Writing'),
),
'onclick' => "",
'onchange' => "",
'value'  => '1',
'disabled' => false,
'tabindex' => 1
));

$fieldset->addField('status', 'select', array(
'label'     => Mage::helper('hi')->__('Status'),
'title'     => Mage::helper('hi')->__('Status'),
'name'      => 'status',
'required'  => true,
'options'   => array(
'1' => Mage::helper('hi')->__('Enabled'),
'0' => Mage::helper('hi')->__('Disabled'),
),
));

$fieldset->addField('categories', 'select', array(
'label'     => Mage::helper('hi')->__('Categories'),
'title'     => Mage::helper('hi')->__('Categories'),
'name'      => 'categories',
'required'  => true,
'values' => array(
array('value'=> Mage::helper('hi')->getAllCategoriesArray(true)),
),
));

if($model->getData('profimage') == "")
{
$fieldset->addField('profimage', 'file', array(
'name'      => 'profimage',
'label'     => Mage::helper('hi')->__('Image'),
'title'     => Mage::helper('hi')->__('Image'),
'required'  => true
));
}
else
{
$path = Mage::getBaseUrl(Mage_Core_Model_Store::URL_TYPE_MEDIA)."AI_Hi/".$model->getData('profimage');
$note = 'Browse new image to replace old one.Allowed image type [ "jpg","jpeg","gif","png"]<br/> <a href="'.$path.'" rel="lightbox" onclick="func_loadLightBox(this);return false;" title="'.$model->getTitle().'">
<img src="'.$path.'" style="width:100px;height:100px;"/></a>';

$fieldset->addField('profimage', 'file', array(
'name'      => 'profimage',
'label'     => Mage::helper('hi')->__('Image'),
'title'     => Mage::helper('hi')->__('Image'),
'required'  => false,
'note'      => $note
));

}if (!$model->getId())
{
$model->setData('status', '1');
}

$form->setValues($model->getData());
$form->setUseContainer(true);
$this->setForm($form);

return parent::_prepareForm();
}

}

?>

Теперь нам нужно изменить файл edit.php, чтобы сделать рабочую кнопку сохранения. Измените приведенный ниже код в соответствии с вашими потребностями.

public function __construct()
{
parent::__construct();
$this->_objectId = 'id';
$this->_blockGroup = 'hi';
$this->_controller = 'adminhtml_hi';
$this->_updateButton('save', 'label', Mage::helper('hi')->__('Save User'));
$this->_updateButton('delete', 'label', Mage::helper('hi')->__('Delete User'));
$this->_addButton('saveandcontinue', array(
'label'     => Mage::helper('adminhtml')->__('Save and Continue Edit'),
'onclick'   => 'saveAndContinueEdit()',
'class'     => 'save',
), -100);

$this->_formScripts[] = "function saveAndContinueEdit(){
editForm.submit($('edit_form').action+'back/edit/');
}
";
}

public function getHeaderText()
{
if (Mage::registry('hi')->getId())
{
return Mage::helper('hi')->__("Edit User '%s'", $this->htmlEscape(Mage::registry('hi')->getTitle()));
}
else
{
return Mage::helper('hi')->__('New User');
}
}

}

2] Я не могу найти deleteAction () в /Adminhtml/SmsorderstatusesController.php:
Добавьте ниже код.

public function deleteAction()
{

try
{
$hiId = $this->getRequest()->getParam('id');
$hi = Mage::getSingleton('hi/hi')->load($hiId);
Mage::dispatchEvent('hi_controller_nammer_delete', array('hi' => $hi));
$hi->delete();
$this->_getSession()->addSuccess($this->__('User Deleted successfully.'));
}
catch (Exception $e)
{
$this->_getSession()->addError($e->getMessage());
}

$this->_redirect('*/*/index');
}

Дайте мне знать, если у вас есть какие-либо проблемы.

0

Другие решения

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

VivasIndustries_SmsNotification_Block_Adminhtml_Sms_Status_Edit_Form::_prepareForm()

Вставьте код ниже справа между строк $form->setUseContainer(true); а также $this->setForm($form);

$id = Mage::app()->getRequest()->getParam('id');
$model = Mage::getModel('smsnotification/smsnotification')->load($id);
$form->setValues($model->getData());
0