Example #1
0
 /**
  * Debe retornar true si pasa o un ViewCommand si no pasa, o sea redireccionar o ejecutar una accion de un cotroller o hacer render de un string...
  * FIXME: $app ya no es necesario xq el filtro es por app.
  */
 public function apply($app, $controller, $action)
 {
     $mode = YuppConfig::getInstance()->getCurrentMode();
     // En prod no deberia poder ejecutar las acciones de gestion de CoreController
     if ($mode == YuppConfig::MODE_PROD) {
         return ViewCommand::display('403', new ArrayObject(array('message' => 'No puede ejecutar tareas de gestión en modo PROD')), new ArrayObject());
     }
     // En otro caso, lo dejo pasar tranquilo
     return true;
 }
Example #2
0
 public function execAction($controller, $action, $params)
 {
     // El nombre de la clase es el que viene en la url + 'Controller''
     $controllerClassName = strtoupper($controller[0]) . substr($controller, 1) . "Controller";
     YuppLoader::load('apps.' . $this->name . '.controllers', $controllerClassName);
     // The controller action should have 'Action' suffix4
     $actionMethod = $action;
     if (!String::endsWith($actionMethod, 'Action')) {
         $actionMethod .= 'Action';
     }
     $this->controller = new $controllerClassName($params);
     // TODO: Can throw method doesnt exist exception, verify if class method exists
     if (!method_exists($this->controller, $actionMethod)) {
         // Si la accion no existe, se puede estar llamando al render de una vista
         if (file_exists('apps/' . $this->appName . '/views/' . $this->controllerName . '/' . $this->actionName . '.view.php')) {
             // Render directo de la vista
             return $this->render($actionMethod);
         } else {
             return ViewCommand::display('404', new ArrayObject(array('message' => "No se encuentra la accion '{$action}' en {$controllerClassName}")), new ArrayObject());
         }
     }
     // La accion existe, pero puede dar errores en la
     // ejecucion, devuelve 500 si da error.
     try {
         $model_or_command = $this->controller->{$actionMethod}();
     } catch (Exception $e) {
         // No existe la accion o cualquier otra excepcion que pueda tirar
         // Tira 500: Internal Server Error
         $model_or_command = ViewCommand::display('500', new ArrayObject(array('message' => $e->getMessage(), 'traceString' => $e->getTraceAsString(), 'trace' => $e->getTrace(), 'exception' => $e)), new ArrayObject());
     }
     //Logger::struct( $model_or_command, "MODEL OR COMMAND, " . __FILE__ . " " . __LINE__ );
     // ======================================================================================
     // Procesa model_or_command para devolver siempre command
     // Si no verifico por null antes que por get_class,
     // get_class(NULL) me tira error en la ultima version de PHP.
     if ($model_or_command === NULL) {
         // Nombre de la vista es la accion.
         $view = $action;
         // El modelo que se devuelve es solo los params submiteados.
         return ViewCommand::display($view, $this->controller->getParams(), $this->controller->getFlash());
     }
     if (is_array($model_or_command)) {
         // Nombre de la vista es la accion.
         $view = $action;
         $returnedParams = new ArrayObject($model_or_command);
         // Se juntan los params con el arrray devuelto
         // Tengo que transformar getParams a array porque es ArrayObject
         $allparams = array_merge((array) $this->controller->getParams(), $model_or_command);
         //$allparams = array_merge( (array)$app->getExecActionParams(), $model_or_command );
         // El modelo que se devuelve es solo los params submiteados.
         // Tengo que transformar allParams a ArrayObject porque es lo que espera el metodo display()
         return ViewCommand::display($view, new ArrayObject($allparams), $this->controller->getFlash());
     }
     if (get_class($model_or_command) === 'ViewCommand') {
         return $model_or_command;
     }
     // El controlador devuelve otra cosa que no es null, ni array ni un comando,
     // el programador cometio un error y no siguio las convensiones.
     return ViewCommand::display('500', new ArrayObject(array('message' => 'Error: verifique lo que retorna de la accion: ' . $controller . '::' . $action . '. Solo puede devolver null, array asociativo con modelo o un comando render/redirect/renderString/renderTemplate')), new ArrayObject());
 }
 private static function render($logic_route, $command, $context, $router)
 {
     // Configuro el command para la view...
     // Si la pagina es fisica
     $pagePath = 'apps/' . $logic_route['app'] . '/views/' . $logic_route['controller'] . '/' . $command->viewName() . '.view.php';
     //echo $pagePath . '<br/>';
     //Logger::struct($logic_route, 'render logic route');
     //Logger::struct($command, 'render command');
     //$pagePath = realpath('./'.$pagePath); // Resuelve .. y .
     // FIXME: en linux puede tener problemas resolviendo . y .. en la path, necesitaria resolverla a la canonica
     //        realpath se desactiva en algunos hostings por temas de seguridad, habria que implementar una alternativa
     //        http://php.net/manual/en/function.realpath.php
     if (!file_exists($pagePath)) {
         // Intento resolver path con .. en linux
         $pagePath = preg_replace('/\\w+\\/\\.\\.\\//', '', $pagePath);
         // Saca .. pero no saca . y deberia
     }
     //echo $pagePath . '<br/>';
     //apps/cms2/views/page/../cms/displayPageRO.view.php
     //apps/cms2/views/cms/displayPageRO.view.php
     // Si la ruta referenciada no existe, intento mostrar la vista de scafolding correspondiente
     // a la accion, pero las acciones con vistas dinamicas son solo para acciones: 'show','list','edit','create'.
     if (!file_exists($pagePath)) {
         //Logger::getInstance()->log("no existe pagePath $pagePath " . __FILE__);
         //Logger::getInstance()->log("view name es " . $command->viewName());
         // Si puedo mostrar la vista dinamica:
         if (in_array($command->viewName(), array('show', 'list', 'edit', 'create', 'index', 'appControllers', 'dbStatus'))) {
             $pagePath = 'core/mvc/view/scaffoldedViews/' . $command->viewName() . '.view.php';
             // No puede no existir, es parte del framework!
         } else {
             if (is_numeric($command->viewName())) {
                 // FIXME: verificar que existe, porque no se implementaron todos los errores...
                 $pagePath = 'core/mvc/view/error/' . $command->viewName() . '.view.php';
                 // No puede no existir, es parte del framework!
                 // FIXME: poner un error general por si no esta en la lista
                 $codes = array(403 => 'Forbidden', 404 => 'Not Found', 500 => 'Internal Server Error');
                 header("HTTP/1.0 " . $command->viewName() . " " . $codes[$command->viewName()]);
             } else {
                 // Tira 404: Not Found
                 // Sobreescribo el command
                 $command = ViewCommand::display('404', new ArrayObject(array('message' => 'La vista <b>' . $pagePath . '</b> no existe')), new ArrayObject());
                 $pagePath = 'core/mvc/view/error/404.view.php';
                 header("HTTP/1.0 404 Not Found");
             }
         }
         // FIXME: con esto de arriba no es necesario tener mas el "mode".
     }
     $command->setPagePath($pagePath);
     // FIXME: No se usa para nada el pagePath en el command.
     // Model va a ser accedida desde las vistas.
     $model = Model::getInstance();
     $model->setModel($command->params());
     // $command->params() es el modelo devuelto por la accion del controller.
     $model->addFlash($command->flash());
     // Solucion a agregar flash cuando se hace redirect
     $model->addFlash($router->getFlashParams());
     /// ACTUALIZAR CONTEXTO ///
     $context->setModel($model);
     //$context->update();
     /// ACTUALIZAR CONTEXTO ///
     $layoutManager = LayoutManager::getInstance();
     $layoutManager->renderWithLayout($pagePath);
 }
 /**
  * redirect( $params )
  * Redirige el flujo de ejecucion de una accion de un controller a una accion del mismo o de otro controller.
  * 
  * @param $params mapa de parametros en la forma nombre=>valor. Un elemento especial es "params", que es a su vez un mapa de parametros para el request que se lanza.
  */
 public function redirect($params)
 {
     $ctx = YuppContext::getInstance();
     if (isset($params['app']) || array_key_exists('app', $params)) {
         // Si no me lo pasan, tengo que poner el actual.
         $app = $params['app'];
     } else {
         $app = $ctx->getApp();
     }
     if (isset($params['controller']) || array_key_exists('controller', $params)) {
         // Si no me lo pasan, tengo que poner el actual.
         $controller = $params['controller'];
     } else {
         $controller = $ctx->getController();
     }
     // FIXME: si no se le pasa action se ejecuta la accion index?? deberia tirar una excepcion si no me pasan la accion??
     $action = $params['action'];
     if (!isset($params['params'])) {
         $params['params'] = array();
     }
     return ViewCommand::execute($app, $controller, $action, $params['params'], $this->flash);
 }