Desarrollo plugin callout
Desarrollo de Plugins – Callout
Importante:
El siguiente material es una traducción de la documentación creada por Jan Thielemann from evenos y fue tomada del siguiente enlace | Developing Plug-Ins - Callout. Gracias a Jan Thielemann por el aporte, este tutorial se limita a la traducción del mismo al español.
Finalidad del Tutorial
La finalidad de este tutorial es mostrar como desarrollar callouts en nuestro plug-in. Para ello existen diferentes formas de implementar callouts. Aprenderas las siguientes maneras:
- Crear un Callout usando IColumnCallout interface y extensión de puntos.
- Crear un Callout usando Java puro y el Diccionario de Aplicación.
- Crear un Callout usando IColumnCalloutFactory y una definición de componente.
Prerequisitos
Antes de iniciar el desarrollo de plug-ins, debes echar un vistazo a | Developing Plug-Ins without affecting trunk y | Get your Plug-In started.
El Flujo de Trabajo
Usando una Extensión
Desarrollar un Callout usando una extensión es una de las formas más fáciles pero es un poco anticuado. Esto también puede causar conflictos en versiones futuras de Idempiere, así que siempre es una buena idea usar el enfoque factory/component si es posible. En primer lugar crea tu plug-in siguiendo los prerequisitos de este tutorial. Después, crea un nuevo paquete y una clase. Nosotros llamamos a nuestra clase IColumnCalloutCallout en este caso. Implementa la clase de interfaz IColumnCallout y agrega alguno registro para el método start():
Abre el MANIFEST.MF y ve a la pestaña extesión. Agrega la extesión org.adempiere.base.IColumnCallout. Ahora haz click en agregar un nuevo callout. Luego click en el botón navegador (browser) y selecciona la clase creada anteriormente. Como nombre de la tabla (tableName) nosotros elegimos "M_Product" y como nombre de columna (columnName) "Help". Como prioridad (priority) escogimos 1:
Copia el nombre de la clase completo y selecciona de nuevo org.adempiere.base.IColumnCallout. Pega y agrega ".help". Con esto se puede definir mejor entre diferentes callouts si están dentro de la misma clase.
Básicamente esto es todo. Inicia un cliente y abre la ventana Producto. Introduzca o cambie algo en el campo de ayuda (help) y deje el campo. Observe los registros en su consola.
Puedes usar una clase para diferentes Tablas/Columnas. Si deseas hacer esto, sólo agrega otra extensión pero con diferente nombre de tabla y columna (tableName/columnName). En el método start() de la clase Callout. Comprueba con mTab.getTableName() y mField.getColumnName() para decidir cual método callout quieres llamar. CalloutInfoWindow.java es una buena referencia para ver como se puede hacer.
Usando Java
Esta forma es algo anticuado y más incomoda que los otros enfoques, pero por motivos de exhaustividad, se les mostrara. En primer lugar se crea otra clase llamada JavaCallout, la cual hereda de "CalloutEngine" y se crea un nuevo método siguiendo la siguiente estructura:
public String myMethodName(Properties ctx, int WindowNo, GridTab mTab, GridField mField, Object value)
Se agrega algún registro para mostrar en consola y al final retornar en nulo (null). Si la sentencia de retorno no es nulo, el CalloutEngine lo manejará como un error:
Abrir el MANIFEST.MF y selecciona la pestaña Runtime. Se agregar el paquete donde tu clase JavaCallout este localizada.
Hasta ahora no hay problema. Debido a que no se utiliza una extensión o un componente, ¿cómo debería el CalloutEngine localizar nuestra clase? Bueno para ello, cambie a la pestaña MANIFEST.MF y añada la siguiente línea: "Eclipse-Registerbuddy: org.adempiere.base". Porfavor tome en cuenta que esto no es una de las mejores practicas! Guarde el Manifest e inicie el cliente. Ingrese como SuperUser/System y abra la ventana Tabla y Columna (Table and Column). Busque la tabla M_Product y cambie a la pestaña Columna. Encuentre la columna Descripción e introduzca el nombre de la clase seguida por un punto y el nombre del método en el campo Callout.
Restaure el cliente y asegúrese que el plug-in esta activado. Ingrese como GardenAdmin/GardenWorld y abra la ventana Producto. Ingrese o cambie algo en el campo descripción y cambie de campo. Ahora observe los registros en consola, debe ver algo como esto:
Usando CalloutFactory
Este debe ser el enfoque preferido. Se crean 2 clases. Una para el Factory y una para el callout actual. Nosostros la llamamos CalloutFactory y CalloutFromFactory. Copie el código de la IColumnCalloutcallout al CalloutFromFactory o observa como hacerlo. Se implementa IColumnCallout interface y tiene sólo un registro en su método start().
Ahora, la parte interesante. En la clase CalloutFractory implemente IColumnCalloutFactory interface y es necesario el método getColumnCallouts(). Aquí se comprueba el nombre de la columna/ nombre de tabla (columnname/tablename ) y decide, si desea proporcionar un callout. Se comprueba para MProduct.Table_Name y MProduct.COLUMNNAME_DocumentNote:
El siguiente paso es agregar una definición de componente(component definition) en el plug-in. Click en New > New > Others y de la lista selecionar Component Definition.
Haga click en siguiente y escoja el nombre. Asegúrese de que el nombre sea único. También, haga click en Examinar(browser) y seleccione la clase que CalloutFactory:
Abra el component.xml (en nuestro caso calloutfactory.xml) y cambie a la pestaña servicio(service tab). Añada org.adempiere.base.IColumnCalloutFactory a la sección de Servicios (Provides Services):
Compruebe la pestaña MANIFEST.MF de su archivo de manifiesto (manifest file) y busque la línea que comienza con "Service-componente: ..." y compruebe la ruta correcta para su xml e insertela aquí:
Inicie el cliente e inicie sesión como GardenAdmin / Gardenworld. Abra la ventana del producto e introduzca o cambie algo en el campo Nota de documentos. Deje el campo y comprobe su registro en la consola. Debería ver algo como esto:
Esta tradución fue realizada por Gabriela Soto de Ghintech - Venezuela