Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] PHP OO MVC traer registros en un array

Estas en el tema de MVC traer registros en un array en el foro de PHP en Foros del Web. Hola, estoy tratando de manipular un código pero tengo un problema al traer el resultado de una consulta y pasarlo a la vista. Primero les ...
  #1 (permalink)  
Antiguo 07/10/2013, 08:20
 
Fecha de Ingreso: febrero-2013
Mensajes: 163
Antigüedad: 11 años, 2 meses
Puntos: 1
MVC traer registros en un array

Hola, estoy tratando de manipular un código pero tengo un problema al traer el resultado de una consulta y pasarlo a la vista. Primero les voy a mostrar el código original, que sí funciona. Este código trae el resultado de una consulta, trae 1 único registro en un array, y de ahí puedo manipularlo a gusto. Omití mucho código que no es necesario mostrar:

database.php
Código PHP:
<?php
private static $db_host 'localhost';
private static 
$db_user 'root';
private static 
$db_pass '';
protected 
$db_name 'database';
protected 
$query;
protected 
$rows = array();
private 
$conn;

# (...)

abstract class DBAbstractModel {
    protected function 
get_results_from_query() {
        
$this->open_connection();
        
$result $this->conn->query($this->query);
        while (
$this->rows[] = $result->fetch_assoc());
        
$result->close();
        
$this->close_connection();
        
array_pop($this->rows);
    }
}
?>
modelo.php
Código PHP:
<?php
require_once('mvc/core/database.php');

class 
Usuario extends DBAbstractModel {
    public 
$nick;
    public 
$permiso;
    public 
$producto;
    private 
$clave;

    public function 
get($user_nick='',$user_clave='') { 
        if(
$user_nick != '') {
            
$this->query "
                SELECT nick, permiso
                FROM usuarios
                WHERE nick = '$user_nick' and clave = '$user_clave'
            "
;
            
$this->get_results_from_query();
        }
        if(
count($this->rows) == 1) {
            foreach (
$this->rows[0] as $propiedad=>$valor) {
                
$this->$propiedad $valor;
            }
        }
    }
    
    
# (...)
}
?>
controlador.php
Código PHP:
<?php
require_once('constantes.php');
require_once(
'modelo.php');
require_once(
'vista.php');

function 
handler() {

    
# (...)
    
if (isset($_POST['login'])) {
        if (!empty(
$_POST['nick']) && !empty($_POST['clave']) ) {
            
$usuario_data helper();
            
$usuario set_obj();
            
$usuario->get($usuario_data['nick'], $usuario_data['clave']);
    
            
$data = array(
                
'nick'=>$usuario->nick,
                
'permiso'=>$usuario->permiso,
            );
            
            echo 
$data['producto'];
        } else {
            
# (...)
        
}
    } else {
        
# (...)
    
}
}

# (...)

function set_obj()
{
    
$obj = new Usuario();
    return 
$obj;
}
?>
Esto imprimiría el campo 'producto' del registro obtenido. Bueno, en vez de <?php echo $data['producto']; ?> tengo <?php retornar_vista(VISTA_INICIO, $data); ?>, y desde vista.php manipulo el array.

Pero ahora estoy tratando de traer varios registros

modelo.php
Código PHP:
<?php
require_once('mvc/core/database.php');

class 
Usuario extends DBAbstractModel {
    public 
$nick;
    public 
$permiso;
    public 
$producto;
    private 
$clave;

    public function 
get() {
        
$this->query "
            SELECT producto, precio
            FROM productos
        "
;
        
$this->get_results_from_query();
    
        if(
count($this->rows) >= 1) {
            foreach (
$this->rows as $registro=>$propiedad) {
                
$this->$registro $propiedad;
            }
        }
    }
    
    
# (...)
}

?>
Ahora estoy trayendo todos los registros, pero cómo agarro esos registros desde el controlador?

controlador.php
Código PHP:
<?php
require_once('constantes.php');
require_once(
'modelo.php');
require_once(
'vista.php');

function 
handler() {

    
# (...)

    
if ($_GET['p'] == 'consulta') {
        
$usuario set_obj();
        
$usuario->get();
        
        
$data = array(
            
'producto'=>$usuario->producto
            
'precio'=>$usuario->precio
        
);
            
        echo (
MOSTRAR TODOS LOS REGITROS)
    } else {
        
# (...)
    
}
}
?>
Cómo hago para imprimir todos los campos 'producto' y 'precio'?
Creo que no estoy manejando bien el foreach
Código PHP:
<?php
foreach ($this->rows as $registro=>$propiedad) {
    
$this->$registro $propiedad;
}
?>
Sé que $propiedad es el campo, por ejemplo $propiedad['producto'] mostraría el campo 'producto' de todos los registros. Pero a partir de ahi ya me pierdo, no sé cómo apartar $propiedad['producto'] y $propiedad['precio'] para poder manipularlo desde la vista. Estoy intentando de varias formas pero no consigo hacer que funcione. No estoy acostumbrado a este tipo de sistemas, estoy muy verde todavía...

Última edición por mathiasmontiel; 07/10/2013 a las 08:26
  #2 (permalink)  
Antiguo 07/10/2013, 12:07
 
Fecha de Ingreso: febrero-2013
Mensajes: 163
Antigüedad: 11 años, 2 meses
Puntos: 1
Respuesta: MVC traer registros en un array

Lo solucioné así:

modelo.php
Código PHP:
public function get() {
    
$this->query "
        SELECT producto, precio, id
        FROM productos
    "
;
    
$this->get_results_from_query();


controlador.php
Código PHP:
function handler() {

    
# (...)

    
if ($_GET['p'] == 'consulta') { 
        
$usuarios set_obj();
        
$usuarios->get();
        
$data = array($usuarios->rows);     
    
        
retornar_vista(VISTA_INICIO$data);
    } else {
        
# (...)
    
}

Y desde la vista puedo manipular los datos con foreach. Espero haberlo hecho bien.
  #3 (permalink)  
Antiguo 07/10/2013, 16:13
 
Fecha de Ingreso: febrero-2013
Mensajes: 163
Antigüedad: 11 años, 2 meses
Puntos: 1
Respuesta: MVC traer registros en un array

Nuevamente tengo un problema al pasar los datos a la vista, para no abrir otro tema sigo escribiendo en este.

Este sistema tiene un template engine, la vista tiene funciones para reemplazar sectores de los archivos html, por ejemplo <span>{dato}</span>, solo un ejemplo.

Pero, ¿cómo hago para reemplazar esas etiquetas teniendo un while o un bucle foreach?

Por ejemplo para reemplazar teniendo solamente un dato, es así:
Código PHP:
function datos_dinamicos($html$data) {
    foreach (
$data as $clave=>$dato) {
        
$html str_replace('{'.$clave.'}', $ dato$html);
    }
    return 
$html;

qué pasa cuando es un bucle y tiene varios datos? cómo puedo reemplazar una {etiqueta} teniendo un bucle?
Hay alguna forma de pasar el foreach a una sola variable, y con esa variable reemplazar la etiqueta? Un foreach no puede ser un valor, cómo puedo hacer algo así?
  #4 (permalink)  
Antiguo 07/10/2013, 18:31
 
Fecha de Ingreso: febrero-2013
Mensajes: 163
Antigüedad: 11 años, 2 meses
Puntos: 1
Respuesta: MVC traer registros en un array

Ok me vuelvo a responder, encontré la solución

vista.php
Código PHP:
# (...)
ob_start();
include 
'mvc/site_media/html/foreach.php';
$foreachob_get_clean();
$html str_replace('{cuerpo}'$foreach$html);
# (...) 
Y en foreach.php tengo el foreach, lo incluyo en la vista con el código anterior y reemplazo la etiqueta {cuerpo} de mi template

Última edición por mathiasmontiel; 08/10/2013 a las 17:27

Etiquetas: mvc, registro, registros, select, usuarios
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 08:55.