2010-10-01 63 views
2

我正在開發一個使用zend框架的網站。zend框架網址並獲取方法

我有一個搜索表單與get方法。當用戶點擊提交按鈕後查詢字符串出現在url後?標記。但我希望它像zend zend一樣。

是否有可能?

回答

3

與JS方法一樣,您可以重定向回您想要的首選URL。即讓表單通過GET提交,然後重定向到ZF路由樣式。

然而,這是過度殺傷,除非你有一個很好的理由要爲你的搜索查詢創建整潔的URL。一般而言,搜索表單應該發送一個可以加入書籤的GET查詢。在URL中,param = val樣式參數沒有問題:-)

ZF URL有點奇怪,它們強制URL參數成爲主URL的一部分。即domain.com/controller/action/param/val/param2/val而不是domain.com/controller/action?param=val & param2 = val

這並不總是你想要的,但似乎是方式框架正在與URL參數

+0

+1雖然重定向似乎應該是不必要的,這似乎是要走的路。用可重複使用的控制器方法查看我的答案以獲得該行爲。 – timdev 2011-02-23 23:42:36

2

沒有明顯的解決方案。由zf生成的表單將是一個標準的html表單。當使用瀏覽器提交得到它會導致類似

/action/specified/in/form?var1=val1&var2=var2 

只有解決方案的請求得到一個「zendlike URL」(即一個/纔好?或&),將使用JavaScript來破解表單提交。例如,您可以偵聽onSubmit,中止提交併將瀏覽器重定向到已轉換的網址。我個人不相信這個解決方案值得增加複雜性,但它應該執行你正在尋找的東西。

2

經過一天半的肆虐,並盡我所能找出正確的方式來做到這一點相當簡單,我放棄了並做了以下。我仍然不相信沒有更好的辦法。

需要這個的用例是一個簡單的記錄列表,帶有一個用於添加一些過濾器(通過GET)的頂部表單,可能是一些列排序,並且引入Zend_Paginate以實現良好的度量。我在我的分頁部分中使用Url視圖助手遇到了問題,但我懷疑即使只是排序和過濾器形式,Zend_View_Helper_Url仍然會掉下來。

但我離題了。我的解決方案是將一個方法添加到我的基本控制器類中,該方法將任何原始查詢字符串參數與現有的zend樣式斜槓參數合併,並重定向(但僅在必要時)。該方法可以在任何不需要處理POST的操作中調用。

希望有人會發現這有用。或者更好,找到更好的方法:

/** 
    * Translate standard URL parameters (?foo=bar&baz=bork) to zend-style 
    * param (foo/bar/baz/bork). Query-string style 
    * values override existing route-params. 
    */ 
    public function mergeQueryString(){ 
    if ($this->getRequest()->isPost()){ 
     throw new Exception("mergeQueryString only works on GET requests."); 
    }  
    $q = $this->getRequest()->getQuery(); 
    $p = $this->getRequest()->getParams(); 
    if (empty($q)) { 
     //there's nothing to do. 
     return; 
    } 
    $action = $p['action']; 
    $controller = $p['controller']; 
    $module = $p['module']; 
    unset($p['action'],$p['controller'],$p['module']); 
    $params = array_merge($p,$q); 
    $this->_helper->getHelper('Redirector') 
      ->setCode(301)    
      ->gotoSimple(
        $action, 
        $controller, 
        $module, 
        $params); 

    }