Question

Whenever I fill a form and click "Save", magento doesn't get the form data. It just saves an empty object in the database. I can't figure out why. Here's my form and file structure:

Form

File Structure

Controller:

<?php
class Vkusen_Kartof_Adminhtml_KartofController extends Mage_Adminhtml_Controller_Action
{
....
 public function saveAction()
{
    $data = $this->getRequest()->getPost();
    var_dump($data);
    >>>> Dumps : array(1) { ["form_key"]=> string(16) "N1sBdZb21Nb7dYHT" }

   /* >>>>  Sends me to the save page which is blank, saving an empty row in DB:

    if ( $data = $this->getRequest()->getPost() ) {
        $this->_getSession()->setFormData($data);
        $model = Mage::getModel('vkusen_kartof/kartof');
        $id = $this->getRequest()->getParam('id');

        try {
            if ($id) {
                $model->load($id);
            }
            $model->addData($data);
            $model->save();

            $this->_getSession()->addSuccess(
                $this->__('Kartof was successfully saved')
            );
            $this->_getSession()->setFormData(false);

            if ( $this->getRequest()->getParam('back') ) {
                $params = array('id' => $model->getId());
                $this->_redirect('*/*/index');
            }
        } catch (Exception $e) {
            $this->_getSession()->addError($e->getMessage());
            if ($model && $model->getId()) {
                $this->_redirect('*/*/edit', array(
                    'id' => $model->getId())
                );
            } else {
                $this->_redirect('*/*/new');
            }
        }
        return;
    }
    $this->_getSession()->addError($this->__('No data found to save'));
    $this->_redirect('*/*');

*/ } }

kartof.xml (the layout):

<?xml version="1.0" encoding="UTF-8" ?>
<layout>
<adminhtml_kartof_index>
    <reference name="content">
        <block type="vkusen_kartof/adminhtml_kartof" name="vkusen.kartof.block"  />
    </reference>
</adminhtml_kartof_index>

<adminhtml_kartof_edit>
    <reference name="content">
        <block type="vkusen_kartof/adminhtml_kartof_edit" name="vkusen.kartof.form"  />
    </reference>
    <reference name="left">
        <block type="vkusen_kartof/adminhtml_kartof_edit_tabs" name="kartof_info_tabs" />
    </reference>
</adminhtml_kartof_edit>
</layout>

Edit.php:

class Vkusen_Kartof_Block_Adminhtml_Kartof_Edit extends Mage_Adminhtml_Block_Widget_Form_Container
{
protected function _construct()
{
    parent::_construct();
                                            // vkusen_kartof/adminhtml_kartof_edit_form
    $this->_objectId = 'id';
    $this->_blockGroup = 'vkusen_kartof';
    $this->_controller = 'adminhtml_kartof';
    $this->_mode = 'edit';
}

protected function _prepareLayout()
{
    parent::_prepareLayout();

    $this->_updateButton('save', 'label',
        $this->__('Save Kartof'));

    $this->_updateButton('delete', 'label',
        $this->__('OBLITERATE Kartof'));

    $this->_addButton('save and continue', array(
        'label' => $this->__('Save And Continue Edit'),
        'onclick' => 'saveAndContinueEdit()',
        'class' => 'save',
    ), -100);

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

public function getHeaderText()
{
    $model = Mage::registry('current_kartof');
    if ($model && $model->getId()) {
        return $this->__('Edit Kartof (%s)',
            $this->__($model->getTitle())
        );
    } else {
        return $this->__('New kartof');
    }
}
}

Tabs.php:

class Vkusen_Kartof_Block_Adminhtml_Kartof_Edit_Tabs extends Mage_Adminhtml_Block_Widget_Tabs
{
public function __construct()
{
    parent::__construct();
    $this->setId('kartof_info_tabs');
    $this->setDestElementId('edit_form');
    $this->setTitle($this->__('Kartof Information'));
}

protected function _beforeToHtml()
{
    $this->parent = parent::_prepareLayout();
    $this->addTab('general', array(
        'label'     => $this->__('Change details'),
           'content'   => $this->getLayout()->createBlock('vkusen_kartof/adminhtml_kartof_edit_tab_general')->toHtml(),
        'active'    => true,
    ));

    $this->parent = parent::_prepareLayout();
    $this->addTab('gggg', array(
        'label'     => $this->__('Change something'),
        'active'    => false,
    ));

    return parent::_beforeToHtml();
}
}

Form.php

class Vkusen_Kartof_Block_Adminhtml_Kartof_Edit_Form extends Mage_Adminhtml_Block_Widget_Form
{
protected function _prepareForm()
{
    if (Mage::registry('current_kartof'))
    {
        $data = Mage::registry('current_kartof')->getData();
    } else {
        $data = array();
    }

    $form = new Varien_Data_Form(array(
            'id' => 'edit_form',
            'action' => $this->getUrl('*/*/save', array('id' => $this->getRequest()->getParam('id'))),
            'method' => 'post',
            'enctype' => 'multipart/form-data'
        )
    );

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

    return parent::_prepareForm();
}
}

General.php:

class Vkusen_Kartof_Block_Adminhtml_Kartof_Edit_Tab_General extends Mage_Adminhtml_Block_Widget_Form
{
protected function _prepareForm()
{
   if (Mage::registry('current_kartof'))
    {
        $data = Mage::registry('current_kartof')->getData();
    } else {
        $data = array();
    }

    $form = new Varien_Data_Form();
    $this->setForm($form);
    $fieldset = $form->addFieldset('general_form', array(
        'legend' => $this->__('General Setup')
    ));

    $fieldset->addField('title', 'text', array(
        'label' => $this->__('Title'),
        'class' => 'required entry',
        'required' => true,
        'name' => 'the_title',
    ));

    $fieldset->addField('description', 'text', array(
        'label' => $this->__('Description'),
        'class' => 'required entry',
        'required' => true,
        'name' => 'the_description',
    ));

    // Pass info from the entity:
         $form->setValues($data);

    return parent::_prepareForm();
}
}

And the config.xml(just in case):

<?xml version="1.0" encoding="UTF-8" ?>
<config>
<modules>
    <Vkusen_Kartof>
        <version>0.1.0</version>
    </Vkusen_Kartof>
</modules>

<global>
    <blocks>
        <vkusen_kartof>
            <class>Vkusen_Kartof_Block</class>
        </vkusen_kartof>
    </blocks>
    <models>
        <vkusen_kartof>
            <class>Vkusen_Kartof_Model</class>
            <resourceModel>vkusen_kartof_resource</resourceModel>
        </vkusen_kartof>
        <vkusen_kartof_resource>
            <class>Vkusen_Kartof_Model_Resource</class>
            <entities>
                <kartof>
                    <table>kartof_table</table>
                </kartof>
            </entities>
        </vkusen_kartof_resource>
    </models>

    <helpers>
        <vkusen_kartof>
            <class>Vkusen_Kartof_Helper</class>
        </vkusen_kartof>
    </helpers>

    <resources>
        <vkusen_kartof_setup>
            <setup>
                <module>Vkusen_Kartof</module>
            </setup>
        </vkusen_kartof_setup>
    </resources>
</global>

<frontend>
    <routers>
        <vkusen_kartof>
            <use>standard</use>
            <args>
                <module>Vkusen_Kartof</module>
                <frontName>vkusen</frontName>
            </args>
        </vkusen_kartof>
    </routers>
</frontend>

<admin>
    <routers>
        <adminhtml>
            <args>
                <modules>
                    <vkusen_kartof after="Mage_Adminhtml">Vkusen_Kartof_Adminhtml</vkusen_kartof>
                </modules>
            </args>
        </adminhtml>
    </routers>
</admin>

<adminhtml>
    <layout>
        <updates>
            <vkusen_kartof>
                <file>vkusen/kartof.xml</file>
            </vkusen_kartof>
        </updates>
    </layout>
</adminhtml>
</config>

P.S. Sorry for the long post but I guess it's inevitable.

EDIT: http: //i.imgur.com/6N73OIe.png

there's a "space" after "http:"

Was it helpful?

Solution

I found out what the problem was. In my form the fields' names weren't the same as the table columns. If I have a column "title", then my field should be:

$fieldset->addField('title', 'text', array(
        'label' => $this->__('Title'),
        'class' => 'required entry',
        'required' => true,
        'name' => 'title',     // MUST match the table column!!!
    ));
Licensed under: CC-BY-SA with attribution
Not affiliated with magento.stackexchange
scroll top