Tutorial de web en PHP con CodeIgniter y Json (3)

En la anteriores entradas tutorial-de-web-en-php-con-codeigniter-y-json-1 y tutorial-de-web-en-php-con-codeigniter-y-json-2 explique como instalar Codeigniter y preparlo para empezar a funcionar y como crear las vistas que ibamos a utilizar.

Ya teniendo la estructura con las vistas y el controlador preparado, vamos a crear el modelo con el que leeremos el json.

Con la siguiente estructura crearemos el modelo Datos_model.php:

<?php class Datos_model extends CI_Model
{
}

Dentro del modelo Datos_model.php crearemos la función leerJson que sera la encargada de leer el json que queremos mostrar en la aplicación. Para el ejemplo he utilizado un json con recetas del ayuntamiento de Gijón.

    public function leerJson()
    {
        // ubicacion JSON online
        define('JSON', 'http://datos.gijon.es/doc/turismo/recetas.json');

        // leemos JSON y convertimos
        $data = file_get_contents(JSON);
        $items = json_decode($data, true);

        return $items;
    }

A continuación crearemos a función obtenerTodos que es la que usaremos para leer el json y pasar el listado al controlador.

    public function obtenerTodos()
    {
        //leemos json
        $items=$this->leerJson();

        //lista de items a recorrer
        $listaItems = $items["recetas"]["receta"];

        return $listaItems;
    }

Ahora vamos al controlador Lista.php y modificaremos la función index para cargar el modelo y enviar a la vista un array con lista de items obtenidas con al función obtenetTodos.

    public function index()
    {
        $this->load->model("Datos_model"); // Carga el modelo
        $datos['listaItems'] = $this->Datos_model->obtenerTodos();

        $this->load->view('head');
        $this->load->view('inicio', $datos);
        $this->load->view('footer');
    }

Y con esto ya podemos modificar la vista inicio.php, en la que con un foreach recorremos el listado de items y lo mostramos con un enlace a lista/ficha, que corresponde con el controlador y el método ficha que crearemos mas adelante.

<div id="container">
  <h1>Recetas</h1>
  <div id="body">
    <ul class="list-group">
      <?php foreach ($listaItems as $key=>$item) { ?>
        <li class="list-group-item">
          <a href="<?php echo base_url() . 'lista/ficha/' .($key + 1) ?>">
            <?php echo $item["nombre"]; ?>
          </a>
        </li>
        <?php } ?>
    </ul>
  </div>

El resultado es el siguiente

Vista lista

Ahora lo que queremos es mostrar una ficha con uno de los items del json.

Volvemos al modelo Datos_model.php y creamos una función obtenerPorId, que recibe por parámetro el id del enlace del listado y utilizando la función leerjson y el id obtenemos el item que queremos mostrar en la ficha.

   public function obtenerPorId($id)
    {
        //leemos json
        $items=$this->leerJson();

        //lista de items a recorrer
        $item = $items["recetas"]["receta"][($id - 1)];

        return $item;
    }

Ahora en el controlador Lista.php creamos la función ficha encargada de mostrar la ficha en la vista y que formara parte de la url, siguiendo la filosofía de codeigniter url+controlador+metodo http://localhost/controlador/metodo.

En este método cargaremos el modelo y enviáramos a la ficha un array con las datos del item obtenidos con el método obtenerPorId.

    public function ficha($id)
    {
        $this->load->model("Datos_model"); // Carga el modelo
        $datos['itemPorId'] = $this->Datos_model->obtenerPorId($id);

        $this->load->view('head');
        $this->load->view('ficha', $datos);
        $this->load->view('footer');
    }

Por ultimo editamos la vista ficha.php y mostraremos los elementos del item que queremos visualizar.

<div id="container">
  <h1><?php echo $itemPorId["nombre"]; ?></h1>
  <div id="body">
    <ul class="list-group">
      <li class="list-group-item"><p><strong>Descripción: </strong><br>
        <?php echo str_replace(".", '.<br>',$itemPorId["descripcion"]); ?> </p>
      </li>
      <li class="list-group-item"><p><strong>Ingredientes:</strong><br>
        <?php echo str_replace(".", '.<br>',$itemPorId["ingredientes"]); ?></p>
      </li>
      <li class="list-group-item"><p><a href="<?php echo base_url() ?>">Volver</a></p>
      </li>
    </ul>
  </div>

Obteninedo el siguiente resultado.

vista ficha

El codigo fuente lo puedes descargar aqui https://github.com/victorgarciasisi/readJSONcodeigniter

Y el ejemplo en funcionamiento aqui: http://programacionconphp.com/dev/readJSONcodeigniter/

Deja un comentario