Day: December 3, 2007

  • 在 Zend Framework 中使用 Jquery 的 ajax 功能

    发现不少人对此有迷惑,所以有通常的做法:设置 noViewRender,然后将 ajax 调用时的返回数据直接输出于 controller 中。

    个人以为,这种做法不是不可以。但是在 Zend Framework 中这样使用,就有违 MVC 的分离原则。controller 不应该区分显示到客户端的是页面还是 json 或者 xml。

    下面是我的做法,仅供参考。部分调用了 ninny project 中封装的功能凑合看吧:

    ———————–view script: index.php—————————

    <?php echo $this->jquery();?>
    <script language="javascript">
    // jquery ajax 的 json
    $().ready(
    function(){
    $("#load").click(
    function() {
    $.getJSON("/foobar/index/ajax",function(data){
    $("#title").html(data.title);
    content = "";
    $.each(data.content, function(i, line){
    content += line + "<br/>";
    });
    $("#content").html(content);
    });
    });
    });
    </script>
    <div id="title"></div><div id="content"></div><input type="button" id="load" value="Load"/>
    -----------------------view script: ajax.php---------------------------
    <?php
    // Zend_Json 处理输出的对象,如果这里不使用 Zend_Json,可使用其他编码器将 php 对象进行编码输出。
    // 这样在需要修改输出类型时,仅需要修改视图部分。而不涉及数据模型或控制器。
    echo Zend_Json::encode($this->content);
    ?>

    ———————–action controller: Foobar_IndexController.php—————————

    <?php
    class Foobar_IndexController extends Ifang_Controller_Action
    {
    public function indexAction()
    {
    }
    public function ajaxAction()
    {
    $foobar = array(
    'title' => 'This is a test!',
    'content' => array(
    '0' => 'This is the first line!',
    '1' => 'This is the second line!',
    '2' => 'This is the last line!',
    ),
    );
    // 传递一个普通的 php 对象(变量)到视图。
    $this->view->content = $foobar;
    }
    }