web-dev-qa-db-fra.com

Vide POST données sur le serveur sur AJAX demande en utilisant Angular $ http

J'utilise AngularJS pour créer un formulaire AJAX qui est ensuite traité sur un serveur exécutant Wordpress.

Le gestionnaire côté serveur est simple:

function rnr_contact_callback() {
    $name = $_POST['firstName'] . ' ' . $_POST['lastName'];

    wp_mail(
        '[email protected]',
        'Contact form submitted',
        $name . '(' . $_POST['email'] . ') sent a message: ' . $_POST['comment']
    );

    exit;
}

Contrôleur côté client:

angular.module('app').controller('ContactForm', function($scope, $http) {
    $scope.sendContactForm = function() {
        $http({ 
            method: 'POST', 
            url: '/wp-admin/admin-ajax.php', 
            params: {
                action: 'contact',
                firstName: $scope.userFirstName,
                lastName: $scope.userLastName,
                email: $scope.userEmail,
                comment: $scope.userComment
            }
        }).success(function(data, status, headers, config) {
            $scope.contactFormSent = true;
        }).error(function(data, status, headers, config) {

        });
    };
});

J'ai testé la cohérence $scope, et tout va bien. De plus, la demande POST est gérée: je reçois un courrier électronique. Le problème est que le corps de l'e-mail ressemble à ceci: () sent a message:. Je conclus que, sur le serveur, aucun des $_POST['...'] n'est défini. Pourquoi? Qu'est-ce que je fais mal?

4
Fleischpflanzerl

J? ai compris. J'aurais juste dû utiliser $_REQUEST au lieu de $_POST dans chaque fonction qui gère les requêtes AJAX.

4
Fleischpflanzerl

Action d'analyse:

function angular_ajax_params_to_post() {
    $is_ajax = ( defined( 'DOING_AJAX' ) && DOING_AJAX );
    if($is_ajax){
        $params = json_decode(file_get_contents('php://input'), true);

        foreach ($params as $param_key => $param_val) {
            $_POST[ $param_key ] = $param_val;
        }
    }
}
add_action( 'plugins_loaded', 'angular_ajax_params_to_post' );

Cette fonction analyse la chaîne de message angulaire dans le tableau $ _POST.

3
FlatDev

Je viens d'avoir le même problème. $ _REQUEST est vide, car angulars $ http envoie ses données au format JSON par défaut. Yu doit envoyer les données en tant que formdata:

var app = angular.module('foo', []);

app.config(function ($httpProvider) {
    // send all requests payload as query string
    $httpProvider.defaults.transformRequest = function(data){
        if (data === undefined) {
            return data;
        }
        return jQuery.param(data);
    };

    // set all post requests content type
    $httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8';
});
2
rmmjohann

Vous devez utiliser $ _REQUEST au lieu de $ _POST en PHP:

function rnr_contact_callback() {
    $name = $_REQUEST['firstName'] . ' ' . $_REQUEST['lastName'];

    wp_mail(
        '[email protected]',
        'Contact form submitted',
        $name . '(' . $_REQUEST['email'] . ') sent a message: ' . $_POST['comment']
    );

    exit;
}
0
Magico