Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

clase Registry / arrayAccess / pasar datos a la vista

Estas en el tema de clase Registry / arrayAccess / pasar datos a la vista en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola chicos, Estoy utilizando mi propio framework, me gustaria saber una buena manera de pasarle los datos a la vista. Yo la que habia pensado ...
  #1 (permalink)  
Antiguo 28/03/2012, 16:20
 
Fecha de Ingreso: enero-2012
Ubicación: España
Mensajes: 150
Antigüedad: 12 años, 9 meses
Puntos: 0
clase Registry / arrayAccess / pasar datos a la vista

Hola chicos,

Estoy utilizando mi propio framework, me gustaria saber una buena manera de pasarle los datos a la vista.
Yo la que habia pensado es la siguiente manera:
La vista extiende de la clase Registry
Código PHP:
<?php
Class Registry {

  private 
$vars = array();

  function 
__set($key$var) {
    
$this->vars[$key] = $var;
    return 
true;
  }

  function 
__get($key) {
    if (isset(
$this->vars[$key]) == false) {
      return 
null;
    }
    return 
$this->vars[$key];
  }

  function 
__unset($var) {
    unset(
$this->vars[$key]);
  }
?>
La vista extenderia esta clase con lo que heredaria la propiedad array vars y los metodos magicos, asi cuando desde el controlador hacemos $vista->titulo = "inicio"
Gracias al metodo magico __set se guarda en la propiedad $_vars de la clase vista como $_vars['titulo'] = 'inicio'
Entonces en mi vista antes de hacer un include de la plantilla con los tipicos <?php if isset($titulo) echo $titulo; ?>
Lo que hago es cargar todas las variables como variables locales de la manera siguiente
Código PHP:
foreach ($this->_vars as $key => $value)
            {
                $
$key $value;
            } 
Busco como solucionar algun pequeño problema que he tenido o busco alguna otra forma de hacer el paso de datos de los controladores a la vista.

El problema que he tenido es cuando intento hacer $vista->layout['url_inicio'] = "url/ejemplo" que me tira un error evidente. Lo he solucionado con $layout[url_inicio'] = "url/ejemplo" y luego $vista->layout = $layout;
Y si quieres añadir un nuevo valor, tendrias que hacer algo asi quizas ( no lo he probado ) y parece feo.
$layout = $vista->layout; // Recuperamos el vector
$layout['url_contacto'] = 'url/contacto'; // Añadimos
$vista->layout = $layout; // Volvemos a guardar

¿ Que me decis chicos ?

Última edición por chemajmb; 28/03/2012 a las 16:25
  #2 (permalink)  
Antiguo 28/03/2012, 17:36
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: clase Registry / arrayAccess / pasar datos a la vista

Eso que indicas no es problema de tu clase, si no un problema de PHP, sí estas usando una versión anterior a 5.2.1, te puede dar error y deberías usar:
Código PHP:
Ver original
  1. $layout = $vista->layout; // Recuperamos el vector
  2. $layout['url_contacto'] = 'url/contacto'; // Añadimos
  3. $vista->layout = $layout; // Volvemos a guardar

Sí usas una versión más nueva a 5.2.1 ya no existe el bug y no veo porque no puedes usar directamente:
Código PHP:
Ver original
  1. $vista->layout = array();
  2. $vista->layout['foo'] = 'bar';

Saludos.
  #3 (permalink)  
Antiguo 29/03/2012, 02:30
 
Fecha de Ingreso: enero-2012
Ubicación: España
Mensajes: 150
Antigüedad: 12 años, 9 meses
Puntos: 0
Respuesta: clase Registry / arrayAccess / pasar datos a la vista

Cita:
Iniciado por GatorV Ver Mensaje
Eso que indicas no es problema de tu clase, si no un problema de PHP, sí estas usando una versión anterior a 5.2.1, te puede dar error y deberías usar:
Código PHP:
Ver original
  1. $layout = $vista->layout; // Recuperamos el vector
  2. $layout['url_contacto'] = 'url/contacto'; // Añadimos
  3. $vista->layout = $layout; // Volvemos a guardar

Sí usas una versión más nueva a 5.2.1 ya no existe el bug y no veo porque no puedes usar directamente:
Código PHP:
Ver original
  1. $vista->layout = array();
  2. $vista->layout['foo'] = 'bar';

Saludos.
Hombre, segun lo he planteado yo,
Código PHP:
Ver original
  1. $vista->layout = array();
  2. $vista->layout['foo'] = 'bar';

$vista->layout = array();
Intenta acceder a la propiedad layout de la vista, como no existe, accede al metodo magico __set con parametros $key = 'layout' y $var = array() con lo que guarda en la propiedad $vista->vars el array() de la forma $vista->vars['layout'] = array()

¿ Que pasa cuando intentamos $vista->layout['foo'] = 'bar'; ?
Que se checkea si existe la propiedad layout y como no existe accede al metodo magico __set pero da un error pues ahora tenemos layout como nombre de la variable, 'foo' como indice y 'bar' como valor a guardar y el metodo __set solo tiene como parametros nombre de variable y valor. Y creo que por eso da error.


EDITADO:
Creo que quizas ya he encontrado la solucion.
Lo que voy a intentar hacer es guardar las variables en la $vista directamente como propiedades y luego para la carga de lo que son datos para la plantilla, lo que hare sera cargar solamente las propiedades "get_object_vars($this);" que no sean propiedades de la clase "get_class_vars(get_class($this))" ...
Voy a ver si lo hago y luego lo posteo finalmente.

EDITADO FINAL:
Pues finalmente la vista no extiende de ninguna clase Registry ni nada parecido. Finalmente lo que hago en mis controladores es guardar las variables en la $vista directamente y luego en la vista para cargar los datos que introduje desde el controlador, lo que hago es:

Código PHP:
            $class_vars get_class_varsget_class$this ) );
            
$class_properties get_object_vars$this );
            
$class_data array_diff_key $class_properties $class_vars );
            foreach (
$class_data as $key => $value)
            {
                $
$key $value;
            } 

Última edición por chemajmb; 29/03/2012 a las 03:29

Etiquetas: clase, class, framework, php, registry, vistas
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:52.