Home Programación Joomla Un detallito más: Colocar listas desplegables de otras tablas. Los fichajes

PostHeaderIcon Un detallito más: Colocar listas desplegables de otras tablas. Los fichajes

Usar puntuación: / 0
MaloBueno 

La principal característica del modelo relacional es la inclusión de claves ajenas o foráneas en una tabla para incluir como dato de nuestra tabla un registro de otra tabla. Me refiero a que podemos incluir en nuestro modelo una tabla que tenga referencias a otra. En nuestro caso particular hablamos de la tabla fichajes, una tabla que relaciona a los jugadores con los equipos. No colocaremos en la tabla fichajes ni el nombre del jugador ni el nombre del equipo, sino su id. Ambos identificadores serán clave foránea.

Pero para poder acceder a esos identificadores de jugadores y de equipos tenemos que incluir el nombre tanto del nombre como del equipo, puesto que el identificador es un número y aunque hay gente capaz de memorizar la guía telefónica, el común de los mortales no es capaz de asociar todos los identificadores de equipos con su correspondiente nombre ni lo mismo con los jugadores. 

En Joomla usaremos dos listas desplegables (los <select> de html) para poder incluir tanto el id (en el value del option) como el nombre que se mostrará a continuación.

 

El mecanismo no difiere mucho de lo que hemos visto hasta ahora. La principal diferencia es que como vamos a trabajar con más de una tabla, necesitaremos conectarnos a más de una vista y a más de un modelo.
Así, en la vista principal, view.html.php en la función display, conectamos con el modelo y creamos la lista de fichajes que se mostrará en pantalla.
     $model = $this->getModel( 'seguros' );
     $this->seguros = $model->getFichajes();
También añadimos el botón de nuevo fichaje.
     JToolBarHelper::addNew('NuevoFichaje');
Como ya sabemos, la lista la obtenemos del modelo models/seguros.php y el botón llama al controlador controller.php a la función NuevoFichaje. En primer lugar vemos el modelo y a continuación el controlador. La función del modelo sería la siguiente:
     function getSeguros(){
Primero conectamos con la base de datos y comprobamos que la lista esté vacía para crear el query
          $db =& $this->_db;
          if( empty($this->_seguros) ) {
El query incluirá un inner join para poder anexar no solo los datos de la tabla de seguros (los id’s de jugador y equipo) sino también que tenga el nombre del jugador y el nombre del equipo. Para ello además seleccionamos los campos individualmente y renombramos aquellos que puedan llamarse iguales (identificadores y nombres en nuestro caso). En caso de que se llamen distinto (por ejemplo fichajes.id_fichajes, jugadores.id_jugadores y equipos.id_equipos) no sería necesario este renombramiento, pero si llamaste id a los 3 identificadores (fichajes, jugadores y equipos, como fue mi caso) sí será necesario.  
                // Build query and get the limits from current state
$query = 'SELECT #__gesseg_fichajes.id as fich_id, #__gesseg_jugadores.id as jug_id, #__gesseg_equipos.id as eq_id,';
$query.= ' #__gesseg_jugadores.nombre as jug_nombre, #__gesseg_equipos.nombre as eq_nombre';
$query.= ' FROM #__gesseg_fichajes INNER JOIN #__gesseg_jugadores ON #__gesseg_fichajes.id_tipo_de_seguro';
$query.= ' = #__gesseg_jugadores.id';
$query.= ' INNER JOIN #__gesseg_equipos ON #__gesseg_fichajes.id_equipos = #__gesseg_equipos.id';
$limitstart = $this->getState('limitstart');
$limit = $this->getState('limit');
$this->_seguros = $this->_getList($query,$limitstart,$limit);
} // Return the list of articulos
return $this->_seguros;
      }
La función del controlador será:
     function NuevoFichaje(){
Lo primero que haremos será la conexión de la vista principal, es decir, de la vista fichajes, así como el modelo.
$vista = $this->getView(‘juegan’,'html');
$modelo = $this->getModel(‘juegan’,'gessegModel');
Además debemos conectar un segundo y tercer modelo, que son los del jugador y el equipo
$modeloJE = $this->getModel( 'jugadores' , 'gessegModel' );
$modeloEq = $this->getModel( 'equipos' , 'gessegModel' );
Finalmente los conectamos
$vista->setModel($modelo, true);
$vista->setModel($modeloJE);
$vista->setModel($modeloEq);
Para terminar llamamos a la función de la vista
          $vista->insertar();
     }
Esta última llamada a la vista es a La función insertar del fichero view.html.php. En dicha función el código será el siguiente:
     function insertar(){
Lo primero, como siempre, la cabecera y el botón para guardar.
JToolBarHelper::title('NUEVO FICHAJE');
JToolBarHelper::save('GuardaFichaje');
Finalmente obtenemos el modelo de los jugadores y llamamos a la función getJugadores del modelo, que nos devolverá la lista de los jugadores, lo mismo para los equipos con getEquipos y llamamos a la vista de editar (views/fichajes/tmpl/default_editar.php)
$modelJ = $this->getModel('jugadores');
$this->jugadores = $modelJ->getJugadores();
$modelEq = $this->getModel('equipos');
$this->eq = $modelEq->getEquipos();
parent::display('editar');
     }
Esta función tiene dos llamadas a dos funciones diferentes. Por un lado llama a la función GuardaFichaje que está en el controlador, y por otro a la función getJugadores del modelo. Vamos con ellas.
En el controlador controller.php estará, dijimos, GuardaFichaje: 
     function GuardaFichaje(){
Lo primero obtener los modelos necesarios, en este caso tanto el de los fichajes como el de los jugadores
$modelo = $this->getModel('juegan','gessegModel');
$modeloJug = $this->getModel('jugadores','gessegModel');
$modeloEq = $this->getModel('equipos','gessegModel');
Obtenemos las variables que necesitaremos del modelo
$jugador = JRequest::getVar('jugador’);
$equipo = JRequest::getVar(‘equipo');
Llamamos a la función InsertarFichaje del modelo
$correcto = $modelo->InsertarFichaje($id,$nombre,$equipo);
Comprobamos si se insertó para si no lanzar un mensaje de error.
if ($correcto) $this->setRedirect('index.php?option=com_gesseg&view=compSeguros' , 'Compañía de seguros insertada correctamente');
else $this->setRedirect('index.php?option=com_gesseg&view=compSeguros', 'ERROR al insertar','ERROR');
}
Nos faltan por definir tres funciones del modelo. Las dos primeras son las que se llamas desde el view, getJugadores y getEquipos, que en principio son las mismas que definimos en su momento para mostrar a los jugadores y los equipos en sus vistas principales, y que se debería encontrar en  models/jugadores.php y models/equipos.php. A modo informativo se muestra a continuación el código de getJugadores, pero no se explica por no entrar en redundancia. 
     function getJugadores(){
// Get the database connection
$db =& $this->_db;
if( empty($this->_tiposSeguros) ) {
// Build query and get the limits from current state
$query = 'SELECT * FROM #__gesseg_jugadores  ORDER BY tipo';
$limitstart = $this->getState('limitstart');

 

                $limit = $this->getState('limit');

                $this->_jugadores = $this->_getList($query,$limitstart,$limit);

}
// Return the list of jugadores
return $this->_jugadores;
      }
La tercera la acabamos de definir, InsertarFichaje. Nos vamos al modelo de los fichajes models/fichajes.php y añadimos el código.
Esta función no difiere mucho de cualquier otro insertar. Simplemente introduciremos los datos obtenidos en una variable que configuraremos con los campos de la base de datos para finalmente insertarlo y devolver si se ha hecho bien la inserción.
     function InsertarFichaje($id,$id_j,$id_e){
En primer lugar comprobaremos que ese jugador no esté insertado ya en ese equipo. NOTA IMPORTANTE: ¿Puede un jugador fichar por dos equipos a la vez? Obviamente no, pero ésta es una de las limitaciones del modelo relacional: se trata de una relación 1:M no obligatoria, es decir, un jugador puede fichar por un único equipo (1) pero un equipo puede fichar muchos jugadores (M), por lo que se podría añadir un campo en jugadores para hacer referencia al equipo (calve foránea), sin embargo no es una relación obligatoria, porque no todos los jugadores tienen por qué pertenecer a un equipo, pueden haber jugadores sin equipo. Sin embargo no pueden haber claves foráneas vacías. Eso nos obliga a crear una tabla para jugadores y equipos, dónde la clave principal podría ser el identificador del jugador (ya que no se puede repetir). 
Así que tenemos dos opciones: Por un lado suponer que el jugador no se va a repetir (lo correcto en este caso) y por otro suponer que sí se podría repetir (supongamos una relación M:M donde guardamos un histórico de los fichajes, por ejemplo, donde el fichaje actual sería el que mayor id tenga). Expondré el query de ambas situaciones.
Primero el primer caso, el identificador del jugador no se repite (1:M)
          $query = "SELECT * FROM #__gesseg_seguros WHERE id_jugador = $id_j";
Finalmente el caso de una relación M:M.
         $query = "SELECT * FROM #__gesseg_seguros WHERE id_jugador = $id_j and id_equipo = $id_e";
Sea como sea lo siguiente es común

          $limitstart = $this->getState('limitstart');
$limit = $this->getState('limit');
$this->_fichaje = $this->_getList($query,$limitstart,$limit);
Una vez ejecutado el query si ya existía una clave del jugador, o una combinación jugador-equipo, la función empty nos dará falsa, por lo que no se insertará. En caso contrario se insertará el fichaje en la tabla
if( empty($this->_seguros) ){
$nuevoseg = new stdClass();

 $nuevoseg->id_jugador = $id_j;

 $nuevoseg->id_equipo = $id_e;

 $result = JFactory::getDbo()->insertObject('#__gesseg_juegan', $nuevoseg);

 }

 else $result = false;

               return $result; 
     } 

Finalmente queda la vista de editar, views/fichajes/tmpl/default_editar.php. Esto es código html así que no me extenderé mucho en las explicaciones, porque además coincide con las explicaciones que se han dado para otros editar. Solo destacaré los dos select html, los dos menús desplegables.

<?php defined('_JEXEC') or die('Restricted access'); 

$view = 'seguros';

$task = 'editSeguros';

?>  

 

<form method="post" name="adminForm" id="adminForm">
 

<table class=adminlist>
 

<thead>

<!-- Encabezado de la lista de sucursales ------------------------------------------------------------------>

<tr>

<th width="20">

<input type="checkbox" name="toggle" value="" onclick="checkAll(<?php echo count($this->seguros); ?>)"/>

</th>

<th width="100" styke="text-align: left;"> </th>

<th width="100" styke="text-align: left;"> </th>

</tr>

</thead>

<?php  

$i = 0;  

foreach($this->fichaje as $fichaje) {  

?>  

<tr>  

<td style="text-align: center;"><?php echo JHTML::_('grid.id', $i, $fichajes->fich_id); ?></td> 

<td> <?php  echo "<a href= 'index.php?option = com_gesTorneo&task = {$task}&cid[]={$fichaje->seg_id}'>{$fichaje->nombre_jugador}</a>";  ?> </td>  

<td><?php echo "<a href = 'index.php?option=com_gesTorneo&task = {$task}&cid[] ={$fichaje->seg_id}'> {$fichaje->nombre_equipo}</a>"; ?></td>  

</tr>  

<?php  

$i++;  

}  

?>

</table>

<input type="hidden" name="task" value="">

<input type="hidden" name="option" value="com_gesseg">

<input type="hidden" name="boxchecked" value="0" /> 

<input type="hidden" name="view" value="<?php echo $view; ?>" />  

</form>

Terminamos con el default_editar.php

<?php 

defined('_JEXEC') or die('Restricted access');

//Import filesystem libraries. Perhaps not necessary, but does not hurt

jimport('joomla.filesystem.file');

?>

<link rel="stylesheet" href="/<?php echo $dir_css; ?>" type="text/css" />

<div id="colizq">

<form method="post" name="adminForm" id="adminForm">

<label for="jugadores">Jugadores:</label>

<select name="jugadores">

<option value="0" selected> Selecciona un jugador</option>

<?php foreach ($this->jug as $jug): ?>

<option value="<?php echo $jug->id;?>"><?php echo $jug->nombre; ?> </option>

<?php endforeach; ?>

</select>

<br><br><br><br>

<label for="equipo">Equipos:</label>

<select name="equipos">

<option value="0" selected> Selecciona el equipo

<?php foreach ($this->eq as $eq): ?>

<option value="<?php echo $cs->id;?>"> <?php echo $eq->nombre; ?> </option>

<?php endforeach; ?>

</select>

<input type="hidden" name="task" value="">

<input type="hidden" name="option" value="com_gesseg"> 

</form>

</div>

 

 

 

 

 

Escribir un comentario


Código de seguridad
Refescar

PostHeaderIcon Más Comentado

PostHeaderIcon Últimos Comentarios

mod_vvisit_countermod_vvisit_countermod_vvisit_countermod_vvisit_countermod_vvisit_countermod_vvisit_countermod_vvisit_counter
mod_vvisit_counterHoy1479
mod_vvisit_counterAyer1493
mod_vvisit_counterEsta semana10778
mod_vvisit_counterLa semana pasada10142
mod_vvisit_counterEste mes27336
mod_vvisit_counterEl mes pasado44972
mod_vvisit_counterTodos los días1432906

We have: 143 guests online
Hoy es: Dic 16, 2017