Object Models¶
Definición de un nuevo Object Model¶
Un object model de prestashop viene a ser algo así como un pequeño ORM. Lo ideal es guardarlos en una carpeta de nuestro módulo llamada classess o models.
- La convención de Prestashop para llamar al fichero y clase son las siguientes:
- El mismo nombre para el archivo y la clase
- Utilizar CamelCase para el nombre
- Definir el nombre en singular
- El nombre debe coincidir con el nombre de la tabla en la base de datos
La clase debe extender de ObjectModel y debes crear una variable pública por cada campo en la base de datos. Además hay que crear un array de definiciones realizando los siguientes pasos:
- Definir el nombre de la tabla relacionada con el objeto, sin el prefijo (se añadirá automáticamente)
- Definir la clave primaria de la tabla
- Definir el campo multilang en caso de que el objeto necesite traducirse a varios idiomas
- Definir el array fields que contiene el type, el método de validación que se llamará al actualizar o insertar un objeto, el tamaño del campo (size) y la bandera required. Además también tenemos el campo copy_post que indicar si se debe obtener el valor de valores POST o no (normalmente se desactiva para campos tipo fecha como updated_at).
Ejemplo:
class MiModuloComentario extends ObjectModel
{
public $id_comentario;
public $id_producto;
public $nombre;
public $apellidos;
public $comentario;
/**
* @see ObjectModel::$definition
*/
public static $definition = array(
'table' => 'mimodulo_comentario',
'primary' => 'id_comentario',
'multilang' => false,
'fields' => array(
'id_producto' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId', 'required' => true),
'nombre' => array('type' => self::TYPE_STRING, 'validate' => 'isName', 'size' => 20),
// Y así con el resto de campos
),
);
}
Guardando en la base de datos con un ObjectModel¶
$comentario = new MiModuloComentario();
$comentario->nombre = 'Carlos';
$comentario->producto = 25;
$comentario->comentario = 'texto del comentario'
# Nuevas instancias
$comentario->add();
# Actualizar
$comentario->update();
# Dejar que decida si es nuevo o actualizar
$comentario->save();
# Eliminar
$comentario->delete();
Advertencia
Valores null serán convertidos a “0
” a no ser que se indique
lo contrario. Para ello el atributo en el modelo debe declararse como tipo
self::TYPE_NOTHING
y probablemente sea necesario sobreescribir el método
add del modelo por:
public function add($autodate = true, $null_values = true)
{
return parent::add($autodate, $null_values);
}
es decir, forzando $null_values=true para permitir valores null.
Validación¶
La lista completa de validaciones se puede consultar en el propio código fuente: https://github.com/pal/prestashop/blob/master/classes/Validate.php
Cuidado. El comentario será validado antes de guardarse en cuyo caso lanzará excepciones que deberás capturar para mostrar el error correspondiente al usuario.
Podríamos guardar así el error:
$this->context->smarty->assign('nuevo_comentario_posted', 'error');
Para mostrar la alerta al usuario el código prestashop en la plantilla sería:
{if isset($nuevo_comentario) && $nuevo_comentario_posted eq 'error'}
<div class="alert alert-danger">
<p>
{l s='Algunos campos del formulario no son correctos, corrígelos y vuelve a intentarlo'}
</p>
</div>
{/if}
Ver también
No olvides incluír el fichero .php del ObjectModel en todos los lugares donde quieras utilizarlo