web-dev-qa-db-fra.com

En remplaçant la méthode save () sur le formulaire, comment puis-je rediriger ou afficher à nouveau le formulaire après raiseError ou enqueueMessage?

Je développe un composant qui utilise un formulaire standard de liste/édition pour créer des enregistrements dans la base de données (le tout se passe bien) basé sur Hello World! tutoriel ici .

Cependant, en plus de sauvegarder les informations dans la base de données, je dois appeler une API externe et envoyer quelques courriels de confirmation (que je traiterai plus tard et que je reviendrai probablement ici pour demander des informations).

Dans mon contrôleur pour l'élément (plutôt que la liste), j'ai créé ma propre méthode save () dans laquelle j'ajoute des données et en modifie d'autres. C’est là que j’appellerais mon API externe pour obtenir une réponse.

Dans contrôleurs/autorisation.php:

public function save($key = null, $urlVar = null)
{
    if (isset($_POST['jform'])) {
        // Get the original POST data
        $jinput = JFactory::getApplication()->input;

        $original = $jinput->post->get('jform', array(), 'array');

        // Trim each of the fields
        foreach($original as $key=>$value) {
            $postData[$key] = trim($value);
        }

        // Set value of authorization date
        $postData['authDate'] = $this->prepareInputDate(time());

        // Create transaction ID based on date and time
        $postData['merchantTransId'] .= date('YmdHis', time());

        // Strip phone number of all but numeric digits
        $postData['phone'] = $this->prepareInputNumeric($original['phone']);

        // Make call to external API
        $response = $this->callApi($postData);

        // If bad response from external API, throw error
        if (!$response) {
            JFactory::getApplication()->enqueueMessage('There was an error with the API', 'error');
            return false;
        }

        // Only store last 4 digits of account number
        $postData['accountNo'] = substr($postData['accountNo'], -4);

        // Save everything back to the $_POST global variable
        $jinput->post->set('jform', $postData);
    }

    // Finally, save the processed form data
    return parent::save('id', $urlVar);
}

Ce qui me pose un problème, c’est que lorsque jette l’erreur, je perds mon formulaire et toutes les données qui y ont été entrées. Dans la plupart des cas, lorsque l'API externe renvoie une réponse incorrecte, cela est dû à un paramètre mal formé qui peut facilement être corrigé et soumis à nouveau (par exemple, des informations d'identification non valides ou des caractères non valides dans le champ fullName).

J'aimerais pouvoir afficher un message d'erreur informatif à l'écran tout en affichant le formulaire rempli à l'écran ou après avoir été redirigé vers le formulaire rempli.

Est-ce possible de le faire depuis la méthode save () ou existe-t-il une méthode appelée après la validation du formulaire mais avant save () où je peux effectuer l'appel API?

Il y a trois jours, lorsque j'ai lancé ce projet, je ne savais absolument rien du développement de Joomla. Tout ce que j'ai pu faire jusqu'à présent a été appris par le tutoriel que j'ai mentionné ci-dessus ou par les recherches Google. Donc, s’il ya du code que j’aurais dû inclure mais ne le faisant pas, faites-moi savoir ce que je devrais montrer et je modifierai ma question pour l’inclure.

1
Tom

Vous devez utiliser une session pour enregistrer les données du formulaire. Dans le CMS, il existe un état utilisateur spécial pour cela. Juste avant de renvoyer false, vous devez enregistrer les données actuelles dans l'état utilisateur:

// Save the form data in the session
JFactory::getApplication()->setUserState($this->option . '.edit.authorization.data', $postData);

$this->option Voici le nom de votre composant.

Ensuite, dans le modèle, vous pouvez le récupérer dans votre méthode loadFormData():

// Check the session for previously entered form data
$data = JFactory::getApplication()->getUserState($this->option . '.edit.authorization.data', array());

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

Si votre contrôleur réussit, vous devez vider les données de la session avant de revenir:

JFactory::getApplication()->setUserState($this->option . '.edit.authorization.data', null);
3
Dmitry Rekun

Vous sauvegardez vos données de formulaire trop tard. S'il y a une erreur, il retourne false avant de pouvoir sauvegarder des données. Et vous devriez sauver $original données, pas de données déjà manipulées.

// If bad response from external API, throw error
if (!$response) {
    // Save everything back to the $_POST global variable
    $jinput->post->set('jform', $original);

    JFactory::getApplication()->enqueueMessage('There was an error with the API', 'error');
    return false;
}
1
Rene Korss