J'apprends Angularjs et j'ai créé une forme simple. En fait, je suis développeur PHP, j'ai préféré utiliser php comme langue de script côté serveur. Je ne peux pas soumettre les données au serveur, j'ai essayé tant de méthodes, mais celles-ci sont très complexes si j'essaie en mode standard. Angularjs ne fonctionne pas, vérifiez mon code et donnez-moi la meilleure méthode pour travailler avec angularjs, jquery et php. Aidez moi!
angular.module("mainModule", []) .controller("mainController", function($scope, $http) { $scope.person = {}; $scope.serverResponse = ''; $scope.submitData = function() { var config = { headers: { "Content-Type": "application/x-www-form-urlencoded" } }; $http.post("server.php", $scope.person, config) .success(function(data, status, headers, config) { $scope.serverResponse = data; }) .error(function(data, status, headers, config) { $scope.serverResponse = "SUBMIT ERROR"; }); }; });
<?php if (isset($_POST["person"])) { // AJAX form submission $person = json_decode($_GET["person"]); $result = json_encode(array( "receivedName" => $person->name, "receivedEmail" => $person->email)); } else { $result = "INVALID REQUEST DATA"; } echo $result; ?>
<!DOCTYPE html> <html> <head> </head> <body ng-app="mainModule"> <div ng-controller="mainController"> <form name="personForm1" novalidate ng-submit="submitData()"> <label for="name">First name:</label> <input id="name" type="text" name="name" ng-model="person.name" required /> <br /> {{person.name}} <br /> <label for="email">email:</label> <input id="email" type="text" name="email" ng-model="person.email" data-parsley-type="email" required /> <br /> <br /> <button type="submit">Submit</button> </form> <br /> <div> {{$scope.serverResponse}} </div> </div> <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> <!--<script type="text/javascript" src="script/parsley.js"></script> <script src="script.js"></script>--> </body> </html>
Mise à jour , c'est un code qui a été testé avec php et Apache – et ça marche. J'ai également changé votre fichier server.php comme ci-dessous. Le fichier a été créé en fonction de l' exemple d'appel de serveur du Hub AngularJS. La même source a été utilisée pour créer l'appel de méthode mainController.js ' $ http.post (…) afin qu'il publie correctement les données sur le serveur.
Capture d'écran (après la soumission)
Server.php
<?php if ($_SERVER["REQUEST_METHOD"] === "POST") { $result = "POST request received!"; if (isset($_GET["name"])) { $result .= "\nname = " . $_GET["name"]; } if (isset($_GET["email"])) { $result .= "\nemail = " . $_GET["email"]; } if (isset($HTTP_RAW_POST_DATA)) { $result .= "\nPOST DATA: " . $HTTP_RAW_POST_DATA; } echo $result; } ?>
PersonForm.html
<!DOCTYPE html> <html lang="en" xmlns="http://www.w3.org/1999/xhtml"> <head> <meta charset="utf-8" /> <title></title> </head> <body ng-app="mainModule"> <div ng-controller="mainController"> <form name="personForm1" validate ng-submit="submit()"> <label for="name">First name:</label> <input id="name" type="text" name="name" ng-model="person.name" required /> <br /> {{person.name}} <br /> <label for="email">email:</label> <input id="email" type="text" name="email" ng-model="person.email" required /> <br /> <br /> <button type="submit">Submit</button> </form> <br /> <div> {{serverResponse}} </div> </div> <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.11/angular.min.js"></script> <script src="mainController.js"></script> <!--<script type="text/javascript" src="script/parsley.js"></script> <script src="script.js"></script>--> </body> </html>
MainController.js
angular.module("mainModule", []) .controller("mainController", function ($scope, $http) { $scope.person = {}; $scope.serverResponse = ""; $scope.submit = function () { console.log("form submit"); var params = { name: $scope.person.name, email: $scope.person.email }; var config = { params: params }; $http.post("server.php", $scope.person, config) .success(function (data, status, headers, config) { console.log("data " + data + ", status "+ status + ", headers "+ headers + ", config " + config); $scope.serverResponse = data; console.log($scope.serverResponse); }) .error(function (data, status, headers, config) { console.log("error"); $scope.serverResponse = "SUBMIT ERROR"; }); }; });// JavaScript source code
Forme alternative, avec la manipulation JSON:
Server_json.php
<?php if ($_SERVER["REQUEST_METHOD"] === "POST") { /* code source: http://stackoverflow.com/a/22852178/2048391 */ $data = array(); $json = file_get_contents('php://input'); // read JSON from raw POST data if (!empty($json)) { $data = json_decode($json, true); // decode } print_r($data); } ?>
Capture d'écran (après la soumission)
Il semble de votre code que vous avez mal compris certains concepts.
DOCTYPE
doivent être dans la balise html
racine. Il est recommandé d'ajouter JS au bas de l'étiquette du body
qui contribuera (de manière conceptuelle) aux performances de la charge de page. submitData
à la portée de votre contrôleur, mais vous ne l'appelez jamais – votre intention était probablement de l'utiliser lorsque l'utilisateur soumet le formulaire afin que vous devez supprimer action
attributs d' action
et de method
du formulaire et ajouter ng-submit
: <form name="personForm1" method="post" novalidate ng-submit="submitData(person, 'thePropNameOnWhichYouWantToSaveTheReturnedData')">
. Les deux arguments sont redondants puisque vous les avez sur la $scope
. config
envoyé avec le service $http
est utilisé pour les configurations, pas les données. Lisez ici: Angular $ http $http
envoie JSON comme corps de la requête. Il semble que vous attendiez un formulaire sur votre code PHP. Cela peut être changé dans la config
par exemple, ou vous pouvez apprendre à désérialiser les JSON sur PHP (désolé, je ne connais pas PHP). $scope
afin qu'elle puisse être rendue. Suggestion de code client fixe:
angular.module("mainModule", []) .controller("mainController", function($scope, $http) { $scope.person = {}; $scope.serverResponse = ''; $scope.submitData = function() { // Let's say that your server doesn't expect JSONs but expects an old fashion submit - you can use the `config` to alter the request var config = { headers: { "Content-Type": "application/x-www-form-urlencoded" } }; $http.post("server.php", $scope.person, config) // You can remove the `config` if the server expect a JSON object .success(function(data, status, headers, config) { $scope.serverResponse = data; }) .error(function(data, status, headers, config) { $scope.serverResponse = "SUBMIT ERROR"; }); }; });
<!DOCTYPE html> <html> <head> </head> <body ng-app="mainModule"> <div ng-controller="mainController"> <form name="personForm1" novalidate ng-submit="submitData()"> <label for="name">First name:</label> <input id="name" type="text" name="name" ng-model="person.name" required /> <br /> {{person.name}} <br /> <label for="email">email:</label> <input id="email" type="text" name="email" ng-model="person.email" data-parsley-type="email" required /> <br /> <br /> <button type="submit">Submit</button> </form> <br /> <div> {{$scope.serverResponse}} </div> </div> <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> <!--<script type="text/javascript" src="script/parsley.js"></script> <script src="script.js"></script>--> </body> </html>
Vous utilisez la forme angulaire et publiez les données du contrôleur en interne, alors vous ne devez pas supposer mentionner action="server.php" method="post"
car vous allez faire cet appel du contrôleur, à savoir $http.post('server.php')
.
Il suffit d'ajouter ng-submit="submitData(person, 'result')"
dans votre étiquette de formulaire, qui appellera votre méthode de contrôleur qui publie des données et que votre code va commencer à fonctionner.
HTML
<form name="personForm1" novalidate ng-submit="submitData(person, 'result')"> <label for="name">First name:</label> <input id="name" type="text" name="name" ng-model="person.name" required /> <br />{{person.name'}} <label for="email">Last name:</label> <input id="email" type="text" name="email" ng-model="person.email" data-parsley-type="email" required /> <br /> <br /> <button type="submit">Submit</button> </form>
J'espère que cela pourrait vous aider. Merci.