次のようなjsonデータを返すphp関数があります。
if ($result !== false)
{
$resultdata = array(
'status' => true,
'error_msg'=>'',
'data' => $result
);
}
else
{
$resultdata = array(
'status' => false,
'error_msg'=>"Unable to reassign port vlan. Check Port mode.",
'data' => $result
);
}
header ('Content-Type: application/json; charset=UTF-8');
echo json_encode($resultdata);
モデルからのデータ($ result)は、次のように作成されます。
$pattern = "/([0-9]+)(\s+)([0-9]+)(\s+)([a-z]+)(\s+)([a-z]+)(\s+)/i";
if (preg_match($pattern, $this->_data, $matches))
{
$vlandetailsArray['VlanId']= $matches[1];
$vlandetailsArray['Name']= $matches[3];
$vlandetailsArray['Egress']= $matches[5];
$vlandetailsArray['Type']= $matches[7];
}
そして、私の見解のコードは次のようになります。
$.ajax({
url:fullpath,
type:'POST',
dataType:'json',
success: function(returnDataFromController) {
console.log(returnDataFromController);
if (returnDataFromController.status == true)
{
//build table contents
var htmlstring = '<thead>';
htmlstring = htmlstring + '<tr>';
htmlstring = htmlstring + '<th>VlanId</th>';
htmlstring = htmlstring + '<th>Name</th>';
htmlstring = htmlstring + '<th>Egress Rule</th>';
htmlstring = htmlstring + '<th>Port Membership Type</th>';
htmlstring = htmlstring + '<tbody>';
//should only be one entry so no need to loop
// htmlstring = htmlstring + "<tr>"
//htmlstring = htmlstring + "<td class ='vlanid'>" + returnDataFromController.VlanId + "</td>";
//htmlstring = htmlstring + "<td>" + returnDataFromController.Name + "</td>";
//htmlstring = htmlstring + "<td>" + returnDataFromController.Egress + "</td>";
// htmlstring = htmlstring + "<td>" + returnDataFromController.Type +"</td>";
//htmlstring = htmlstring + "</tr>";
$('#assignedvlans').html(htmlstring);
$('#progress-indicator').hide();
}
else
{
alert('my error message: ' + returnDataFromController.error_msg);
}
},//end success
error: function(jqXHR, textStatus, errorThrown)
{
alert(errorThrown);
}
私が疑問に思っているのは、戻り配列の「data」セクションと「error_msg」にアクセスする方法です。現在、ajaxが実行された後、ステータスがfalseの場合、表示されるアラートに「my error message:undefined」と表示されます。しかし、「returnDataFromController.status」に関するエラーメッセージは表示されません。
データに関する限り、私は試しました:
returnDataFromController.data.VlanId
と
returnDataFromController["#data"].VlanId
しかし、どちらも機能していないようです。コメントアウトされたコードは、データのラッパー配列を返さなかったときに機能していました。以前はコントローラーから「$result」を返していました...
任意の提案をいただければ幸いです。ありがとう。
UPDATE 1 ちなみに、console.logはあまり役に立ちません。何らかの理由で、Webコンソールにデータがダンプされていないのがわかります。私はFirefoxを使用しています...
更新2
コントローラーがステータスに対してtrueを返す場合、これはajaxエラーハンドラーから受け取るエラーメッセージです。
SyntaxError:JSON.parse:予期しない文字
使用するコードを変更しました:
returnDataFromController.data.VlanId
更新3
問題を単純化するために、より基本的なコードを使用して問題を再現しようとしました。そのために、これが私のコントローラーです。
public function test()
{
$mydata = array(
'VlanID'=>80,
'Name'=>'test vlan'
);
$data = array(
'status'=> true,
'error_msg'=>'all is well',
'data'=>$mydata
);
header ('Content-Type: application/json; charset=UTF-8');
echo json_encode($data);
}
そして、これが私の見解です:
$('#testbutton').click(function() {
$.ajax({
url:'http://myserver/myapp/index.php/controller/test/',
type:'POST',
dataType:'json',
success: function(returnDataFromController) {
alert('success');
console.log(returnDataFromController);
alert(returnDataFromController.data.VlanID);
},//end success
error: function(jqXHR, textStatus, errorThrown)
{
alert('ajax error handler: ' + errorThrown);
}
}); //end ajax call
テストボタンをクリックすると、次のようになります。1.「成功」という最初のアラートが表示されます。2.コンソールに何も書き込まれません。3。コンソールに次のエラーメッセージが表示されます。2番目のアラート「TypeError:returnDataFromController.dataisundefined」を実行しようとすると。
この例が物事を単純化し、私が間違っているところを特定するのに役立つことを願っています。ありがとう。
更新4
追加すると:
alert(returnDataFromController.toSource());
次の出力が得られます。
({VlanID:80, Name:"test vlan"})