/** * 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; }
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); }