创建一个jQuery $.post()到PHP控制器,然后在中间返回到View,然后使用$.get()继续处理控制器


Make a jQuery $.post() to a PHP Controller, and then in the middle of it back to View, and then use $.get() to continue with the Controller

我正在处理一个网页的视图和控制器,我正试图弄清楚这将如何工作:

  1. 控制器将在加载页面时定义视图中使用的变量。
  2. 一旦用户提交了一个表单,它就会执行一个onclick jQuery函数,该函数会返回给控制器。
  3. 根据投票是否成功插入数据库,控制器返回给视图true或false。
  4. 视图的jquery函数继续,决定下一步做什么:如果成功,执行另一个jquery函数。
  5. 下一个jQuery函数执行$。返回到控制器,它决定在视图中使用的相关变量。

现在,我的工作是提交投票。然而,当我运行它时,我从来没有看到警告弹出,这让我担心我的设置没有按应有的方式工作。

这是我的PHP网站控制器的代码:

if(!isset($_POST['poll'])) //UPON PAGE LOAD
{
    //define relevant variables to be put into the view
}
if(isset($_POST['poll'])) //UPON jQuery $.Post() back to controller
{
    if($_POST['poll']=='done')
        $vote = 2;
    if($_POST['poll']=='no')
        $vote = 1;
    $id = $_POST['id'];
    $result = vote($user_id, $id, $vote); //inserts vote into Database
    if( !$res )
        echo json_encode(array('success'=>true, 'text'=>'success'));
    else
        echo json_encode(array('success'=>false, 'text'=>'fail'));
    //I want ^this json data to be sent back to the jQuery of my view 
}
if(isset($_GET['newListing']))
{
    //code that would redifine relevant variables to be put into view
}
if(isset($_GET['newListing']) || !isset($_POST['poll']))
{
   //code that does something--both upon page load and when needing to retrieve
   //and define variables to put into view.
}
include('view.php');

这是代码从我的HTML/jQuery网站视图:

<html> 
<body>   
<form name='poll' id='poll' >
<INPUT TYPE="radio" name='poll'  value='done'checked/>Done it.<br/>
<INPUT TYPE="radio" name='poll'  value='no'/>No.</br>
<button id='submit-vote' onclick="postVote();">Submit</button>
<INPUT TYPE='hidden' name='id' value='<?php echo $id; ?>'/>
</form>
</body>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript">
function loadListing(){
   $.get('controller.php?newListing=yes',function(data){
       if(data.response == 'success'){
           //something}
        else{
           return false;}
   });
 }
 function postVote(){
   $.post('controller.php', { poll: $('input:radio[name=poll]:checked').val(), id: $('input:hidden[name=id]').val()} , function(data){
       if(data.success){
          alert('data.text');
          loadListing();
          return true;}
       else{ 
          alert(data.text);
          return false;}
                    }, 
                    "json");
   }
            </script>
</html>

感谢任何帮助/建议!

编辑:从我的视图代码:HTML:

<fieldset id='poll'>
 <INPUT TYPE="radio" name='poll'  value='yes' checked/>Yes!<br/>
 <INPUT TYPE="radio" name='poll'  value='done'/>Done it.<br/>
 <INPUT TYPE="radio" name='poll'  value='no'/>No.</br>
 <button id='submit-vote'>Submit</button>
 <INPUT TYPE='hidden' name='id' value='<?php echo $id; ?>'/>
 </fieldset>
jquery:

 jQuery(function($){
                $("#submit-vote").click(
                    function(){ 
                        alert("HELLO");
                        $.post('controller.php', { poll: $('input:radio[name=poll]:checked').val(), id: $('input:hidden[name=id]').val()} , 
                        function(data)
                        {
                            alert("THIS FUNCTION WORKS");
                        }, "json"); 
                    }
                );
            });

控制器基本相同。当我现在点击提交按钮时,alert("HELLO");被执行,并且根据Firefox的Firebug, $.post()确实发生了。然而,alert("THIS FUNCTION WORKS");不会被执行。我需要帮助弄清楚为什么可能是....

谢谢!

问题是json_encode创建了一个字符串。然而,在Javascript中,您试图访问它,就好像它是一个对象(data.success)。首先需要使用window.JSON.parse()将其转换为对象:

var dataObj = window.JSON.parse(data);

这样做之后,您应该能够访问dataObj.success.

老实说,我不知道你为什么把它弄得那么复杂。为什么不返回一个简单的字符串,比如"成功"或"失败"?然后,您不需要在php中编码对象或在JavaScript中解码它。你只需要这样做:

PHP

if( !$res )
        echo 'success';
else
        echo 'failure';
JavaScript

if(data === 'success'){
    //do your stuff
}else{ 
    //do other stuff
}

编辑OP对这个答案的第一个评论一旦PHP脚本结束,JavaScript将重新获得控制权。在您发布的代码中,在PHP脚本的末尾包含了一个view.php文件。我不知道view.php里面有什么,很有可能包括这个文件会导致你的JS alert()仍然没有触发,即使你做了我上面描述的更改。这是因为如果有任何输出(即echo, print等)在view.php文件中运行,它将被附加到json_encode创建的字符串上。结果将是一个不能被window.JSON.parse()解析的字符串。

如果您希望脚本在回显"成功"或"失败"(或您的json_encoded版本)后结束,只需将return;放在echo语句之后:

if( !$res ){
    echo 'success';
else
    echo 'failure';
}
return;

include('view.php');应该只放在if(!isset($_POST['poll'])) //UPON PAGE LOAD代码中

相关文章: