CakePHP1.1のページングでGETパラメータを正しく引き継ぐ

9月 27th, 2008 admin Posted in CakePHP, PHP | コメントは受け付けていません。

以前にCakePHP1.1用のPaginationコンポーネントを紹介したんですが、getパラメータに配列を使うと正しくリンクを作ってくれなかったのでそれの補足。

要するにhttp://example.com/?data[Search][name]=1とかって感じの配列がGETパラメータにある場合に、このパラメータを引き継いでくれない(data=Arrayとかってなる)バグを修正した。

/views/helpers/pagination.phpの_generateUrlってメソッドを修正する。
http_build_queryっていう関数を使ったんですが、これは配列もしくはオブジェクトからURL エンコードされたクエリ文字列を生成する関数で、なんと多次元配列にも対応している。さすがPHP!(オブジェクトに対応してるほうが変か)

PHP:
  1. function _generateUrl ($page=NULL,$pageDetails=NULL)
  2.     {
  3.         $pageDetails = $pageDetails?$pageDetails:$this->_pageDetails;
  4.         $getParams = $this->getParams; // Import any other pre-existing get parameters
  5.         if ($this->_pageDetails['paramStyle']=="pretty")
  6.         {
  7.             $pageParams=$pageDetails['importParams'];
  8.         }
  9.         $pageParams['show'] = $pageDetails['show'];
  10.         $pageParams['sortBy'] = $pageDetails['sortBy'];
  11.         $pageParams['direction'] = $pageDetails['direction'];
  12.         $pageParams['page'] = $page?$page:$pageDetails['page'];
  13.         if (isset($pageDetails['sortByClass']))
  14.         {
  15.             $pageParams['sortByClass'] = $pageDetails['sortByClass'];
  16.         }
  17.         $getString = Array();
  18.         $prettyString = Array();
  19.         if ($pageDetails['paramStyle']=="get")
  20.         {
  21.             $getParams = am($getParams,$pageParams);
  22.         }
  23.         else
  24.         {
  25.             foreach($pageParams as $key => $value)
  26.             {
  27.                 if (isset($pageDetails['Defaults'][$key]))
  28.                 {
  29.                     if (up($pageDetails['Defaults'][$key])<>up($value))
  30.                     {
  31.                         $prettyString[] = "$key{$pageDetails['paramSeperator']}$value";
  32.                     }
  33.                 }
  34.                 else
  35.                 {
  36.                     $prettyString[] = "$key{$pageDetails['paramSeperator']}$value";
  37.                 }
  38.             }
  39.         }
  40.  
  41.         $url = $this->url;
  42.         if ($prettyString)
  43.         {
  44.             $prettyString = implode ("/", $prettyString);
  45.             $url .= $prettyString;
  46.         }
  47.         if ($getParams)
  48.         {
  49.             $url .= "?". http_build_query($getParams);
  50.         }
  51.         return $url;
  52.     }

Comments are closed.