PageRenderTime 66ms CodeModel.GetById 22ms RepoModel.GetById 0ms app.codeStats 0ms

/jea-php/sistema/web/asistentes/CFormulario.php

https://gitlab.com/jakolab/prax-sys
PHP | 192 lines | 91 code | 16 blank | 85 comment | 9 complexity | 81d15975a9f8242b2058c09e85b0f924 MD5 | raw file
  1. <?php
  2. /**
  3. * Esta clase esta diseñada para generar formularios a partir de un modelo
  4. * @package sistema.web.asistentes
  5. * @author Jorge Alejandro Quiroz Serna (Jako) <alejo.jko@gmail.com>
  6. * @version 1.0.0
  7. * @copyright (c) 2016, jakop
  8. */
  9. class CFormulario {
  10. /**
  11. * Id para el formulario
  12. * @var string
  13. */
  14. protected $id;
  15. /**
  16. * método de envio del formulario
  17. * @var string
  18. */
  19. protected $metodo;
  20. /**
  21. * url a la cual el formulario enviará
  22. * @var string
  23. */
  24. protected $accion;
  25. /*
  26. * Opciones html para el formulario
  27. */
  28. protected $opcionesHtml;
  29. /**
  30. * Bandera para saber si el formulario fue cerrado
  31. * @var boolean
  32. */
  33. protected $formularioCerrado = false;
  34. /**
  35. * Bandera para saber si aún se está trabajando en bufer, en otras palabras
  36. * si se intenta cerrar un formulario que no se ha abierto esta bandera ayuda a controlarlo
  37. * @var boolean
  38. */
  39. private $trabajoEnBuffer = false;
  40. public function __construct($p = []) {
  41. $this->opcionesHtml = isset($p['opcionesHtml'])? $p['opcionesHtml'] : [];
  42. $this->id = isset($p['id'])? $p['id'] : '';
  43. $this->metodo = isset($p['metodo'])? $p['metodo'] : 'POST';
  44. $this->accion = isset($p['accion'])? $p['accion'] : '';
  45. $this->inicializar();
  46. }
  47. /**
  48. * El formulario debe ser cerrado antes de que inicie la aplicación
  49. * @throws CExAplicacion
  50. */
  51. public function __destruct() {
  52. if(!$this->formularioCerrado){
  53. # he comentado esto por que estaré discutiendo si conservarlo o no
  54. // throw new CExAplicacion("No se ha cerrado apropiadamente el formualrio, recuerde usar \$formulario->cerrar())");
  55. }
  56. }
  57. /**
  58. * Esta función inicializa los valores basicos del formulario
  59. */
  60. private function inicializar(){
  61. $this->opcionesHtml['id'] = $this->id;
  62. $this->opcionesHtml['method'] = $this->metodo;
  63. $this->opcionesHtml['action'] = $this->accion;
  64. }
  65. /**
  66. * Todo lo que suceda despues de llamar esta función será capturado como
  67. * el contenido del formulario
  68. */
  69. public function abrir(){
  70. $this->trabajoEnBuffer = true;
  71. ob_start();
  72. }
  73. /**
  74. * Esta función captura todo el contenido desde la apertura del formulario y
  75. * lo imprime
  76. *
  77. * @throws CExAplicacion Si no se ha abierto el formulario
  78. */
  79. public function cerrar(){
  80. if(!$this->trabajoEnBuffer){
  81. throw new CExAplicacion("Para poder cerrar el formulario primero debes abrirlo \$formulario->abrir()");
  82. }
  83. $this->trabajoEnBuffer = false;
  84. $this->formularioCerrado = true;
  85. $contenido = ob_get_clean();
  86. echo CHtml::e("form", $contenido, $this->opcionesHtml);
  87. }
  88. /**
  89. *
  90. * @param CModelo $modelo
  91. * @param string $atributo
  92. * @param array $opciones
  93. * @return string
  94. */
  95. public function campoTexto($modelo = null, $atributo = '', $opciones = []){
  96. $opcHtml = $this->obtenerOpciones($modelo, $atributo, $opciones);
  97. $valor = $modelo->$atributo;
  98. return CHtml::campoTexto($valor, $opcHtml);
  99. }
  100. /**
  101. * Esta función crea un area de texto con los atributos del modelo
  102. * @param CModelo $modelo
  103. * @param string $atributo
  104. * @param array $opciones
  105. * @return string
  106. */
  107. public function areaTexto($modelo = null, $atributo = '', $opciones = []){
  108. $opcHtml = $this->obtenerOpciones($modelo, $atributo, $opciones);
  109. $valor = $modelo->$atributo;
  110. return CHtml::areaTexto($valor, $opcHtml);
  111. }
  112. /**
  113. * Esta función crea un campo lista de selección
  114. * @param CModelo $modelo
  115. * @param string $atributo
  116. * @param array $elementos
  117. * @param array $opciones
  118. * @return string
  119. */
  120. public function lista($modelo = null, $atributo = '', $elementos = [], $opciones = []){
  121. $opcHtml = $this->obtenerOpciones($modelo, $atributo, $opciones);
  122. $valor = $modelo->$atributo;
  123. return CHtml::lista($valor, $elementos, $opcHtml);
  124. }
  125. public function campoArchivo($modelo = null, $atributo = '', $opciones = []){
  126. $opcHtml = $this->obtenerOpciones($modelo, $atributo, $opciones);
  127. $valor = $modelo->$atributo;
  128. return CHtml::input('file', $valor, $opcHtml);
  129. }
  130. public function campoPassword($modelo = null, $atributo = '', $opciones = []){
  131. $opcHtml = $this->obtenerOpciones($modelo, $atributo, $opciones);
  132. $valor = $modelo->$atributo;
  133. return CHtml::input('password', $valor, $opcHtml);
  134. }
  135. /**
  136. *
  137. * @param CModelo $modelo
  138. * @param string $atributo
  139. * @param array $opciones
  140. * @throws CExAplicacion
  141. */
  142. protected function obtenerOpciones($modelo, $atributo, $opciones = []){
  143. if($modelo === null){
  144. throw new CExAplicacion("El modelo no puede estar vacio");
  145. }
  146. if($atributo === null || trim($atributo) === ''){
  147. throw new CExAplicacion("El atributo no puede estar vacio");
  148. }
  149. # obtenemos el nombre de la tabla
  150. $nModelo = str_replace(' ', '', ucwords(str_replace('_', ' ', $modelo->tabla())));
  151. $opcBasicas = [
  152. 'name' => ucfirst($nModelo)."[$atributo]",
  153. 'id' => $nModelo."_".$atributo,
  154. ];
  155. # buscamos si hay label
  156. if(isset($opciones['label']) && $opciones['label'] == true){
  157. $opciones['label'] = $modelo->obtenerEtiqueta($atributo);
  158. }
  159. # lo que retornamos es una mezcla entre las opciones ingresadas y las básicas
  160. # si hay posiciones con el mismo nombre en las opciones ingresadas, estas
  161. # sobreescribirán el valor de las opciones básicas
  162. return array_merge($opcBasicas, $opciones);
  163. }
  164. public function obtenerEtiqueta(&$opHtml = []){
  165. $label = '';
  166. if(isset($opHtml['label'])){
  167. $label = CHtml::e('label', $opHtml['label'], ['for' => $opHtml['id']]);
  168. unset($opHtml['label']);
  169. }
  170. return $label;
  171. }
  172. public function mostrarErrores($modelo){
  173. # pendiente por implementar
  174. return $modelo;
  175. }
  176. }