web-dev-qa-db-fra.com

Modifier un enregistrement enregistre un nouvel enregistrement avec des champs mis à jour

J'écris un petit composant Joomla pour mon école mais cela pose un petit problème.

Lorsque je vais éditer un enregistrement puis le sauvegarder, au lieu de mettre à jour cet enregistrement, il l'enregistre en tant que nouvel enregistrement avec un champ mis à jour.

J'ai vérifié le bouton en vue de détecter d'éventuelles erreurs, mais je ne vois aucun problème.

Quelqu'un peut-il me dire s'il vous plaît quelques erreurs communes qui pourraient causer ce problème?

contrôleur

class StudentControllerStudent extends JControllerForm
{
    public function __construct($config = array()) {
        parent::__construct($config);
    }
}

Modèle

class StudentModelStudent extends JModelAdmin
{
    public function getTable($type = 'Student', $prefix = 'StudentTable', $config = array())
    {
        return JTable::getInstance($type, $prefix, $config);
    }

        public function getForm($data = array(), $loadData = true) {
            $form = $this->loadForm('com_student.student', 'student',array('control' => 'jform', 'load_data' => $loadData));

            if (empty($form))
            {
                return false;
            }
            return $form;
        }

        protected function loadFormData() {
            return $this->getItem();
        }

}

view.html.php

class StudentViewStudent extends JViewLegacy {

    protected $state;
    protected $item;
    protected $form;

    /**
     * Display the view
     */
    public function display($tpl = null) {
        $this->state = $this->get('State');
        $this->item = $this->get('Item');
        $this->form = $this->get('Form');

        // Check for errors.
        if (count($errors = $this->get('Errors'))) {
            throw new Exception(implode("\n", $errors));
        }

        $this->addToolbar();
        parent::display($tpl);
    }


    protected function addToolbar() {
            JFactory::getApplication()->input->set('hidemainmenu', true);
            JToolbarHelper::title('edit item');
            JToolbarHelper::save('student.save');
            if (empty($this->item->id))
            {
                JToolbarHelper::cancel('student.cancel');
            }
            else
            {
                JToolbarHelper::cancel('student.cancel', 'JTOOLBAR_CLOSE');
            }
    }

}
3
Sumer Raj Chouhan

Dans le vue de votre composant. composants -> com_mycom -> afficher -> tmpl -> default.php ( ou edit.php, some.php) selon vos besoins.

<form action="<?php echo JRoute::_( 'index.php?option=com_student&view=student&layout=ifnotdefault&id='.$this->item->id ); ?>" method="post" class="form-validate" id="adminForm" enctype="multipart/form-data">

    <?php echo $this->form->renderField('id'); ?> // !important
    <?php echo $this->form->renderField('somefield'); ?>

    <input type="hidden" name="task" value="student.save" /> // !important
        <input type="submit" value="Save" />
        <?php echo JHtml::_( 'form.token' ); ?>

</form>

Vérifier 'action de formulaire', vérifier 'id de champ', vérifier 'tâche'

1
MaXX

Essayez ceci fonction loadFormData () pour votre modèle:

protected function loadFormData()
{
    $data = JFactory::getApplication()->getUserState('com_student.edit.student.data', array());

    if (empty($data))
    {
        $data = $this->getItem();
    }

    return $data;
}
1
stckvrw

S'il vous plaît essayez de suivre:

1) Vous devez créer la classe JTable et y ajouter le code suivant:

function __construct(&$db)
{
     parent::__construct('#__yourtablename', 'id', $db);
     // Assumes "id" should be primary key of your table.
}

2) Vérifiez dans la base de données et assurez-vous que la clé primaire est définie pour "#__yourtablename". En outre, il doit être défini sur AUTO_INCREMENT. Sinon, essayez de suivre les requêtes dans votre base de données MySQL:

ALTER TABLE `#__yourtablename` ADD PRIMARY KEY(`id`);
ALTER TABLE `#__yourtablename` CHANGE `id` `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT;

Encore une fois, supposons que, vous avez la colonne id dans votre table.

Remarque: remplacez "#__" par votre préfixe de table.

1
Sahil Purav