【问题标题】:Ionic: show data rendered by phpIonic:显示由 php 渲染的数据
【发布时间】:2016-09-26 16:26:31
【问题描述】:

我有一个离子应用程序,我想用我通过 php 脚本获得的数据填充其中一个页面。所以,我的 php:

<?php 

    $user = 'username';
    $pass = 'mypass';
    $client = new SoapClient('http://mywebsite.rs/api/soap/?wsdl', array('soap_version' => SOAP_1_2));

    try {
    $session = $client->login($user, $pass);

    $result = $client->call($session, 'api_category.rootcategories');
    print_r ( $result);

    $client->endSession($session);
} catch (Exception $e) {
    echo "Error: ".$e->getMessage();
}

?>

现在。我想在我的主页上打印结果。什么是输出它的简单方法?问题是我不知道如何从离子框架调用该文件。我确实有一些代码,我进行了实验,但它不起作用:

.controller('AppCtrl', function($scope, $http,$state ,$ionicModal,$ionicHistory,$ionicNavBarDelegate,SearchData,$window) {

$scope.categories = [];
var numberOfRow = 1;

var link = 'app/getAllCats.php';
$http.post(link).then(function (res){
  $scope.categories = res.data;
  for(var i = 0 ; i<res.data.length ; i++){
    if(res.data[i].is_active === 1)
      $scope.categories.push(res.data[i]);
  }
  arrayLength = $scope.categories.length;
  numberOfRow = ~~(arrayLength / 3);
   var div = arrayLength - numberOfRow;
   if(div <=2 || div >=1 ){
      numberOfRow = numberOfRow + 1;
   }
});
$scope.range = function(){
  return new Array(numberOfRow);
}
$scope.create = function(id){
  $state.go('fooBar',{category_id: id});
}
console.log($scope.categories);

})

【问题讨论】:

  • 以json的形式发送数据,然后在controller show in view中读取。
  • 我该怎么做?代码示例将非常有帮助

标签: php angularjs ionic-framework


【解决方案1】:

在您的 PHP 代码中,您应该以 JSON 格式发送数组。替换这一行:

print_r($result);

echo json_encode($result);

然后,如果您希望能够在客户端使用此结果,您有两个选择,您可以要求 PHP 将输出声明为 JSON 给任何发送请求的客户端,方法是在 PHP 的第 1 行添加文件:

header("Content-type: application/json");

或者通过替换这一行让 JavaScript 将响应字符串解析为 JSON 对象:

$scope.categories = res.data;

$scope.categories = JSON.parse(res.data);

PS:以下不是回答问题,但还是很高兴知道

当使用 Ionic(或更一般的 AngularJS)$http 查询 PHP 服务器时,请求正文作为原始 JSON 字符串发送。假设您想通过 Ionic 应用程序中的表单发送登录名和密码:

<input type="text" ng-model="user" />
<input type="password" ng-model="pass" />
<input type="button" ng-click="login()" />

$scope.login = function() {
  $http.post(link,
    {
      user: $scope.user,
      pass: $scope.pass
    }
  ).then(function(response) {
    ...
  });
}

然后在 PHP 中,你会很想使用 $_POST 获取发送的登录名和密码,而实际上你不能,因为 $_POST 超全局是通过解析请求正文中的查询字符串创建的

user=username
pass=P@s$W0rd666

而 AngularJS 的 $http 将原始 JSON 作为字符串发送。

{
    user: "username",
    pass: "P@s$W0rd666"
}

这很烦人,但幸运的是,PHP 为这些情况提供了另一个全局变量:$HTTP_RAW_POST_DATA。因此,在您的 PHP 代码中,您将通过调用来检索用户输入

<?php 
$postData = json_decode($HTTP_RAW_POST_DATA, 1); // don't forget the second argument
$user = $postData['user'];
$pass = $postData['pass'];
?>

抱歉,这篇文章太长了,我觉得我需要告诉你这个。我希望有人在我遇到你这种情况时这样做。

编辑

您将无法将 PHP 文件存储在 ionic 项目的 www 目录中。您需要一个单独的 Web 服务器。也别忘了

header("Access-Control-Allow-Origin: *");

在您的 PHP 文件之上

【讨论】:

  • 感谢您的回复。不过有一件事:我在 http 中使用的链接变量不正确,而且似乎 angular 无法向本地 PHP 文件发出请求。我是对的还是有办法做到这一点?
  • 好吧,Ionic 是通过 Node.JS 提供的,你绝对可以向本地文件发出 $http 请求(路径相对于 www 文件夹),但你无法解释 PHP。您需要有一个单独的 Web 服务器并改为调用该地址(并且不要忘记 PHP 顶部的 Access-Control-Allow-Origin 标头以及 Content-type: application/json)。我已经编辑了我的答案
  • 这意味着我不能在 ionic 中做我想做的事。感谢您的解释。
  • 你能解释一下你想做什么吗?可能有办法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-05
  • 1970-01-01
  • 2017-06-06
  • 1970-01-01
  • 1970-01-01
  • 2016-01-29
相关资源
最近更新 更多