J'ai une fonction de sauvegarde personnalisée dans une classe qui étend JModelAdmin.
La fonction de sauvegarde appelle plusieurs fonctions externes dans d'autres fichiers d'assistance.
À plusieurs reprises, ces fichiers auxiliaires peuvent indiquer qu’il ya une erreur et effectuer un "retour faux", ce qui entraîne l’échec de la sauvegarde. Ça marche.
Lorsque cela se produit, Joomla affiche bien
"L'enregistrement a échoué avec l'erreur suivante:"
en haut du formulaire.
Ce que je ne sais pas, c'est comment obtenir correctement la "raison" dans la fonction de sauvegarde parent afin qu'elle affiche la notification d'erreur après cette notification.
Jusqu'à présent, la seule chose que j'ai pu faire est d'ajouter une ligne dans le fichier d'aide:
JFactory :: getApplication () -> enqueueMessage (JText :: sprintf ('Votre fichier% s n'est pas le type de format approprié.', $ TypeName, 'error');
juste avant le
retourne faux;
ligne dans le fichier d'assistance.
Le problème est que ceci est affiché AU-DESSUS de la notification d’échec de sauvegarde, ce qui entraîne
Votre fichier image n'est pas le type de format approprié.
L'enregistrement a échoué avec l'erreur suivante:
Ce qui est dans le mauvais ordre.
Existe-t-il un moyen de "repousser" le type d'erreur vers la fonction de sauvegarde de l'appelant (et de revenir à la fonction de sauvegarde de base) et d'afficher mon erreur dans le bon ordre SOUS le message "Erreur suivante:"?
La manière dont JFactory::getApplication()->enqueueMessage()
affiche les messages dans le même ordre. Ainsi, le message "votre image ..." a été ajouté en premier et s'affiche donc en premier. Donc, la réponse courte est que les erreurs s'alignent, vous devriez les ajouter dans le bon ordre.
J'ai trouvé deux autres moyens de contourner cela pour l'instant.
L'une consiste à utiliser ma propre méthode d'assistance pour la collecte des erreurs, puis à les insérer dans la JFactory::getApplication()->enqueueMessage()
dans le bon ordre. Voici le code utilisé dans la classe helper.
/**
* The errors
**/
protected static $errors = array();
public static function getError($key)
{
if (isset(self::$errors[$key]) && self::checkArray(self::$errors[$key]))
{
return '<ul><li>'.implode('</li><li>', self::$errors[$key]).'</li><ul>';
}
return false;
}
protected static function setError($key, $errorArray)
{
if (self::checkArray($errorArray))
{
foreach ($errorArray as $error)
{
if (!isset(self::$errors[$key]))
{
self::$errors[$key] = array();
}
self::$errors[$key][] = $error;
}
}
}
Dans la vue, vous pouvez faire quelque chose comme ceci:
if ($errors = YourComponentHelper::getError(1))
{
JFactory::getApplication()->enqueueMessage('<h1>Save failed with the following error:</h1>'.$errors, 'Error');
}
La deuxième option est que votre classe de modèle dispose d'une fonction pour en extraire les erreurs et la transmettre au modèle actuel.
Donc, dans ce cas, vous pouvez faire quelque chose comme ceci:
$model = YourComponentHelper::getModel('expert', JPATH_COMPONENT_ADMINISTRATOR); // A JCB custom helper method
if ($model->save($data))
{
return true;
}
$errors = $model->getErrors();
if (YourComponentHelper::checkArray($errors)) // also a JCB custom helper method
{
foreach ($errors as $error)
{
$this->setError($error);
}
}
Mais encore une fois, vous devrez vous assurer de les charger dans le bon ordre.