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.
$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>
Actualizado (Lunes, 24 de Agosto de 2015 18:06)