简体   繁体   中英

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.

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 :

在此输入图像描述

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. 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:

<?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:

<?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:

<?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:

<?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:

<?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:

<?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:

<?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. Where is my mistake?
  3. When i click Create new SMS Rule i'm redirected to blank page. The newAction function is totaly wrong. I can not insert a new data in the mysql table 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. Change according to your block/model/helper. "AI" = NameSpace and "Hi = ModuleName".Try below code in your 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. 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.

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. You need to edit method

VivasIndustries_SmsNotification_Block_Adminhtml_Sms_Status_Edit_Form::_prepareForm()

Insert the code below right between lines $form->setUseContainer(true); and $this->setForm($form);

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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