2011-10-26 6 views
5

私はZendの中に以下のようにルータを呼び出す:Zendのアクション後にすべてのパラメータを取得しますか?

coupon/index/search/cat/1/page/1/x/111/y/222

そして、コントローラ内部で、私は$this->_paramsを得るとき、私は配列を取得:

array(
    'module' => 'coupon', 
    'controller' => 'index', 
    'action' => 'search', 
    'cat' => '1', 
    'page' => '1', 
    'x' => '111', 
    'y' => '222' 
) 

をしかし、私は唯一取得したい:

array(
    'cat' => '1', 
    'page' => '1', 
    'x' => '111', 
    'y' => '222' 
) 

あなたは私にすべてを得る方法を教えてください。params tの直後彼action

答えて

6

私が知る限り、デフォルトの一部であるため、コントローラ、アクション、モジュールは常にparamsリストに表示されます。あなたは、あなたが得る配列から3を削除するには、このような何かを行うことができます:あなたがリストを必要とするたびに、あなたのためにそれを行うためのヘルパーを作成することをやっているしたくないよう

また
$url_params = $this->getRequest()->getUserParams(); 
    if(isset($url_params['controller'])) 
     unset($url_params['controller']); 
    if(isset($url_params['action'])) 
     unset($url_params['action']); 
    if (isset($url_params['module'])) 
     unset($url_params['module']); 

、このような何か:

class Helper_Myparams extends Zend_Controller_Action_Helper_Abstract 
{ 
    public $params; 

    public function __construct() 
    { 
     $request = Zend_Controller_Front::getInstance()->getRequest(); 
     $this->params = $request->getParams(); 
    } 

    public function myparams() 
    {  
     if(isset($this->params['controller'])) 
      unset($this->params['controller']); 
     if(isset($this->params['action'])) 
      unset($this->params['action']); 
     if (isset($this->params['module'])) 
      unset($this->params['module']); 
     return $this->params; 
    } 

    public function direct() 
    { 
     return $this->myparams(); 
    } 
} 

そして、あなたは、単にリストを取得するために、あなたのコントローラからこれを呼び出すことができます。

$this->_helper->myparams(); 

http://127.0.0.1/testing/urls/cat/1/page/1/x/111/y/222 

とコード:私は次の配列が印刷されます

echo "<pre>"; 
print_r($this->_helper->myparams()); 
echo "</pre>"; 

:これは、よりエレガントで、行動の変化を含んで

Array 
(
    [cat] => 1 
    [page] => 1 
    [x] => 111 
    [y] => 222 
) 
+0

'$ this-> getRequest() - > getParams()'が期待値を返すなら、ヘルパーを書く必要があるのはなぜですか? –

+0

ポスターの質問を読むと、予想される値が返されないため、ポスターはコントローラー、アクション、およびモジュールをアレイ内で必要としません。 '$ this-> getRequest() - > getParams()' __WILL__は配列内でそれらを返します。したがって、 'unset'でそれらを削除します - しかし、配列が複数回使用される場合、または異なるコントローラーで使用される場合は、コントローラーでヘルパーと少ないコードを使用する方が簡単です。 – Scoobler

3

これはいかがですか?コントローラで

$params = $this->getRequest()->getParams(); 
unset($params['module']; 
unset($params['controller']; 
unset($params['action']; 

かなり不格好。警告を避けるために何らかのisset()チェックが必要な場合があります。このセグメントを独自のメソッドまたはヘルパーに詰まらせる可能性があります。しかしそれは仕事をするだろう、そう?

+0

@ Scooblerの回答を参照してください。これは、私が言及している詳細をうまく示しています。 –

10

私見だから例えばURLを使用して、コントローラとメソッドキー。

$request = $this->getRequest(); 
$diffArray = array(
    $request->getActionKey(), 
    $request->getControllerKey(), 
    $request->getModuleKey() 
); 
$params = array_diff_key(
    $request->getUserParams(), 
    array_flip($diffArray) 
); 
+0

「どうもありがとうございました」あなたの答えを愛してください。 – vietean

+0

実際、それは優雅です。 ;-) –

関連する問題