简体   繁体   English

Magento - Adminhtml - 空白编辑表单,不显示编辑输入字段中的数据

[英]Magento - Adminhtml - Blank Edit Form, not showing data in the edit input fields

I'm using Magento 1.9.0.1 and i'm working a custom extension. 我正在使用Magento 1.9.0.1,我正在使用自定义扩展。

Right now i'm stuck on the part of creating a admin form. 现在我被困在创建管理表单的部分。 Let me show you. 让我演示给你看。

Here is the grid table in a custom page which i've created in the admin fetching data from custom MySQL table called VivasIndustries_SmsNotification : 这是自定义页面中的网格表,我在管理中从自定义MySQL表中获取数据,名为VivasIndustries_SmsNotification

在此输入图像描述

When i click on a row with result here is what i get: 当我点击一行结果时,我得到的是:

在此输入图像描述

As you can see the input fields Receiver, Phone and Date are blank, but they must not be blank. 如您所见,输入字段Receiver, Phone and Date为空白,但它们不能为空。 This is an edit form and these fields must hold the data printed in the row in the grid table. 这是一个编辑表单,这些字段必须保存打印在网格表中的行中的数据。 Also when i hit save it should save the edited data, but it is not working. 此外,当我点击保存它应该保存编辑的数据,但它不起作用。

So let me show you what i have done so far: 那么让我告诉你到目前为止我做了什么:

I have in: /app/code/community/VivasIndustries/SmsNotification/etc/config.xml: 我有:/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>  

Here is what i have in: /app/code/community/VivasIndustries/SmsNotification/controllers/Adminhtml/SmsorderstatusesController.php: 以下是我所拥有的:/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');
    }
}

Here is what i have in: /app/code/community/VivasIndustries/SmsNotification/Model/Smsnotification.php: 以下是我的内容:/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');
    }

}

Here is what i have in: /app/code/community/VivasIndustries/SmsNotification/Block/Adminhtml/Sms/Status.php: 以下是我所拥有的:/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();
    }



}

Here is what i have in: /app/code/community/VivasIndustries/SmsNotification/Block/Adminhtml/Sms/Status/Grid.php: 这是我所拥有的:/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()));
    }
}

Here is what i have in: /app/code/community/VivasIndustries/SmsNotification/Block/Adminhtml/Sms/Status/Edit.php: 以下是我的内容:/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');
    }
}

Here is what i have in: /app/code/community/VivasIndustries/SmsNotification/Block/Adminhtml/Sms/Status/Edit/Form.php: 以下是我的内容:/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');
    }
}

I have two problem for which i need you to help me out please: 我有两个问题需要你来帮助我:

  1. Edit fields are not showing the data when they must show it and the save function is not working. 编辑字段在显示数据时不显示数据且保存功能不起作用。
  2. When i edit a row the Delete function is not working. 当我编辑一行时, Delete功能不起作用。 Where is my mistake? 我的错误在哪里?
  3. When i click Create new SMS Rule i'm redirected to blank page. 当我单击Create new SMS Rule我被重定向到空白页面。 The newAction function is totaly wrong. newAction函数完全错误。 I can not insert a new data in the mysql table VivasIndustries_SmsNotification . 我无法在mysql表VivasIndustries_SmsNotification插入新数据。

Please give me a detailed help response. 请给我一个详细的帮助回复。

Thanks in advance! 提前致谢!

1] I wil give you my code that include most of the functionalities in edit form. 1]我将为您提供包含编辑表单中大部分功能的代码。 Change according to your block/model/helper. 根据您的块/模型/帮助器进行更改。 "AI" = NameSpace and "Hi = ModuleName".Try below code in your form.php. “AI”= NameSpace和“Hi = ModuleName”。请在form.php中尝试以下代码。 It will generate edit fields with data. 它将生成包含数据的编辑字段。

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

}

?>

Now, we need to change edit.php file to make working save button. 现在,我们需要更改edit.php文件以使工作保存按钮。 Change below code according to your need. 根据您的需要更改以下代码。

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] I can't find deleteAction() in /Adminhtml/SmsorderstatusesController.php: Add below code. 2]我在/Adminhtml/SmsorderstatusesController.php中找不到deleteAction():添加下面的代码。

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

Let me know if you've any issue. 如果您有任何问题,请告诉我。

1) You have to load the model and insert its data into the form to show prefilled values. 1)您必须加载模型并将其数据插入到表单中以显示预填充值。 You need to edit method 你需要编辑方法

VivasIndustries_SmsNotification_Block_Adminhtml_Sms_Status_Edit_Form::_prepareForm()

Insert the code below right between lines $form->setUseContainer(true); $form->setUseContainer(true);行之间插入右下方的代码$form->setUseContainer(true); and $this->setForm($form); $this->setForm($form);

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM