Esta web utiliza cookies propias y de terceros para su funcionamiento. ¿Aceptas? Leer más
Creación de plugins

Las extensiones

Las extensiones son una forma sencilla para que los plugins añadan funcionalidad a recursos existentes (modelos, controladores, tablas o vistas). Las extensiones no son herencia, esto hay que tenerlo claro para poder trabajar con ellas.

Añadir columnas a una tabla

Supongamos que queremos añadir la columna "usado" a la tabla de productos. Lo que normalmente harías es añadir el archivo Table/productos.xml a tu plugin con la columna deseada. Pero esto no es correcto. Al hacer esto lo que le estás diciendo a FacturaScripts es que la tabla productos se compone únicamente de la columna "usado".

Para este caso lo correcto es crear el archivo Extension/Table/productos.xml:

<?xml version="1.0" encoding="UTF-8"?>
<table>
    <column>
        <name>usado</name>
        <type>boolean</type>
    </column>
</table>

De esta forma lo que estamos indicando a FacturaScripts es que añada esta columna a la definición de la tabla productos.

Tabla y modelo

Recuerda que todas las columnas de una tabla se cargan en el modelo como propiedades, así que no es necesario añadir la propiedad "usado" en el modelo.

Añadir columnas a una vista XML

Continuando con el ejemplo, para añadir la columna "usado" a la vista del producto utilizaremos un widget checkbox y lo incluiremos en una extensión en el archivo Extension/XMLView/EditProducto.xml:

<?xml version="1.0" encoding="UTF-8"?>
<view>
    <columns>
        <group name="options" numcolumns="12" valign="bottom">
           <column name="usado">
              <widget type="checkbox" fieldname="usado" />
           </column>
        </group>
    </columns>
</view>

De esta forma le estamos diciendo a FacturaScripts que incluya la columna "usado" dentro del grupo "options" de la lista de columnas del archivo XMLView/EditProducto.xml

Añadir métodos a un modelo

Como ya hemos comentado al añadir una columna a una tabla automáticamente se añade esa propiedad al modelo. Las extensiones para modelos se usarán únicamente para métodos o funciones. Y como también hemos comentado, las extensiones no son herencia, solamente son una forma de añadir métodos a una clase, pero sin extender y sin padre.

Continuando con el ejemplo vamos a añadir un método "usado()" que nos devolverá el valor de "usado". Podemos consultar este valor directamente, pero para el ejemplo imaginaremos que no. Para añadir el método "usado()" crearemos el archivo Extension/Model/Producto.php:

<?php
namespace FacturaScripts\Plugins\MiPLugin\Extension\Model;

class Producto
{
   public function usado()
   {
      return function() {
         return $this->usado;
      };
   }
}

Fíjate que no hay ningún extends Producto. No estamos heredando del modelo, solamente estamos añadiendo el método "usado()". Y fíjate además que el método devuelve una función, esta función es la que se añade al modelo. Pero para ello primero hay que cargar la extensión en el archivo Init.php del plugin.

Cargar extensiones en el Init.php

Las extensiones de archivos xml se integran automáticamente al activar el plugin o reconstruir Dinamic. En cambio, las extensiones de archivo php se deben cargar explícitamente, y se deben hacer desde el archivo Init.php del plugin, en el método init().

public function init()
{
   $this->loadExtension(new Extension\Model\Producto());
}

Métodos clear(), delete() y save()

Si queremos ejecutar algo cada vez que se crea, actualiza o elimina un producto, podemos usar una extensión para ello. Siguiendo con el ejemplo, vamos a ejecutar algo cada vez que se crea un nuevo producto. Para ello en nuestro archivo Extension/Model/Producto.php vamos a añadir esta función:

public function saveInsert()
{
   return function() {
        /// tu código aquí
     };
}

Este código se ejecutará cada vez que se cree un nuevo producto. Si queremos ejecutarlo cuando se actualice, podemos usar save() o saveUpdate().

Añadir pestañas a un controlador

Las extensiones también sirven para poder añadir pestañas o cualquier método a controladores que ya existen. Siguiendo con el ejemplo vamos a añadir la pestaña de logs al listado de productos (controlador ListProducto). Para ello creamos el archivo Extension/Controller/ListProducto.php:

<?php
namespace FacturaScripts\Plugins\MiPLugin\Extension\Controller;

class ListProducto
{
   public function createViews()
   {
      return function() {
         $this->addView('ListLogMessage', 'LogMessage', 'log');
      };
   }
}

Recuerda que debes cargar la extensión desde el archivo Init.php del plugin.