Algunas cosas se me han aclarado y otras todavía no. Por lo cuál pase de la teoría a la práctica y quiero compartirlo para conocer su comentarios y críticas.
La práctica es básicamente una agenda.
La redacción de la necesidad sería mas o menos así:
Un Usuario tiene una agenda y la agenda tiene contactos
Se puede ver un listado de contactos agregados a la agenda
y se pueden agregar mas contactos.
pues bien sencillo que están las clases (creo):
hasta donde llego a comprender estas serían mis clases entidad y también necesitaría una clase control llamada Operciones y otras 2 de Borde:
Reporte
AgregarContacto <-- que dejaré pendiente
Y una de persistencia que hará consultas a la BD disñeado al estilo singleton
bueno pasemos al código:
Clase Usuario
Código PHP:
Clase AgendaVer original
class Usuario { private $_db; private $_nombre; private $_id; private $_agenda; public function __construct() { $this->_db = Persistencia::conectar(); } private function cargarDatos($usr) { $query = "SELECT nombreUsuario, id FROM usuario " . "WHERE nombreUsuario = '$usr' LIMIT 1"; $rs = $this->_db->query($query); $data = $rs->fetch_object(); $this->_nombre = $data->nombreUsuario; $this->_id= $data->id; $this->_sesionActiva = true; } public function asociaAgenda(Agenda $agenda) { $this->_agenda = $agenda; } public function __set($atr,$valor) { $this->$atr = $valor; } public function __get($atr) { return $this->$atr; } }
Código PHP:
Ver original
class Agenda { public function __construct() { } public function agregaContacto(Contacto $contacto) { $this->_listaContactos[] = $contacto; } public function __get($atributo) { return $this->$atributo; } }
Clase Contacto
Código PHP:
Ver original
class Contacto { private $_id ; private $_nombre; private $_apellido; private $_telefono; public function __construct($id, $nombre, $apellido, $telefono) { $this->_id = $id; $this->_nombre = $nombre; $this->_apellido = $apellido; $this->_telefono = $telefono; } public function __get($atributo) { return $this->$atributo; } public function __set($atributo,$valor) { $this->$atributo = $valor; } }
Clase Persistencia
Código PHP:
Ver original
class Persistencia extends mysqli { private static $_instancia; private function __construct($servidor = SERVIDOR, $usuario = USUARIO, $password = PASSWORD, $baseDatos = BD) { parent::__construct($servidor, $usuario, $password, $baseDatos); } public static function conectar() { $thisClass = __CLASS__; self::$_instancia = new $thisClass ; } return self::$_instancia ; } }
Clase Operaciones
Código PHP:
Ver original
class Operaciones { private $_usuario; private $_db; public function __construct(usuario $usuario) { $this->_usuario = $usuario; $this->_db = Persistencia::conectar(); } public function traerContactos() { $query = "SELECT id, FirstName, LastName, phonenumber FROM phonebook " ."WHERE idUsuario = ". $this->_usuario->_id; $rs = $this->_db->query($query); return $rs; } public function traerContacto($idContacto) { $query = "SELECT id, FirstName, LastName, phonenumber FROM phonebook " ."WHERE id = $idContacto"; $rs = $this->_db->query($query); return $rs; } else { return false; } } public function muestraContactos() { $html =""; foreach ($this->_usuario->_agenda->_listaContactos as $contactos) { $html .= "<tr class='row'>"; $html .= "<td>"; $html .= $contactos->_nombre; $html .= "</td>"; $html .= "<td>"; $html .= $contactos->_apellido; $html .= "</td>"; $html .= "<td>"; $html .= $contactos->_telefono; $html .= "</td>"; $html .= "</tr>"; } return $html; } public function agregarContacto($nombre, $apellido, $telefono) { $query = "INSERT INTO phonebook (FirstName, LastName, phonenumber,idUsuario) " ."VALUES('$nombre', '$apellido', '$telefono',{$this->_usuario->_id})"; $this->_db->query($query); } }
Bien ahora por último vamos a ver como se dibuja en pantalla lo que el usuario quiere ver que para este caso es un reporte de los contactos almacenados
Clase Borde
Código PHP:
Ver original
$usr = $_GET["usr"]; class Reporte { public static function main() { $usuario = new Usuario(); $usuario->cargarDatos($usr); $agenda = new Agenda(); $usuario->asociaAgenda($agenda); $oc = new Operaciones($usuario); $objContactos = $oc->traerContactos(); while ($contactoRs = $objContactos->fetch_object()) { $agenda->agregaContacto(new Contacto($contactoRs->id, $contactoRs->FirstName, $contactoRs->LastName, $contactoRs->phonenumber)); } require_once 'head.html';; echo "<a href='agregarContacto.php'><img src='imagenes/user__plus.png' border=0> Agregar Contacto</a></a><br><br>"; echo "<div class='centrado'><table align='center'><tr ><th>Nombre</th>"; echo "<th>Apellido</th>"; echo "<th>Teléfono</th></tr>"; echo $oc->muestraContactos(); echo "</table></div><br>"; } } Reporte::main();
y para verlo en acción: http://localhost/Reporte.php?usr=7th_Sign
En este ejemplo traté de usar, la agregación y la asociación y no se si las aplique bien, también tengo duda sobre el uso de la multiplicidad así como las consultas a la BD.
A ver si alguien puede decirme que deficiencias tiene este ejemplo en cuanto a UML así como que hacer para mejorarlo.
¿o creen que ya soy un experto?
Saludos