Advertisement
Guest User

Untitled

a guest
Aug 18th, 2017
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 12.04 KB | None | 0 0
  1. <?php
  2. error_reporting(E_ALL);
  3. ini_set('display_errors', TRUE);
  4. class iGrid
  5. {
  6.   /**
  7.    * Nombre del modelo en que se trabajara.
  8.    *
  9.    * @var string
  10.    */
  11.   private $_model = NULL;
  12.  
  13.   /**
  14.    * Nombre del metodo a utilizar para obtener los datos.
  15.    *
  16.    * @var string
  17.    */
  18.   private $_method = NULL;
  19.  
  20.   /**
  21.    * Parametros que se pasaran al metodo.
  22.    *
  23.    * @var array
  24.    */
  25.   private $_params = array();
  26.  
  27.   /**
  28.    * Instancia del modelo cargado.
  29.    *
  30.    * @var object
  31.    */
  32.   private $_modelAsoc = NULL;
  33.  
  34.   /**
  35.    * RecordSet con los nombres de las cabeceras.
  36.    *
  37.    * @var array
  38.    */
  39.   private $_recordSetHeaders = array();
  40.  
  41.   /**
  42.    * RecordSet con los registros obtenidos por el metodo($this->_method).
  43.    *
  44.    * @var array
  45.    */
  46.   private $_recordSet = array();
  47.  
  48.   /**
  49.    * Total de Registros depues de ejecutar el metodo.
  50.    *
  51.    * @var int
  52.    */
  53.   private $_totalRecords = 0;
  54.  
  55.   /**
  56.    * Contenedor de los campos a mostrar en las relaciones.
  57.    *
  58.    * @var array
  59.    */
  60.   private $_fieldsFK = array();
  61.  
  62.   /**
  63.    * Contenedor de las configuraciones generales de la grilla.
  64.    *
  65.    *  actions => (bool) Activa las acciones para cara registro.
  66.    *  search => (bool) Activa la opcion de buscar.
  67.    *  paginate => (bool) Muestra el paginador.
  68.    *  select_check => (bool) Activa los checks para cada registro.
  69.    *  action_edit => Nombre de la acción para editar un registro.
  70.    *  action_delete => Nombre de la acción para eliminar un registro.
  71.    *
  72.    * @var array
  73.    */
  74.   private $_configGrid = array(
  75.     'actions' => 0,
  76.     'search' => 0,
  77.     'paginate' => 0,
  78.     'select_check' => 0,
  79.     'action_edit' => 'editar',
  80.     'action_delete' => 'eliminar'
  81.   );
  82.  
  83.   /**
  84.    *   Matriz con la informacion necesaria para configurar la salida del breadcrumb.
  85.    *
  86.    *   toupper => (bool) Transforma a mayusculas(strtoupper) los titulos.
  87.    *   tolower => (bool) Transforma a minusculas(strtolower) los titulos.
  88.    *   ucfirst => (bool) Convierte a mayuscula(ucfirst) la primera letra de los titulos.
  89.    *
  90.    * @var array
  91.    */
  92.   private $_attrsHeaders = Array(
  93.     'toupper' => FALSE,
  94.     'tolower' => FALSE,
  95.     'ucfirst' => FALSE
  96.   );
  97.  
  98.   /**
  99.    * Contiene los headers que se pintaran en pantalla.
  100.    *
  101.    * @var array
  102.    */
  103.   public $headers = array();
  104.  
  105.   /**
  106.    * Contenedor de las acciones que se van a mostrar en el grid.
  107.    *
  108.    * @var array
  109.    */
  110.   private $_actions = array();
  111.  
  112.   /**
  113.    * Contenedor de las acciones predefinidas y su configuración.
  114.    *
  115.    * @var array
  116.    */
  117.   private $_recordSetActions = array(
  118.     'edit' => array(
  119.       'title' => 'Editar',
  120.       'url' => '%ctrl/%action_edit/%id',
  121.       'show' => TRUE
  122.     ),
  123.     'delete' => array(
  124.       'title' => 'Eliminar',
  125.       'url' => '%ctrl/%action_delete/%id',
  126.       'show' => TRUE
  127.     )
  128.   );
  129.  
  130.   public function __construct($model = NULL, $method = NULL, $params = array())
  131.   {
  132.     $this->_model = $model;
  133.     $this->_method = $method;
  134.     $this->_params = $params;
  135.     $this->_getRecordSet();
  136.   }
  137.  
  138.   /**
  139.    * Obtiene las cabeceras de las columnas, obtenidas del metodo ejecutado.
  140.    *
  141.    * @return void
  142.    */
  143.   private function _getModelHeaders()
  144.   {
  145.     foreach($this->_modelAsoc->fields as $v) $this->_recordSetHeaders[$v] = array('title' => $v, 'show' => TRUE);
  146.   }
  147.  
  148.   /**
  149.    * Obtiene los registros a mostrar.
  150.    *
  151.    * @return void
  152.    */
  153.   private function _getRecordSet()
  154.   {
  155.     $this->_modelAsoc = Load::model($this->_model);
  156.     $this->_getModelHeaders();
  157.     if(Validate::isNull($this->_method))
  158.       $this->_recordSet = $this->_modelAsoc->find();
  159.     else
  160.       $this->_recordSet = (count($this->_params) > 0) ? $this->_modelAsoc->{$this->_method}($this->_params) : $this->_modelAsoc->{$this->_method}();
  161.     $this->_configGrid['paginate'] = isset($this->_recordSet ->items);
  162.     $this->_totalRecords = count($this->_configGrid['paginate'] ? $this->_recordSet ->items : $this->_recordSet );
  163.   }
  164.  
  165.   /**
  166.    * Filtra las acctiones que se van a mostrar,
  167.    *
  168.    * @return void
  169.    */
  170.   private function _processActions()
  171.   {
  172.     foreach($this->_recordSetActions as $k => $item) if($item['show']) $this->_actions[$k] = $item;
  173.   }
  174.  
  175.   /**
  176.    * Procesa los header, aplicando estilos y filtrando los header que se mostran.
  177.    *
  178.    * @return void
  179.    */
  180.   private function _processHeaders()
  181.   {
  182.     $this->_stylingHeaders(); /* Aplica los estilos a las cabeceras */
  183.     foreach($this->_recordSetHeaders as $k => $item) if($item['show']) $this->headers[$k] = $item['title'];
  184.   }
  185.  
  186.   /**
  187.    *   Aplica los estilos a los encabezados, segun la configuracion en $this->_attrs.
  188.    *
  189.    * @return void
  190.    */
  191.   private function _stylingHeaders()
  192.   {
  193.     foreach($this->_recordSetHeaders as $k => $v)
  194.     {
  195.       $this->_recordSetHeaders[$k]['title'] = $this->_attrsHeaders['toupper'] ?
  196.         strtoupper($v['title']) :
  197.           ($this->_attrsHeaders['tolower'] ?
  198.             strtolower($v['title']) :
  199.               ($this->_attrsHeaders['ucfirst'] ?
  200.                 ucfirst($v['title']) : $v['title']));
  201.     }
  202.   }
  203.  
  204.   /**
  205.    * Agregar una nueva acción.
  206.    *
  207.    * @param $k string Key de la accion en la matriz contenedora.
  208.    * @param $title string Titulo que aparecera en la acción.
  209.    * @param $url string URL a donde apuntara la acción-
  210.    */
  211.   public function addAction($k = NULL, $title = NULL, $url = NULL)
  212.   {
  213.     if(array_key_exists($k, $this->_recordSetActions)) return;
  214.     $this->_recordSetActions[$k] = array('title' => $title, 'url' => $url, 'show' => TRUE);
  215.   }
  216.  
  217.   /**
  218.    * Agrega una nueva asociación para las FK del modelo.
  219.    *
  220.   * @param $params string Cadena con los parametros a procesar, el formato es campo_fk:nombre_campo_en_tabla_fk,
  221.    *                                                          para mas de un header se pueden definir en una sola cadena separada por comas(,), ejemplo 'perfil_id:nombre'.
  222.    * @return void
  223.    */
  224.   public function addFieldFK($params = NULL)
  225.   {
  226.     if(Validate::isNull($params)) return;
  227.     $params = explode(',', $params);
  228.     foreach($params as $item)
  229.     {
  230.       $item = explode(':', $item);
  231.       if(count($item) != 2) continue;
  232.       $fk_header = trim($item[0]);
  233.       $fk_field = trim($item[1]);
  234.       if(!array_key_exists($fk_header, $this->_recordSetHeaders)) continue;
  235.       $model = Util::camelcase(substr($fk_header, 0, -3));
  236.       $this->_fieldsFK[$fk_header] = array('model' => $model, 'field' => $fk_field);
  237.     }
  238.   }
  239.  
  240.   /**
  241.    * Retorna TRUE en caso de existir datos en el RecordSet o FALSE en caso contrario.
  242.    *
  243.    * @return boolean
  244.    */
  245.   public function existRecords(){ return $this->_totalRecords > 0; }
  246.  
  247.   public function generate()
  248.   {
  249.     $this->_processHeaders(); /* Filtra las cabeceras a mostrar y las asigna a la variable */
  250.     if($this->getConfig('actions')) $this->_processActions();
  251.     return $this;
  252.   }
  253.  
  254.   /**
  255.    * Genera los links de las acciones y retorna el html.
  256.    *
  257.    * @param $item object Objeto con la informacion del registro.
  258.    * @return string
  259.    */
  260.   public function getActions($item = NULL)
  261.   {
  262.     if(!$this->getConfig('actions')) return;
  263.     $html = NULL;
  264.     $patterns = array('/%ctrl/','/%id/', '/%action_edit/', '/%action_delete/');
  265.     $replacements = array(Router::get('controller'), $item->id, $this->getConfig('action_edit'), $this->getConfig('action_delete'));
  266.     foreach($this->_actions as $action)
  267.     {
  268.       $action['url'] = preg_replace($patterns, $replacements, $action['url']);
  269.       $html[] = Html::link($action['url'], $action['title']);
  270.     }
  271.     return implode(' | ', $html);
  272.   }
  273.  
  274.   /**
  275.    *  Obtiene una configuracion general para la grilla.
  276.    *
  277.    * Estilos disponibles:
  278.    *
  279.    *  actions => (bool) Activa las acciones para cara registro.
  280.    *  search => (bool) Activa la opcion de buscar.
  281.    *  paginate => (bool) Muestra el paginador.
  282.    *  select_check => (bool) Activa los checks para cada registro.
  283.    *
  284.    * @param string $key Configuracion para obtener.
  285.    * @return void
  286.    */
  287.   public function getConfig($k = NULL)
  288.   {
  289.     if(Validate::isNull($k) && !array_key_exists($k, $this->_configGrid)) return;
  290.     return $this->_configGrid[$k];
  291.   }
  292.  
  293.   /**
  294.    * Obtiene el recordset para iterar.
  295.    *
  296.    * @return array
  297.    */
  298.   public function getRecordSet($full = FALSE)
  299.   {
  300.     return $full ? $this->_recordSet : ($this->_configGrid['paginate'] ? $this->_recordSet->items : $this->_recordSet);
  301.   }
  302.  
  303.   /**
  304.    * Obtiene el campo correcto para listar.
  305.    *
  306.    * return mixed
  307.    */
  308.   public function getRow($k = NULL, &$item = NULL)
  309.   {
  310.     return array_key_exists($k, $this->_fieldsFK) ?  $item->{"get{$this->_fieldsFK[$k]['model']}"}()->{$this->_fieldsFK[$k]['field']} : $item->$k;
  311.   }
  312.  
  313.   /**
  314.    * Devuelve el total de registros obtenidos al ejecutar el metodo del modelo.
  315.    *
  316.    * @return int
  317.    */
  318.   public function getTotalRecords(){ return $this->_totalRecords; }
  319.  
  320.   /**
  321.    *  Define que headers no deben mostrarse en la lista.
  322.    *
  323.    * @param $key string Nombre de los headers a ocultar, para mas de un header se pueden
  324.    *                                                 definir en una sola cadena separada por comas(,), ejemplo 'id, nombre'.
  325.    * @return void
  326.    */
  327.   public function hiddenHeaders($k = NULL)
  328.   {
  329.     if(Validate::isNull($k)) return;
  330.     foreach(explode(',', $k) as $item)
  331.     {
  332.       if(!array_key_exists($item, $this->_recordSetHeaders)) continue;
  333.       $this->_recordSetHeaders[$item]['show'] = FALSE;
  334.     }
  335.   }
  336.  
  337.   /**
  338.    * Renombra el titulo de los headers.
  339.    *
  340.    * @param $params string Cadena con los parametros a procesar, el formato es nombre_anterior:nombre_nuevo,
  341.    *                                                           para mas de un header se pueden definir en una sola cadena separada por comas(,), ejemplo 'perfil_id:Perfil'.
  342.    * @return void
  343.    */
  344.   public function renameHerders($params = NULL)
  345.   {
  346.     if(Validate::isNull($params)) return;
  347.     $params = explode(',', $params);
  348.     foreach($params as $item)
  349.     {
  350.       $item = explode(':', $item);
  351.       if(count($item) != 2) continue;
  352.       $k = trim($item[0]);
  353.       $v = trim($item[1]);
  354.       if(!array_key_exists($k, $this->_recordSetHeaders)) continue;
  355.       $this->_recordSetHeaders[$k]['title'] = $v;
  356.     }
  357.   }
  358.  
  359.   /**
  360.    * Modifica la configuración de una accion.
  361.    *
  362.    * @return void
  363.    */
  364.   public function setActions($k = NULL, $v = NULL)
  365.   {
  366.     if(Validate::isNull($k) || Validate::isNull($v)) return;
  367.     if(!array_key_exists($k, $this->_recordSetActions)) return;
  368.     $this->_recordSetActions[$k]['title'] = $v;
  369.   }
  370.  
  371.   /**
  372.    * Modifica una configuracion para el grid.
  373.    *
  374.    * Configuraciones disponibles:
  375.    *
  376.    *    search => (bool) Activa la opcion de buscar, por default FALSE.
  377.    *   paginate => (bool) Muestra el paginador, por default FALSE.
  378.    *
  379.    * @param $k string Configuración a modificar.
  380.    * @param $v mixed Valor para la configuración.
  381.    * @return void
  382.    */
  383.   public function setConfig($params = NULL)
  384.   {
  385.     if(Validate::isNull($params)) return;
  386.     $params = explode(',', $params);
  387.     foreach($params as $item)
  388.     {
  389.       $item = explode(':', $item);
  390.       if(count($item) != 2) continue;
  391.       $k = trim($item[0]);
  392.       $v = trim($item[1]);
  393.       if(!array_key_exists($k, $this->_configGrid)) return;
  394.       $this->_configGrid[$k] = $v;
  395.     }
  396.   }
  397.  
  398.   /**
  399.    *  Modifica el estilo de las cabeceras.
  400.    *
  401.    * Estilos disponibles:
  402.    *
  403.    *   toupper => (bool) Transforma a mayusculas(strtoupper) los titulos, por default FALSE.
  404.    *   tolower => (bool) Transforma a minusculas(strtolower) los titulos, por default FALSE.
  405.    *   ucfirst => (bool) Convierte a mayuscula(ucfirst) la primera letra de los titulos, por default FALSE.
  406.    *
  407.    * @param string $k Estilo a modificar.
  408.    * @param mixed $v Valor que va tomar el estilo.
  409.    * @return void
  410.    */
  411.   public function setStyleHeader($k = NULL, $v = NULL)
  412.   {
  413.     if(!(Validate::isNull($k) || Validate::isNull($v)))
  414.       if(array_key_exists($k, $this->_attrsHeaders)) $this->_attrsHeaders[$k] = $v;
  415.   }
  416. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement