Ver Mensaje Individual
  #6 (permalink)  
Antiguo 03/03/2014, 12:13
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 12 años
Puntos: 320
Respuesta: Tomar valores de una base de datos y colocarlos en un formulario

Cita:
Esta muy bien planteado no querer tener código HTML en tus librerías, las hace muchísimo más reusables.
Tienes toda la razon, cuanto menos html tengas es mejor, pero hay un detalle importante:
Código PHP:
Ver original
  1. $datos = $conection->lastQueryToCombo();

Con eso estarias sacando una propiedad privada de la clase al exterior, rompiendo completamnete el concepto de encapsulamiento, ya no puedes asegurar que la clase se va a comportar ciempre igual.

Poner html dentro del metodo es una chapuza pero que mantiene al objeto encapsulado, una forma realmente correcta de hacerlo seria asi:

Código PHP:
Ver original
  1. <?php
  2. class utiles
  3. {
  4.     public static selectStmtToCombo(mysqli_stmt $stmt, $params=array())
  5.     {  
  6.         $combo = '<select id="'.$params['id'].'" name="'.$params['name'].'" '.($params['multiple'] ? 'multiple' : '').' '.($params['disabled'] ? 'disabled' : '').'>'
  7.         $resultado = $stmt->get_result();
  8.         while($fila = $resultado->fetch_assoc())
  9.         {
  10.             $combo .= '<option value="'.$fila['id'].'" '.($params['default']==$fila['id'] ? 'selected' : '').'>'.$fila['descripcion'].'</option>';
  11.         }  
  12.         $combo .= '</select>';
  13.         return $combo;
  14.     }
  15. }
  16.  
  17.  
  18. class OpMySQL
  19. {
  20.     public $tabla;
  21.    
  22.     private $_con;
  23.     private $_stmt;
  24.    
  25.     public function __construct()
  26.     {
  27.         //Preparamos la conexion a la BD
  28.         $this->_con = new mysqli(DB_HOST, DB_USUARIO, DB_PASSWORD, DB_DATABASE);
  29.     }
  30.    
  31.     //Tomamos los locales para colocarlos en el formulario
  32.     public function tomarLocalesParaForm()
  33.     {
  34.         //Creamos la consulta
  35.         $sql = 'SELECT id_local id, nombre descripcion FROM locales';        
  36.         //Preparamos la sentencia
  37.         $this->_stmt = $this->_con->prepare($sql);
  38.         //Ejecutamos la sentencia
  39.         $this->_stmt->execute();
  40.         return  $this->_stmt;
  41.     }    
  42. }

Código PHP:
Ver original
  1. $ob = new OpMySQL();
  2. echo(utiles::selectStmtToCombo($ob->tomarLocalesParaForm()));

De esta forma, el html esta en una clase estatica llamada utiles, altamente reusable y mantenible que sirve para todas las clases del sistema, cambiando los parametros que recibe se puede personalizar el select tanto como se quiera.
Si bien la propiedad privada _stmt sale de la clase, no queda suelta en el sistema, sino que va a una clase estatica, el dia que se modifique el comportamiento de la clase, solo hay dos lugares para revisar, no todos los scripts que muestren un combo, saludos.
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios