Soy nueva en Symfony y tengo una graaaaaaaaaan duda:
"Symfony" un framework que agiliza el desarrollo de aplicaciones web,
trabaja con patron MVC y posee un ORM que transforma el modelo de
datos a modelo de clases, facilitando el trabajo (abstrayendo...).
Y es aquí mi pregunta: Si trabajo con RUP (naturalmente asociado con
UML y el diseño orientado a objetos): ¿Como puedo traducir todo el
analisis y diseño (oo) que haga a partir de UML- RUP y plasmarlo en
symfony?
Me explico, en diseño oo se crean clases, diagramas de interaccion, de
paquetes, tambien diseñamos pantallas y hacemos un modelo de datos.
No necesariamente, las clases diseñadas tienen una correspondencia 1 a
1 con las tablas de la base de datos (relacional), por ejemplo: una
clase boleta puede tener los atributos numero de boleta y fecha y un
arreglo de productos, lo que en la base de datos puede estar reflejado
como una tabla "Boleta" que contenga los campos: id_boleta,
numero_Boleta, fecha_boleta y otra tabla "detalleBoleta" que
contenga los campos: id_detalleBoleta, fk_id_Boleta,
NombreProducto (listado de productos asociado a cada boleta).
Como vemos no necesariamente el modelo de clases que podemos obtener
despues de analisis y diseño orientado a objetos, sera coincidente con
el modelo de la BD, pero lo que hace Symfony es por cada tabla de la
BD crear una clase ( que en el ejemplo seria la clase sfBoleta y la
clase sfDetalleBoleta, lo cual no coincidiria con mi diseño oo que
tendria solo la clase Boleta)
Entonces, ¿como que si hago mi diseño oo, no va a coincidir con las
clases que me genere symfony?
Si la repuesta fuese: No, no coincidiran... se podria decir que
symfony es orientado a eventos, ya que no tenemos un diseño de objetos
previo?
Pls SOS SOS
Les agradezco de antemano su ayuda :D
salu2
Niky
Está bien que existan dos clases, Boleta y DetalleBoleta.
Sólo te queda configurar tu capa ORM (Propel o Doctrine (te lo
rocomiendo)) para que Boleta esté compuesto por muchos DetalleBoleta, y
ahí tenes tu "array".
Por ejemplo, en Doctrine tendriamos las dos clases cofiguradas así:
class Boleta extends Doctrine_Record
{
public function setTableDefinition()
{
$this->hasColumn('numero', 'integer');
$this->hasColumn('fecha', 'date');
}
public function setUp()
{
$this->ownsMany('DetalleBoleta as Detalles',
'DetalleBoleta.boleta_id');
}
public function getTotal()
{
$acum = 0;
foreach($this->getDetalles() as $detalle) {
$acum += $detalle->getTotal();
}
return $acum;
}
}
class DetalleBoleta extends Doctrine_Record
{
public function setTableDefinition()
{
$this->hasColumn('boleta_id', 'integer');
$this->hasColumn('producto_id', 'integer');
$this->hasColumn('cantidad', 'integer');
$this->hasColumn('precio', 'integer');
}
public function setUp()
{
$this->hasOne('Boleta', 'DetalleBoleta.boleta_id');
$this->hasOne('Producto', 'DetalleBoleta.producto_id');
}
public function getTotal()
{
return $this->getCantidad() * $this->getPrecio();
}
}
class Producto extends Doctrine_Record
{
public function setTableDefinition()
{
$this->hasColumn('nombre', 'string', 100);
}
}
Entonces..., al usar tu modelo podria ser algo así:
// Alta
$boleta = new Boleta();
$boletaNumero = $this->getRequestParameter('boleta_numero');
$productosComprados =
sfDoctrine::getTable('Producto')->find($this->getRequestParameter('productos'));
$productosCantidades = $this->getRequestParameter('cantidades');
$boleta->setNumero($boletaNumero);
$boleta->setFecha(date());
foreach($productosComprados as $producto) {
$detalle = new BoletaDetalle();
$detalle->setProducto($producto);
$detalle->setCantidad($productosCantidades[$producto->getId()]);
...
$boleta->Detalles[] = $detalle;
}
$boleta->save();
// Ver boleta
# En la acción:
public function executeVer()
{
$boleta =
sfDoctrine::getTable('Boleta')->find($this->getRequestParameter('id'));
$this->forward404Unless($boleta);
}
# En la vista
<h2><?php echo $boleta->getNumero() ?> - <?php echo $boleta->getFecha()
?></h2>
<table>
<caption>Detalle de boleta</caption>
<thead>
<tr>
<th>Cantidad</th>
<th>Producto</th>
<th>Precio Unitario</th>
<th>Total</th>
</tr>
</thead>
<tfoot>
<tr>
<th colspan="3">Total de la boleta</th>
<td>$ <?php echo $boleta->getTotal() // se puede usar
format_number() aqui ?></td>
</tr>
</tfoot>
<tbody>
<?php foreach($boleta->getDetalles() as $detalle): ?>
<tr>
<td><?php echo $boleta->getCantidad() ?></td>
<td><?php echo $boleta->getProducto()->getNombre() ?></td>
<td><?php echo $boleta->getPrecio() ?></td>
<td><?php echo $boleta->getTotal() ?></td>
</tr>
<?php endforeach ?>
</tbody>
</table>
Espero haya servido de algo..., no sé si es realmente lo que buscas...,
pero es cómodo y ni documentación le hace falta por lo "natural".
Saludos!
NikY escribió:
Muchas gracias a ambos por responderme, y aclararme la duda... eso de
configurar la capa ORM sonó muy interesante....
Voy a ver que sale.. grax... estaba super complicada con mi oo y lo
que hacia symfony
saludines to2
Niky