* Copyright (C) SowerPHP (http://sowerphp.org) * * Este programa es software libre: usted puede redistribuirlo y/o * modificarlo bajo los términos de la Licencia Pública General Affero de GNU * publicada por la Fundación para el Software Libre, ya sea la versión * 3 de la Licencia, o (a su elección) cualquier versión posterior de la * misma. * * Este programa se distribuye con la esperanza de que sea útil, pero * SIN GARANTÍA ALGUNA; ni siquiera la garantía implícita * MERCANTIL o de APTITUD PARA UN PROPÓSITO DETERMINADO. * Consulte los detalles de la Licencia Pública General Affero de GNU para * obtener una información más detallada. * * Debería haber recibido una copia de la Licencia Pública General Affero de GNU * junto a este programa. * En caso contrario, consulte <http://www.gnu.org/licenses/agpl.html>. */ namespace sowerphp\core; /** * @file es.php * Reglas de español para clase Inflector * @author http://joecabezas.tumblr.com/post/572538183/espanolizando-cakephp-mediante-inflections-version * @version 2014-05-10 */ // reglas para pasar de plural a singular Utility_Inflector::rules('singular', array('rules' => array('/bles$/i' => 'ble', '/ses$/i' => 's', '/([r|d|j|n|l|m|y|z])es$/i' => '\\1', '/as$/i' => 'a', '/([ti])a$/i' => '\\1a'), 'irregular' => array(), 'uninflected' => array())); // reglas para pasar de singular a plural Utility_Inflector::rules('plural', array('rules' => array('/([r|d|j|n|l|m|y|z])$/i' => '\\1es', '/a$/i' => '\\1as'), 'irregular' => array('pais' => 'paises'), 'uninflected' => array()));
/** * Método que obtiene un objeto que es FK de este * @param fk Nombre de la clase que es la FK (sin Model_) * @param args Argunentos con la PK del objeto que es FK * @return Model_FK * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]delaf.cl) * @version 2015-04-24 */ private function getFK($fk, $args) { $fkClass = $this::$fkNamespace['Model_' . $fk] . '\\Model_' . $fk; // si la clase no existe error if (!class_exists($fkClass)) { throw new Exception_Model_Missing(array('model' => $fkClass)); } $fkClasss = \sowerphp\core\Utility_Inflector::pluralize($fkClass); // tratar de recuperar con la clase plural (para usar caché) // clase plural sólo existe al tener la extesión sowerphp\app if (class_exists($fkClasss)) { if (isset($args[0])) { return (new $fkClasss())->get($args[0]); } else { return (new $fkClasss())->get($this->{Utility_Inflector::underscore($fk)}); } } else { if (isset($args[0])) { return new $fkClass($args[0]); } else { return new $fkClass($this->{Utility_Inflector::underscore($fk)}); } } }
/** * Método para renderizar una página * El como renderizará dependerá de la extensión de la página encontrada * @param page Ubicación relativa de la página * @param location Ubicación de la vista * @return Buffer de la página renderizada * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]delaf.cl) * @version 2014-12-18 */ public function render($page, $location = null) { // buscar página if ($location) { $location = self::location(\sowerphp\core\App::layer($location) . '/' . $location . '/View/' . $page); } else { $location = self::location($page, $this->request->params['module']); } // si no se encontró error if (!$location) { if ($this->request->params['controller'] == 'pages') { $this->render('/error/404'); } else { throw new Exception_View_Missing(array('view' => $page, 'controller' => Utility_Inflector::camelize($this->request->params['controller']), 'action' => $this->request->params['action'])); } return; } // preparar _header_extra (se hace antes de renderizar la página para // quitarlo de las variables por si existe if (isset($this->viewVars['_header_extra'])) { $_header_extra = ''; if (isset($this->viewVars['_header_extra']['css'])) { foreach ($this->viewVars['_header_extra']['css'] as &$css) { $_header_extra .= ' <link type="text/css" href="' . $this->request->base . $css . '" rel="stylesheet" />' . "\n"; } } if (isset($this->viewVars['_header_extra']['js'])) { foreach ($this->viewVars['_header_extra']['js'] as &$js) { $_header_extra .= ' <script type="text/javascript" src="' . $this->request->base . $js . '"></script>' . "\n"; } } unset($this->viewVars['_header_extra']); } else { $_header_extra = ''; } // dependiendo de la extensión de la página se renderiza $ext = substr($location, strrpos($location, '.') + 1); $class = App::findClass('View_Helper_Pages_' . ucfirst($ext)); $page_content = $class::render($location, $this->viewVars); if ($this->layout === null) { return $page_content; } // buscar archivo del tema que está seleccionado, si no existe // se utilizará el tema por defecto $layout = $this->getLayoutLocation($this->layout); if (!$layout) { $this->layout = $this->defaultLayout; $layout = $this->getLayoutLocation($this->layout); } // página que se está viendo if (!empty($this->request->request)) { $slash = strpos($this->request->request, '/', 1); $page = $slash === false ? $this->request->request : substr($this->request->request, 0, $slash); } else { $page = '/' . Configure::read('homepage'); } // determinar module breadcrumb $module_breadcrumb = []; if ($this->request->params['module']) { $modulos = explode('.', $this->request->params['module']); $url = ''; foreach ($modulos as &$m) { $link = Utility_Inflector::underscore($m); $module_breadcrumb[$link] = $m; $url .= '/' . $link; } $module_breadcrumb += explode('/', substr(str_replace($url, '', $this->request->request), 1)); } // determinar titulo $titulo_pagina = isset($this->viewVars['header_title']) ? $this->viewVars['header_title'] : $this->request->request; // renderizar layout de la página (con su contenido) return View_Helper_Pages_Php::render($layout, array_merge(array('_header_title' => Configure::read('page.header.title') . ($titulo_pagina ? ': ' . $titulo_pagina : ''), '_body_title' => Configure::read('page.body.title'), '_footer' => Configure::read('page.footer'), '_header_extra' => $_header_extra, '_page' => $page, '_nav_website' => Configure::read('nav.website'), '_nav_app' => Configure::read('nav.app'), '_timestamp' => date(Configure::read('time.format'), filemtime($location)), '_layout' => $this->layout, '_content' => $page_content, '_module_breadcrumb' => $module_breadcrumb), $this->viewVars)); }
*/ public static function variable($string) { if (!($result = self::_cache(__FUNCTION__, $string))) { $string2 = self::camelize(self::underscore($string)); $replace = strtolower(substr($string2, 0, 1)); $result = preg_replace('/\\w/', $replace, $string2, 1); self::_cache(__FUNCTION__, $string, $result); } return $result; } /** * Returns a string with all spaces converted to underscores (by default), accented * characters converted to non-accented characters, and non word characters removed. * * @param string $string the string you want to slug * @param string $replacement will replace keys in map * @return string * @link http://book.cakephp.org/2.0/en/core-utility-libraries/inflector.html#Inflector::slug */ public static function slug($string, $replacement = '_') { $quotedReplacement = preg_quote($replacement, '/'); $merge = array('/[^\\s\\p{Ll}\\p{Lm}\\p{Lo}\\p{Lt}\\p{Lu}\\p{Nd}]/mu' => ' ', '/\\s+/' => $replacement, sprintf('/^[%s]+|[%s]+$/', $quotedReplacement, $quotedReplacement) => ''); $map = self::$_transliteration + $merge; return preg_replace(array_keys($map), array_values($map), $string); } } // Store the initial state Utility_Inflector::reset();
/** * Método que renderiza la vista del controlador * @param view Vista que se desea renderizar * @param location Ubicación de la vista * @return Objeto Response con la página ya renderizada * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]delaf.cl) * @version 2014-04-22 */ public function render($view = null, $location = null) { // Ejecutar eventos que se deben realizar antes de renderizar $this->beforeRender(); // Si la vista es nula se carga la vista según el controlador y accion solicitado if (!$view) { $view = Utility_Inflector::camelize($this->request->params['controller']) . '/' . $this->request->params['action']; } // Crear vista para este controlador if (!$this->View) { $this->View = new View($this); } // Renderizar vista y layout $this->response->body($this->View->render($view, $location)); // Entregar respuesta return $this->response; }
/** * Determina a partir de una URL si esta corresponde o no a un módulo, * en caso que sea un módulo lo carga (aquí se hace la carga real del * módulo que se indicó con self::uses()) * @param url Solicitud realizada (sin la base de la aplicación) * @return Nombre del módulo si es que existe uno en la url * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]delaf.cl) * @version 2014-03-22 */ public static function find($url) { // Separar por "/" $partes = explode('/', $url); // Quitar primer elemento, ya que si parte con / entonces será vacío if (!strlen($partes[0])) { array_shift($partes); } // Determinar hasta que elemento de la url corresponde a parte de un modulo $npartes = count($partes); $hasta = -1; for ($i = 0; $i < $npartes; ++$i) { // armar nombre del modulo $module = array(); for ($j = 0; $j <= $i; ++$j) { $module[] = Utility_Inflector::camelize($partes[$j]); } $module = implode('.', $module); // determinar si dicho modulo existe if (array_key_exists($module, self::$_modules)) { $hasta = $i; } } // Si $hasta es mayor a -1 if ($hasta >= 0) { // Armar nombre final del modulo (considerando hasta $hasta partes del arreglo de partes) $module = array(); for ($i = 0; $i <= $hasta; ++$i) { $module[] = Utility_Inflector::camelize($partes[$i]); } // cargar módulo $module = implode('.', $module); // retornar nombre del modulo return $module; } else { return ''; } }
/** * Método que quita el módulo solicitado de la parte de la URL * @param url URL * @param module Nombre del módulo (ejemplo: Nombre.De.ModuloQueSeEjecuta) * @return URL sin el módulo * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]delaf.cl) * @version 2014-10-01 */ private static function urlClean($url, $module) { if ($module) { $url = substr(Utility_String::replaceFirst(str_replace('.', '/', Utility_Inflector::underscore($module)), '', $url), 1); } return $url; }
/** * Método que obtiene el controlador * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]delaf.cl) * @version 2014-03-22 */ private static function _getController(Network_Request $request, Network_Response $response) { // Cargar clase del controlador $class = App::findClass('Controller_' . Utility_Inflector::camelize($request->params['controller']), $request->params['module']); if (!class_exists($class)) { return false; } // Se verifica que la clase no sea abstracta $reflection = new \ReflectionClass($class); if ($reflection->isAbstract()) { return false; } // Se retorna la clase instanciada del controlador con los parámetros // $request y $response al constructor return $reflection->newInstance($request, $response); }