2011-10-26 17 views
5

Cuando llamo a un router, como a continuación en Zend:Obtenga todos los parámetros después de la acción en Zend?

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

Y dentro del controlador cuando llegue $this->_params, me sale una matriz:

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

Pero quiero conseguir solamente:

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

¿Podría decirme una manera de obtener todos los params justo después de t él action?

Respuesta

6

Hasta donde yo sé, siempre obtendrá el controlador, la acción y el módulo en la lista de parámetros, ya que es parte del valor predeterminado. Se podría hacer algo como esto para eliminar las tres de la matriz que se obtiene:

$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']); 

Alternativamente y cuando no se desea estar haciendo que cada vez que necesita la lista, crear un ayudante que lo haga por usted, algo como esto:

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(); 
    } 
} 

Y sólo tiene que llamar esto desde el controlador para obtener la lista:

$this->_helper->myparams(); 

Así, por ejemplo, mediante la URL:

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

Y el código:

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

me sale el siguiente conjunto impresas

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

¿por qué hay una necesidad de escribir un ayudante si '$ this-> getRequest() -> getParams()' devuelve el valor esperado? –

+0

Porque, si lees la pregunta de los carteles, no devuelve los valores esperados, el cartel __no quiere__ quiere el controlador, la acción y el módulo de la matriz. '$ this-> getRequest() -> getParams()' __WILL__ los devuelve en su matriz. Por lo tanto, eliminándolos con 'unset', pero si la matriz se usará varias veces o en diferentes controladores, es más fácil usar un helper y menos código en el controlador. – Scoobler

3

¿Qué tal esto?

En controlador:

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

Pretty torpe; puede necesitar algunas verificaciones isset() para evitar advertencias; podría bloquear este segmento en su propio método o ayudante. Pero haría el trabajo, ¿verdad?

+0

Consulte la respuesta de @ Scoobler, que llena los detalles que menciono. –

10

mi humilde opinión esto es más elegante e incluye cambios en la acción , controlador y claves de método.

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

¿Cómo puedo decir "muchas gracias"? Amo tu respuesta. – vietean

+0

De hecho, eso es elegante. ;-) –

Cuestiones relacionadas