web-dev-qa-db-fra.com

Comment utiliser le modèle MVC pour charger, modifier, puis enregistrer un enregistrement?

Après avoir googlé, etc. Je suis arrivé au code ci-dessous pour Ajouter une nouvelle catégorie à Joomla afin que tous les événements du plug-in, etc. soient terminés.

$basePath = JPATH_ADMINISTRATOR.'/components/com_categories';
require_once $basePath.'/models/category.php';
$catmodel = new CategoriesModelCategory(array('table_path' => $basePath.'/tables'));

$myArrayOfData = array('id'=>'0','title'='my title'...);
$catmodel->save($myArrayOfData);

Dans l’état actuel, j’utilise le même code pour mettre à jour l’enregistrement, mais au lieu d’une nouvelle copie du tableau de données à ajouter, j’utilise SQL pour obtenir l’enregistrement existant sous forme de tableau, puis le modifie et l’enregistre de la même manière.

Cela "fonctionne", mais ne semble pas être la bonne façon de le faire. Je suis donc curieux de savoir comment charger le modèle à l'aide de l'id de la catégorie, puis utiliser ses méthodes pour changer/enregistrer. J'ai essayé de suivre le code qui s'exécute lorsque le composant Catégorie le fait, mais il y a trop de choses à faire pour que je sache comment procéder.

7
GDP

Disons que vous avez l'ID de catégorie qui est stocké dans $ id. Vous pouvez instancier le modèle de catégorie comme vous l'avez fait auparavant:

$basePath = JPATH_ADMINISTRATOR . '/components/com_categories';
require_once $basePath . '/models/category.php';
$catModel = new CategoriesModelCategory(array('table_path' => $basePath . '/tables'));
$id = 11;

Maintenant vous avez deux méthodes:

Méthode 1 - sans objet JTable

$item = $catModel->getItem($id);
$catModel->save('id' => $id, 'parent_id' => $item->parent_id, 'title' => 'My New Title'); // parent_id should be defined otherwise a warning will be displayed

Méthode 2 - avec un objet JTable

$catTable = $catModel->getTable();
$catTable->load($id);
$catTable->title = 'My New Title';

$catTable->check();
$catTable->store();

Remarque

Seulement avec la première méthode, les événements onContentBeforeSave et onContentAfterSave seront déclenchés.

3
Farahmand