web-dev-qa-db-fra.com

Écriture d'une méthode personnalisée pour enregistrer les données de formulaire

J'essaie de trouver le moyen préféré pour enregistrer les données de formulaire à l'aide des méthodes de l'API joomla. J'essaie de sauvegarder des données avec un appel ajax. J'ai d'abord essayé d'appeler simplement la méthode de sauvegarde standard des composants, en appelant:

index.php?option=com_whatever&view=wdata&task=save // ...etc

Cela fonctionne, en quelque sorte, mais je ne peux pas trouver un moyen de vérifier que l'appel a réellement fonctionné.

Maintenant, j'essaie d'utiliser les fonctions de modèle du nouveau et très agréable plug-in ajax de joomla 3.3, mais je ne sais pas quelle est la bonne approche. Je peux faire quelque chose comme ça:

function onAjaxSaveWData(){
    if(!JSession::checkToken()) return 0; // checking the token
    $in=JFactory::getApplication->input; 
    $data=$in->get('jform',array(),'ARRAY'); //this is unfiltered input?!
    JLoader::register('WhateverModelWData', $whatevermodelpath);
    $model = new WhateverModelWData();
    $model->save($data);
}

Le seul problème avec cette approche est que cela ne fonctionne pas. La fonction de sauvegarde échoue avec une erreur:

Appel à une fonction membre getKeyName () sur un non-objet dans libraries/legacy/model/admin.php à la ligne 1064

En plus de cela ne fonctionnait pas, il n'aurait pas filtré les données avant l'insertion.

Je penserais que $model->validate($model->getForm(), $data) ferait l'affaire, mais aussi $model->getForm() échoue lamentablement, alors je suis coincé. Quelqu'un peut m'aider?

4
jonasfh

Au départ, je pensais que le mieux serait d'utiliser la méthode du contrôleur save (), que j'ai finalement obtenu comme ceci:

$path = JPATH_ADMINISTRATOR . '/components/com_anycomponent;
JLoader::register('AnycomponentControllerAnyController', $path . '/controllers/anycontroller.php');
$controller = AnycomponentControllerAnyController::getInstance('Anycomponent'); 
$controller->addModelPath($path . '/models', 'Anycomponent');  
JTable::addIncludePath($path . '/tables'); 
JForm::addFormPath($path . '/models/forms');
$ret = $controller->save();

Ainsi, lorsque vous appelez un contrôleur depuis l'extérieur du composant, vous devez spécifier tous les chemins nécessaires. Cela s'applique lorsque le contrôleur étend JControllerForm, qui se trouve maintenant dans le dossier hérité de joomla, mais utilisé dans le noyau de joomla. Pour les contrôleurs frontaux, cela pourrait ne pas fonctionner correctement, à moins que ceux-ci ne prolongent également JControllerForm.

Lorsque vous appelez save ainsi, toutes les vérifications nécessaires semblent avoir été effectuées: validation des données, vérifications d'accès, etc.

Je ne vois toujours pas le meilleur moyen d'obtenir l'ID inséré du contrôleur. La fonction save () renvoie simplement true ou false en fonction du succès de l'appel de la fonction.

Il est possible d'utiliser la même méthode que ci-dessus pour appeler le modèle -save () (comme suggéré dans la question ci-dessus), en ajoutant d'abord les chemins nécessaires. Cela peut être plus flexible, mais vous devez alors effectuer vous-même les contrôles de validation des données et les contrôles d'accès. L'appel de controller-save () prend en charge ces problèmes.

N'hésitez pas à corriger/prolonger cette réponse si vous avez plus d'informations sur le sujet.

Edit: Si vous utilisez cette méthode pour sauvegarder des données existantes, vous devez ajouter le paramètre id à l’URL, comme ceci:

index.php?option=com_whatever&view=wdata&task=save&id=20 
// where 20 is the id you are editing

Si l'identifiant est uniquement dans un champ du formulaire, il sera ignoré et l'enregistrement sera ajouté en tant que nouvel enregistrement.

4
jonasfh