Estamos mirando la manera más optima para extender las clases de modelos actuales como pudiera ser la clase producto.
Pongamos un ejemplo:
Fichero original:
Código: Seleccionar todo
//file://htdocs/product/class/product.class.php
/**
* Class to manage products or services
*/
class Product extends CommonObject
{
/**
* Codigo omitido
*
*/
/**
* Insert product into database
*
* @param User $user User making insert
* @param int $notrigger Disable triggers
* @return int Id of product/service if OK, < 0 if KO
*/
function create($user,$notrigger=0)
{
//Aqui se realiza la inserción de los datos nuevos del producto
//Despues de insertar se llama al trigger "PRODUCT_CREATE"
}
}
Código: Seleccionar todo
//Ejemplo de extension de clase
//file://htdocs/mymodule/class/myProduct.class.php
/**
* Class to manage Myproducts or services
*/
class MyProduct extends CommonObject
{
/**
* {@ineherit}
*/
function create($user,$notrigger=0)
{
//Llamamos a nuestra funcion para crear ahora los productos pasando por la padre
$result = parent::create($user, 0);
if($result < 0) {
return $result;
}
//Si pasa por aqui significa que el producto se ha creado correctamente
//Añado propiedades que se han creado nuevas
$sql = "UPDATE" // Actualizar cambios
//Si se realiza correctamente devolvemos el id del producto tal y como lo hace dolibarr
if($this->db->query($sql)) {
return $this->id;
}
//Comprobaremos el error y devolveremos el codigo correspondiente
return CODE_ERROR;
}
- Clase original :
- Estamos hablando de un INSERT inicial en la tabla producto
- INSERT secundario en la tabla de precios
- UPDATE inicial en la tabla producto
- Clase Extendida
- UPDATE con el id obtenido del padre
Si se quisiera adaptar mediante el trigger tampoco podriamos eliminar el ultimo UPDATE de la tabla.
Es la primera vez que me enfrento a un problema así, ya que con la mayoria de software/frameworks que he trabajado funcionan de manera similar a esta:
Código: Seleccionar todo
class Product extends BaseModel
{
// Algo parecido a esto dependiendo del framework es basicamente el funcionamiento actual de los triggers solo que unicamente se llaman
//despues de crearse sin poder cambiar absolutamente ningun dato antes de su insercion o actualizacion en la base de datos.
function create()
{
$this->event('product.before.create', $this);
//Aqui se realiza la inserción de los datos nuevos del producto
//Despues de insertar se llama al trigger "PRODUCT_CREATE"
// Para por ejemplo mandar un mail al cliente o similiares
$this->event('product.after.create', $this);
}
//Essto permitira modificar propiedades de la entidad antes de su creacion o actualizacion
static public function boot()
{
parent::boot();
//evento ejecutado por el conector de la base de datos antes de crear un nuevo registro
static::creating(function($model) {
$model->api_token = $this->model->generateApiToken();
});
//evento ejecutado por el conector antes de actualizar un registro
static::updating(function($model){
if($this->hasAccessToDevelop())
$model->api_token = $this->model->generateApiToken();
});
}
}
A donde quiero llegar es la posiblidad de modificar la primera consulta de en este caso la creacion de productos para no tener que actualizar despues en mi clase.
Cuando se trabaja con pocos registros esto no es problema, pero cuando tienes miles de productos (43k aprox), clientes (189k aprox), facturas (250k aprox), es bastante tedioso.
A ver si alguien puede aportar alguna idea/sugerencia sobre el tema.
Un saludo.