2011-02-11 97 views
2

我对CakePHP比较新,想知道用户如何构造他们的ajax方法。代码的目的是为jQuery自动完成创建一个匹配产品的JSON列表。这是CakePHP自动完成的可接受的Ajax操作吗?

function autocomplete() { 
      $terms = $this->params['url']['q']; 
      if (!$this->RequestHandler->isAjax()) { 
       $products = $this->Product->find('list', array(
        'conditions' => array(
         'Product.name LIKE' => '%'.$terms.'%', 
        ), 
        'limit' => 7, 
        'order' => 'Product.name', 
        'contain' => false 
       )); 
       exit(json_encode($products)); 
      } else { 
       $this->redirect(); 
      } 
     } 

感觉有点胆量,只是抛出一个出口(),但话又说回来,我不需要运行任何意见做我肯定?

+0

没错那也没关系,我做同样的方式。 – Sergei 2011-02-12 01:12:08

+0

没有它也不行,因为这是“观看”代码的“控制器”,MVC 101 – dogmatic69 2011-02-12 01:21:53

回答

5

这是我在过去所做的那样:

config/routes.php,添加以下内容:

Router::mapResources(array('restaurants', 'items')); 
Router::parseExtensions('json'); 

app/app_controller.php

function beforeFilter() { 
    if ($this->isApiCall()) { 
     Configure::write('debug', 0); 
    } 
} 

function isApiCall() { 
    return $this->RequestHandler->isAjax() 
     || $this->RequestHandler->isXml() 
     || $this->RequestHandler->prefers('json'); 
} 

然后在app/views/itemsapp/views/restaurants,我有一个json文件夹下每个与相应的视图文件控制器中的每个操作。请求使用.json扩展名。

最后,我有一个布局文件中app/views/layouts/json/default.ctp有以下几点:

<?php echo $content_for_layout; ?> 

例如,http://mydomain.com/items/view.json映射到app/views/items/json/view.ctp包含:

<?php echo $javascript->object($item); ?> 

$item被填充在app/controllers/items_controller.php文件。

不知道这有助于为增加了混乱,但这就是我用JSON在我的CakePHP应用程序。

UPDATE:新增布局信息。

0

我用什么也没有一个Ajax布局除了

<?php echo $content_for_layout ?> 

然后我让我在其中回声JSON编码变量的autocomplete.ctp图。

autocomplete.ctp

<?php echo json_encode($products); ?>