3 votes

L'envoi d'un email par Mailchimp renvoie une erreur, Javascript et php

J'espère qu'il s'agit d'un problème simple. J'utilise l'API Mailchimp pour soumettre un simple formulaire d'inscription à partir de mon site web. J'essaie d'apprendre le javascript en ce moment, donc j'essaie de faire la httprequest et le callback sans jQuery. En fait, j'essaie de convertir cet exemple de jQuery que j'ai trouvé en ligne en Javascript vanille. Mais il y a quelque chose (plusieurs choses ?) qui ne va pas avec mon javascript et que je ne comprends pas.

EDITAR: Lorsque le formulaire est soumis, je suis dirigé vers la page email-validate.php, et j'obtiens l'objet d'erreur suivant renvoyé par MailChimp.

{"type":"http://developer.mailchimp.com/documentation/mailchimp/guides/error-glossary/","title":"Invalid Resource","status":400,"detail":"The resource submitted could not be validated. For field-specific details, see the 'errors' array.","instance":"","errors":[{"field":"","message":"Required fields were not provided: email_address"},{"field":"email_address","message":"Schema describes string, NULL found instead"}]}

jQuery

Trouvé ici (ceci lance en fait une erreur ajax(...).success is not a function error dans la console mais soumet quand même le formulaire, FWIW)

$('document').ready(function(){
  $('.mc-form').submit(function(e){

    //prevent the form from submitting via the browser redirect
    e.preventDefault();

    //grab attributes and values out of the form
    var data = {email: $('#mc-email').val()};
    var endpoint = $(this).attr('action');

    //make the ajax request
    $.ajax({
      method: 'POST',
      dataType: "json",
      url: endpoint,
      data: data
    }).success(function(data){
      if(data.id){
        //successful adds will have an id attribute on the object
        alert('thanks for signing up');
      } else if (data.title == 'Member Exists') {
        //MC wil send back an error object with "Member Exists" as the title
        alert('thanks, but you are alredy signed up');
      } else {
        //something went wrong with the API call
        alert('oh no, there has been a problem');
      }
    }).error(function(){
      //the AJAX function returned a non-200, probably a server problem
      alert('oh no, there has been a problem');
    });
  });
});

Mon Javascript (qui ne fonctionne pas)

document.addEventListener("DOMContentLoaded", function() {
    document.getElementById("mc-form", function submit(e){
        e.preventDefault();

        var data = {"email": document.getElementById("mc-email").value};
        var endpoint = document.getElementById("mc-form").getAttribute('action');

        function formSubmit(callback){
            var request = new XMLHttpRequest();

                request.onreadystatechange = function() {
                    if (request.readyState === 4) {
                      if (request.status === 200) {
                        //Parse returned string into an object, then pass the object to the callback function.
                        var response = JSON.parse(request.responseText);
                        callback(response);
                      } else {
                   console.log('JSON request error');
                        }
                    }
                }
            request.open("POST", endpoint , true);
            request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
            request.send(data);
        }
        function formResponse(response){
            if(response.id){
            //successful adds will have an id attribute on the object
            alert('Thank you for signing up for Launch Alerts!');
          } else if (response.title == 'Member Exists') {
            //MC wil send back an error object with "Member Exists" as the title
            alert('You are already signed up for Launch Alerts!');
          } else {
            //something went wrong with the API call
            alert('Something went wrong. Please resubmit the form!');
          }
        }
        formSubmit(formResponse);
    })
});

Mon html

<form class="mc-form" method="POST" action="./email-validate.php">
    <h2 class="launch-alerts">Never miss a launch with Launch Alerts</h2>
    <label for="mc-email">Email Address:</label>
    <input type="email" id="mc-email" name="mc-email" autofocus="true" required/>
    <input type="text" value="pending" id="status" name="status" hidden/>
    <input type="submit" value="Submit">
</form>

Il utilise un fichier php pour valider et soumettre le formulaire, comme on peut le voir sur le lien ci-dessus. Le html et le php fonctionnent pour soumettre le formulaire quand on utilise le script de jQuery, mais pas mon javascript, ce qui veut dire qu'il y a quelque chose qui ne va pas avec mon script, mais je suis trop novice avec le javascript pour bien comprendre ce que j'essaie de faire, et ce que je fais de travers.

Merci de votre attention !

EDIT 2 :

Le code PHP (copié directement à partir de aquí

<?php
//fill in these values for with your own information
$api_key = 'xxxxxxxxxxxxxxxxxxxxxxxx';
$datacenter = 'xxxxx';
$list_id = 'xxxxxxxxx';
$email = $_POST['email'];
$status = 'pending';
if(!empty($_POST['status'])){
    $status = $_POST['status'];
}
$url = 'https://'.$datacenter.'.api.mailchimp.com/3.0/lists/'.$list_id.'/members/';
$username = 'apikey';
$password = $api_key;
$data = array("email_address" => $email,"status" => $status);
$data_string = json_encode($data);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, "$username:$api_key");
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Content-Type: application/json',
    'Content-Length: ' . strlen($data_string))
);
$result=curl_exec ($ch);
curl_close ($ch);
echo $result;
?>

3voto

Barmar Points 135986

L'argument de données de request.send() doit être une chaîne codée en URL, vous passez un objet. jQuery effectue cette conversion automatiquement pour vous ; lorsque vous le faites vous-même, vous devez également le faire.

var data = "email=" + encodeURIComponent(document.getElementById("mc-email").value);

Vous n'ajoutez pas non plus votre fonction de soumission à la fonction submit correctement. Il devrait être :

document.getElementById("mc-form").addEventListener("submit", function submit(e){

0voto

Danmoreng Points 1748

Vous pouvez ajouter manuellement des paramètres à l'URL :

var endpoint = document.getElementById("mc-form").getAttribute('action') +
               "?email=" + document.getElementById("mc-email").value;

Et ensuite seulement

request.send();

sans les données qu'il contient.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X