web-dev-qa-db-fra.com

Un appel Ajax renvoie les bagages en HTML

J'ai lu des questions similaires sur ce site, mais aucune que je puisse trouver ne corresponde étroitement à mon problème.

Je gère un site joomla 3.5.1 et j'ai écrit un code javascript qui, lorsque j'appuie sur un bouton, envoie un courrier en appelant de manière asynchrone une page php que j'ai placée à la racine de joomla.

Le fichier php fait écho à un résultat ("Mail envoyé" ou le contenu d'une exception, avec une structure try/catch).

Supposons que la fonction fonctionne correctement et que l'écho dans la capture s'exécute (puis se termine).

echo "Mail sent";
exit();

L'appel AJAX doit définir le code HTML interne d'une plage sur "Message envoyé"

$ajax({
  url: 'phpname.php',
  type: 'POST',
  datatype: 'text',
  data: 'option=com_ajax&a1=mail&a2=from&a3=...',
  success: function(data){
    $('#container').html(data);
  }
  console.log(data);
}

Comme vous pouvez le constater, le type de données est textuel (j’ai aussi essayé json ou html, sans résultats perceptibles), et pourtant console.log me donne ceci:

<!DOCTYPE HTML>
  <HTML><BODY>
    Mail sent

Le code HTML de la div résultant, tel que vu dans chrome inspector est

<span>



          Mail sent</span>

Bien sûr, quand j'implémente un if/else dans la partie réussie de ajax afin de colorer ce texte en vert s'il s'agit de "Mail envoyé" et en rouge sinon, je reçois toujours du texte en rouge.

Lorsque j'ai testé les fichiers php et js en dehors de joomla, ils ont bien fonctionné. Je n’ai alors utilisé aucune option = com_ajax, mais apparemment joomla en a besoin.

Comment dois-je procéder?

2
Zachiel

dans votre fichier php il devrait y avoir quelque chose comme ça:

ob_end_clean();

header('Content-Type: application/json');

echo json_encode($data);

die();

de sorte que vous allez nettoyer la sortie - avertissement et avis

définir l'encodage

sortie

arrêter de rendre plus loin

1
Alexandr

Faites ces quelques changements et cela devrait fonctionner sans aucun problème.

Modifiez votre déclaration Mail Sent comme suit:

$this->sendMessage(JFactory::getApplication()->enqueueMessage('Mail Sent.','success'));

Ajoutez la fonction suivante à votre PHP fichier qui envoie le courrier:

public static function sendMessage($message, $error = false, array $data = array())
{
    ob_clean();
    if(!$error){
        JFactory::getApplication()->enqueueMessage($message);
        echo new JResponseJson($data);
    }else{
        JFactory::getApplication()->enqueueMessage($message, 'error');
        $response = new JResponseJson($data, $message, true);
        foreach($response->messages['error'] as $i => $message){
            if($message instanceof Exception){
                $response->messages['error'][$i] = $message->getMessage();
            }
        }
        echo $response;
    }
    JFactory::getApplication()->close();
}

Modifiez votre demande JavScript Ajax comme suit:

var result = $ajax({
  url: "phpname.php",
  type: "POST",
  data: {option: com_ajax, a1: mail, a2: from, a3: ...},
  success: function(result){
      var json = jQuery.parseJSON(result);
      Joomla.renderMessages(json.messages);
      console.log(result);
  }
}

Cela devrait permettre à votre message de réussite de s'afficher dans le conteneur de messages système.

1
Terry Carter

J'ai juste ce problème aussi.

J'utilise ce php au début de mon AJAX PHP répondeur.

error_reporting(0);

Cela n'affectera que cet appel ajax et évitera de gâcher la réponse json avec une notification ou un message d'avertissement.

0
Piero Marsilio