Desarrollo de un módulo: Difference between revisions

Jump to navigation Jump to search
m
(change source tag to syntaxHighlight)
Tag: 2017 source edit
Line 12: Line 12:
{{TemplateDocDesarrollo}}
{{TemplateDocDesarrollo}}
Para crear un nuevo módulo hay distintas fases a seguir. Este tutorial tiene como meta describir cada una de estas fases con el fin de ayudar a comprender las posibilidades de Dolibarr, como por ejemplo añadir una o varias de las siguientes funcionalidades:
Para crear un nuevo módulo hay distintas fases a seguir. Este tutorial tiene como meta describir cada una de estas fases con el fin de ayudar a comprender las posibilidades de Dolibarr, como por ejemplo añadir una o varias de las siguientes funcionalidades:
* Añadir nuevas tablas a la base de datos.
 
* Añadir sus propias entradas en los menús.
*Añadir nuevas tablas a la base de datos.
* Añadir pantallas de edición/consulta de nuevas tablas.
*Añadir sus propias entradas en los menús.
* Añadir o eliminar pestañas en las páginas de vista/edición de objetos (factura, producto, pedido, evento, etc.)
*Añadir pantallas de edición/consulta de nuevas tablas.
* Añadir exportaciones predefinidas a la función “Exportar”.
*Añadir o eliminar pestañas en las páginas de vista/edición de objetos (factura, producto, pedido, evento, etc.)
* Añadir variables de substitución
*Añadir exportaciones predefinidas a la función “Exportar”.
* Añadir nuevas cajas a la página de inicio.
*Añadir variables de substitución
* Definir nuevos permisos.
*Añadir nuevas cajas a la página de inicio.
* Activar código automático sobre una acción particular de Dolibarr.
*Definir nuevos permisos.
* Insertar nuestro código mediante los hooks de Dolibarr
*Activar código automático sobre una acción particular de Dolibarr.
* Añadir un módulo de numeración
*Insertar nuestro código mediante los hooks de Dolibarr
* Añadir un modelo de documento
*Añadir un módulo de numeración
* Añadir un nuevo tema  
*Añadir un modelo de documento
*Añadir un nuevo tema


etc.
etc.


= [[File:Art.png]] Crear un módulo =
=[[File:Art.png]] Crear un módulo=
Los capítulos siguientes describen las acciones a realizar para crear un módulo Dolibarr. Los primeros capítulos son obligatorios cualquiera que sea la vocación de los módulos, los siguientes dependerán de lo que deba hacer el módulo
Los capítulos siguientes describen las acciones a realizar para crear un módulo Dolibarr. Los primeros capítulos son obligatorios cualquiera que sea la vocación de los módulos, los siguientes dependerán de lo que deba hacer el módulo


== [[File:Art.png]] Crear un descriptor de Módulo (obligatorio) ==
==[[File:Art.png]] Crear un descriptor de Módulo (obligatorio)==
'''Cuándo''': Obligatorio cada vez que se desarrolla una extensión, cualquiera que sea su finalidad.
'''Cuándo''': Obligatorio cada vez que se desarrolla una extensión, cualquiera que sea su finalidad.


=== Crear su descriptor ===
===Crear su descriptor===
La primera fase es la de crear un fichero descriptor del módulo. Para ello:
La primera fase es la de crear un fichero descriptor del módulo. Para ello:
* Crear el directorio '''/htdocs/''mimodulo''/core/modules'''. Seguidamente ir al directorio '''dev/skeletons''' y copiar el archivo modMyModule.class.php en el directorio '''htdocs/''mimodulo''/core/modules'''.
 
*Crear el directorio '''/htdocs/''mimodulo''/core/modules'''. Seguidamente ir al directorio '''htdocs/modulebuilder/template''' y copiar el archivo modMyModule.class.php en el directorio '''htdocs/''mimodulo''/core/modules'''.


A continuación, modificar el contenido del archivo, reemplazando:
A continuación, modificar el contenido del archivo, reemplazando:
* los "modMyModule" por un valor que corresponda a la finalidad de su módulo. Este valor debe siempre comenzar por mod.  
 
*los "modMyModule" por un valor que corresponda a la finalidad de su módulo. Este valor debe siempre comenzar por mod.
 
ATENCIÓN: El MiModulo debe estar compuesto por una serie de caracteres, siendo los únicos permitidos [A-Za-z_] con longuitud max de MyModule de 12 caracteres.
ATENCIÓN: El MiModulo debe estar compuesto por una serie de caracteres, siendo los únicos permitidos [A-Za-z_] con longuitud max de MyModule de 12 caracteres.
* $this->numero = 100000 por un número de módulo que esté libre. Ver [[List of modules id|Listado de los id de módulos]]
 
* Modificar eventualmente otras variables definidas por los desarrolladores (ver el comentario en el código del esqueleto para ver su significado)
*$this->numero = 100000 por un número de módulo que esté libre. Ver [[List of modules id|Listado de los id de módulos]]
* Crear el directorio /htdocs/mimodulo/  
*Modificar eventualmente otras variables definidas por los desarrolladores (ver el comentario en el código del esqueleto para ver su significado)
*Crear el directorio /htdocs/mimodulo/
 
Ahora su fichero descriptor está configurado.
Ahora su fichero descriptor está configurado.


=== Probar su descriptor ===
===Probar su descriptor===
Ejecute Dolibarr y vaya a la página "Configuración > Módulo". Debería aparecer una nueva línea con su nuevo módulo y la posibilidad de activarlo o no (eche un vistazo a todas las pestañas de cada categoría para encontrarlo). Es el valor $this->special el que determina en qué pestaña se encuentra su módulo.
Ejecute Dolibarr y vaya a la página "Configuración > Módulo". Debería aparecer una nueva línea con su nuevo módulo y la posibilidad de activarlo o no (eche un vistazo a todas las pestañas de cada categoría para encontrarlo). Es el valor $this->special el que determina en qué pestaña se encuentra su módulo.


== [[File:Art.png]] Árbol de un nuevo módulo ==
==[[File:Art.png]] Árbol de un nuevo módulo==
Crear un directorio 'mimodulo' que contendrá los archivos del módulo. Este directorio debe de estar en el directorio '''htdocs''' y contendrá los siguientes subdirectorios:
Crear un directorio 'mimodulo' que contendrá los archivos del módulo. Este directorio debe de estar en el directorio '''htdocs''' y contendrá los siguientes subdirectorios:
{{TemplateModuleTreeSimple}}
{{TemplateModuleTreeSimple}}


== [[File:Art.png]] Crear sus tablas SQL y la clase PHP con los métodos de acceso (opcional) ==
==[[File:Art.png]] Crear sus tablas SQL y la clase PHP con los métodos de acceso (opcional)==
'''Cuándo:''' Si su módulo necesita gestionar sus propios datos.
'''Cuándo:''' Si su módulo necesita gestionar sus propios datos.


Line 60: Line 66:


Revisa que en el descriptor de archivo (mymodule/core/modules/mymodule.class.php) la línea
Revisa que en el descriptor de archivo (mymodule/core/modules/mymodule.class.php) la línea
<syntaxHighlight lang="php">
<syntaxhighlight lang="PHP">
$this->_load_tables('/mymodule/sql/');
$this->_load_tables('/mymodule/sql/');
</syntaxHighlight>
</syntaxhighlight>
esté descomentada y correctamente configurada.
esté descomentada y correctamente configurada.


Line 68: Line 74:


''Regla a respetar:''  
''Regla a respetar:''  
* Agregue los archivos de orden de creación de sus tablas siguiendo el principio de un fichero '''llx_mitabla.sql'' por tabla, eventualmente acompañado del archivo '''llx_mitabla.key.sql''' (ver los archivos existentes en ''install/mysql/tables'', para tomar ejemplo).  
 
* The recommended type and name for SQL fields are defined into page [[Language_and_development_rules#Table_and_fields_structures]].
*Agregue los archivos de orden de creación de sus tablas siguiendo el principio de un fichero '''llx_mitabla.sql'' por tabla, eventualmente acompañado del archivo '''''<nowiki/>''llx_mitabla.key.sql'<nowiki/>'' (ver los archivos existentes en ''install/mysql/tables'', para tomar ejemplo).
* En términos de orden de gestión de datos, todos deben estar en un archivo llamado '''data.sql''' situado en la misma carpeta '''/mimodulo/sql/'''.
*The recommended type and name for SQL fields are defined into page [[Language_and_development_rules#Table_and_fields_structures]].
*En términos de orden de gestión de datos, todos deben estar en un archivo llamado '''data.sql''' situado en la misma carpeta '''/mimodulo/sql/'''.


Ejemplo de contenido de un fichero data.sql
Ejemplo de contenido de un fichero data.sql
<syntaxHighlight lang="sql">
<syntaxhighlight lang="sql">
  delete from llx_const where name='MYMODULE_IT_WORKS' and entity='__ENTITY__';
  delete from llx_const where name='MYMODULE_IT_WORKS' and entity='__ENTITY__';
  insert into llx_const (name, value, type, note, visible, entity) values ('MYMODULE_IT_WORKS','1','chaine','A constant vor my module',1,'__ENTITY__');
  insert into llx_const (name, value, type, note, visible, entity) values ('MYMODULE_IT_WORKS','1','chaine','A constant vor my module',1,'__ENTITY__');
</syntaxHighlight>
</syntaxhighlight>


Las órdenes SQL de los archivos deben de ser operacionales para la base de datos '''mysql'''.
Las órdenes SQL de los archivos deben de ser operacionales para la base de datos '''mysql'''.
Nota: Los archivos de otras bases de datos no se mantienen. Se leen y se convierten al vuelo por el driver de la base de datos.
Nota: Los archivos de otras bases de datos no se mantienen. Se leen y se convierten al vuelo por el driver de la base de datos.


=== Probar su archivo .sql ===
===Probar su archivo .sql===
Una vez que los archivos estén listos, puede volver a Dolibarr para desactivar el módulo, eliminar las tablas de la base de datos y reactivar el módulo. Las tablas deben ser recreadas por la activación del módulo. Si no es así, verifique sus scripts o consulte los logs Dolibarr.
Una vez que los archivos estén listos, puede volver a Dolibarr para desactivar el módulo, eliminar las tablas de la base de datos y reactivar el módulo. Las tablas deben ser recreadas por la activación del módulo. Si no es así, verifique sus scripts o consulte los logs Dolibarr.


=== Generar la clase PHP de acceso (DAO) ===
===Generar la clase PHP de acceso (DAO)===
Una vez que sus tablas estén creadas en la base de datos, vaya al directorio '''dev/skeletons''', copie el archivo '''build_class_from_table.php''' en el directorio sql/ de su módulo module, y ejecute el script
Una vez que sus tablas estén creadas en la base de datos, vaya al directorio '''dev/skeletons''', copie el archivo '''build_class_from_table.php''' en el directorio sql/ de su módulo module, y ejecute el script
<syntaxHighlight lang="bash">
<syntaxhighlight lang="bash">
  php build_class_from_table.php nombretabla
  php build_class_from_table.php nombretabla
</syntaxHighlight>
</syntaxhighlight>
Nota: Si el comando no funciona, intente con php-cli en lugar de php.
Nota: Si el comando no funciona, intente con php-cli en lugar de php.


Line 95: Line 102:
Un archivo '''out.nombretabla_script.php''' se genera igualmente y contiene un ejemplo de código para utilizar la clase para cada uno de los cuatro métodos CRUD.
Un archivo '''out.nombretabla_script.php''' se genera igualmente y contiene un ejemplo de código para utilizar la clase para cada uno de los cuatro métodos CRUD.


== Visualización de pestañas (opcional) ==
==Visualización de pestañas (opcional)==


=== Añadir o eliminar pestañas en las fichas entidad ===
===Añadir o eliminar pestañas en las fichas entidad===
'''Cuándo''' : Para añadir su propia pestaña en las pestañas estándar de una ficha entidad (factura, pedido, presupuesto, miembro...)
'''Cuándo''' : Para añadir su propia pestaña en las pestañas estándar de una ficha entidad (factura, pedido, presupuesto, miembro...)


Para ello, vaya al archivo descriptor del módulo creado anteriormente y modifique la tabla $this->tabs:
Para ello, vaya al archivo descriptor del módulo creado anteriormente y modifique la tabla $this->tabs:
<syntaxHighlight lang="php">
<syntaxhighlight lang="PHP">
// Array to add new pages in new tabs or remove existing one
// Array to add new pages in new tabs or remove existing one
$this->tabs = array('objecttype:+tabname1:Title1:@mymodule:/mymodule/mynewtab1.php?id=__ID__',  // To add a new tab identified by code tabname1
$this->tabs = array('objecttype:+tabname1:Title1:@mymodule:/mymodule/mynewtab1.php?id=__ID__',  // To add a new tab identified by code tabname1
                             'objecttype:+tabname2:Title2:@mymodule:/mymodule/mynewtab2.php?id=__ID__',  // To add another new tab identified by code tabname2
                             'objecttype:+tabname2:Title2:@mymodule:/mymodule/mynewtab2.php?id=__ID__',  // To add another new tab identified by code tabname2
                             'objecttype:-tabname');                                                    // To remove an existing tab identified by code tabname
                             'objecttype:-tabname');                                                    // To remove an existing tab identified by code tabname
</syntaxHighlight>
</syntaxhighlight>


La tabla debe contener una lista de cadena, cada cadena representa una nueva pestaña.
La tabla debe contener una lista de cadena, cada cadena representa una nueva pestaña.
El formato de la cadena se compone de 4 partes separadas por ":"
El formato de la cadena se compone de 4 partes separadas por ":"
* Parte 1: El código de la entidad (objecttype) en la que debe aparecer la pestaña siendo el valor de ella misma:
 
*Parte 1: El código de la entidad (objecttype) en la que debe aparecer la pestaña siendo el valor de ella misma:
{{TemplateModuleTabs-es}}
{{TemplateModuleTabs-es}}
* Parte 2: El título de la pestaña. Puede ser una etiqueta directa o mejor un código de traducción de un archivo lang.
* Parte 3: El nombre del archivo .lang (sin la extensión .lang) que contiene la correspondencia entre el código de traducción y la etiqueta a mostrar. Si el nombre empieza con @, Dolibarr buscará el archivo en el directorio lang del propio módulo, es decir, htdocs/mimodulo/langs/code_CODE/mimodulo.lang, de lo contrario Dolibarr buscará el archivo de en /langs/code_CODE/mimodulo.lang


* Parte 4: La url de la página a mostrar cuando se haga click en las pestaña. La cadena __ID__ será reemplazada automáticamente por el Id de la entidad concerniente.
*Parte 2: El título de la pestaña. Puede ser una etiqueta directa o mejor un código de traducción de un archivo lang.
*Parte 3: El nombre del archivo .lang (sin la extensión .lang) que contiene la correspondencia entre el código de traducción y la etiqueta a mostrar. Si el nombre empieza con @, Dolibarr buscará el archivo en el directorio lang del propio módulo, es decir, htdocs/mimodulo/langs/code_CODE/mimodulo.lang, de lo contrario Dolibarr buscará el archivo de en /langs/code_CODE/mimodulo.lang
 
*Parte 4: La url de la página a mostrar cuando se haga click en las pestaña. La cadena __ID__ será reemplazada automáticamente por el Id de la entidad concerniente.


Para alimentar el contenido de la pestaña con los datos de la base de datos, vea el capítulo siguiente.
Para alimentar el contenido de la pestaña con los datos de la base de datos, vea el capítulo siguiente.


=== Añadir pestañas de una ficha entidad en su propia página ===
===Añadir pestañas de una ficha entidad en su propia página===
'''Cuándo''' : Para mostrar las pestañas estándar de ficha entidad (producto, tercero, etc.) en su propia pestaña de una entidad.
'''Cuándo''' : Para mostrar las pestañas estándar de ficha entidad (producto, tercero, etc.) en su propia pestaña de una entidad.


Line 127: Line 136:


Para cada ficha entidad, hay que incluir dos archivos con la instrucción
Para cada ficha entidad, hay que incluir dos archivos con la instrucción
<syntaxHighlight lang="php">require_once($url_fichier) ;</syntaxHighlight>
<syntaxhighlight lang="PHP">require_once($url_fichier) ;</syntaxhighlight>


Aquí le mostramos la lista de estos archivos (DOL_DOCUMENT_ROOT correspondiente al directorio '''dolibarr/htdocs/''') :
Aquí le mostramos la lista de estos archivos (DOL_DOCUMENT_ROOT correspondiente al directorio '''dolibarr/htdocs/''') :
* Entidad tercero (thirdparty) :
 
** DOL_DOCUMENT_ROOT/societe/class/societe.class.php
*Entidad tercero (thirdparty) :
** DOL_DOCUMENT_ROOT/core/lib/company.lib.php
**DOL_DOCUMENT_ROOT/societe/class/societe.class.php
* Entidad producto (product) :
**DOL_DOCUMENT_ROOT/core/lib/company.lib.php
** DOL_DOCUMENT_ROOT/product.class.php
*Entidad producto (product) :
** DOL_DOCUMENT_ROOT/lib/product.lib.php
**DOL_DOCUMENT_ROOT/product.class.php
* Entidad factura (invoice) :
**DOL_DOCUMENT_ROOT/lib/product.lib.php
** DOL_DOCUMENT_ROOT/facture.class.php
*Entidad factura (invoice) :
** DOL_DOCUMENT_ROOT/lib/invoice.lib.php
**DOL_DOCUMENT_ROOT/facture.class.php
**DOL_DOCUMENT_ROOT/lib/invoice.lib.php


'''2. Crear y cargar el objeto a mostrar en su pestaña'''
'''2. Crear y cargar el objeto a mostrar en su pestaña'''
Line 145: Line 155:


''Ejemplo :''
''Ejemplo :''
<syntaxHighlight lang="php">
<syntaxhighlight lang="PHP">
$id=$_GET["id"];
$id=$_GET["id"];
$product = new Product($db) ;
$product = new Product($db) ;
$result = $product->fetch($id) ; //Tester $result pour vérifier que l'accès à la base s'est bien passé
$result = $product->fetch($id) ; //Tester $result pour vérifier que l'accès à la base s'est bien passé
</syntaxHighlight>
</syntaxhighlight>


'''3. Recuperar la lista de pestañas correspondientes a la entidad seleccionada'''
'''3. Recuperar la lista de pestañas correspondientes a la entidad seleccionada'''
Line 156: Line 166:


La tabla devuelta se compone de la siguiente manera :
La tabla devuelta se compone de la siguiente manera :
<syntaxHighlight lang="php">
<syntaxhighlight lang="PHP">
$head        // Tableau des onglets
$head        // Tableau des onglets
$head[$h]    // Élément décrivant un onglet. Il y aura autant de $h que d'onglets à afficher
$head[$h]    // Élément décrivant un onglet. Il y aura autant de $h que d'onglets à afficher
Line 162: Line 172:
$head[$h][1] // Titre de l'ongLet
$head[$h][1] // Titre de l'ongLet
$head[$h][2] // Code de l'onglet, à utiliser pour choisir quel onglet sera 'actif' (voir paragraphe suivant)
$head[$h][2] // Code de l'onglet, à utiliser pour choisir quel onglet sera 'actif' (voir paragraphe suivant)
</syntaxHighlight>
</syntaxhighlight>


''Ejemplo :''
''Ejemplo :''
<syntaxHighlight lang="php">
<syntaxhighlight lang="PHP">
$head = product_prepare_head($product, $user) ; //le paramètre $user n'est pas présent sur certaines fonctions
$head = product_prepare_head($product, $user) ; //le paramètre $user n'est pas présent sur certaines fonctions
</syntaxHighlight>
</syntaxhighlight>


'''4. Mostrar las pestañas en su pestaña'''
'''4. Mostrar las pestañas en su pestaña'''
Line 173: Line 183:
Use la función dol_fiche_head() que muestra las pestañas contenidas en la tabla $head devuelta por XX_prepare_head().
Use la función dol_fiche_head() que muestra las pestañas contenidas en la tabla $head devuelta por XX_prepare_head().


<syntaxHighlight lang="php">
<syntaxhighlight lang="PHP">
dol_fiche_head($links, $active='0', $title='', $notab=0, $picto='')
dol_fiche_head($links, $active='0', $title='', $notab=0, $picto='')
$links  // Tableau des onglets, appelé $head plus haut.
$links  // Tableau des onglets, appelé $head plus haut.
Line 183: Line 193:
//            service
//            service
//            company
//            company
</syntaxHighlight>
</syntaxhighlight>


Esta función muestra las pestañas deseadas y abre un elemento ''< div class="" >'' que corresponde a la zona azul bajo las pestañas (si el parámetro $notab = 0). Para cerrar la zona azul, simplemente cierre el elemento ''< /div >'' en el código PHP.
Esta función muestra las pestañas deseadas y abre un elemento ''< div class="" >'' que corresponde a la zona azul bajo las pestañas (si el parámetro $notab = 0). Para cerrar la zona azul, simplemente cierre el elemento ''< /div >'' en el código PHP.
Line 190: Line 200:
Para más detalles, consulte la [http://www.dolibarr.fr/doxygen/ documentación Doxygen] o directamente el código de Dolibarr.
Para más detalles, consulte la [http://www.dolibarr.fr/doxygen/ documentación Doxygen] o directamente el código de Dolibarr.


== Crear sus páginas pantalla PHP (opcional) ==
==Crear sus páginas pantalla PHP (opcional)==
'''Cuándo:''' Si su módulo consiste en añadir funcionalidades que necesitan nuevas pantallas.
'''Cuándo:''' Si su módulo consiste en añadir funcionalidades que necesitan nuevas pantallas.


=== Crear una página pantalla PHP ===
===Crear una página pantalla PHP===
Debe crear a continuación pantallas PHP que se basen en los datos de sus tablas utilizando los esqueletos como ejemplo del directorio '''modulebuilder'''. (Para el desarrollo de un script en línea de comandos, ver [[Desarrollo de scripts]]).
Debe crear a continuación pantallas PHP que se basen en los datos de sus tablas utilizando los esqueletos como ejemplo del directorio '''modulebuilder'''. (Para el desarrollo de un script en línea de comandos, ver [[Desarrollo de scripts]]).


Line 199: Line 209:


Copie allí el archivo '''myobject_page.php''', que va a servir de punto de partida a su página. Modifique el archivo para que la ruta relativa de
Copie allí el archivo '''myobject_page.php''', que va a servir de punto de partida a su página. Modifique el archivo para que la ruta relativa de
<syntaxHighlight lang="php">
<syntaxhighlight lang="PHP">
// Load Dolibarr environment
// Load Dolibarr environment
$res=0;
$res=0;
Line 214: Line 224:
if (! $res && file_exists("../../../main.inc.php")) $res=@include("../../../main.inc.php");
if (! $res && file_exists("../../../main.inc.php")) $res=@include("../../../main.inc.php");
if (! $res) die("Include of main fails");
if (! $res) die("Include of main fails");
</syntaxHighlight>
</syntaxhighlight>


sea la correcta, en función de la profundidad del directorio en el que se encuentra el archivo (quitando o añadiendo "../"). Es en el "main" donde se carga el entorno técnico y las habilitaciones. Los objetos variables se posicionan ahora:
sea la correcta, en función de la profundidad del directorio en el que se encuentra el archivo (quitando o añadiendo "../"). Es en el "main" donde se carga el entorno técnico y las habilitaciones. Los objetos variables se posicionan ahora:
* $user – El objeto que contiene las características del usuario y sus derechos.
* $conf – El objeto que contiene la configuración de Dolibarr.
* $db – El objeto que contiene el gestor de conexión abierto a la base de datos.
* $langs – El objeto que contiene el idioma del usuario.


* La inclusión de una clase o una biblioteca dedicada al módulo, sin saber a dónde se llamará el archivo, se realiza mediante una función de Dolibarr (no directamente mediante include_once):
*$user – El objeto que contiene las características del usuario y sus derechos.
*$conf – El objeto que contiene la configuración de Dolibarr.
*$db – El objeto que contiene el gestor de conexión abierto a la base de datos.
*$langs – El objeto que contiene el idioma del usuario.
 
*La inclusión de una clase o una biblioteca dedicada al módulo, sin saber a dónde se llamará el archivo, se realiza mediante una función de Dolibarr (no directamente mediante include_once):
 
''Ejemplo :''
''Ejemplo :''
<syntaxHighlight lang="php">
<syntaxhighlight lang="PHP">
dol_include_once('/mimodulo/class/miclass.class.php', 'MiClass');
dol_include_once('/mimodulo/class/miclass.class.php', 'MiClass');
</syntaxHighlight>
</syntaxhighlight>
 
*Las clases de llamadas Dolibarr utilice la siguiente sintaxis:


* Las clases de llamadas Dolibarr utilice la siguiente sintaxis:
''Ejemplo :''
''Ejemplo :''
<syntaxHighlight lang="php">
<syntaxhighlight lang="PHP">
require_once DOL_DOCUMENT_ROOT.'/core/class/doli.class.php';
require_once DOL_DOCUMENT_ROOT.'/core/class/doli.class.php';
</syntaxHighlight>
</syntaxhighlight>


=== Acceso a la base de datos ===
===Acceso a la base de datos===
Si necesita realizar modificaciones en su tabla de la base de datos, utilice la clase generada más arriba.
Si necesita realizar modificaciones en su tabla de la base de datos, utilice la clase generada más arriba.


Line 240: Line 253:


Para un ''insert'', ''update'' o ''delete'':
Para un ''insert'', ''update'' o ''delete'':
<syntaxHighlight lang="php">
<syntaxhighlight lang="PHP">
  $db->begin();  // Debut transaction
  $db->begin();  // Debut transaction
  $db->query("Ma requete insert, update ou delete");
  $db->query("Ma requete insert, update ou delete");
  $db->commit();      // Valide
  $db->commit();      // Valide
  o $db->rollback()  // Annule
  o $db->rollback()  // Annule
</syntaxHighlight>
</syntaxhighlight>


Para una lectura:
Para una lectura:
<syntaxHighlight lang="php">
<syntaxhighlight lang="PHP">
  $resql=$db->query("Ma requete select");
  $resql=$db->query("Ma requete select");
  if ($resql)
  if ($resql)
Line 269: Line 282:
         }
         }
  }
  }
</syntaxHighlight>
</syntaxhighlight>


=== Definición de estilos ===
===Definición de estilos===
Para que el aspecto de la página guarde coherencia con el tema Dolibarr, es necesario utilizar los estilos CSS de Dolibarr.
Para que el aspecto de la página guarde coherencia con el tema Dolibarr, es necesario utilizar los estilos CSS de Dolibarr.


Por ejemplo:
Por ejemplo:


* class="liste_titre"1 en las etiquetas tr y td para una línea de título de tabla.  
*class="liste_titre"1 en las etiquetas tr y td para una línea de título de tabla.
* class=”pair” o class=”impair” en las etiquetas tr y td de las líneas de datos de la tabla.
*class=”pair” o class=”impair” en las etiquetas tr y td de las líneas de datos de la tabla.
* class=”flat” en todos los campos en los que se teclea (input, select, textarea...)
*class=”flat” en todos los campos en los que se teclea (input, select, textarea...)
* class=”button” en los objetos de tipo input type=”submit”.
*class=”button” en los objetos de tipo input type=”submit”.




=== Utilizar el selector de fechas de Dolibarr ===
===Utilizar el selector de fechas de Dolibarr===
Si quiere, puede beneficiarse del selector de fechas en las pantallas Dolibarr. Para ello, utilice la siguiente línea:
Si quiere, puede beneficiarse del selector de fechas en las pantallas Dolibarr. Para ello, utilice la siguiente línea:
<syntaxHighlight lang="php">
<syntaxhighlight lang="PHP">
  $form=new Form($db);
  $form=new Form($db);
  $form->select_date('','mykey',0,0,0,"myform");
  $form->select_date('','mykey',0,0,0,"myform");
</syntaxHighlight>
</syntaxhighlight>


La cadena "mikey" identifica el campo fecha. Hace falta introducir un valor diferente en caso de que haya varios campos. La cadena "myform" es el nombre del campo "FORM" (en el formulario, name="myform" de la página html). La visualización de un selector de fecha debe por tanto estar integrada en un formulario html.
La cadena "mikey" identifica el campo fecha. Hace falta introducir un valor diferente en caso de que haya varios campos. La cadena "myform" es el nombre del campo "FORM" (en el formulario, name="myform" de la página html). La visualización de un selector de fecha debe por tanto estar integrada en un formulario html.


Para recuperar el valor, a la herencia de POST, el comando es:
Para recuperar el valor, a la herencia de POST, el comando es:
<syntaxHighlight lang="php">
<syntaxhighlight lang="PHP">
  $mydate = dol_mktime(12, 0 , 0, $_POST['mykeymonth'], $_POST['mykeyday'], $_POST['mykeyyear']);
  $mydate = dol_mktime(12, 0 , 0, $_POST['mykeymonth'], $_POST['mykeyday'], $_POST['mykeyyear']);
  print strftime('%A %d %B %Y', $mydate);
  print strftime('%A %d %B %Y', $mydate);
</syntaxHighlight>
</syntaxhighlight>


== Definir su página de configuración (opcional) ==
==Definir su página de configuración (opcional)==
'''Cuándo:''' Si su módulo ofrece varias opciones parametrizables.
'''Cuándo:''' Si su módulo ofrece varias opciones parametrizables.


=== Crear su página de edición de configuración ===
===Crear su página de edición de configuración===
Si su módulo ofrece varias opciones parametrizables, es necesario crear una página PHP para editar las opciones (que serán guardadas en la [[Table llx_const|tabla '''llx_const''']]). Cree una página PHP llamada '''mimodulo_setuppage.php''', que registre las opciones posibles y las ponga al día. Es necesario tomar como ejemplo una página de '''/admin''' que le muestre el método para leer o guardar en la base de datos su opción. Coloque esta página de configuración también en el directorio '''/admin'''. A continuación, en el descriptor del módulo, modifique la variable para indicar el nombre de esta página PHP (no es necesario modificar la ruta, ya que la página estará forzosamente en el directorio '''/admin''').
Si su módulo ofrece varias opciones parametrizables, es necesario crear una página PHP para editar las opciones (que serán guardadas en la [[Table llx_const|tabla '''llx_const''']]). Cree una página PHP llamada '''mimodulo_setuppage.php''', que registre las opciones posibles y las ponga al día. Es necesario tomar como ejemplo una página de '''/admin''' que le muestre el método para leer o guardar en la base de datos su opción. Coloque esta página de configuración también en el directorio '''/admin'''. A continuación, en el descriptor del módulo, modifique la variable para indicar el nombre de esta página PHP (no es necesario modificar la ruta, ya que la página estará forzosamente en el directorio '''/admin''').
<syntaxHighlight lang="php">
<syntaxhighlight lang="PHP">
  $this->config_page_url = array("monmodule_setuppage.php");
  $this->config_page_url = array("monmodule_setuppage.php");
</syntaxHighlight>
</syntaxhighlight>


=== Probar su página ===
===Probar su página===
Vaya a la página '''Configuración > módulo'''. Debería aparecer un icono que permite acceder a la página de configuración, y debería poder modificar estas opciones y verlas en la base de datos.
Vaya a la página '''Configuración > módulo'''. Debería aparecer un icono que permite acceder a la página de configuración, y debería poder modificar estas opciones y verlas en la base de datos.




== Definir sus entradas de menú (opcional) ==
==Definir sus entradas de menú (opcional)==
'''Cuándo:''' Si ha creado páginas PHP, es necesario que estas pantallas sean accesibles desde el menú Dolibarr.
'''Cuándo:''' Si ha creado páginas PHP, es necesario que estas pantallas sean accesibles desde el menú Dolibarr.


=== Definir sus entradas de menú ===
===Definir sus entradas de menú===
Para ello, hace falta definir en el archivo descriptor de menú de tabla this->menu, que declara los menús.
Para ello, hace falta definir en el archivo descriptor de menú de tabla this->menu, que declara los menús.
Esta tabla contiene todas las entradas que aparecerán en los menús una vez que el módulo sea activado. Los archivos de descriptor de módulo contienen un ejemplo de cómo se declara el menú superior, así como las entradas correspondientes en el menú de la derecha
Esta tabla contiene todas las entradas que aparecerán en los menús una vez que el módulo sea activado. Los archivos de descriptor de módulo contienen un ejemplo de cómo se declara el menú superior, así como las entradas correspondientes en el menú de la derecha


He aquí un ejemplo de declaración de entradas de menú en el fichero descriptor:
He aquí un ejemplo de declaración de entradas de menú en el fichero descriptor:
<syntaxHighlight lang="php">
<syntaxhighlight lang="PHP">
// Main menu entries
// Main menu entries
$this->menu = array(); // List of menus to add
$this->menu = array(); // List of menus to add
Line 353: Line 366:
'user'=>2); // 0=Menu for internal users,1=external users, 2=both
'user'=>2); // 0=Menu for internal users,1=external users, 2=both
$r++;
$r++;
</syntaxHighlight>
</syntaxhighlight>


Para condicionar el acceso al menú segun los permisos, modificar la propiedad '''perms''' de la tabla. Ver el capítulo sobre permisos, un poco más abajo, para saber como realizar los permisos.
Para condicionar el acceso al menú segun los permisos, modificar la propiedad '''perms''' de la tabla. Ver el capítulo sobre permisos, un poco más abajo, para saber como realizar los permisos.


=== Probar sus entradas de menú ===
===Probar sus entradas de menú===
Desactive y reactive su módulo bajo Dolibarr. Las entradas del menú deberían aparecer después de hacerlo (si la condición 'enabled' está activada).
Desactive y reactive su módulo bajo Dolibarr. Las entradas del menú deberían aparecer después de hacerlo (si la condición 'enabled' está activada).


== Definir sus propios permisos (opcional) ==
==Definir sus propios permisos (opcional)==
'''Cuándo:''' Si quiere añadir nuevos permisos.
'''Cuándo:''' Si quiere añadir nuevos permisos.


La definición de permisos que gestionará su módulo se hace en el archivo descriptor creado en la primera fase. Modifique la línea $this->rights_class = 'facture' para que diga:
La definición de permisos que gestionará su módulo se hace en el archivo descriptor creado en la primera fase. Modifique la línea $this->rights_class = 'facture' para que diga:
<syntaxHighlight lang="php">
<syntaxhighlight lang="PHP">
  $this->rights_class = 'mimodulo';
  $this->rights_class = 'mimodulo';
</syntaxHighlight>
</syntaxhighlight>


A continuación, rellene la tabla $this->rights con tantas entradas como permisos diferentes vaya a definir:
A continuación, rellene la tabla $this->rights con tantas entradas como permisos diferentes vaya a definir:
<syntaxHighlight lang="php">
<syntaxhighlight lang="PHP">
  $this->rights[$r][0] = 10001;
  $this->rights[$r][0] = 10001;
  $this->rights[$r][1] = 'Texto por defecto de mi permiso';
  $this->rights[$r][1] = 'Texto por defecto de mi permiso';
Line 376: Line 389:
  $this->rights[$r][5] = 'subaccion';
  $this->rights[$r][5] = 'subaccion';
  $r++;
  $r++;
</syntaxHighlight>
</syntaxhighlight>


En $this->rights[$r][0], introduzca un id de permiso que no haya sido ocupado ya (para saber qué id están siendo ya utilizadas, ver el menú '''Información del Sistema''' en una instalación de Dolibarr que esté funcionando. En $this->rights[$r][3], introduzca 1 si este permiso se atribuye por defecto a los usuarios según son creados. En $this->rights[$r][1] introduzca un texto por defecto -que será mostrado si no se encuentra traducción para su permiso en el archivo '''admin.lang'''). En $this->rights[$r][4] y $this->rights[$r][5], introduzca una cadena de acción y subacción sin espacios. Después puede probar si un usuario tiene los permisos bien, introduciendo la siguiente secuencia en el código PHP:
En $this->rights[$r][0], introduzca un id de permiso que no haya sido ocupado ya (para saber qué id están siendo ya utilizadas, ver el menú '''Información del Sistema''' en una instalación de Dolibarr que esté funcionando. En $this->rights[$r][3], introduzca 1 si este permiso se atribuye por defecto a los usuarios según son creados. En $this->rights[$r][1] introduzca un texto por defecto -que será mostrado si no se encuentra traducción para su permiso en el archivo '''admin.lang'''). En $this->rights[$r][4] y $this->rights[$r][5], introduzca una cadena de acción y subacción sin espacios. Después puede probar si un usuario tiene los permisos bien, introduciendo la siguiente secuencia en el código PHP:
<syntaxHighlight lang="php">
<syntaxhighlight lang="PHP">
  if ($user->rights->mimodulo->accion->subaccion) ...
  if ($user->rights->mimodulo->accion->subaccion) ...
</syntaxHighlight>
</syntaxhighlight>


== Definir sus propios paneles (opcional) ==
==Definir sus propios paneles (opcional)==
'''Cuándo:''' Si su módulo tiene uno o varios paneles.
'''Cuándo:''' Si su módulo tiene uno o varios paneles.


=== Defina sus paneles ===
===Defina sus paneles===
Para ello, modifique las tablas $this->boxes del archivo descriptor de módulo. Es suficiente con añadir 2 líneas por cada archivo de panel que se encuentre en el directorio '''htdocs/mimodulo/core/boxes'''.
Para ello, modifique las tablas $this->boxes del archivo descriptor de módulo. Es suficiente con añadir 2 líneas por cada archivo de panel que se encuentre en el directorio '''htdocs/mimodulo/core/boxes'''.


Ejemplo:
Ejemplo:
<syntaxHighlight lang="php">
<syntaxhighlight lang="PHP">
$this->boxes[0]['file']='mabox0.php@mimodulo'
$this->boxes[0]['file']='mabox0.php@mimodulo'
$this->boxes[0]['note']='Mi panel 0'
$this->boxes[0]['note']='Mi panel 0'
Line 396: Line 409:
$this->boxes[n]['file']='maboxn.php@mimodulo'
$this->boxes[n]['file']='maboxn.php@mimodulo'
$this->boxes[n]['note']='Mi panel n'
$this->boxes[n]['note']='Mi panel n'
</syntaxHighlight>
</syntaxhighlight>


A continuación cree los archivos '''htdocs/mimodulo/core/boxes/mabox0.php''', '''htdocs/mimodulo/core/boxes/mabox1.php'''...  tomando como ejemplo los paneles existentes (en el directorio htdocs/core/boxes)
A continuación cree los archivos '''htdocs/mimodulo/core/boxes/mabox0.php''', '''htdocs/mimodulo/core/boxes/mabox1.php'''...  tomando como ejemplo los paneles existentes (en el directorio htdocs/core/boxes)


=== Pruebe sus paneles en Dolibarr ===
===Pruebe sus paneles en Dolibarr===
Vaya al menú '''Inico – Configuración – Paneles'''. Sus paneles deben aparecer en la lista de paneles activables. Actívelos, vaya a la página de bienvenida y verifique que se muestran correctamente.
Vaya al menú '''Inico – Configuración – Paneles'''. Sus paneles deben aparecer en la lista de paneles activables. Actívelos, vaya a la página de bienvenida y verifique que se muestran correctamente.


== Definir sus propias exportaciones (opcional) ==
==Definir sus propias exportaciones (opcional)==
'''Cuándo:''' Si su módulo incorpora exportaciones predefinidas de datos (tanto para sus propias tablas o para otras tablas existentes de otros módulos de Dolibarr)
'''Cuándo:''' Si su módulo incorpora exportaciones predefinidas de datos (tanto para sus propias tablas o para otras tablas existentes de otros módulos de Dolibarr)




=== Definir la exportación ===
===Definir la exportación===
Para ello, descomente y modifique las tablas $this->export_xxx  de su archivo descriptor de módulo.
Para ello, descomente y modifique las tablas $this->export_xxx  de su archivo descriptor de módulo.


=== Probar la exportación ===
===Probar la exportación===
Vaya al menú "Herramientas > Exportar" de Dolibarr. Su exportación debería aparecer en la lista de exportaciones predefinidas disponibles (si su módulo ha sido activado correctamente). Deberían aparecer, para que pudiera elegirlos, los campos que definió en la fase anterior en las tablas correspondientes. Seleccione algunos campos y pruebe a generar un archivo de exportación.
Vaya al menú "Herramientas > Exportar" de Dolibarr. Su exportación debería aparecer en la lista de exportaciones predefinidas disponibles (si su módulo ha sido activado correctamente). Deberían aparecer, para que pudiera elegirlos, los campos que definió en la fase anterior en las tablas correspondientes. Seleccione algunos campos y pruebe a generar un archivo de exportación.




== Definir sus estilos CSS (opcional) ==
==Definir sus estilos CSS (opcional)==
'''Cuándo:''' Si en sus pantallas PHP utiliza clases de estilos distintas a las de los temas de Dolibarr (no recomendado).
'''Cuándo:''' Si en sus pantallas PHP utiliza clases de estilos distintas a las de los temas de Dolibarr (no recomendado).


Esta funcionalidad todavía no es operativa en la versión 2.4., a pesar de estar ya descrita.
Esta funcionalidad todavía no es operativa en la versión 2.4., a pesar de estar ya descrita.


=== Crear y declarar su hoja de estilos ===
===Crear y declarar su hoja de estilos===
Crear un archivo de estilos llamada '''mimodulo.css''' o '''mimodule.css.php''' y guardarla en el directorio '''''mimodulo''''' dentro de '''htdocs'''. Solo puede haber un archivo css propio a cada módulo.
Crear un archivo de estilos llamada '''mimodulo.css''' o '''mimodule.css.php''' y guardarla en el directorio '''''mimodulo''''' dentro de '''htdocs'''. Solo puede haber un archivo css propio a cada módulo.
Recordamos que es mejor usar los estilos ya existentes en Dolibarr (el archivo css usado por Dolibarr es el archivo '''themes/nomtheme/''nombretema''.css.php'''.  
Recordamos que es mejor usar los estilos ya existentes en Dolibarr (el archivo css usado por Dolibarr es el archivo '''themes/nomtheme/''nombretema''.css.php'''.  
Line 426: Line 439:
El valor a indicar debe ser la ruta URL relativa de su archivo css.
El valor a indicar debe ser la ruta URL relativa de su archivo css.
Por ejemplo
Por ejemplo
<syntaxHighlight lang="php">
<syntaxhighlight lang="PHP">
$this->module_parts = array('css' => array('/mimodulo/css/mimodulo.css.php'));
$this->module_parts = array('css' => array('/mimodulo/css/mimodulo.css.php'));
</syntaxHighlight>
</syntaxhighlight>


=== Probar su hoja de estilos ===
===Probar su hoja de estilos===
Desactivar y reactivar su módulo.
Desactivar y reactivar su módulo.


Line 437: Line 450:
Debería ver en el encabezado HTML, una línea de declaración de su hoja de estilos.
Debería ver en el encabezado HTML, una línea de declaración de su hoja de estilos.


== Definir sus funciones Javascript (opcional) ==
==Definir sus funciones Javascript (opcional)==
'''Cuando''': Si en sus pantallas en PHP utiliza funciones de Javascript no disponibles en estandard (archivo lib_head.js)
'''Cuando''': Si en sus pantallas en PHP utiliza funciones de Javascript no disponibles en estandard (archivo lib_head.js)


Line 445: Line 458:


Ejemplo para la página /htdocs/mimodulo/mapage.php :
Ejemplo para la página /htdocs/mimodulo/mapage.php :
<syntaxHighlight lang="php">
<syntaxhighlight lang="PHP">
require('../main.inc.php');
require('../main.inc.php');
$morejs=array("/mimomulo/js/monmodule.js");
$morejs=array("/mimomulo/js/monmodule.js");
llxHeader('','Titulo','','','','',$morejs,'',0,0);  
llxHeader('','Titulo','','','','',$morejs,'',0,0);  
</syntaxHighlight>
</syntaxhighlight>


== Ejecutar código sobre un evento Dolibarr (opcional) ==
==Ejecutar código sobre un evento Dolibarr (opcional)==
'''Cuándo:''' Si quiere que se ejecuten acciones particulares al activar ciertas acciones estandar de Dolibarr (por ejemplo, si deseáramos actualizar una tabla de mi módulo cada vez que se crea una factura en Dolibarr), hará falta crear un archivo '''disparador (triggers)'''.
'''Cuándo:''' Si quiere que se ejecuten acciones particulares al activar ciertas acciones estandar de Dolibarr (por ejemplo, si deseáramos actualizar una tabla de mi módulo cada vez que se crea una factura en Dolibarr), hará falta crear un archivo '''disparador (triggers)'''.


Véase también [[Interfaces Dolibarr hacia el exterior]] e [[Interfaces del Exterior hacia Dolibarr]]
Véase también [[Interfaces Dolibarr hacia el exterior]] e [[Interfaces del Exterior hacia Dolibarr]]


== Insertar su código usando los hooks de Dolibarr (opcional) ==
==Insertar su código usando los hooks de Dolibarr (opcional)==
'''Cuándo''': Cuando desee cambiar o añadir otro tipo de código en un evento de negociado (véase lel capítulo anterior para esto).
'''Cuándo''': Cuando desee cambiar o añadir otro tipo de código en un evento de negociado (véase lel capítulo anterior para esto).


Véase la página [[El sistema Hooks]].
Véase la página [[El sistema Hooks]].


== Añadir un módulo de numeración (opcional) ==
==Añadir un módulo de numeración (opcional)==
'''Cuándo''': Si quiere añadir una regla de numeración no cubierta por los módulos por defecto.
'''Cuándo''': Si quiere añadir una regla de numeración no cubierta por los módulos por defecto.


Véase la página [[Crear un módulo de numeración]].
Véase la página [[Crear un módulo de numeración]].


== Añadir un nuevo módulo de documento (opcional) ==
==Añadir un nuevo módulo de documento (opcional)==
'''Cuándo''': Si quiere añadir un nuevo modelo de documento.
'''Cuándo''': Si quiere añadir un nuevo modelo de documento.


La documentación relativa a la generación de documentos desde los modelos se encuentra disponible en la página [[Crear un modelo de documento PDF]] o [[Crear un modelo de documento ODT]].
La documentación relativa a la generación de documentos desde los modelos se encuentra disponible en la página [[Crear un modelo de documento PDF]] o [[Crear un modelo de documento ODT]].


== Añadir un tema (opcional) ==
==Añadir un tema (opcional)==
'''Cuándo''': Si quiere un interface con colores personalizados.
'''Cuándo''': Si quiere un interface con colores personalizados.


Véase la página [[Temas]].
Véase la página [[Temas]].


= [[File:Art.png]] Algunas reglas de código =
=[[File:Art.png]] Algunas reglas de código=
Las reglas de código a seguir se definen en la [[Documentación Desarrolladores| Documentación para desarrolladores]], concretamente en la sección "Lenguaje" del capítulo de "Información General".
Las reglas de código a seguir se definen en la [[Documentación Desarrolladores| Documentación para desarrolladores]], concretamente en la sección "Lenguaje" del capítulo de "Información General".


= [[File:Art.png]] Crear un paquete para liberar e instalar su módulo =
=[[File:Art.png]] Crear un paquete para liberar e instalar su módulo=
Este proceso debe ser usado para fabricar un paquete con el fin de enviarlo a la tienda oficial http://www.dolistore.com.
Este proceso debe ser usado para fabricar un paquete con el fin de enviarlo a la tienda oficial http://www.dolistore.com.


También puede usarlo para distribuir fácilmente su módulo vía su propio método de distribución.
También puede usarlo para distribuir fácilmente su módulo vía su propio método de distribución.


* Vaya al directorio '''/build''' y copie el archivo '''makepack-dolibarrmodules.conf''' como '''makepack-mimodulo.conf'''. Cuidado: este directorio puede no ser suministrado en los paquetes de versión estables. Si es el caso, puede bajarte la última snapshot en la sección de Downloads del sitio de Dolibarr con el nombre “Development Version” (tome en este caso todos los directorios que sean autónomos e independientes de la versión).
*Vaya al directorio '''/build''' y copie el archivo '''makepack-dolibarrmodules.conf''' como '''makepack-mimodulo.conf'''. Cuidado: este directorio puede no ser suministrado en los paquetes de versión estables. Si es el caso, puede bajarte la última snapshot en la sección de Downloads del sitio de Dolibarr con el nombre “Development Version” (tome en este caso todos los directorios que sean autónomos e independientes de la versión).


Teclee en este archivo la lista de nombres de los nuevos archivos que ha creado para su módulo (descriptor de módulo, nuevos ficheros sql de tablas, páginas php, imágenes, etc...)
Teclee en este archivo la lista de nombres de los nuevos archivos que ha creado para su módulo (descriptor de módulo, nuevos ficheros sql de tablas, páginas php, imágenes, etc...)
* Lance el script vía Perl (necesita la versión 5.0. o superiores de Perl)
 
<syntaxHighlight lang="bash">
*Lance el script vía Perl (necesita la versión 5.0. o superiores de Perl)
 
<syntaxhighlight lang="bash">
  perl makepack-dolibarrmodule.pl
  perl makepack-dolibarrmodule.pl
</syntaxHighlight>
</syntaxhighlight>


El script le pide el nombre de su módulo, su versión mayor y menor. Se va a crear un fichero '''mimodulo.zip''', que incluirá su módulo listo para ser liberado.
El script le pide el nombre de su módulo, su versión mayor y menor. Se va a crear un fichero '''mimodulo.zip''', que incluirá su módulo listo para ser liberado.
* La persona que reciba su módulo deberá ubicar el archivo en el directorio raíz de Dolibarr y ejecutar el comando:
 
<syntaxHighlight lang="bash">
*La persona que reciba su módulo deberá ubicar el archivo en el directorio raíz de Dolibarr y ejecutar el comando:
 
<syntaxhighlight lang="bash">
  tar -xvf monmodule.zip
  tar -xvf monmodule.zip
</syntaxHighlight>
</syntaxhighlight>


* Si  desea que su módulo sea aprovechado por todos, puede enviarlo (el fichero zip) al sitio web de Dolibarr, en la sección de descargas: {{LinkToPluginDownload}} (debe de haber creado una cuenta y estar logeado para que aparezca el link "Submit a product").
*Si  desea que su módulo sea aprovechado por todos, puede enviarlo (el fichero zip) al sitio web de Dolibarr, en la sección de descargas: {{LinkToPluginDownload}} (debe de haber creado una cuenta y estar logeado para que aparezca el link "Submit a product").
** Si su módulo está correctamente realizado, será rápidamente validado.
**Si su módulo está correctamente realizado, será rápidamente validado.
** Si la calidad es suficiente, la licencia lo permite y la funcionalidad del módulo es de interés general, el código podrá añadirse al código fuente de Dolibarr (salvo que no lo desee).
**Si la calidad es suficiente, la licencia lo permite y la funcionalidad del módulo es de interés general, el código podrá añadirse al código fuente de Dolibarr (salvo que no lo desee).
3

edits

Navigation menu