使用Zend Framework管理AJAX调用

时间:2014-04-08 19:32:10

标签: php jquery ajax zend-framework zend-framework2

我正在尝试集成AJAX搜索功能,但我无法正确使用Zend Framework部分。我有以下控制器和操作。

class IndexController extends Zend_Controller_Action
{   
    public function indexSearchAction()
    {
        $this->_helper->layout()->disableLayout();
        $this->_helper->viewRenderer->setNoRender(true);

        if ($this->getRequest()->isXmlHttpRequest()) {
            if ($this->getRequest()->isPost()) {
                $search = new Model_Index();

                $this->_helper->json($search->indexSearch());

                $this->view->indexSearch = $result;
            }
        } else {
            //regular controller logic goes here
            echo "regular controller";
        }

    }

我的Ajax调用的副本如下:

$.ajax({
    type: "POST",
    url: "/index/index-search/format/json",
    data: dataString,
    dataType: "json", 
    cache: false,
    success: function(html)
    {

我只是希望模型返回一条简单的消息,以确保它正在发挥作用。话虽如此,这是我在模型中的功能的副本:

public function indexSearch()
{
    $testMessage = "this was returned via ajax";
    return $testMessage;
}

触发Ajax调用的代码:

$(document).ready(function(){
    $(".search").keyup(function() 
    {
        var searchbox = $(this).val();
        var dataString = 'searchword='+ searchbox;

        if(searchbox=='')
        {
        }
        else
        {
            $.ajax({
                type: "POST",
                url: "/index/index-search/format/json",
                data: dataString,
                dataType: "json", 
                cache: false,
                success: function(html)
                {
                    $("#display").html(html).show();
                }

            });
        }
        return false;
    });
});

我不知道我错过了什么,这是我第一次尝试让AJAX调用在ZF2中工作而不能解决问题。

任何帮助将不胜感激!干杯!

2 个答案:

答案 0 :(得分:1)

问题在于,当我期待json时,我正在返回html ...我已经改变了这个:

这是控制器动作:

 public function indexSearchAction()
{
     $this->_helper->layout('homelayout')->disableLayout();

    if ($this->getRequest()->isXmlHttpRequest()) {
        if ($this->getRequest()->isPost()) {

            $q=$_POST['searchword'];
            $indexSearch = new Model_Index();
            $result = $indexSearch ->indexSearch ($q);

            $this->view->indexSearch = $result;

        }
    } else {
        //regular controller logic goes here
    }

}

jQuery Ajax处理代码:

$(document).ready(function(){

$(".search").keyup(function() {
var searchbox = $(this).val();
var dataString = 'searchword='+ searchbox;

if(searchbox==''){
    $("#display").hide();
} else
{

$.ajax({
type: "POST",
url: "/user/user-search/",
data: dataString,
cache: false,
success: function(html)
{   $("#display").html(html).show();        }

});
}return false;    


});
    });

jQuery(function($){
   $("#searchbox").Watermark("Search");
    });

Model_index函数indexSearch()脚本:

public function indexSearch($q)
{
    $select = $this->select()
                   ->from($this)
                   ->where('username LIKE ?', '%' . $q . '%');

    $row = $this->fetchAll($select);
    return $row;
}

以下是用户搜索的输入框元素:

<input type="text" class="rounded search" id="searchbox" /><br />

    <div id="display">

    </div>

view script(index-search.phtml),显示div中的内容:

<div class="display_box" align="left">
    <ul class="index-list">
        <?php echo $this->partialLoop('user/search-dropdown.phtml', $this->indexSearch);?>
    </ul>

并且最后但并非最不重要的是,上面的部分循环中提到的视图脚本遍历数据库的返回内容并且转换为可以在下拉列表中显示的格式。下面是search-dropdown.phtml:

<li class="user-list-item" >
<div class="search-list-item-container" >
<?php 

    $validator = new Zend_Validate_File_Exists();
    $validator->addDirectory('users/');
          if ($validator->isValid('/' . $this->username . '/' . $this->username . '.jpg')) { ?>
            <div class="search-list-item-picture">
                <img class='search-pic' src="..\users\<?=$this->username ?>\<?=$this->username ?>.jpg?t=<?=time(); ?>">
            </div>
    <?php } else {  ?>
            <div class="search-list-item-picture">
                <img class='search-pic' src="..\skins\blues\images\f1.png">
            </div>
    <?php }?>

    <div class="search-list-item-name">
        <?php echo $this->username; ?>
    </div>
</div>

最终结果如下:

enter image description here

感谢所有在此协助的人!很多人认识到了

答案 1 :(得分:0)

很可能是因为这一行

$this->_helper->viewRenderer->setNoRender(true);

然后尝试使用此行的视图

$this->view->indexSearch = $result;

如果您要关闭自己的观点,那么您需要echo发布您的内容。像echo $result;

这样的东西

最重要的是,你的ajax函数需要返回JSON个数据,但你实际上是在返回纯文本/ html。如果您知道自己最终会返回/回显json,那么在测试期间,您可以简单地注释掉dataType: "json",行,直到完成初始测试,然后再将其添加回来。如果您根本不打算使用json,只需删除该行。

请参阅此简单JSFiddle example