Ver Mensaje Individual
  #2 (permalink)  
Antiguo 17/08/2012, 07:51
Avatar de Uncontroled_Duck
Uncontroled_Duck
Colaborador
 
Fecha de Ingreso: mayo-2011
Ubicación: Málaga [Spain]
Mensajes: 806
Antigüedad: 13 años
Puntos: 261
[SOLUCIONADO] Respuesta: Controlar error de url en plugin

Buenas, al final lo he solucionado de otra forma, no se si será buena, pero al menos funciona y controla lo que esperaba.

Probé con el ejemplo que viene en el manual de Zend, control de excepciones, pero me daba error el ejemplo que tienen. (Lo pongo mas abajo por si alguien le sirve o quiere probarlo)

Entonces, encontré esta función en stackoverflow, que con un par de ajustes se adapta a lo que buscaba.

Con la función $this->_actionExists, comprueba en el array que existen los modulos, controllers y actions que se piden.

En función de si retorna true o false, despacha el error, continua con el acl, o añade el nuevo recurso a la db para gestionar después los permisos.

Código PHP:
public function preDispatch(Zend_Controller_Request_Abstract $request)
{
    
// else show the error
    
$this->_mca false;
    if( 
$frontController->getDispatcher()->isDispatchable($request) &&
        
$this->_actionExists($module$controller$action) )
    {
        
// if dispatchable do some stuff
        
$this->_mca true;
    }


Código del Manual Zend
Código PHP:
class My_Controller_PreDispatchPlugin extends Zend_Controller_Plugin_Abstract
{
    public function 
preDispatch(Zend_Controller_Request_Abstract $request)
    {
        
$front      Zend_Controller_Front::getInstance();
        
$dispatcher $front->getDispatcher();
        
$class      $dispatcher->getControllerClass($request);
        if (!
$controller) {
            
$class $dispatcher->getDefaultControllerClass($request);
        }

        
$r      = new ReflectionClass($class);
        
$action $dispatcher->getActionMethod($request);

        if (!
$r->hasMethod($action)) {
            
$defaultAction  $dispatcher->getDefaultAction();
            
$controllerName $request->getControllerName();
            
$response       $front->getResponse();
            
$response->setRedirect('/' $controllerName
                                  
'/' $defaultAction);
            
$response->sendHeaders();
            exit;
        }
    }

Saludos,
__________________
Todos agradeceremos que pongas el código en su respectivo Highlight