entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

2votos

Mostrar información en la vista con el Modelo MVC PHP

Buenas tardes, estoy usando el modelo MVC para un proyecto y necesito mostrar una serie de información en la vista.
A través del controlador obtengo el modelo y así puedo ir realizando consultas SQL para mostrarlas en la vista. Por ejemplo:

<?php
  class Paginas extends Controlador {
    public function __construct() {
      $this->equipoModelo = $this->modelo('Equipo');
      $this->clasificacionModelo = $this->modelo('Clasificacion');
      //echo 'Controlador Páginas cargado';
    }

    public function index() {
      $equipos = $this->equipoModelo->obtenerEquipos();
      $equiposClasificacion = [];
      $clasificaciones = $this->clasificacionModelo->obtenerClasificacion();
      /*
      foreach ($clasificaciones as $clasificacion) :
        $equiposClasificacion[$clasificacion->equipo] = $this->equipoModelo->buscarEquipoPorId($clasificacion->equipo);
      endforeach;
      print_r($equiposClasificacion);*/ --> En $clasificaciones estoy obteniendo la tabla clasificación, donde solo obtiene el id del equipo
      $datos = [
                'titulo' => 'Bienvenidos...',
                'equipos' => $equipos,
                'clasificaciones' => $clasificaciones,
                'equiposClasificacion' => $equiposClasificacion
               ];
      $this->vista('paginas/inicio', $datos);
    }
  }
?>

En la vista lo muestro así:

<?php
                    foreach($datos['clasificaciones'] as $clasificacion) :
                                /*Cuando no usaba el modelo MVC aquí llamaba al método $equipo = $equipoController->buscarEquipoPorId($clasificacion->getEquipo());*/
                  ?>
                    <tbody>
                        <tr>
                            <td><?php echo $clasificacion->posicion; ?></td>
                            <td><img alt="Escudo del <?php echo $equipo->nombre; ?>" title="Escudo del <?php echo $equipo->nombre; ?>" src="<?php echo RUTA_URL; ?>/images/escudos/<?php echo $equipo->id; ?>.png" width="40" height="30">&nbsp;<?php echo $equipo->nombre; ?></td>
                        </tr>
                    </tbody>
          <?php endforeach; ?>

¿Cómo puedo mostrar el nombre de cada equipo haciéndolo directamente desde el controlador y después pasársela a la vista?.

Estuve intentando con un foreach y a través de ahí ir metiéndolos en otro array, pero sigo sin conseguir sacar el nombre del equipo.

0voto

carlossevi comentado

Yo creo que tienes que seguir la lógica inversa e ir paso a paso. ¿Qué datos necesitas en la vista para poder mostrar la información que quieres mostrar? Si decides que es un array con tal o cual información, prueba a generar ese array manualmente en el controlador y a pasarlo. ¿Funciona? Entonces piensa cómo conseguir ese array en el controlador, o bien pidiéndoselo al modelo si tiene sentido en tu MVC, o construyéndolo programáticamente en el controlador tomando datos de uno o varios modelos.

0voto

danielreales7 comentado

En el controlador donde paso los datos a la vista tengo lo siguiente:

foreach ($clasificaciones as $clasificacion) :
        $equiposClasificacion[$clasificacion->equipo] = $this->equipoModelo->buscarEquipoPorId($clasificacion->equipo);
      endforeach;

Al hacer un print_r($equiposClasificacion) me muestra por pantalla el siguiente array:

Array ( [3] => Array ( [0] => stdClass Object ( [id] => 3 [nombre] => Betis [puntuacion] => 91 [idEstadio] => 3 [liga] => ibiza [imagen] => betis ) ) [2] => Array ( [0] => stdClass Object ( [id] => 2 [nombre] => Barcelona [puntuacion] => 88 [idEstadio] => 2 [liga] => ibiza [imagen] => ) ) [1] => Array ( [0] => stdClass Object ( [id] => 1 [nombre] => R. Madrid [puntuacion] => 62 [idEstadio] => 4 [liga] => ibiza [imagen] => realmadrid ) ) [5] => Array ( [0] => stdClass Object ( [id] => 5 [nombre] => Liverpool [puntuacion] => 60 [idEstadio] => 6 [liga] => ibiza [imagen] => liverpool ) ) [4] => Array ( [0] => stdClass Object ( [id] => 4 [nombre] => Manchester U. [puntuacion] => 45 [idEstadio] => 5 [liga] => ibiza [imagen] => ) ) [11] => Array ( [0] => stdClass Object ( [id] => 11 [nombre] => Shaktar D. [puntuacion] => 44 [idEstadio] => 12 [liga] => ibiza [imagen] => shaktar ) ) [8] => Array ( [0] => stdClass Object ( [id] => 8 [nombre] => PSG [puntuacion] => 43 [idEstadio] => 9 [liga] => ibiza [imagen] => psg ) ) [7] => Array ( [0] => stdClass Object ( [id] => 7 [nombre] => I. Milán [puntuacion] => 43 [idEstadio] => 8 [liga] => ibiza [imagen] => ) ) [6] => Array ( [0] => stdClass Object ( [id] => 6 [nombre] => Tottenham [puntuacion] => 42 [idEstadio] => 7 [liga] => ibiza [imagen] => ) ) [10] => Array ( [0] => stdClass Object ( [id] => 10 [nombre] => Ajax [puntuacion] => 39 [idEstadio] => 11 [liga] => ibiza [imagen] => ) ) [9] => Array ( [0] => stdClass Object ( [id] => 9 [nombre] => Mónaco [puntuacion] => 36 [idEstadio] => 10 [liga] => ibiza [imagen] => ) ) [12] => Array ( [0] => stdClass Object ( [id] => 12 [nombre] => Zenit [puntuacion] => 32 [idEstadio] => 13 [liga] => ibiza [imagen] => zenit ) ) )

Me está almacenando según la clasificación los equipos correctamente, lo que no estoy logrando sacar por la vista es el nombre de cada Equipo.
Es decir, hago el foreach($datos['clasificaciones'] as $clasificacion) :
Pero no sé como sacar de $datos['equiposClasificacion'] el nombre de cada equipo.

2 Respuestas

2votos

carlossevi Puntos63580

Insisto en que debeías hacer el camino inverso. Genera el array manualmente, mira que te funciona, y trata de replicarlo programáticamente.

De todas formas, trato de dar formato al churro que has puesto:

Array ( [3] => Array ( [0] => stdClass Object (...))
    [2] => Array ( [0] => stdClass Object (...))
    [1] => Array ( [0] => stdClass Object (...))
    ...)

Es decir, tienes un array en el que cada elemento es un array con una única posición (clave 0) que es un objeto del tipo stdClass. El acceso a los datos del stdClass se debería hacer mediante $elemento->clave, así que la siguiente línea debería devolver "R. Madrid":

$equiposClasificacion[1][0]->nombre;

Pruébalo.

1voto

danielreales7 comentado

Exacto, me lo muestra correctamente. ¿Cómo puedo ahora imprimir estos datos entonces en la vista?

<?php
                    foreach($datos['clasificaciones'] as $clasificacion) :
              $equiposClasificacion = $datos['equiposClasificacion'];
                  ?>
                    <tbody>
                        <tr>
                            <td><?php echo $clasificacion->posicion; ?></td>
                            <td><img alt="Escudo del <?php echo $equiposClasificacion[1][0]->nombre; ?>" title="Escudo del <?php echo $equipo->nombre; ?>" src="<?php echo RUTA_URL; ?>/images/escudos/<?php echo $equipo->id; ?>.png" width="40" height="30">&nbsp;<?php echo $equipo->nombre; ?></td>
                        </tr>
                    </tbody>
          <?php endforeach; ?>

En vez de <?php echo $equiposClasificacion[1][0]->nombre; ?> tendría que cambiarlo por $equiposClasificacion[$clasificacion][0]->nombre; no?

1voto

carlossevi comentado

foreach ($datos['equiposClasificacion'] as $equipoClasificacion)
{
    echo $equipoClasificacion[0]->nombre;
}

0voto

danielreales7 comentado

Claro, eso si solo tuviese una tabla. Pero como en la misma tabla estoy mostrando dos resultados. El primer foreach que te muestro arriba obtengo el nº situado del equipo en la clasificacion y lo muestro en el primer td y en el segundo td de la tabla el nombre del equipo.

 <?php
                    //foreach($datos['clasificaciones'] as $clasificacion) :
              foreach($datos['equiposClasificacion'] as $equipoClasificacion) :
              //$equiposClasificacion = $datos['equiposClasificacion'];
                  ?>
                    <tbody>
                        <tr>
                            <td><?php echo $clasificacion->posicion; ?></td>
                            <td><img alt="Escudo del <?php echo $equipoClasificacion[0]->nombre; ?>" title="Escudo del <?php echo $equipoClasificacion[0]->nombre; ?>" src="<?php echo RUTA_URL; ?>/images/escudos/<?php $equipoClasificacion[0]->id; ?>.png" width="40" height="30">&nbsp;<?php echo $equipoClasificacion[0]->nombre; ?></td>
                        </tr>
                    </tbody>
            <?php endforeach; ?>
          <?php //endforeach; ?>

Con el código que tú me dices no puedo obtener en el primer td el nº de la clasificación del equipo. No sé si me estoy explicando bien.

0voto

carlossevi comentado

Creo que la clave del array es la posición ¿no?

foreach ($datos['equiposClasificacion'] as $posicion => $equipoClasificacion)
{
    echo $posicion;
    echo $equipoClasificacion[0]->nombre;
}

0voto

danielreales7 comentado

No, así me lo muestra según la tabla de equipos por orden. En $datos['clasificaciones'] tengo el array en orden de la clasificación. Por eso anteriormente hacía el foreach ahí.

Con esto debajo del foreach: echo $datos['clasificaciones'][0]->posicion;
Me devolvería correctamente la posición. Pero necesito que 0 vaya cambiando. Si pongo $posicion me muestra otros números.

0voto

carlossevi comentado

Lo siento pero no termino de entender la estructura de arrays, arrays anidados y cómo guardas la información. Yo optaría como te decía anteriormente por simplificarlo y hacer el camino inverso: ¿qué array necesito? ¿cómo lo construyo?

1voto

danielreales7 comentado

¡Ya está! Disculpa las molestias, pero erra un error a la hora de guardarlo en el array. Cambiando:

foreach ($clasificaciones as $clasificacion) :
        $equiposClasificacion[$clasificacion->posicion] = $this->equipoModelo->buscarEquipoPorId($clasificacion->equipo);
      endforeach;

He cambiado la línea anterior que era

$equiposClasificacion[$clasificacion->equipo]

Por:

$equiposClasificacion[$clasificacion->posicion]

Y ya me mostraría los elementos correctamente.
Muchas gracias por todo!!

1voto

Leonardo-Tadei Puntos227320

Hola @danielreales7,

lo que estás haciendo y con la experta ayuda de @carlossevi funciona, pero no estás respetando la arquitectura MVC...

En un MVC, la Vista usa al Controlador para modificar al Modelo y la Vista usa directamente al Modelo para obtener lo que hay que presentar.

Eso es lo que significan las líneas sólidas en es esquema de la arquitectura:

enter image description here

Saludos cordiales

0voto

danielreales7 comentado

Buenas Leonardo, mi idea es hacer una aplicación desde 0 usando la última versión de PHP. Topando con algunos cursos, creaban un Framework desde 0 usando MVC. Siguiendo un poco las pautas te dejo la raíz de carpetas para que te hagas una idea:

app
  /config
  /controllers
     Páginas.php --> Este controlador me gestiona las páginas y llamo desde aquí a los modelos para gestionar la información y enviarla a las vistas.
  /library
  /models
     Equipo.php --> En cada uno de estos archivos tengo varias funciones que me devuelven información de la BD
     Jugador.php
  /views
public

Corrígeme si me equívoco en algo. Muchas gracias por tu aporte.

1voto

Leonardo-Tadei comentado

Hola @danielreales7

una estructura de directorios no implica una funcionalidad.

Si en alguno de tus controladores le estás devolviendo datos a la vista, estás implementando mal la arquitectura.

La función de un Controlador en la MVC, es interactuar con el Modelo para cambiar su estado y a lo sumo devolver a la vista si la acción solicitada se ejecutó o no.

Organizar el código de esta manera tiene varias ventajas, pero no significa que si no se usa la MVC las cosas no funcionen... lo que sí, vale mucho la pena entender la idea del MVC y usarla!

1voto

danielreales7 comentado

Vale entiendo lo que me quieres decir. Ahora sí me quedó más claro. Muchísimas gracias por todo!!

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta