2011-10-12 44 views
1

使用jQuery自動完成在Zend和建立我們的這樣jQuery自動完成mysql zend沒有來自動作/控制器的迴應?

public function ajaxautocompleteAction() 
{ 
    $postData = $this->_request->getParams(); 
    $term = $postData['term']; 
    $categoryObj = new Categories(); 
    $result = $categoryObj->searchCategory($term); 
    $this->view->result = $result; 
} 

在視圖文件中的JavaScript動作此

$(function() { 
     var url = "http://www.domain.com/account/ajaxautocomplete?format=json"; 
     $("#autotest").autocomplete({ 
      minLength: 2, 
      source: function(request, response){ 
       var iterm = request.term; 
       var url = "http://www.domain.com/account/ajaxautocomplete?format=json"; 
       $.post(url, {term: iterm}, 
       function(data) { 
      response(data); }); 
      } 
    }); 
}); 

在Chrome控制檯我得到這個錯誤是

的XMLHttpRequest無法加載http://www.domain.com/account/ajaxautocomplete?format=json。 Access-Control-Allow-Origin不允許原產地http://domain.com

任何想法爲什麼沒有從ajax請求獲得結果?

+0

編輯我們的網址對非WWWW這是他們在Zend中集如何開始工作,我在Chrome控制檯中看到「XHR加載完成:......」但沒有選擇列表 – Anagio

+0

鉻控制檯顯示XHR完成加載:「http://domain.com/account/ajaxautocomplete?format=json」它應該有?term = asdf是我開始鍵入的字母,但它不會選擇它,任何想法? – Anagio

回答

2

這是怎麼我用jQueryUI的的自動完成和ZF前...

  1. 創建行動

    public function ajaxautocompleteAction() 
    { 
        $term = $this->getRequest()->getParam('term'); 
        $categoryObj = new Categories(); 
        $result = $categoryObj->searchCategory($term); 
        $this->view->result = $result; 
    } 
    
  2. 的AjaxContext添加到您的行動,禁用自動JSON序列化。我跳過自動序列化,因爲它不是普遍的模式,以代表通常的「標籤」 /「值」對jQueryUI的的automcomplete查找

    public function init() 
    { 
        $this->_helper->ajaxContext->addActionContext('ajaxautocomplete', 'json') 
               ->setAutoJsonSerialization(false) 
               ->initContext('json'); 
    } 
    
  3. 創建JSON視圖(views/scripts/account/ajaxautocomplete.json.phtml

    <?php 
    $data = array(); 
    foreach ($this->results as $category) { 
        // format each result for jQueryUI autocomplete 
        $data[] = array(
         'label' => $category->getName(), 
         'value' => $category->getName() 
        );    
    } 
    echo Zend_Json::encode($data); 
    
  4. 添加網址爲您自動完成動作的JavaScript變量需要使用它的視圖(假設你使用HeadScript助手在你的佈局)

    $this->headScript()->prependScript(sprintf('var searchUrl = "%s";', 
        $this->url(array(
         'action'  => 'ajaxautocomplete', 
         'controller' => 'account' 
        ), null, true))); 
    
  5. 設置你的JavaScript這樣

    $("#autotest").autocomplete({ 
        source: searchUrl, 
        minLength: 2 
    }); 
    
+0

謝謝,你能夠從你的數據庫獲得行ID,並設置輸入名稱/ ID?你是否用任何代碼驗證它,以便用戶不輸入一些不是來自你的數據庫表的值? – Anagio

+1

在這種情況下,我建議使用帶有select元素的標準Zend Form,並使用[Chosen plugin](http://harvesthq.github.com/chosen/)對其進行增強(http://harvesthq.github.com/chosen/) – Phil

+0

此插件非常感謝! – Anagio

-1

貌似domain.com不允許跨域呼叫。

嘗試chrome.exe --disable-web-security

+0

我不認爲這是答案,我們所有的網站訪問者都無法通過Chrome瀏覽器進行此操作。我看不到有什麼文件://與此有關?我們從我們的mysql表中獲取了一個類別列表,試圖通過zend操作將它變成一個自動完成。 – Anagio

+0

請忘記'file://',我之前編輯答案:) 當然,你的訪問者不會設置chrome。 這是您的網絡服務器,不允許這種類型的請求。嘗試添加響應標題,如'header(「訪問控制 - 允許 - 來源:http://domain.com」)' – TarasB