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