Desarrollo de un módulo: Difference between revisions

Jump to navigation Jump to search
change source tag to syntaxHighlight
Tag: 2017 source edit
(change source tag to syntaxHighlight)
Tag: 2017 source edit
Line 60: Line 60:


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
<source lang="php">
<syntaxHighlight lang="php">
$this->_load_tables('/mymodule/sql/');
$this->_load_tables('/mymodule/sql/');
</source>
</syntaxHighlight>
esté descomentada y correctamente configurada.
esté descomentada y correctamente configurada.


Line 73: Line 73:


Ejemplo de contenido de un fichero data.sql
Ejemplo de contenido de un fichero data.sql
<source 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__');
</source>
</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'''.
Line 86: Line 86:
=== 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
<source lang="bash">
<syntaxHighlight lang="bash">
  php build_class_from_table.php nombretabla
  php build_class_from_table.php nombretabla
</source>
</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 101: Line 101:


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:
<source 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
</source>
</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.
Line 127: Line 127:


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
<source lang="php">require_once($url_fichier) ;</source>
<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/''') :
Line 145: Line 145:


''Ejemplo :''
''Ejemplo :''
<source 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é
</source>
</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 156:


La tabla devuelta se compone de la siguiente manera :
La tabla devuelta se compone de la siguiente manera :
<source 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 162:
$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)
</source>
</syntaxHighlight>


''Ejemplo :''
''Ejemplo :''
<source 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
</source>
</syntaxHighlight>


'''4. Mostrar las pestañas en su pestaña'''
'''4. Mostrar las pestañas en su pestaña'''
Line 173: Line 173:
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().


<source 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 183:
//            service
//            service
//            company
//            company
</source>
</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 199: Line 199:


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
<source lang="php">
<syntaxHighlight lang="php">
// Load Dolibarr environment
// Load Dolibarr environment
$res=0;
$res=0;
Line 214: Line 214:
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");
</source>
</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:
Line 224: Line 224:
* 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):
* 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 :''
<source lang="php">
<syntaxHighlight lang="php">
dol_include_once('/mimodulo/class/miclass.class.php', 'MiClass');
dol_include_once('/mimodulo/class/miclass.class.php', 'MiClass');
</source>
</syntaxHighlight>


* Las clases de llamadas Dolibarr utilice la siguiente sintaxis:
* Las clases de llamadas Dolibarr utilice la siguiente sintaxis:
''Ejemplo :''
''Ejemplo :''
<source 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';
</source>
</syntaxHighlight>


=== Acceso a la base de datos ===
=== Acceso a la base de datos ===
Line 240: Line 240:


Para un ''insert'', ''update'' o ''delete'':
Para un ''insert'', ''update'' o ''delete'':
<source 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
</source>
</syntaxHighlight>


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


=== Definición de estilos ===
=== Definición de estilos ===
Line 284: Line 284:
=== 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:
<source 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");
</source>
</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:
<source 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);
</source>
</syntaxHighlight>


== Definir su página de configuración (opcional) ==
== Definir su página de configuración (opcional) ==
Line 302: Line 302:
=== 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''').
<source lang="php">
<syntaxHighlight lang="php">
  $this->config_page_url = array("monmodule_setuppage.php");
  $this->config_page_url = array("monmodule_setuppage.php");
</source>
</syntaxHighlight>


=== Probar su página ===
=== Probar su página ===
Line 318: Line 318:


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:
<source 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 353:
'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++;
</source>
</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.
Line 364: Line 364:


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:
<source lang="php">
<syntaxHighlight lang="php">
  $this->rights_class = 'mimodulo';
  $this->rights_class = 'mimodulo';
</source>
</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:
<source 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 376:
  $this->rights[$r][5] = 'subaccion';
  $this->rights[$r][5] = 'subaccion';
  $r++;
  $r++;
</source>
</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:
<source lang="php">
<syntaxHighlight lang="php">
  if ($user->rights->mimodulo->accion->subaccion) ...
  if ($user->rights->mimodulo->accion->subaccion) ...
</source>
</syntaxHighlight>


== Definir sus propios paneles (opcional) ==
== Definir sus propios paneles (opcional) ==
Line 390: Line 390:


Ejemplo:
Ejemplo:
<source 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 396:
$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'
</source>
</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)
Line 426: Line 426:
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
<source 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'));
</source>
</syntaxHighlight>


=== Probar su hoja de estilos ===
=== Probar su hoja de estilos ===
Line 445: Line 445:


Ejemplo para la página /htdocs/mimodulo/mapage.php :
Ejemplo para la página /htdocs/mimodulo/mapage.php :
<source 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);  
</source>
</syntaxHighlight>


== Ejecutar código sobre un evento Dolibarr (opcional) ==
== Ejecutar código sobre un evento Dolibarr (opcional) ==
Line 488: Line 488:
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)
* Lance el script vía Perl (necesita la versión 5.0. o superiores de Perl)
<source lang="bash">
<syntaxHighlight lang="bash">
  perl makepack-dolibarrmodule.pl
  perl makepack-dolibarrmodule.pl
</source>
</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:
* La persona que reciba su módulo deberá ubicar el archivo en el directorio raíz de Dolibarr y ejecutar el comando:
<source lang="bash">
<syntaxHighlight lang="bash">
  tar -xvf monmodule.zip
  tar -xvf monmodule.zip
</source>
</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).

Navigation menu