<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.dolibarr.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Nnicolashr</id>
	<title>Dolibarr ERP CRM Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.dolibarr.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Nnicolashr"/>
	<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php/Special:Contributions/Nnicolashr"/>
	<updated>2026-10-25T16:09:51Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.17</generator>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Table_llx_categorie_societe&amp;diff=36463</id>
		<title>Table llx categorie societe</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Table_llx_categorie_societe&amp;diff=36463"/>
		<updated>2016-11-11T03:36:11Z</updated>

		<summary type="html">&lt;p&gt;Nnicolashr: /* Table */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Table SQL]]&lt;br /&gt;
[[Category:Categories]]&lt;br /&gt;
[[Category:Catégories]]&lt;br /&gt;
[[Category:Categorías]]&lt;br /&gt;
{{ListOfTables}}&lt;br /&gt;
&lt;br /&gt;
= Content/Contenu/Contenido =&lt;br /&gt;
{{flag en}} Contains a &amp;quot;n to m&amp;quot; relationship between societies and the categories.&lt;br /&gt;
&lt;br /&gt;
{{flag fr}} Contient une relation &amp;quot;n to m&amp;quot; entre les sociétés et les catégories.&lt;br /&gt;
&lt;br /&gt;
{{flag sp}} Contiene una relación &amp;quot;n a m&amp;quot; entre las empresas y las categorías.&lt;br /&gt;
&lt;br /&gt;
= Structure =&lt;br /&gt;
== Table ==&lt;br /&gt;
{|  align=&amp;quot;left&amp;quot; width=&amp;quot;100%&amp;quot; border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; class=&amp;quot;dolbox&amp;quot;&lt;br /&gt;
 |style=&amp;quot;background-color: #e9e9ef&amp;quot;| &amp;lt;b&amp;gt;Field&amp;lt;/b&amp;gt;&lt;br /&gt;
 |style=&amp;quot;background-color: #e9e9ef&amp;quot;| &amp;lt;b&amp;gt;Type&amp;lt;/b&amp;gt;&lt;br /&gt;
 |style=&amp;quot;background-color: #e9e9ef&amp;quot;| &amp;lt;b&amp;gt;Null&amp;lt;/b&amp;gt;&lt;br /&gt;
 |style=&amp;quot;background-color: #e9e9ef&amp;quot;| &amp;lt;b&amp;gt;Key&amp;lt;/b&amp;gt;&lt;br /&gt;
 |style=&amp;quot;background-color: #e9e9ef&amp;quot;| &amp;lt;b&amp;gt;Default&amp;lt;/b&amp;gt;&lt;br /&gt;
 |style=&amp;quot;background-color: #e9e9ef&amp;quot;| &amp;lt;b&amp;gt;Extra&amp;lt;/b&amp;gt;&lt;br /&gt;
 |style=&amp;quot;background-color: #e9e9ef&amp;quot;| &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| fk_categorie &lt;br /&gt;
| int(11) &lt;br /&gt;
| NO &lt;br /&gt;
| PRI&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| ID of category ([[Table llx_categorie|llx_categorie]]-&amp;gt;rowid)&lt;br /&gt;
|-&lt;br /&gt;
| fk_soc&lt;br /&gt;
| int(11)&lt;br /&gt;
| NO &lt;br /&gt;
| PRI&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| ID of society ([[Table llx_societe|llx_societe]]-&amp;gt;rowid)&lt;br /&gt;
|-&lt;br /&gt;
| import_key&lt;br /&gt;
| varchar(14)&lt;br /&gt;
| SÍ &lt;br /&gt;
| &lt;br /&gt;
| NULL&lt;br /&gt;
| &lt;br /&gt;
| import key&lt;br /&gt;
|}&amp;amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
== Keys ==&lt;br /&gt;
{|  align=&amp;quot;left&amp;quot; width=&amp;quot;100%&amp;quot; border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; class=&amp;quot;dolbox&amp;quot;&lt;br /&gt;
 |style=&amp;quot;background-color: #e9e9ef&amp;quot;| &amp;lt;b&amp;gt;Key&amp;lt;/b&amp;gt;&lt;br /&gt;
 |style=&amp;quot;background-color: #e9e9ef&amp;quot;| &amp;lt;b&amp;gt;Type&amp;lt;/b&amp;gt;&lt;br /&gt;
 |style=&amp;quot;background-color: #e9e9ef&amp;quot;| &amp;lt;b&amp;gt;Fields&amp;lt;/b&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| PRIMARY &lt;br /&gt;
| PRIMARY&lt;br /&gt;
| fk_categorie,fk_societe&lt;br /&gt;
|- &lt;br /&gt;
| idx_categorie_product_fk_categorie  &lt;br /&gt;
| MULTIPLE&lt;br /&gt;
| fk_categorie&lt;br /&gt;
|- &lt;br /&gt;
| idx_categorie_product_fk_societe&lt;br /&gt;
| MULTIPLE&lt;br /&gt;
| fk_product&lt;br /&gt;
|}&amp;amp;nbsp;&lt;/div&gt;</summary>
		<author><name>Nnicolashr</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Table_llx_categorie_societe&amp;diff=36462</id>
		<title>Table llx categorie societe</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Table_llx_categorie_societe&amp;diff=36462"/>
		<updated>2016-11-11T03:35:52Z</updated>

		<summary type="html">&lt;p&gt;Nnicolashr: /* Table */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Table SQL]]&lt;br /&gt;
[[Category:Categories]]&lt;br /&gt;
[[Category:Catégories]]&lt;br /&gt;
[[Category:Categorías]]&lt;br /&gt;
{{ListOfTables}}&lt;br /&gt;
&lt;br /&gt;
= Content/Contenu/Contenido =&lt;br /&gt;
{{flag en}} Contains a &amp;quot;n to m&amp;quot; relationship between societies and the categories.&lt;br /&gt;
&lt;br /&gt;
{{flag fr}} Contient une relation &amp;quot;n to m&amp;quot; entre les sociétés et les catégories.&lt;br /&gt;
&lt;br /&gt;
{{flag sp}} Contiene una relación &amp;quot;n a m&amp;quot; entre las empresas y las categorías.&lt;br /&gt;
&lt;br /&gt;
= Structure =&lt;br /&gt;
== Table ==&lt;br /&gt;
{|  align=&amp;quot;left&amp;quot; width=&amp;quot;100%&amp;quot; border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; class=&amp;quot;dolbox&amp;quot;&lt;br /&gt;
 |style=&amp;quot;background-color: #e9e9ef&amp;quot;| &amp;lt;b&amp;gt;Field&amp;lt;/b&amp;gt;&lt;br /&gt;
 |style=&amp;quot;background-color: #e9e9ef&amp;quot;| &amp;lt;b&amp;gt;Type&amp;lt;/b&amp;gt;&lt;br /&gt;
 |style=&amp;quot;background-color: #e9e9ef&amp;quot;| &amp;lt;b&amp;gt;Null&amp;lt;/b&amp;gt;&lt;br /&gt;
 |style=&amp;quot;background-color: #e9e9ef&amp;quot;| &amp;lt;b&amp;gt;Key&amp;lt;/b&amp;gt;&lt;br /&gt;
 |style=&amp;quot;background-color: #e9e9ef&amp;quot;| &amp;lt;b&amp;gt;Default&amp;lt;/b&amp;gt;&lt;br /&gt;
 |style=&amp;quot;background-color: #e9e9ef&amp;quot;| &amp;lt;b&amp;gt;Extra&amp;lt;/b&amp;gt;&lt;br /&gt;
 |style=&amp;quot;background-color: #e9e9ef&amp;quot;| &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| fk_categorie &lt;br /&gt;
| int(11) &lt;br /&gt;
| NO &lt;br /&gt;
| PRI&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| ID of category ([[Table llx_categorie|llx_categorie]]-&amp;gt;rowid)&lt;br /&gt;
|-&lt;br /&gt;
| fk_soc&lt;br /&gt;
| int(11)&lt;br /&gt;
| NO &lt;br /&gt;
| PRI&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| ID of society ([[Table llx_societe|llx_societe]]-&amp;gt;rowid)&lt;br /&gt;
|-&lt;br /&gt;
| import_key&lt;br /&gt;
| varchar(14)&lt;br /&gt;
| SÍ &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| NULL&lt;br /&gt;
| import key&lt;br /&gt;
|}&amp;amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
== Keys ==&lt;br /&gt;
{|  align=&amp;quot;left&amp;quot; width=&amp;quot;100%&amp;quot; border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; class=&amp;quot;dolbox&amp;quot;&lt;br /&gt;
 |style=&amp;quot;background-color: #e9e9ef&amp;quot;| &amp;lt;b&amp;gt;Key&amp;lt;/b&amp;gt;&lt;br /&gt;
 |style=&amp;quot;background-color: #e9e9ef&amp;quot;| &amp;lt;b&amp;gt;Type&amp;lt;/b&amp;gt;&lt;br /&gt;
 |style=&amp;quot;background-color: #e9e9ef&amp;quot;| &amp;lt;b&amp;gt;Fields&amp;lt;/b&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| PRIMARY &lt;br /&gt;
| PRIMARY&lt;br /&gt;
| fk_categorie,fk_societe&lt;br /&gt;
|- &lt;br /&gt;
| idx_categorie_product_fk_categorie  &lt;br /&gt;
| MULTIPLE&lt;br /&gt;
| fk_categorie&lt;br /&gt;
|- &lt;br /&gt;
| idx_categorie_product_fk_societe&lt;br /&gt;
| MULTIPLE&lt;br /&gt;
| fk_product&lt;br /&gt;
|}&amp;amp;nbsp;&lt;/div&gt;</summary>
		<author><name>Nnicolashr</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Table_llx_categorie_societe&amp;diff=36461</id>
		<title>Table llx categorie societe</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Table_llx_categorie_societe&amp;diff=36461"/>
		<updated>2016-11-11T03:35:04Z</updated>

		<summary type="html">&lt;p&gt;Nnicolashr: /* Table */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Table SQL]]&lt;br /&gt;
[[Category:Categories]]&lt;br /&gt;
[[Category:Catégories]]&lt;br /&gt;
[[Category:Categorías]]&lt;br /&gt;
{{ListOfTables}}&lt;br /&gt;
&lt;br /&gt;
= Content/Contenu/Contenido =&lt;br /&gt;
{{flag en}} Contains a &amp;quot;n to m&amp;quot; relationship between societies and the categories.&lt;br /&gt;
&lt;br /&gt;
{{flag fr}} Contient une relation &amp;quot;n to m&amp;quot; entre les sociétés et les catégories.&lt;br /&gt;
&lt;br /&gt;
{{flag sp}} Contiene una relación &amp;quot;n a m&amp;quot; entre las empresas y las categorías.&lt;br /&gt;
&lt;br /&gt;
= Structure =&lt;br /&gt;
== Table ==&lt;br /&gt;
{|  align=&amp;quot;left&amp;quot; width=&amp;quot;100%&amp;quot; border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; class=&amp;quot;dolbox&amp;quot;&lt;br /&gt;
 |style=&amp;quot;background-color: #e9e9ef&amp;quot;| &amp;lt;b&amp;gt;Field&amp;lt;/b&amp;gt;&lt;br /&gt;
 |style=&amp;quot;background-color: #e9e9ef&amp;quot;| &amp;lt;b&amp;gt;Type&amp;lt;/b&amp;gt;&lt;br /&gt;
 |style=&amp;quot;background-color: #e9e9ef&amp;quot;| &amp;lt;b&amp;gt;Null&amp;lt;/b&amp;gt;&lt;br /&gt;
 |style=&amp;quot;background-color: #e9e9ef&amp;quot;| &amp;lt;b&amp;gt;Key&amp;lt;/b&amp;gt;&lt;br /&gt;
 |style=&amp;quot;background-color: #e9e9ef&amp;quot;| &amp;lt;b&amp;gt;Default&amp;lt;/b&amp;gt;&lt;br /&gt;
 |style=&amp;quot;background-color: #e9e9ef&amp;quot;| &amp;lt;b&amp;gt;Extra&amp;lt;/b&amp;gt;&lt;br /&gt;
 |style=&amp;quot;background-color: #e9e9ef&amp;quot;| &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| fk_categorie &lt;br /&gt;
| int(11) &lt;br /&gt;
| NO &lt;br /&gt;
| PRI&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| ID of category ([[Table llx_categorie|llx_categorie]]-&amp;gt;rowid)&lt;br /&gt;
|-&lt;br /&gt;
| fk_soc&lt;br /&gt;
| int(11)&lt;br /&gt;
| NO &lt;br /&gt;
| PRI&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
| ID of society ([[Table llx_societe|llx_societe]]-&amp;gt;rowid)&lt;br /&gt;
|-&lt;br /&gt;
| import_key&lt;br /&gt;
| varchar(14)&lt;br /&gt;
| SÍ &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
| import key&lt;br /&gt;
|}&amp;amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
== Keys ==&lt;br /&gt;
{|  align=&amp;quot;left&amp;quot; width=&amp;quot;100%&amp;quot; border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; class=&amp;quot;dolbox&amp;quot;&lt;br /&gt;
 |style=&amp;quot;background-color: #e9e9ef&amp;quot;| &amp;lt;b&amp;gt;Key&amp;lt;/b&amp;gt;&lt;br /&gt;
 |style=&amp;quot;background-color: #e9e9ef&amp;quot;| &amp;lt;b&amp;gt;Type&amp;lt;/b&amp;gt;&lt;br /&gt;
 |style=&amp;quot;background-color: #e9e9ef&amp;quot;| &amp;lt;b&amp;gt;Fields&amp;lt;/b&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| PRIMARY &lt;br /&gt;
| PRIMARY&lt;br /&gt;
| fk_categorie,fk_societe&lt;br /&gt;
|- &lt;br /&gt;
| idx_categorie_product_fk_categorie  &lt;br /&gt;
| MULTIPLE&lt;br /&gt;
| fk_categorie&lt;br /&gt;
|- &lt;br /&gt;
| idx_categorie_product_fk_societe&lt;br /&gt;
| MULTIPLE&lt;br /&gt;
| fk_product&lt;br /&gt;
|}&amp;amp;nbsp;&lt;/div&gt;</summary>
		<author><name>Nnicolashr</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Table_llx_facture_rec&amp;diff=36456</id>
		<title>Table llx facture rec</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Table_llx_facture_rec&amp;diff=36456"/>
		<updated>2016-11-09T04:09:46Z</updated>

		<summary type="html">&lt;p&gt;Nnicolashr: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Invoices]]&lt;br /&gt;
[[Category:Facture]]&lt;br /&gt;
[[Category:Facturas]]&lt;br /&gt;
[[Category:Table SQL]]&lt;br /&gt;
&lt;br /&gt;
{{ListOfTables}}&lt;br /&gt;
&lt;br /&gt;
= Content/Contenu/Contenido =&lt;br /&gt;
{{flag en}} Contains the predefined invoices. The invoice details are in [[Table llx_facturedet_rec]]&lt;br /&gt;
&lt;br /&gt;
{{flag fr}} Contient les factures prédéfinies. les détails de la facture sont dans la [[Table llx_facturedet_rec]]&lt;br /&gt;
&lt;br /&gt;
{{flag sp}} Contiene las facturas predefinidas. Los detalles de la factura se encuentran en la [[Table llx_facturedet_rec]]&lt;br /&gt;
&lt;br /&gt;
= Structure =&lt;br /&gt;
== Table ==&lt;br /&gt;
{|  align=&amp;quot;left&amp;quot; width=&amp;quot;100%&amp;quot; border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; class=&amp;quot;dolbox&amp;quot;&lt;br /&gt;
 |style=&amp;quot;background-color: #e9e9ef&amp;quot;| &amp;lt;b&amp;gt;Field&amp;lt;/b&amp;gt;&lt;br /&gt;
 |style=&amp;quot;background-color: #e9e9ef&amp;quot;| &amp;lt;b&amp;gt;Type&amp;lt;/b&amp;gt;&lt;br /&gt;
 |style=&amp;quot;background-color: #e9e9ef&amp;quot;| &amp;lt;b&amp;gt;Null&amp;lt;/b&amp;gt;&lt;br /&gt;
 |style=&amp;quot;background-color: #e9e9ef&amp;quot;| &amp;lt;b&amp;gt;Key&amp;lt;/b&amp;gt;&lt;br /&gt;
 |style=&amp;quot;background-color: #e9e9ef&amp;quot;| &amp;lt;b&amp;gt;Default&amp;lt;/b&amp;gt;&lt;br /&gt;
 |style=&amp;quot;background-color: #e9e9ef&amp;quot;| &amp;lt;b&amp;gt;Extra&amp;lt;/b&amp;gt;&lt;br /&gt;
 |style=&amp;quot;background-color: #e9e9ef&amp;quot;| &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| rowid &lt;br /&gt;
| int(11) &lt;br /&gt;
| NO&lt;br /&gt;
| PRI&lt;br /&gt;
| &lt;br /&gt;
| auto_increment &lt;br /&gt;
| technical index&lt;br /&gt;
|-&lt;br /&gt;
| titre&lt;br /&gt;
| varchar(50) &lt;br /&gt;
| NO&lt;br /&gt;
| UNI&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| title&lt;br /&gt;
|- &lt;br /&gt;
| entity&lt;br /&gt;
| int(11) &lt;br /&gt;
| NO&lt;br /&gt;
| UNI&lt;br /&gt;
| 1&lt;br /&gt;
| &lt;br /&gt;
| multi company id&lt;br /&gt;
|-&lt;br /&gt;
| fk_soc &lt;br /&gt;
| int(11) &lt;br /&gt;
| NO &lt;br /&gt;
| MUL &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| ID society ([[Table llx_societe|llx_societe]]-&amp;gt;rowid)&lt;br /&gt;
|-&lt;br /&gt;
| datec &lt;br /&gt;
| datetime &lt;br /&gt;
| YES &lt;br /&gt;
| &lt;br /&gt;
| NULL &lt;br /&gt;
| &lt;br /&gt;
| creation date&lt;br /&gt;
|-&lt;br /&gt;
| amount &lt;br /&gt;
| real&lt;br /&gt;
| NO &lt;br /&gt;
| &lt;br /&gt;
| 0&lt;br /&gt;
| &lt;br /&gt;
| amount&lt;br /&gt;
|-&lt;br /&gt;
| remise&lt;br /&gt;
| real&lt;br /&gt;
| YES &lt;br /&gt;
| &lt;br /&gt;
| 0&lt;br /&gt;
| &lt;br /&gt;
| discount&lt;br /&gt;
|-&lt;br /&gt;
| remise_percent&lt;br /&gt;
| real&lt;br /&gt;
| YES &lt;br /&gt;
| &lt;br /&gt;
| 0&lt;br /&gt;
| &lt;br /&gt;
| percent discount&lt;br /&gt;
|-&lt;br /&gt;
| remise_absolute&lt;br /&gt;
| real&lt;br /&gt;
| YES &lt;br /&gt;
| &lt;br /&gt;
| 0&lt;br /&gt;
| &lt;br /&gt;
| absolut discount&lt;br /&gt;
|-&lt;br /&gt;
| tva&lt;br /&gt;
| real&lt;br /&gt;
| YES &lt;br /&gt;
| &lt;br /&gt;
| 0&lt;br /&gt;
| &lt;br /&gt;
| VAT&lt;br /&gt;
|-&lt;br /&gt;
| total&lt;br /&gt;
| real&lt;br /&gt;
| YES &lt;br /&gt;
| &lt;br /&gt;
| 0&lt;br /&gt;
| &lt;br /&gt;
| total&lt;br /&gt;
|-&lt;br /&gt;
| total_ttc&lt;br /&gt;
| real&lt;br /&gt;
| YES &lt;br /&gt;
| &lt;br /&gt;
| 0&lt;br /&gt;
| &lt;br /&gt;
| total with tax&lt;br /&gt;
|-&lt;br /&gt;
| fk_user_author &lt;br /&gt;
| int(11) &lt;br /&gt;
| YES &lt;br /&gt;
| MUL &lt;br /&gt;
| NULL &lt;br /&gt;
| &lt;br /&gt;
| ID of user author of invoice ([[Table llx_user|llx_user]]-&amp;gt;rowid)&lt;br /&gt;
|-&lt;br /&gt;
| fk_projet &lt;br /&gt;
| int(11) &lt;br /&gt;
| YES &lt;br /&gt;
| MUL &lt;br /&gt;
| NULL &lt;br /&gt;
| &lt;br /&gt;
| ID of related proyect ([[Table llx_projet|llx_projet]]-&amp;gt;rowid)&lt;br /&gt;
|-&lt;br /&gt;
| fk_cond_reglement &lt;br /&gt;
| int(11) &lt;br /&gt;
| NO &lt;br /&gt;
| &lt;br /&gt;
| 0 &lt;br /&gt;
| &lt;br /&gt;
| Id of payment condition ([[Table llx_cond_reglement|llx_cond_reglement]]-&amp;gt;rowid)&lt;br /&gt;
|-&lt;br /&gt;
| fk_mode_reglement &lt;br /&gt;
| int(11) &lt;br /&gt;
| NO &lt;br /&gt;
| &lt;br /&gt;
| 0&lt;br /&gt;
| &lt;br /&gt;
| Id of payment mode&lt;br /&gt;
|-&lt;br /&gt;
| date_lim_reglement&lt;br /&gt;
| date &lt;br /&gt;
| YES &lt;br /&gt;
| &lt;br /&gt;
| NULL&lt;br /&gt;
|&lt;br /&gt;
| date limit for payment&lt;br /&gt;
|-&lt;br /&gt;
| note&lt;br /&gt;
| text &lt;br /&gt;
| YES  &lt;br /&gt;
|&lt;br /&gt;
| NULL &lt;br /&gt;
| &lt;br /&gt;
| comentary&lt;br /&gt;
|-&lt;br /&gt;
| note_public &lt;br /&gt;
| text &lt;br /&gt;
| YES &lt;br /&gt;
| &lt;br /&gt;
| NULL &lt;br /&gt;
| &lt;br /&gt;
| public comentary&lt;br /&gt;
|-&lt;br /&gt;
| frequency&lt;br /&gt;
| char(2)&lt;br /&gt;
| YES &lt;br /&gt;
| &lt;br /&gt;
| NULL &lt;br /&gt;
| &lt;br /&gt;
| invoice frequency&lt;br /&gt;
|-&lt;br /&gt;
| last_gen&lt;br /&gt;
| varchar(7)&lt;br /&gt;
| YES &lt;br /&gt;
| &lt;br /&gt;
| NULL &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|}&amp;amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
== Keys ==&lt;br /&gt;
{|  align=&amp;quot;left&amp;quot; width=&amp;quot;100%&amp;quot; border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; class=&amp;quot;dolbox&amp;quot;&lt;br /&gt;
 |style=&amp;quot;background-color: #e9e9ef&amp;quot;| &amp;lt;b&amp;gt;Key&amp;lt;/b&amp;gt;&lt;br /&gt;
 |style=&amp;quot;background-color: #e9e9ef&amp;quot;| &amp;lt;b&amp;gt;Type&amp;lt;/b&amp;gt;&lt;br /&gt;
 |style=&amp;quot;background-color: #e9e9ef&amp;quot;| &amp;lt;b&amp;gt;Fields&amp;lt;/b&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| PRIMARY&lt;br /&gt;
| PRIMARY&lt;br /&gt;
| rowid&lt;br /&gt;
|- &lt;br /&gt;
| idx_facture_rec_uk_titre &lt;br /&gt;
| UNI&lt;br /&gt;
| titre, entity&lt;br /&gt;
|- &lt;br /&gt;
| idx_facture_rec_fksoc &lt;br /&gt;
| MULTIPLE&lt;br /&gt;
| fk_soc &lt;br /&gt;
|- &lt;br /&gt;
| idx_facture_rec_fk_soc &lt;br /&gt;
| MULTIPLE&lt;br /&gt;
| fk_soc &lt;br /&gt;
|- &lt;br /&gt;
| idx_facture_rec_fk_user_author&lt;br /&gt;
| MULTIPLE&lt;br /&gt;
| fk_user_author&lt;br /&gt;
|- &lt;br /&gt;
| idx_facture_rec_fk_projet &lt;br /&gt;
| MULTIPLE&lt;br /&gt;
| fk_projet&lt;br /&gt;
|}&amp;amp;nbsp;&lt;/div&gt;</summary>
		<author><name>Nnicolashr</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Table_llx_facture_rec&amp;diff=36455</id>
		<title>Table llx facture rec</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Table_llx_facture_rec&amp;diff=36455"/>
		<updated>2016-11-09T04:06:03Z</updated>

		<summary type="html">&lt;p&gt;Nnicolashr: Undo revision 36454 by Nnicolashr (talk)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Invoices]]&lt;br /&gt;
[[Category:Facture]]&lt;br /&gt;
[[Category:Facturas]]&lt;br /&gt;
[[Category:Table SQL]]&lt;br /&gt;
&lt;br /&gt;
{{ListOfTables}}&lt;br /&gt;
&lt;br /&gt;
= Content/Contenu/Contenido =&lt;br /&gt;
{{flag en}} Contains the predefined invoices. The invoice details are in [[Table llx_facturedet_rec]]&lt;br /&gt;
&lt;br /&gt;
{{flag fr}} Contient les factures prédéfinies. les détails de la facture sont dans la [[Table llx_facturedet_rec]]&lt;br /&gt;
&lt;br /&gt;
{{flag sp}} Contiene las facturas predefinidas. Los detalles de la factura se encuentran en la [[Table llx_facturedet_rec]]&lt;br /&gt;
&lt;br /&gt;
= Structure =&lt;br /&gt;
== Table ==&lt;br /&gt;
{|  align=&amp;quot;left&amp;quot; width=&amp;quot;100%&amp;quot; border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; class=&amp;quot;dolbox&amp;quot;&lt;br /&gt;
 |style=&amp;quot;background-color: #e9e9ef&amp;quot;| &amp;lt;b&amp;gt;Field&amp;lt;/b&amp;gt;&lt;br /&gt;
 |style=&amp;quot;background-color: #e9e9ef&amp;quot;| &amp;lt;b&amp;gt;Type&amp;lt;/b&amp;gt;&lt;br /&gt;
 |style=&amp;quot;background-color: #e9e9ef&amp;quot;| &amp;lt;b&amp;gt;Null&amp;lt;/b&amp;gt;&lt;br /&gt;
 |style=&amp;quot;background-color: #e9e9ef&amp;quot;| &amp;lt;b&amp;gt;Key&amp;lt;/b&amp;gt;&lt;br /&gt;
 |style=&amp;quot;background-color: #e9e9ef&amp;quot;| &amp;lt;b&amp;gt;Default&amp;lt;/b&amp;gt;&lt;br /&gt;
 |style=&amp;quot;background-color: #e9e9ef&amp;quot;| &amp;lt;b&amp;gt;Extra&amp;lt;/b&amp;gt;&lt;br /&gt;
 |style=&amp;quot;background-color: #e9e9ef&amp;quot;| &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| rowid &lt;br /&gt;
| int(11) &lt;br /&gt;
| NO&lt;br /&gt;
| PRI&lt;br /&gt;
| &lt;br /&gt;
| auto_increment &lt;br /&gt;
| technical index {{flag sp}} Índice técnico&lt;br /&gt;
|-&lt;br /&gt;
| titre&lt;br /&gt;
| varchar(50) &lt;br /&gt;
| NO&lt;br /&gt;
| UNI&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| title&lt;br /&gt;
|- &lt;br /&gt;
| entity&lt;br /&gt;
| int(11) &lt;br /&gt;
| NO&lt;br /&gt;
| UNI&lt;br /&gt;
| 1&lt;br /&gt;
| &lt;br /&gt;
| multi company id&lt;br /&gt;
|-&lt;br /&gt;
| fk_soc &lt;br /&gt;
| int(11) &lt;br /&gt;
| NO &lt;br /&gt;
| MUL &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| ID society ([[Table llx_societe|llx_societe]]-&amp;gt;rowid)&lt;br /&gt;
|-&lt;br /&gt;
| datec &lt;br /&gt;
| datetime &lt;br /&gt;
| YES &lt;br /&gt;
| &lt;br /&gt;
| NULL &lt;br /&gt;
| &lt;br /&gt;
| creation date&lt;br /&gt;
|-&lt;br /&gt;
| amount &lt;br /&gt;
| real&lt;br /&gt;
| NO &lt;br /&gt;
| &lt;br /&gt;
| 0&lt;br /&gt;
| &lt;br /&gt;
| amount&lt;br /&gt;
|-&lt;br /&gt;
| remise&lt;br /&gt;
| real&lt;br /&gt;
| YES &lt;br /&gt;
| &lt;br /&gt;
| 0&lt;br /&gt;
| &lt;br /&gt;
| discount&lt;br /&gt;
|-&lt;br /&gt;
| remise_percent&lt;br /&gt;
| real&lt;br /&gt;
| YES &lt;br /&gt;
| &lt;br /&gt;
| 0&lt;br /&gt;
| &lt;br /&gt;
| percent discount&lt;br /&gt;
|-&lt;br /&gt;
| remise_absolute&lt;br /&gt;
| real&lt;br /&gt;
| YES &lt;br /&gt;
| &lt;br /&gt;
| 0&lt;br /&gt;
| &lt;br /&gt;
| absolut discount&lt;br /&gt;
|-&lt;br /&gt;
| tva&lt;br /&gt;
| real&lt;br /&gt;
| YES &lt;br /&gt;
| &lt;br /&gt;
| 0&lt;br /&gt;
| &lt;br /&gt;
| VAT&lt;br /&gt;
|-&lt;br /&gt;
| total&lt;br /&gt;
| real&lt;br /&gt;
| YES &lt;br /&gt;
| &lt;br /&gt;
| 0&lt;br /&gt;
| &lt;br /&gt;
| total&lt;br /&gt;
|-&lt;br /&gt;
| total_ttc&lt;br /&gt;
| real&lt;br /&gt;
| YES &lt;br /&gt;
| &lt;br /&gt;
| 0&lt;br /&gt;
| &lt;br /&gt;
| total with tax&lt;br /&gt;
|-&lt;br /&gt;
| fk_user_author &lt;br /&gt;
| int(11) &lt;br /&gt;
| YES &lt;br /&gt;
| MUL &lt;br /&gt;
| NULL &lt;br /&gt;
| &lt;br /&gt;
| ID of user author of invoice ([[Table llx_user|llx_user]]-&amp;gt;rowid)&lt;br /&gt;
|-&lt;br /&gt;
| fk_projet &lt;br /&gt;
| int(11) &lt;br /&gt;
| YES &lt;br /&gt;
| MUL &lt;br /&gt;
| NULL &lt;br /&gt;
| &lt;br /&gt;
| ID of related proyect ([[Table llx_projet|llx_projet]]-&amp;gt;rowid)&lt;br /&gt;
|-&lt;br /&gt;
| fk_cond_reglement &lt;br /&gt;
| int(11) &lt;br /&gt;
| NO &lt;br /&gt;
| &lt;br /&gt;
| 0 &lt;br /&gt;
| &lt;br /&gt;
| Id of payment condition ([[Table llx_cond_reglement|llx_cond_reglement]]-&amp;gt;rowid)&lt;br /&gt;
|-&lt;br /&gt;
| fk_mode_reglement &lt;br /&gt;
| int(11) &lt;br /&gt;
| NO &lt;br /&gt;
| &lt;br /&gt;
| 0&lt;br /&gt;
| &lt;br /&gt;
| Id of payment mode&lt;br /&gt;
|-&lt;br /&gt;
| date_lim_reglement&lt;br /&gt;
| date &lt;br /&gt;
| YES &lt;br /&gt;
| &lt;br /&gt;
| NULL&lt;br /&gt;
|&lt;br /&gt;
| date limit for payment&lt;br /&gt;
|-&lt;br /&gt;
| note&lt;br /&gt;
| text &lt;br /&gt;
| YES  &lt;br /&gt;
|&lt;br /&gt;
| NULL &lt;br /&gt;
| &lt;br /&gt;
| comentary&lt;br /&gt;
|-&lt;br /&gt;
| note_public &lt;br /&gt;
| text &lt;br /&gt;
| YES &lt;br /&gt;
| &lt;br /&gt;
| NULL &lt;br /&gt;
| &lt;br /&gt;
| public comentary&lt;br /&gt;
|-&lt;br /&gt;
| frequency&lt;br /&gt;
| char(2)&lt;br /&gt;
| YES &lt;br /&gt;
| &lt;br /&gt;
| NULL &lt;br /&gt;
| &lt;br /&gt;
| invoice frequency&lt;br /&gt;
|-&lt;br /&gt;
| last_gen&lt;br /&gt;
| varchar(7)&lt;br /&gt;
| YES &lt;br /&gt;
| &lt;br /&gt;
| NULL &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|}&amp;amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
== Keys ==&lt;br /&gt;
{|  align=&amp;quot;left&amp;quot; width=&amp;quot;100%&amp;quot; border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; class=&amp;quot;dolbox&amp;quot;&lt;br /&gt;
 |style=&amp;quot;background-color: #e9e9ef&amp;quot;| &amp;lt;b&amp;gt;Key&amp;lt;/b&amp;gt;&lt;br /&gt;
 |style=&amp;quot;background-color: #e9e9ef&amp;quot;| &amp;lt;b&amp;gt;Type&amp;lt;/b&amp;gt;&lt;br /&gt;
 |style=&amp;quot;background-color: #e9e9ef&amp;quot;| &amp;lt;b&amp;gt;Fields&amp;lt;/b&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| PRIMARY&lt;br /&gt;
| PRIMARY&lt;br /&gt;
| rowid&lt;br /&gt;
|- &lt;br /&gt;
| idx_facture_rec_uk_titre &lt;br /&gt;
| UNI&lt;br /&gt;
| titre, entity&lt;br /&gt;
|- &lt;br /&gt;
| idx_facture_rec_fksoc &lt;br /&gt;
| MULTIPLE&lt;br /&gt;
| fk_soc &lt;br /&gt;
|- &lt;br /&gt;
| idx_facture_rec_fk_soc &lt;br /&gt;
| MULTIPLE&lt;br /&gt;
| fk_soc &lt;br /&gt;
|- &lt;br /&gt;
| idx_facture_rec_fk_user_author&lt;br /&gt;
| MULTIPLE&lt;br /&gt;
| fk_user_author&lt;br /&gt;
|- &lt;br /&gt;
| idx_facture_rec_fk_projet &lt;br /&gt;
| MULTIPLE&lt;br /&gt;
| fk_projet&lt;br /&gt;
|}&amp;amp;nbsp;&lt;/div&gt;</summary>
		<author><name>Nnicolashr</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Table_llx_facture_rec&amp;diff=36454</id>
		<title>Table llx facture rec</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Table_llx_facture_rec&amp;diff=36454"/>
		<updated>2016-11-09T04:05:27Z</updated>

		<summary type="html">&lt;p&gt;Nnicolashr: /* Structure */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Invoices]]&lt;br /&gt;
[[Category:Facture]]&lt;br /&gt;
[[Category:Facturas]]&lt;br /&gt;
[[Category:Table SQL]]&lt;br /&gt;
&lt;br /&gt;
{{ListOfTables}}&lt;br /&gt;
&lt;br /&gt;
= Content/Contenu/Contenido =&lt;br /&gt;
{{flag en}} Contains the predefined invoices. The invoice details are in [[Table llx_facturedet_rec]]&lt;br /&gt;
&lt;br /&gt;
{{flag fr}} Contient les factures prédéfinies. les détails de la facture sont dans la [[Table llx_facturedet_rec]]&lt;br /&gt;
&lt;br /&gt;
{{flag sp}} Contiene las facturas predefinidas. Los detalles de la factura se encuentran en la [[Table llx_facturedet_rec]]&lt;br /&gt;
&lt;br /&gt;
= Structure =&lt;br /&gt;
== Table ==&lt;br /&gt;
{|  align=&amp;quot;left&amp;quot; width=&amp;quot;100%&amp;quot; border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; class=&amp;quot;dolbox&amp;quot;&lt;br /&gt;
 |style=&amp;quot;background-color: #e9e9ef&amp;quot;| &amp;lt;b&amp;gt;Field&amp;lt;/b&amp;gt;&lt;br /&gt;
 |style=&amp;quot;background-color: #e9e9ef&amp;quot;| &amp;lt;b&amp;gt;Type&amp;lt;/b&amp;gt;&lt;br /&gt;
 |style=&amp;quot;background-color: #e9e9ef&amp;quot;| &amp;lt;b&amp;gt;Null&amp;lt;/b&amp;gt;&lt;br /&gt;
 |style=&amp;quot;background-color: #e9e9ef&amp;quot;| &amp;lt;b&amp;gt;Key&amp;lt;/b&amp;gt;&lt;br /&gt;
 |style=&amp;quot;background-color: #e9e9ef&amp;quot;| &amp;lt;b&amp;gt;Default&amp;lt;/b&amp;gt;&lt;br /&gt;
 |style=&amp;quot;background-color: #e9e9ef&amp;quot;| &amp;lt;b&amp;gt;Extra&amp;lt;/b&amp;gt;&lt;br /&gt;
 |style=&amp;quot;background-color: #e9e9ef&amp;quot;| &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| rowid &lt;br /&gt;
| int(11) &lt;br /&gt;
| NO&lt;br /&gt;
| PRI&lt;br /&gt;
| &lt;br /&gt;
| auto_increment &lt;br /&gt;
| technical index&lt;br /&gt;
|-&lt;br /&gt;
| titre&lt;br /&gt;
| varchar(50) &lt;br /&gt;
| NO&lt;br /&gt;
| UNI&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| title&lt;br /&gt;
|- &lt;br /&gt;
| entity&lt;br /&gt;
| int(11) &lt;br /&gt;
| NO&lt;br /&gt;
| UNI&lt;br /&gt;
| 1&lt;br /&gt;
| &lt;br /&gt;
| multi company id&lt;br /&gt;
|-&lt;br /&gt;
| fk_soc &lt;br /&gt;
| int(11) &lt;br /&gt;
| NO &lt;br /&gt;
| MUL &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| ID society ([[Table llx_societe|llx_societe]]-&amp;gt;rowid)&lt;br /&gt;
|-&lt;br /&gt;
| datec &lt;br /&gt;
| datetime &lt;br /&gt;
| YES &lt;br /&gt;
| &lt;br /&gt;
| NULL &lt;br /&gt;
| &lt;br /&gt;
| creation date&lt;br /&gt;
|-&lt;br /&gt;
| amount &lt;br /&gt;
| real&lt;br /&gt;
| NO &lt;br /&gt;
| &lt;br /&gt;
| 0&lt;br /&gt;
| &lt;br /&gt;
| amount&lt;br /&gt;
|-&lt;br /&gt;
| remise&lt;br /&gt;
| real&lt;br /&gt;
| YES &lt;br /&gt;
| &lt;br /&gt;
| 0&lt;br /&gt;
| &lt;br /&gt;
| discount&lt;br /&gt;
|-&lt;br /&gt;
| remise_percent&lt;br /&gt;
| real&lt;br /&gt;
| YES &lt;br /&gt;
| &lt;br /&gt;
| 0&lt;br /&gt;
| &lt;br /&gt;
| percent discount&lt;br /&gt;
|-&lt;br /&gt;
| remise_absolute&lt;br /&gt;
| real&lt;br /&gt;
| YES &lt;br /&gt;
| &lt;br /&gt;
| 0&lt;br /&gt;
| &lt;br /&gt;
| absolut discount&lt;br /&gt;
|-&lt;br /&gt;
| tva&lt;br /&gt;
| real&lt;br /&gt;
| YES &lt;br /&gt;
| &lt;br /&gt;
| 0&lt;br /&gt;
| &lt;br /&gt;
| VAT&lt;br /&gt;
|-&lt;br /&gt;
| total&lt;br /&gt;
| real&lt;br /&gt;
| YES &lt;br /&gt;
| &lt;br /&gt;
| 0&lt;br /&gt;
| &lt;br /&gt;
| total&lt;br /&gt;
|-&lt;br /&gt;
| total_ttc&lt;br /&gt;
| real&lt;br /&gt;
| YES &lt;br /&gt;
| &lt;br /&gt;
| 0&lt;br /&gt;
| &lt;br /&gt;
| total with tax&lt;br /&gt;
|-&lt;br /&gt;
| fk_user_author &lt;br /&gt;
| int(11) &lt;br /&gt;
| YES &lt;br /&gt;
| MUL &lt;br /&gt;
| NULL &lt;br /&gt;
| &lt;br /&gt;
| ID of user author of invoice ([[Table llx_user|llx_user]]-&amp;gt;rowid)&lt;br /&gt;
|-&lt;br /&gt;
| fk_projet &lt;br /&gt;
| int(11) &lt;br /&gt;
| YES &lt;br /&gt;
| MUL &lt;br /&gt;
| NULL &lt;br /&gt;
| &lt;br /&gt;
| ID of related proyect ([[Table llx_projet|llx_projet]]-&amp;gt;rowid)&lt;br /&gt;
|-&lt;br /&gt;
| fk_cond_reglement &lt;br /&gt;
| int(11) &lt;br /&gt;
| NO &lt;br /&gt;
| &lt;br /&gt;
| 0 &lt;br /&gt;
| &lt;br /&gt;
| Id of payment condition ([[Table llx_cond_reglement|llx_cond_reglement]]-&amp;gt;rowid)&lt;br /&gt;
|-&lt;br /&gt;
| fk_mode_reglement &lt;br /&gt;
| int(11) &lt;br /&gt;
| NO &lt;br /&gt;
| &lt;br /&gt;
| 0&lt;br /&gt;
| &lt;br /&gt;
| Id of payment mode&lt;br /&gt;
|-&lt;br /&gt;
| date_lim_reglement&lt;br /&gt;
| date &lt;br /&gt;
| YES &lt;br /&gt;
| &lt;br /&gt;
| NULL&lt;br /&gt;
|&lt;br /&gt;
| date limit for payment&lt;br /&gt;
|-&lt;br /&gt;
| note&lt;br /&gt;
| text &lt;br /&gt;
| YES  &lt;br /&gt;
|&lt;br /&gt;
| NULL &lt;br /&gt;
| &lt;br /&gt;
| comentary&lt;br /&gt;
|-&lt;br /&gt;
| note_public &lt;br /&gt;
| text &lt;br /&gt;
| YES &lt;br /&gt;
| &lt;br /&gt;
| NULL &lt;br /&gt;
| &lt;br /&gt;
| public comentary&lt;br /&gt;
|-&lt;br /&gt;
| frequency&lt;br /&gt;
| char(2)&lt;br /&gt;
| YES &lt;br /&gt;
| &lt;br /&gt;
| NULL &lt;br /&gt;
| &lt;br /&gt;
| invoice frequency&lt;br /&gt;
|-&lt;br /&gt;
| last_gen&lt;br /&gt;
| varchar(7)&lt;br /&gt;
| YES &lt;br /&gt;
| &lt;br /&gt;
| NULL &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|}&amp;amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
== Keys ==&lt;br /&gt;
{|  align=&amp;quot;left&amp;quot; width=&amp;quot;100%&amp;quot; border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; class=&amp;quot;dolbox&amp;quot;&lt;br /&gt;
 |style=&amp;quot;background-color: #e9e9ef&amp;quot;| &amp;lt;b&amp;gt;Key&amp;lt;/b&amp;gt;&lt;br /&gt;
 |style=&amp;quot;background-color: #e9e9ef&amp;quot;| &amp;lt;b&amp;gt;Type&amp;lt;/b&amp;gt;&lt;br /&gt;
 |style=&amp;quot;background-color: #e9e9ef&amp;quot;| &amp;lt;b&amp;gt;Fields&amp;lt;/b&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| PRIMARY&lt;br /&gt;
| PRIMARY&lt;br /&gt;
| rowid&lt;br /&gt;
|- &lt;br /&gt;
| idx_facture_rec_uk_titre &lt;br /&gt;
| UNI&lt;br /&gt;
| titre, entity&lt;br /&gt;
|- &lt;br /&gt;
| idx_facture_rec_fksoc &lt;br /&gt;
| MULTIPLE&lt;br /&gt;
| fk_soc &lt;br /&gt;
|- &lt;br /&gt;
| idx_facture_rec_fk_soc &lt;br /&gt;
| MULTIPLE&lt;br /&gt;
| fk_soc &lt;br /&gt;
|- &lt;br /&gt;
| idx_facture_rec_fk_user_author&lt;br /&gt;
| MULTIPLE&lt;br /&gt;
| fk_user_author&lt;br /&gt;
|- &lt;br /&gt;
| idx_facture_rec_fk_projet &lt;br /&gt;
| MULTIPLE&lt;br /&gt;
| fk_projet&lt;br /&gt;
|}&amp;amp;nbsp;&lt;/div&gt;</summary>
		<author><name>Nnicolashr</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Table_llx_facture_rec&amp;diff=36453</id>
		<title>Table llx facture rec</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Table_llx_facture_rec&amp;diff=36453"/>
		<updated>2016-11-09T04:04:49Z</updated>

		<summary type="html">&lt;p&gt;Nnicolashr: /* Table */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Invoices]]&lt;br /&gt;
[[Category:Facture]]&lt;br /&gt;
[[Category:Facturas]]&lt;br /&gt;
[[Category:Table SQL]]&lt;br /&gt;
&lt;br /&gt;
{{ListOfTables}}&lt;br /&gt;
&lt;br /&gt;
= Content/Contenu/Contenido =&lt;br /&gt;
{{flag en}} Contains the predefined invoices. The invoice details are in [[Table llx_facturedet_rec]]&lt;br /&gt;
&lt;br /&gt;
{{flag fr}} Contient les factures prédéfinies. les détails de la facture sont dans la [[Table llx_facturedet_rec]]&lt;br /&gt;
&lt;br /&gt;
{{flag sp}} Contiene las facturas predefinidas. Los detalles de la factura se encuentran en la [[Table llx_facturedet_rec]]&lt;br /&gt;
&lt;br /&gt;
= Structure =&lt;br /&gt;
== Table ==&lt;br /&gt;
{|  align=&amp;quot;left&amp;quot; width=&amp;quot;100%&amp;quot; border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; class=&amp;quot;dolbox&amp;quot;&lt;br /&gt;
 |style=&amp;quot;background-color: #e9e9ef&amp;quot;| &amp;lt;b&amp;gt;Field&amp;lt;/b&amp;gt;&lt;br /&gt;
 |style=&amp;quot;background-color: #e9e9ef&amp;quot;| &amp;lt;b&amp;gt;Type&amp;lt;/b&amp;gt;&lt;br /&gt;
 |style=&amp;quot;background-color: #e9e9ef&amp;quot;| &amp;lt;b&amp;gt;Null&amp;lt;/b&amp;gt;&lt;br /&gt;
 |style=&amp;quot;background-color: #e9e9ef&amp;quot;| &amp;lt;b&amp;gt;Key&amp;lt;/b&amp;gt;&lt;br /&gt;
 |style=&amp;quot;background-color: #e9e9ef&amp;quot;| &amp;lt;b&amp;gt;Default&amp;lt;/b&amp;gt;&lt;br /&gt;
 |style=&amp;quot;background-color: #e9e9ef&amp;quot;| &amp;lt;b&amp;gt;Extra&amp;lt;/b&amp;gt;&lt;br /&gt;
 |style=&amp;quot;background-color: #e9e9ef&amp;quot;| &amp;lt;b&amp;gt;Description&amp;lt;/b&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| rowid &lt;br /&gt;
| int(11) &lt;br /&gt;
| NO&lt;br /&gt;
| PRI&lt;br /&gt;
| &lt;br /&gt;
| auto_increment &lt;br /&gt;
| technical index {{flag sp}} Índice técnico&lt;br /&gt;
|-&lt;br /&gt;
| titre&lt;br /&gt;
| varchar(50) &lt;br /&gt;
| NO&lt;br /&gt;
| UNI&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| title&lt;br /&gt;
|- &lt;br /&gt;
| entity&lt;br /&gt;
| int(11) &lt;br /&gt;
| NO&lt;br /&gt;
| UNI&lt;br /&gt;
| 1&lt;br /&gt;
| &lt;br /&gt;
| multi company id&lt;br /&gt;
|-&lt;br /&gt;
| fk_soc &lt;br /&gt;
| int(11) &lt;br /&gt;
| NO &lt;br /&gt;
| MUL &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| ID society ([[Table llx_societe|llx_societe]]-&amp;gt;rowid)&lt;br /&gt;
|-&lt;br /&gt;
| datec &lt;br /&gt;
| datetime &lt;br /&gt;
| YES &lt;br /&gt;
| &lt;br /&gt;
| NULL &lt;br /&gt;
| &lt;br /&gt;
| creation date&lt;br /&gt;
|-&lt;br /&gt;
| amount &lt;br /&gt;
| real&lt;br /&gt;
| NO &lt;br /&gt;
| &lt;br /&gt;
| 0&lt;br /&gt;
| &lt;br /&gt;
| amount&lt;br /&gt;
|-&lt;br /&gt;
| remise&lt;br /&gt;
| real&lt;br /&gt;
| YES &lt;br /&gt;
| &lt;br /&gt;
| 0&lt;br /&gt;
| &lt;br /&gt;
| discount&lt;br /&gt;
|-&lt;br /&gt;
| remise_percent&lt;br /&gt;
| real&lt;br /&gt;
| YES &lt;br /&gt;
| &lt;br /&gt;
| 0&lt;br /&gt;
| &lt;br /&gt;
| percent discount&lt;br /&gt;
|-&lt;br /&gt;
| remise_absolute&lt;br /&gt;
| real&lt;br /&gt;
| YES &lt;br /&gt;
| &lt;br /&gt;
| 0&lt;br /&gt;
| &lt;br /&gt;
| absolut discount&lt;br /&gt;
|-&lt;br /&gt;
| tva&lt;br /&gt;
| real&lt;br /&gt;
| YES &lt;br /&gt;
| &lt;br /&gt;
| 0&lt;br /&gt;
| &lt;br /&gt;
| VAT&lt;br /&gt;
|-&lt;br /&gt;
| total&lt;br /&gt;
| real&lt;br /&gt;
| YES &lt;br /&gt;
| &lt;br /&gt;
| 0&lt;br /&gt;
| &lt;br /&gt;
| total&lt;br /&gt;
|-&lt;br /&gt;
| total_ttc&lt;br /&gt;
| real&lt;br /&gt;
| YES &lt;br /&gt;
| &lt;br /&gt;
| 0&lt;br /&gt;
| &lt;br /&gt;
| total with tax&lt;br /&gt;
|-&lt;br /&gt;
| fk_user_author &lt;br /&gt;
| int(11) &lt;br /&gt;
| YES &lt;br /&gt;
| MUL &lt;br /&gt;
| NULL &lt;br /&gt;
| &lt;br /&gt;
| ID of user author of invoice ([[Table llx_user|llx_user]]-&amp;gt;rowid)&lt;br /&gt;
|-&lt;br /&gt;
| fk_projet &lt;br /&gt;
| int(11) &lt;br /&gt;
| YES &lt;br /&gt;
| MUL &lt;br /&gt;
| NULL &lt;br /&gt;
| &lt;br /&gt;
| ID of related proyect ([[Table llx_projet|llx_projet]]-&amp;gt;rowid)&lt;br /&gt;
|-&lt;br /&gt;
| fk_cond_reglement &lt;br /&gt;
| int(11) &lt;br /&gt;
| NO &lt;br /&gt;
| &lt;br /&gt;
| 0 &lt;br /&gt;
| &lt;br /&gt;
| Id of payment condition ([[Table llx_cond_reglement|llx_cond_reglement]]-&amp;gt;rowid)&lt;br /&gt;
|-&lt;br /&gt;
| fk_mode_reglement &lt;br /&gt;
| int(11) &lt;br /&gt;
| NO &lt;br /&gt;
| &lt;br /&gt;
| 0&lt;br /&gt;
| &lt;br /&gt;
| Id of payment mode&lt;br /&gt;
|-&lt;br /&gt;
| date_lim_reglement&lt;br /&gt;
| date &lt;br /&gt;
| YES &lt;br /&gt;
| &lt;br /&gt;
| NULL&lt;br /&gt;
|&lt;br /&gt;
| date limit for payment&lt;br /&gt;
|-&lt;br /&gt;
| note&lt;br /&gt;
| text &lt;br /&gt;
| YES  &lt;br /&gt;
|&lt;br /&gt;
| NULL &lt;br /&gt;
| &lt;br /&gt;
| comentary&lt;br /&gt;
|-&lt;br /&gt;
| note_public &lt;br /&gt;
| text &lt;br /&gt;
| YES &lt;br /&gt;
| &lt;br /&gt;
| NULL &lt;br /&gt;
| &lt;br /&gt;
| public comentary&lt;br /&gt;
|-&lt;br /&gt;
| frequency&lt;br /&gt;
| char(2)&lt;br /&gt;
| YES &lt;br /&gt;
| &lt;br /&gt;
| NULL &lt;br /&gt;
| &lt;br /&gt;
| invoice frequency&lt;br /&gt;
|-&lt;br /&gt;
| last_gen&lt;br /&gt;
| varchar(7)&lt;br /&gt;
| YES &lt;br /&gt;
| &lt;br /&gt;
| NULL &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|}&amp;amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
== Keys ==&lt;br /&gt;
{|  align=&amp;quot;left&amp;quot; width=&amp;quot;100%&amp;quot; border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; class=&amp;quot;dolbox&amp;quot;&lt;br /&gt;
 |style=&amp;quot;background-color: #e9e9ef&amp;quot;| &amp;lt;b&amp;gt;Key&amp;lt;/b&amp;gt;&lt;br /&gt;
 |style=&amp;quot;background-color: #e9e9ef&amp;quot;| &amp;lt;b&amp;gt;Type&amp;lt;/b&amp;gt;&lt;br /&gt;
 |style=&amp;quot;background-color: #e9e9ef&amp;quot;| &amp;lt;b&amp;gt;Fields&amp;lt;/b&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| PRIMARY&lt;br /&gt;
| PRIMARY&lt;br /&gt;
| rowid&lt;br /&gt;
|- &lt;br /&gt;
| idx_facture_rec_uk_titre &lt;br /&gt;
| UNI&lt;br /&gt;
| titre, entity&lt;br /&gt;
|- &lt;br /&gt;
| idx_facture_rec_fksoc &lt;br /&gt;
| MULTIPLE&lt;br /&gt;
| fk_soc &lt;br /&gt;
|- &lt;br /&gt;
| idx_facture_rec_fk_soc &lt;br /&gt;
| MULTIPLE&lt;br /&gt;
| fk_soc &lt;br /&gt;
|- &lt;br /&gt;
| idx_facture_rec_fk_user_author&lt;br /&gt;
| MULTIPLE&lt;br /&gt;
| fk_user_author&lt;br /&gt;
|- &lt;br /&gt;
| idx_facture_rec_fk_projet &lt;br /&gt;
| MULTIPLE&lt;br /&gt;
| fk_projet&lt;br /&gt;
|}&amp;amp;nbsp;&lt;/div&gt;</summary>
		<author><name>Nnicolashr</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Crear_un_modelo_de_documento_PDF&amp;diff=36434</id>
		<title>Crear un modelo de documento PDF</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Crear_un_modelo_de_documento_PDF&amp;diff=36434"/>
		<updated>2016-11-03T18:41:54Z</updated>

		<summary type="html">&lt;p&gt;Nnicolashr: /* Crear el nuevo modelo */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TemplateDocDesarrollo}}&lt;br /&gt;
&lt;br /&gt;
Este documento describe como crear su propio modelo de generación de documentos PDF para así personalizar sus documentos (presupuestos, facturas, etc.)&lt;br /&gt;
Tomaremos como ejemplo los presupuestos, pero todo ello se aplica a cualquier tipo de documento.&lt;br /&gt;
&lt;br /&gt;
Para documentos ODT, ver [[Crear un modelo de documento ODT]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Encontrar el modelo existente más cercano =&lt;br /&gt;
En Dolibarr probar los modelos existentes activando todos los modelos existentes en la configuración del módulo y, a continuación, generar y visualizar un documento borrador para cada uno de ellos.&lt;br /&gt;
&lt;br /&gt;
Entre los disponibles, elegir el modelo que mejor se adapte a sus necesidades. En este ejemplo, el modelo azur (correspondente al fichero pdf_propale_azur.modules.php).&lt;br /&gt;
&lt;br /&gt;
Para su información, todos los modelos se encuentran en &#039;&#039;&#039;htdocs\core\modules&#039;&#039;&#039; si trabaja bajo Windows y &#039;&#039;&#039;htdocs/core/modules&#039;&#039;&#039; si trabaja bajo Unix.&lt;br /&gt;
&lt;br /&gt;
= Crear el nuevo modelo =&lt;br /&gt;
Por seguridad, hay que conservar los modelos de origen. Para el ejemplo, comenzaremos creando un nuevo modelo de presupuesto al que llamaremos &#039;masocietebleu&#039; y que se inspira en el modelo &#039;azur&#039;:&lt;br /&gt;
* Copiar-pegar pdf_propale_azur.modules.php&lt;br /&gt;
* Renombrar la copia como pdf_propale_masocietebleu.modules.php&lt;br /&gt;
* Editarla realizando las siguientes modificaciones en el código:&lt;br /&gt;
# Renombrar &#039;Class pdf_propale_azur{ &#039;    como &#039;Class pdf_propale_masocietebleu { &#039;&lt;br /&gt;
# Renombrar &#039;Function pdf_propale_azur($db=0)&#039; como &#039;Function pdf_propale_masocietebleu($db=0)&#039;&lt;br /&gt;
# Cambiar nombre del modelo en línea: Original --&amp;gt; &amp;quot;$this-&amp;gt;name = &amp;quot;azur&amp;quot;;&amp;quot;, Nueva --&amp;gt; $this-&amp;gt;name = &amp;quot;masocietebleu&amp;quot;;&lt;br /&gt;
# Guardar : el modelo &#039;masocietebleu&#039; se encuentra disponible en la lista de modelos de presupuestos de Dolibarr&lt;br /&gt;
* Probar este modelo, antes de continuar, para ello seguir los siguientes pasos:&lt;br /&gt;
# En directorio /htdocs/core/modules/propale/doc poner la copia de la nueva plantilla (Dolibarr versión 3.9.2)&lt;br /&gt;
# Ir al sistema Dolibarr--&amp;gt;Inicio--&amp;gt;Configuración--&amp;gt;Módulos--&amp;gt;Presupuestos--&amp;gt;Configuración del módulo Presupuestos&lt;br /&gt;
# Activar nueva plantilla en sección: Modelos de documentos de presupuestos&lt;br /&gt;
# Ir al sistema Dolibarr--&amp;gt;Comercial--&amp;gt;Listado de Presupuestos--&amp;gt;Seleccionar un presupuesto&lt;br /&gt;
# En sección Documentos, seleccionar nueva plantilla&lt;br /&gt;
# Presionar botón: Generar&lt;br /&gt;
# Verificar que se genera archivo PDF y abrirlo, se espera que se abra con éxito sin errores&lt;br /&gt;
* Borrar indicios de prueba de plantilla después de desactivar&lt;br /&gt;
# Desactivar en sistema Dolibarr--&amp;gt;Inicio--&amp;gt;Configuración--&amp;gt;Módulos--&amp;gt;Presupuestos--&amp;gt;Configuración del módulo Presupuestos&lt;br /&gt;
# Mover archivo de plantilla desde directorio /htdocs/core/modules/propale/doc&lt;br /&gt;
# Eliminar registro creado en tabla llx_document_model&lt;br /&gt;
&lt;br /&gt;
= Personalizar =&lt;br /&gt;
Personalizar el modelo creado.&lt;br /&gt;
Siempre en pdf_propale_masocietebleu.modules.php, buscar la función &#039;Function _pagehead(&amp;amp;$pdf, $fac)&#039;. Ella gestiona la visualización de la cabecera.&lt;br /&gt;
&lt;br /&gt;
== Librería de creación PDF ==&lt;br /&gt;
La librería utilizada para la creación de documentos PDF se llama FPDF y se puede encontrar en htdocs/includes/tcpdf/tcpdf.class.php. En esta clase también encontraremos muchos métodos utilizados para generar los diferentes elementos de los documentos.&lt;br /&gt;
&lt;br /&gt;
Los modelos instancian ellos mismos la clase FPDF y utilizan sus métodos, combinados con los datos de una factura, pedido u otro tipo de datos.&lt;br /&gt;
&lt;br /&gt;
Normalmente encontraremos las siguientes llamadas en los scripts de creación de documentos:&lt;br /&gt;
* $pdf-&amp;gt;SetFont() - &#039;&#039;Designa la fuente utilizada para el texto que continua&#039;&#039;&lt;br /&gt;
* $pdf-&amp;gt;SetXY() - &#039;&#039;Designa el punto de partida para señalar el siguiente texto en coordenadas X,Y que se expresan en milímetros de la página&#039;&#039;&lt;br /&gt;
* $pdf-&amp;gt;MultiCell() - &#039;&#039;Dibuja una caja que puede contener texto, y que primero debe dar el ancho y altura - muy utilizado&#039;&#039;&lt;br /&gt;
* $pdf-&amp;gt;GetY() - &#039;&#039;Devuelve la posición actual en Y&#039;&#039;&lt;br /&gt;
* $pdf-&amp;gt;SetDrawColor() - &#039;&#039;Designa el color a utilizar para el siguiente texto a ser escrito - generalmente negro (0,0,0) o blanco (255,255,255)&#039;&#039;&lt;br /&gt;
* $pdf-&amp;gt;Rect() - &#039;&#039;Dibuja un rectángulo cuya esquina superior izquierda se encuentra en el punto indicado por los dos primeros parámetros y la esquina inferior derecha por los dos últimos parámetros en modo relativo a los dos primeros&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Estructura de los scripts ==&lt;br /&gt;
Los scripts de generación de documentos PDF, durante el desarrollo de la versión 2.2, disponen de los siguientes métodos (tomando como ejemplo el modelo &amp;quot;crabe&amp;quot;) en el seno de la clase del nombre del modelo:&lt;br /&gt;
* pdf_crabe() - &#039;&#039;Constructor del objeto pdf&#039;&#039;&lt;br /&gt;
* write_pdf_file() - &#039;&#039;	Método general para la generación del archivo. Este método llama a todos los siguientes después de inicializar algunas variables&#039;&#039;&lt;br /&gt;
* _pagehead() - &#039;&#039;Método de dibujo de la cabecera del documento, incluyendo generalmente el logotipo, el título del documento (y la fecha) así como los marcos de datos del emisor y el destinatario del documento&#039;&#039;&lt;br /&gt;
* _tableau() - &#039;&#039;Método de dibujo de la tabla de datos (productos, servicios, etc)&#039;&#039;&lt;br /&gt;
* _tableau_info() - &#039;&#039;Método de dibujo de la tabla con una lista de informaciones de la factura&#039;&#039;&lt;br /&gt;
* _tableau_tot() - &#039;&#039;Método de dibujo de la tabla de los totales&#039;&#039;&lt;br /&gt;
* _tableau_versement() - &#039;&#039;Método de dibujo de la tabla de las forma de pago&#039;&#039;&lt;br /&gt;
* _pagefoot() - &#039;&#039;Método de dibujo del pié de página&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Ejemplo ==&lt;br /&gt;
=== Inserción de un logo ===&lt;br /&gt;
* Añadir la instrucción:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$pdf-&amp;gt;Image(&#039;\www\htdocs\dolibarr\document\societe\logo.jpg&#039;, 10, 5,60.00);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Inserción de una firma u otros en pié de página de la factura ===&lt;br /&gt;
* abrir el modelo a modificar crabe u oursin (en htdocs/core/modules/facture/)&lt;br /&gt;
* insertar (por mi parte, justo antes de la línea 618 // Show payment mode CHQ)&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$pdf-&amp;gt;Image(&#039;http://localhost/dolibarr/doc/images/signature.jpg&#039;,120,250,74);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
la imagen (largo 74mm) aparece en la columna de la derecha justo antes del pie de página.&lt;br /&gt;
* copiar la imagen en el directorio. Parece ser que una imagen png con transparencias trae problemas.&lt;br /&gt;
* generar el pdf, la firma aparece.&lt;br /&gt;
&lt;br /&gt;
=== Inserción de textos ===&lt;br /&gt;
Principales funciones utilizadas&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$pdf-&amp;gt;setX(float a); // establece la posición actual x&lt;br /&gt;
$pdf-&amp;gt;setY(float b); // establece la posición actual y&lt;br /&gt;
$pdf-&amp;gt;setXY(float a,float b); // establece las posición actual x e y&lt;br /&gt;
$pdf-&amp;gt;SetTextColor(0,0,200); // establece el color del texto&lt;br /&gt;
$pdf-&amp;gt;SetFont(&#039;Arial&#039;,&#039;B&#039;,14); // establece la fuente, le tipo ( &#039;B&#039; para negrita, &#039;I&#039; para itálica, &#039;&#039; para normal,...)&lt;br /&gt;
$pdf-&amp;gt;MultiCell(60, 8, &#039;My text&#039;, 0, &#039;L&#039;); // imprime &#039;My text&#039; con salto de línea&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Recuerde: el origen es la esquina superior izquierda&lt;br /&gt;
&lt;br /&gt;
== Para más información ==&lt;br /&gt;
http://www.fpdf.org/?lang=es&lt;br /&gt;
&lt;br /&gt;
= Elegir un modelo por defecto en Dolibarr =&lt;br /&gt;
En  Inicio =&amp;gt; Configuración =&amp;gt; Módulos =&amp;gt; :&lt;br /&gt;
* indicamos que modelos deben de estar activos,&lt;br /&gt;
* precisaremos el modelo propuesto por defecto.&lt;/div&gt;</summary>
		<author><name>Nnicolashr</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Desarrollo_Canvas&amp;diff=36288</id>
		<title>Desarrollo Canvas</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Desarrollo_Canvas&amp;diff=36288"/>
		<updated>2016-10-15T02:32:54Z</updated>

		<summary type="html">&lt;p&gt;Nnicolashr: /* Condiciones */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TemplateDocDesarrollo}}&lt;br /&gt;
&lt;br /&gt;
Canvas es una funcionalidad destinada a desarrolladores para reemplazar a las pantallas de creación, actualización o visualización de fichas (productos, terceros, contactos, ...). &lt;br /&gt;
&lt;br /&gt;
Por ejemplo, puede reemplazar el formulario de creación de terceros, el de actualización o el de visualización.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Condiciones =&lt;br /&gt;
La funcionalidad Canvas se encuentra disponible con Dolibarr 3.2 o superior.&lt;br /&gt;
&lt;br /&gt;
De momento disponible solamente para:&lt;br /&gt;
* formulario de creación de productos, contactos y terceros&lt;br /&gt;
* formulario de edición de productos, contactos y terceros&lt;br /&gt;
* pestaña visualización de productos, contactos y terceros. En la mayoría de los casos es la primera pestaña al abrir la ficha de un objeto. Puede echar un vistazo a la documentación de como crear un módulo nuevo para saber como desactivar o añadir otras pestañas, si es que lo necesita.&lt;br /&gt;
&lt;br /&gt;
= Reemplazar un formulario de creación con su página canvas =&lt;br /&gt;
{{ToComplete}}&lt;/div&gt;</summary>
		<author><name>Nnicolashr</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Lenguaje_y_Normas_de_Desarrollo&amp;diff=36287</id>
		<title>Lenguaje y Normas de Desarrollo</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Lenguaje_y_Normas_de_Desarrollo&amp;diff=36287"/>
		<updated>2016-10-15T02:24:16Z</updated>

		<summary type="html">&lt;p&gt;Nnicolashr: /* Tabla structura */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TemplateDocDesarrollo}}&lt;br /&gt;
&lt;br /&gt;
He aquí algunas normas sobre el lenguaje, la sintaxis y las norma de desarrollo en vigor para el proyecto Dolibarr:&lt;br /&gt;
&lt;br /&gt;
= Versiones =&lt;br /&gt;
&lt;br /&gt;
* Dolibarr debe funcionar con:&lt;br /&gt;
# Todos los SO (Windows, Linux, MACOS...)&lt;br /&gt;
# PHP {{PHPMinVersion}} (Debe funcionar sin ningún módulo PHP complementario, exceptuando los módulos de acceso a la base de datos).&lt;br /&gt;
# Mysql {{MySqlMinVersion}}&lt;br /&gt;
&lt;br /&gt;
= Normas de Copyright =&lt;br /&gt;
* Todos los archivos PHP deben empezar con una cabezara como&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
/* Copyright (C) YYYY John Doe  &amp;lt;email@email.com&amp;gt;&lt;br /&gt;
*&lt;br /&gt;
* Licence information&lt;br /&gt;
*/&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si edita un archivo existente del proyecto, debe añadir una línea de Copyright debajo de las otras.&lt;br /&gt;
&lt;br /&gt;
= Normas PHP =&lt;br /&gt;
&lt;br /&gt;
* Dolibarr está escrito en PHP y soporta todas las versiones de PHP superiores a la {{PHPMinVersion}}. Todos los archivos deben de contener la extensión .php&lt;br /&gt;
&lt;br /&gt;
* La llamada a las variables superglobales PHP deben pasar a través de los operadores dedicados $_COOKIES, $_SERVER, $_ENV y a través de la función dolibarr GETPOST() para obtener el contenido de$_GET o $_POST...&lt;br /&gt;
Los otros operadores ($HTTP_SERVER_GET, ...) están siendo depreciados en el seno de PHP, no deben de ser ya utilizados. Por lo tanto, el código debe funcionar incluso cuando la opción &#039;&#039;&#039;register_long_arrays&#039;&#039;&#039; esté en off.&lt;br /&gt;
Además de que el código debe funcionar cuando la opción de PHP &#039;&#039;&#039;register_globals&#039;&#039;&#039; esté en off (recomendado por PHP), también lo deberá hacer cuando la opción &#039;&#039;&#039;register_globals&#039;&#039;&#039; esté en on (por defecto en muchas instalaciones).&lt;br /&gt;
&lt;br /&gt;
* Los smart tags PHP no són utilizados. Las secciones de código deben de empezar por &#039;&#039;&#039;&amp;lt;?php&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* No se permite el uso de la variable &#039;&#039;&#039;PHP_SELF&#039;&#039;&#039;. Utilice en su lugar $_SERVER[&amp;quot;PHP_SELF&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
* Cuando varias variables deben ser inicializadas con el mismo valor, utilice múltiples líneas&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$var1=1;$var2=1;$var3=1;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
en lugar de&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$var1=$var2=$var3=1;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
que es menos eficiente.&lt;br /&gt;
&lt;br /&gt;
* las cadenas deben de ser encuadradas con comillas simples y las variables sacadas de la cadena.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
print &#039;Mi texo muestra mi &#039;.$variable.&#039; !&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Los comentarios deben seguir la sintaxis de C, es decir, una doble barra invertida para una línea de comentario y el uso de una barra con arterisco para abrir un bloque de varias líneas&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/* Bloque de comentarios&lt;br /&gt;
 *&lt;br /&gt;
 * Fin el bloque&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
$monobjet = new MonObjet($db);&lt;br /&gt;
$result=$monobjet-&amp;gt;fetch($idobject);&lt;br /&gt;
&lt;br /&gt;
for ($i = 1 , $i &amp;lt; 2 ; $i++)&lt;br /&gt;
{&lt;br /&gt;
  // comentario de una línea&lt;br /&gt;
  print $i;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Los ficheros deben ser guardados en formato Unix (LF) y no en formato Windows (CR/LF). El formato Unix es compatible con los SO Unix, Windows, Mac, mientras que el formato de archivo de texto de Windows es problemático en algunos PHP en Unix.&lt;br /&gt;
&lt;br /&gt;
* Las funciones deben devolver &amp;gt;0 en caso de éxito, y un número &amp;lt;0 en caso de error.&lt;br /&gt;
&lt;br /&gt;
* Sin código muerto (no usado) en el código principal de Dolibarr (El código usado únicamente por un módulo externo debe ser incluido en el módulo externo).&lt;br /&gt;
&lt;br /&gt;
* Usar &amp;quot;include_once&amp;quot; para la inclusión de todo archivo que contenga definiciones de funciones o de clases (archivos *.class.php y *.lib.php), usar &amp;quot;include&amp;quot; para la inclusión de archivos de tipo template o que contenga una mezcla de HTML y PHP (archivos *.inc.php et *.tpl.php).&lt;br /&gt;
&lt;br /&gt;
= Normas SQL =&lt;br /&gt;
&lt;br /&gt;
== Estructura de Tabla ==&lt;br /&gt;
* Todas las tablas tienen prefijo para evitar conflictos de nombres. A día de hoy, el prefijo está determinado y no se puede cambiar. Su valor es &amp;lt;tt&amp;gt;llx_&amp;lt;/tt&amp;gt;. Sin embargo, está pendiente de considerar, en una futura versión, el poder cambiarlo en el momento de la instalación.&lt;br /&gt;
&lt;br /&gt;
* En la práctica, con la finalidad de set compatible con todas las precisiones de los paises, utilizaremos los siguientes tipos:&lt;br /&gt;
 - integer para cualquier foreign key&lt;br /&gt;
 - double(24,8) para cualquier importe&lt;br /&gt;
 - double(6,3) para las tasas de IVA&lt;br /&gt;
 - real para una cantidad&lt;br /&gt;
 - varchar para una cadena (incluidos los de longitud 1, el tipo char se está depreciando)&lt;br /&gt;
 - timestamp para fecha+hora que deba ser actualizado automáticamente&lt;br /&gt;
 - datetime para fecha+hora&lt;br /&gt;
 - date para fecha&lt;br /&gt;
&lt;br /&gt;
== Clave primaria ==&lt;br /&gt;
La clave primaria de una tbla se llama &amp;lt;tt&amp;gt;rowid&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Hay unas pocas tablas que incumplen la norma ahora (ej [[Table llx_c_actioncomm]]), por razones históricas. Podrá ser estudiada una evolución para una próxima versión.&lt;br /&gt;
&lt;br /&gt;
== Clave secundaria ==&lt;br /&gt;
El nombre de una clave secundaria empieza con el prefijo &amp;lt;tt&amp;gt;fk_&amp;lt;/tt&amp;gt; seguido por el nombre de la tabla vinculada (necesario para evitar duplicaciones globales en la base de datos, problemáticas en algunos RDBMS como postgresql), seguido del campo vinculado (para permitir diferentes claves secundarias en la misma tabla).&lt;br /&gt;
&lt;br /&gt;
Ejemplo:&lt;br /&gt;
fk_facture_fourn_fk_soc&lt;br /&gt;
&lt;br /&gt;
== Clave alternativa ==&lt;br /&gt;
	&lt;br /&gt;
A veces no sólamente la clave primaria debe ser única. Por lo tanto, podemos añadir un índice de clave única alternativa. Este índice es llamado por un nombre que comienza con el prefijo &amp;lt;tt&amp;gt;uk_&amp;lt;/tt&amp;gt; seguido por el nombre de la tabla  (necesario para evitar la duplicación de índeces globales en la base de datos, problemáticos en algunos DBMS como postgresql) y de un sufijo que caracterice a la clave (para permitir múltiples índices en una sola tabla).&lt;br /&gt;
&lt;br /&gt;
Ejemplo:&lt;br /&gt;
uk_societe_code_client&lt;br /&gt;
&lt;br /&gt;
== Indices de rendimiento ==&lt;br /&gt;
Algunos campos se utilizan a menudo como un criterio para la búsqueda, clasificación o afiliación. Conviene en este caso, poner un índice de rendimiento. Tales índices se llamarán con un prefijo &amp;lt;tt&amp;gt;idx_&amp;lt;/tt&amp;gt; seguidos del nombre de la tabla y el nombre del campo en el que el índice trabaja.&lt;br /&gt;
&lt;br /&gt;
Ejemplo:&lt;br /&gt;
idx_societe_user_creat&lt;br /&gt;
&lt;br /&gt;
== Formato de fichero DDL ==&lt;br /&gt;
Los ficheros que contienen la definición de la estructura de la base de datos (DDL) deben de estar repartidos en dos tablas:&lt;br /&gt;
* Cada tabla se define en su propio archivo cuyo nombre es &amp;lt;tt&amp;gt;llx_&#039;&#039;mitabla&#039;&#039;.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
Donde habrá un comentario junto a cada campo para explicar su significado.&lt;br /&gt;
* Claves de relacionales y el índice de rendimiento o otras constraints de carácter único se definen en un archivo cuyo nombre es &amp;lt;tt&amp;gt;llx_&#039;&#039;mitable&#039;&#039;.key.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Estos ficheros se guardan el la carpeta &#039;&#039;&#039;install/mysql/tables&#039;&#039;&#039; para los ficheros standards ó &#039;&#039;&#039;mimodulo/tables&#039;&#039;&#039; para las tablas llevadas por un módulo.&lt;br /&gt;
&lt;br /&gt;
Ejemplos &#039;&#039;&#039;Fichero tabla llx_matable.sql&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- ===========================================================================&lt;br /&gt;
-- Copyright (C) 2008 Author &amp;lt;email@author.com&amp;gt;&lt;br /&gt;
-- &lt;br /&gt;
-- This program is free software; you can redistribute it and/or modify&lt;br /&gt;
-- it under the terms of the GNU General Public License as published by&lt;br /&gt;
-- the Free Software Foundation; either version 2 of the License, or&lt;br /&gt;
-- (at your option) any later version.&lt;br /&gt;
--&lt;br /&gt;
-- This program is distributed in the hope that it will be useful,&lt;br /&gt;
-- but WITHOUT ANY WARRANTY; without even the implied warranty of&lt;br /&gt;
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the&lt;br /&gt;
-- GNU General Public License for more details.&lt;br /&gt;
--&lt;br /&gt;
-- You should have received a copy of the GNU General Public License&lt;br /&gt;
-- along with this program. If not, see &amp;lt;http://www.gnu.org/licenses/&amp;gt;.&lt;br /&gt;
-- ===========================================================================&lt;br /&gt;
&lt;br /&gt;
create table llx_matable&lt;br /&gt;
(&lt;br /&gt;
  rowid       integer AUTO_INCREMENT PRIMARY KEY,&lt;br /&gt;
  field_one   integer,&lt;br /&gt;
  field_two   integer NOT NULL,&lt;br /&gt;
  fk_field    integer,&lt;br /&gt;
  field_date  datetime,&lt;br /&gt;
  tms         timestamp&lt;br /&gt;
)type=innodb;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ejemplos &#039;&#039;&#039;Fichero de claves/índices llx_matable.key.sql&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- ===========================================================================&lt;br /&gt;
-- Copyright (C) 2008 Author &amp;lt;email@author.com&amp;gt;&lt;br /&gt;
-- &lt;br /&gt;
-- This program is free software; you can redistribute it and/or modify&lt;br /&gt;
-- it under the terms of the GNU General Public License as published by&lt;br /&gt;
-- the Free Software Foundation; either version 2 of the License, or&lt;br /&gt;
-- (at your option) any later version.&lt;br /&gt;
--&lt;br /&gt;
-- This program is distributed in the hope that it will be useful,&lt;br /&gt;
-- but WITHOUT ANY WARRANTY; without even the implied warranty of&lt;br /&gt;
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the&lt;br /&gt;
-- GNU General Public License for more details.&lt;br /&gt;
--&lt;br /&gt;
-- You should have received a copy of the GNU General Public License&lt;br /&gt;
-- along with this program. If not, see &amp;lt;http://www.gnu.org/licenses/&amp;gt;.&lt;br /&gt;
-- ===========================================================================&lt;br /&gt;
&lt;br /&gt;
ALTER TABLE llx_matable ADD UNIQUE uk_matable_field(field_one, field_two);&lt;br /&gt;
&lt;br /&gt;
ALTER TABLE llx_matable ADD CONSTRAINT fk_matable_fk_field FOREIGN KEY (fk_field) REFERENCES llx_matablepere (rowid);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SQL Coding rules ==&lt;br /&gt;
* Uso de alias / nombres de los campos&lt;br /&gt;
Dentro de los selects pueden utilizar alias para simplificar la redacción de las consultas:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
select chp1, chpxxx2 as chp2 from table2 as t1, table2 as t2 where t1.chpx = t2.chpy&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Sin embargo, no debemos utilizar este alias en las consultas de actualización porque no es compatible con mysql 3.1.&lt;br /&gt;
&lt;br /&gt;
* ¡Los SELECT * están prohibidos! Cada Select deberá especificar la lista completa de los campos para recuperar. Esto permitirá evitar confusiones. Ejemplo:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT field_a, field_b, field_c FROM table_1 WHERE field_d = &#039;$id&#039;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* En las consultas SQL, entrecomillaremos los campos, pero no los numéricos que contengan cantidades que se almacenen en los campos de tipo double o real. Los entrecomillados en los numéricos de tipo float se almacenan con un valor diferente. Por ejemplo 412.62 dentro del insert se guardara con el valor 412.61999512 en base si el campo es de tipo double(24,8). Y PHP sólo ve 412.61999512. Otras herramientas verán 412.62 dando la impresión de que no hay problemas. Y PHP tiene razón, hay un problema en base. Mediante la eliminación de las comillas en los numéricos, esto irá  mejor.&lt;br /&gt;
&lt;br /&gt;
Ejemplo:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
Bien:INSERT INTO table_1 (field_txt, field_num) VALUES (&#039;txt&#039;, 412.62)&lt;br /&gt;
Mal: INSERT INTO table_1 (field_txt, field_num) VALUES (&#039;txt&#039;, &#039;412.62&#039;)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nota, el problema de los float es general y no sólamete en el acceso a la base de datos, está presente en todos los lenguajes cuando trabajamos sobre números reales, por lo que deberán ser limpiados por la función price2num con el segundo parámetro rellenado con:&lt;br /&gt;
&#039;MU&#039;, &#039;MT&#039; ó &#039;MS&#039; según sea necesario. Consulte el capítulo &amp;quot;Los números reales, importes y cálculos&amp;quot; más abajo.&lt;br /&gt;
&lt;br /&gt;
* las funciones NOW, SYSDATE ó IFNULL están prohibidas en las órdenes de SQL. Si se necesita indicar la fecha del momento en un campo, el valor debe provenir de PHP y no del motor de la base de datos. Esto además de ofrecer una mejor portabilidad del código, también permite una gestión correcta de la zona horaria.&lt;br /&gt;
&lt;br /&gt;
== Reglas de migración de base de datos ==&lt;br /&gt;
* Los scripts de migración de estructura se encuentran en el directorio &#039;&#039;&#039;install/mysql/migration/a.b.c-x.y.z.sql&#039;&#039;&#039;. En un archivo de migración de n a n+1, no destruiremos una tabla (DROP TABLE) que no sea utilizada en n+1, se realizará en la migración de la versión n+1 a n+2. Esto tiene el fin de conservar las tablas depreciadas durante una versión para poder reparar una situación de error de migración.&lt;br /&gt;
&lt;br /&gt;
== Particularidades de MySQL ==&lt;br /&gt;
&lt;br /&gt;
* Las tablas deben de estar en formato InnoDB.&lt;br /&gt;
En efecto, este formato soporta claves secundarias, las eventuales restricciones que se adjuntan y la noción de integridad de transacciones requeridas para obteter datos coherentes entre tablas en la base de datos.&lt;br /&gt;
&lt;br /&gt;
* Dolibarr debe trabajar incluso con la opción &#039;&#039;&#039;strict&#039;&#039;&#039; de Mysql activa.&lt;br /&gt;
Para activarla, añada la siguiente línea en su archivo config del servidor MySql (my.cnf o my.ini)&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
sql-mode=&amp;quot;STRICT_ALL_TABLES,ONLY_FULL_GROUP_BY,NO_ZERO_DATE&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Particularidades de PostgreSQL ==&lt;br /&gt;
Sólo los archivos de MySQL deben mantenerse.&lt;br /&gt;
Los archivos para otras bases de datos se convierten &amp;quot;al vuelo&amp;quot; por el gestor de la base de datos.&lt;br /&gt;
&lt;br /&gt;
= Normas HTML =&lt;br /&gt;
&lt;br /&gt;
* Todos los atributos de las etiquetas HTML deben de estar *en minúscula* y entrecomillados con *doble comilla*.&lt;br /&gt;
&lt;br /&gt;
* Los enlaces href deben de ser absolutos. para las páginas, basarse en la function dol_buildpath(). Para las imágenes basarse en la llamada de la función img_picto.&lt;br /&gt;
Por ejemplo:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
print &#039;&amp;lt;a href=&amp;quot;&#039;.dol_buildpath(&#039;/monrep/mapage.php&#039;).&#039;&amp;quot;&amp;gt;&#039;.img_picto(&#039;Texte alt&#039;,&#039;nompictopng&#039;,&#039;&#039;).&#039;&amp;lt;/a&amp;gt;&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Las tablas HTML deben tener las columnas sin valores forcados, a excepción de las columnas que contienen información cuya longitud no es variable. Por ejemplo, una columna con una imagen puede forzarse a un with=&amp;quot;20px&amp;quot;. En los otros casos, hay que evitar forzar la longitud de las columnas. Esto es porque en la mayoría de los casos el navegador realiza un buen trabajo al definir automáticamente la longitud de las columnas, independientemente de la resolución de la pantalla.&lt;br /&gt;
&lt;br /&gt;
* Javascript/ajax y la llamada a scripts java en las páginas php está fuera de las normas. Si de todas maneras se incluye código javascript, debe estar condicionado mediante el test &amp;quot;$conf-&amp;gt;use_javascript_ajax&amp;quot;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
if ($conf-&amp;gt;use_javascript_ajax) {&lt;br /&gt;
...  // El código PHP que genera el javascript va aquí&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Las ventanas emergentes  no deben de ser utilizadas, exceptuando los tooltips (y quedan condicionados por el punto anterior).&lt;br /&gt;
&lt;br /&gt;
* Los scripts externos son escritos en Perl si no pueden serlo en php, la utilización de otro lenguaje no está prohibido, pero debe de ser discutido priero en la lista de correo de desarrollo.&lt;br /&gt;
&lt;br /&gt;
= Normas Dolibarr y plantillas de código =&lt;br /&gt;
&lt;br /&gt;
== Plantillas de código ==&lt;br /&gt;
Para estandarizar el código y acelerar el desarrollo de nuevos componentes en Dolibarr, en la carpeta &#039;&#039;&#039;dev/skeletons&#039;&#039;&#039; encontraremos 4 plantillas de código preparadas.&lt;br /&gt;
&lt;br /&gt;
* 1 que sirve de ejemplo de descriptor de módulo: &#039;&#039;&#039;myModule.class.php&#039;&#039;&#039;&lt;br /&gt;
* 1 que sirve de ejemplo de código para crear una nueva clase: &#039;&#039;&#039;skeleton_class.class.php&#039;&#039;&#039;&lt;br /&gt;
* 1 que sirve de ejemplo de código para crear una nueva página: &#039;&#039;&#039;skeleton_page.php&#039;&#039;&#039;&lt;br /&gt;
* 1 que sirve de ejemplo de código para crear una nuevo script a ejecutar en línea de comandos: &#039;&#039;&#039;skeleton_script.php&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Úsenlas como ejemplo.&lt;br /&gt;
Tenga en cuenta que estas plantillas también son utilizadas por el generador de código PHP que se describe en el capítulo de Desarrollo de módulos Dolibarr módulo para acelerar su desarrollo.&lt;br /&gt;
&lt;br /&gt;
== Las fechas y la Zona Horaria ==&lt;br /&gt;
Dolibarr es una aplicación multi-usuario y multi-ubicación. Por lo tanto, es necesario almacenar las fechas en el formato correcto. Para evitar problemas de conversión, deben aplicarse las siguientes reglas:&lt;br /&gt;
* Una fecha en memoria debe de estar en formato Timestamp GMT.&lt;br /&gt;
* Una fecha guardada en la base de datos contiene el Timestamp GMT en relación con la fecha que figura en la consulta en hora local &amp;lt;b&amp;gt;del servidor PHP&amp;lt;/b&amp;gt;. No se trata de las fechas de actualización de la base de datos (campo &#039;&#039;&#039;tms&#039;&#039;&#039; en la base de datos).&lt;br /&gt;
Por lo tanto, el 1 de enero de 1970, a las 3 en París (TZ=+1) = las 2 en Greenwitch (TZ=0)  será almacenado en memora 7200 y será enviado a la base de datos con la cadena &#039;19700101030000&#039; (PHP convierte en hora de su TZ y la base de datos la deconvierte con su TZ que es la misma que la de PHP).&lt;br /&gt;
&lt;br /&gt;
Los métodos select deben traducir los campos fecha al formato de cadenta TZ de la base (&#039;19700101030000&#039;) mediante la llamada del método db-&amp;gt;jdate para recuperar la información en memoria en formato Timestamp GMT. Y los métodos insert deben deben generar la petición convirtiendo la fecha en memoria conocida en variable, mediante el método db-&amp;gt;idate (Ver ejemplos generados por la plantilla).&lt;br /&gt;
&lt;br /&gt;
* Las actualizaciones automáticas de la base de datos (campo &#039;&#039;&#039;tms&#039;&#039;&#039; en la base) contienen el Timestamp GMT del momento en que se ha realizado la modificación. Los métodos select recuperan directamente este dato en memoria en formato Timestamp GMT.&lt;br /&gt;
&lt;br /&gt;
* La manipulación de fechas en PHP debe realizarse usando las funciones de fechas de Dolibarr: &#039;&#039;&#039;dol_now(), dol_mktime(), dol_stringtotime(), dol_getdate(), dol_time_plus_duree()&#039;&#039;&#039;. También se encuentran otras funciones listas para su uso en el archivo date.lib.php.&lt;br /&gt;
&lt;br /&gt;
== Codificación UTF8/ISO ==&lt;br /&gt;
Dolibarr guarda la información de la manera siguiente:&lt;br /&gt;
&lt;br /&gt;
* En la base de datos, los datos en UTF8 ó ISO. Esto depende del pagecode de la base de datos, y por lo tanto, de las opciones en la creación de esta base de datos. En todos los casos, el controlador de base de datos Dolibarr (dentro de /lib/database) lee e inserta por conversión desde y hacia UTF8.&lt;br /&gt;
* Los datos en memoria se guardan en UTF8 (instancias de objetos PHP).&lt;br /&gt;
* las páginas web mostradas en pantalla se encuentran en formato UTF8 (con versiones &amp;lt; 2.5.1, es el antiguo parámetro $character_set del fichero conf.php quien define el formato de salida).&lt;br /&gt;
&lt;br /&gt;
== Los números reales, importes y cálculos ==&lt;br /&gt;
Tanto en PHP como en otros lenguajes (Java, por ejemplo), los datos no enteros (float, real, double) no son fialbes.&lt;br /&gt;
Pruebe a realizar por ejemplo&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
print 239.2 - 229.3 - 9.9;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
No obtendrá 0, sino un número muy pequeño en potencia 10 negativo . Si obtiene cero, puede encontrar otros ejemplos que no funcionan.&lt;br /&gt;
El problema de los float es general, una variable resultante del cálculo de números reales debe SISTEMATICAMENTE ser limpiada mediante la función &#039;&#039;&#039;price2num()&#039;&#039;&#039; con el segundo parámetro rellenado con: &#039;MU&#039;, &#039;MT&#039; ó &#039;MS&#039; según el caso (ver doc de la función).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
print price2num(239.2 - 229.3 - 9.9, &#039;MT&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;	&lt;br /&gt;
Si no es un precio que se ajuste a los parámetros de MU, MT, MS debe utilizar la función &#039;&#039;&#039;round()&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Creación de tablas ==&lt;br /&gt;
No crear una tabla a utilizar, es decir, al &#039;&#039;&#039;primer uso&#039;&#039;&#039; del módulo.&lt;br /&gt;
Si crea un módulo que usa tablas que no se incluyen como estándar en el código de Dolibarr, asegúrese de seguir el tutorial Creación de un módulo que explica cómo incluir las tablas que se crean en la activación del módulo y no en su uso (ver más arriba).&lt;br /&gt;
&lt;br /&gt;
== Logs ==&lt;br /&gt;
Añada traces dentro de su código mediante la función &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
dol_syslog($yourmessage, LOG_INFO|LOG_DEBUG|LOG_WARNING|LOG_ERR);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Carpetas de trabajo ==&lt;br /&gt;
Si tiene que crear una carpeta de trabajo, en el código, haga referencia a esta carpeta de la siguiente forma&lt;br /&gt;
&#039;&#039;&#039;DOL_DATA_ROOT.&#039;/mimodulo&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
La carpeta puede crearse en desde su código mediante el código siguiente:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$mymoduledir=DOL_DATA_ROOT.&#039;/mimodulo&#039;;&lt;br /&gt;
dol_mkdir($mymoduledir);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si necesita una carpeta de datos temporales, esta carpeta deberá ser &#039;&#039;&#039;DOL_DATA_ROOT.&#039;/minmodulo/temp&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Patrones de Diseño y programación con objetos =&lt;br /&gt;
== Patrones de Diseño Creacionales (GoF) ==&lt;br /&gt;
Design patterns definidos por el le Gang Of Four (ver la wikipedia sobre los [http://es.wikipedia.org/wiki/Patr%C3%B3n_de_dise%C3%B1o Design patterns]).&lt;br /&gt;
No hay design patterns creacionales particulares.&lt;br /&gt;
Hay objetos cercanos a los Singleton y creados conforme al 100% en el espíritu, pero no en la sintaxis, a fin de ser compatible con PHP 4 que no es un lenguaje orientado a objetos completo.&lt;br /&gt;
&lt;br /&gt;
== Design patterns Estructurales (GoF) ==&lt;br /&gt;
(ver la wikipedia sobre los [http://es.wikipedia.org/wiki/Patr%C3%B3n_de_dise%C3%B1o Design patterns]).&lt;br /&gt;
No hay design patterns estructurales particulares.&lt;br /&gt;
&lt;br /&gt;
== Design patterns de Comportamiento (GoF) ==&lt;br /&gt;
(ver la wikipedia sobre los [http://es.wikipedia.org/wiki/Patr%C3%B3n_de_dise%C3%B1o Design patterns]).&lt;br /&gt;
No hay design patterns de Comportamiento particulares.&lt;br /&gt;
&lt;br /&gt;
== Design patterns enterprise (Martin Fowler) ==&lt;br /&gt;
&lt;br /&gt;
=== Motivos de organización del código ===&lt;br /&gt;
&lt;br /&gt;
[[wikipedia:Martin Fowler|Martin Fowler]] ha identificado 3 métodos de organización de código llamados &#039;&#039;&#039;principios&#039;&#039;&#039;:&lt;br /&gt;
* El &#039;&#039;&#039;Transaction Script&#039;&#039;&#039; (El código es lineal en función de una acción del usuario).&lt;br /&gt;
Es el antiguo principio utilizado en los lenguajes de procedimiento.&lt;br /&gt;
Inconveniente: Redundancia de código. Necesidad de conocer el modelo físico a desarrollar.&lt;br /&gt;
* El &#039;&#039;&#039;Domain Model&#039;&#039;&#039;&lt;br /&gt;
Es un modelo posible desde los lenguajes orientados a objeto. Son procedimentos funcionales (que deben de ser indentificados antes) que sirven de base para las clases objeto.&lt;br /&gt;
Inconveniente: Motivo de mantenimiento complejo.&lt;br /&gt;
* El &#039;&#039;&#039;Table Module&#039;&#039;&#039;&lt;br /&gt;
Un intermedio entre los 2 anteriores donde se tiene una sola clase por tabla de la base de datos.&lt;br /&gt;
&lt;br /&gt;
-&amp;gt; Como se muestra en el código de la plantilla (ver sección anterior) Dolibarr se basa en el principio de &#039;&#039;&#039;Table Module&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Comunicación lógica de negociado - datos (ORM) ===&lt;br /&gt;
&lt;br /&gt;
Existen 3 tipos de conexiones:&lt;br /&gt;
* &#039;&#039;&#039;Data Gateway a tablas y filas&#039;&#039;&#039; &lt;br /&gt;
Es el más simple. Creamos una tabla por clase y cada clase es un puente con la tabla correspondiente, ver una clase por línea tabla. Una instancia de la clase será pues un registro de la tabla. La clase contiene sólo el código de acceso a líneas o columnas de tablas.&lt;br /&gt;
&lt;br /&gt;
Ejemplo: Es el método utilizado al utilizar ciertos Frameworks de ORM como &#039;&#039;&#039;iBatis&#039;&#039;&#039; (http://ibatis.apache.org/).&lt;br /&gt;
&lt;br /&gt;
* El &#039;&#039;&#039;Active Record&#039;&#039;&#039; &lt;br /&gt;
Idéntico al anterior, pero podemos añadir algunas funciones de negociado en la clase, siempre que estas funciones sean exclusivas de la tabla o la grabación.&lt;br /&gt;
&lt;br /&gt;
Ejemplo: Es el método utilizado por los desarrollos de Dolibarr y por otras muchas aplicaciones en PHP que disponen de su propio propio framework y prácticas de desarrollo.&lt;br /&gt;
&lt;br /&gt;
* El &#039;&#039;&#039;Data Mapper&#039;&#039;&#039;&lt;br /&gt;
Las clases representan las entidades del problema y no los datos. Por lo tanto hay que doblar, triplicar... estas clases con clases de mapeo para acceder a los datos.&lt;br /&gt;
Más &amp;quot;purista&amp;quot; en el papel ya que el negociado está más cercano, este método también tiene la desventaja de ser más complejo en la práctica.&lt;br /&gt;
&lt;br /&gt;
Ejemplo: Es el utilizadao si utilizamos el Framework de ORM &#039;&#039;&#039;Propel&#039;&#039;&#039; (http://propel.phpdb.org/trac/). Lo encontraremos pues en aplicacciones más pesadas basadas en este ORM.&lt;br /&gt;
&lt;br /&gt;
-&amp;gt; Para los desarrollos de Dolibarr, es recomendado utilizar el modo &#039;&#039;&#039;Active Record &#039;&#039;&#039; que ofrece las ventajas de un modelo cercano de negociado sin la complejidad y sin dificultar mucho la técnica. Es en este modo mediante el cual el desarrollo, la comprensión del código y el mantenimiento técnico y/o funcional parece ser la más productivo (Sin embargo, se trata de un eterno debate entre los puristas y los pragmáticos, el debate en el que nadie puede realmente estar en lo cierto, porque todo depende de los objetivos a atender).&lt;/div&gt;</summary>
		<author><name>Nnicolashr</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=FAQ_Mejorar_el_rendimiento&amp;diff=36286</id>
		<title>FAQ Mejorar el rendimiento</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=FAQ_Mejorar_el_rendimiento&amp;diff=36286"/>
		<updated>2016-10-15T02:18:22Z</updated>

		<summary type="html">&lt;p&gt;Nnicolashr: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:FAQ ES]]&lt;br /&gt;
{{TemplateDocDesarrollo}}&lt;br /&gt;
{{TemplateDocUsuario}}&lt;br /&gt;
Dolibarr es una aplicación web diseñada para tener un tiempo de respuesta lo más optimizado posible. Utiliza muchas tecnologías, pero algunas de ellas no están habilitadas por defecto, ya que necesitan algunas configuraciones específicas para su uso. Esta es una lista de todo lo que puede hacer para aumentar la velocidad Dolibarr.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Soluciones recomendadas =&lt;br /&gt;
== Desactivación de xdebug ==&lt;br /&gt;
Eficacia: *****&lt;br /&gt;
&lt;br /&gt;
Principio: Si el módulo php xdebug está activado, habrá que desactivarlo. Este módulo es una funcionalidad de PHP que le sirve a los desarrolladores, pero que ralentiza el funcionamiento de toda aplicación PHP.&lt;br /&gt;
Para averiguar si el módulo está activado, vaya a la página &#039;&#039;&#039;Inicio-Configuración-Info del Sistema-PHP&#039;&#039;&#039; y realice una búsqueda de &#039;&#039;&#039;xdebug&#039;&#039;&#039;. Si no encuentra nada, el módulo no está atcivado. Si encuentra una ocurrencia, está activado y puede desactivarse.&lt;br /&gt;
Su activación/desactivación depende de su sistema PHP y SO, lo más corriente suele ser desactivarlo comentando una línea en el archivo php.ini&lt;br /&gt;
== Aplicación Cache vía MemCached ==&lt;br /&gt;
Eficacia: *****&lt;br /&gt;
&lt;br /&gt;
Principio: Instalar un servidor de caché Memcached y el [[Módulo MemCached]].&lt;br /&gt;
&lt;br /&gt;
== Caché PHP OPCODE ==&lt;br /&gt;
Eficacia: ****&lt;br /&gt;
&lt;br /&gt;
Principio: Instalar un módulo apache/php que mete en caché la compilación de sus páginas PHP. En cada acceso, una página que ya haya sido accedida cargará más rápidamente.&lt;br /&gt;
Para ello puede instalar cualquier [http://en.wikipedia.org/wiki/List_of_PHP_accelerators acelerador]. xcache parte como solución recomendada.&lt;br /&gt;
Este cache trabaja a un nivel diferente que el [[Módulo MemCached]], ¡las mejoras son acumulativas!&lt;br /&gt;
&lt;br /&gt;
== Cache HTTP de las páginas de estadísticas ==&lt;br /&gt;
Eficacia: ***&lt;br /&gt;
&lt;br /&gt;
Principio: Puede configurar apache para activar la caché explicita de recursos estadísticos añadiendo las directivas:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
# Cache for static resources (Enable expiration and set it to A2592000 = 1 month)&lt;br /&gt;
ExpiresActive On&lt;br /&gt;
ExpiresByType image/x-icon A2592000&lt;br /&gt;
ExpiresByType image/gif A2592000&lt;br /&gt;
ExpiresByType image/png A2592000&lt;br /&gt;
ExpiresByType image/jpeg A2592000&lt;br /&gt;
ExpiresByType text/css A2592000&lt;br /&gt;
ExpiresByType text/javascript A2592000&lt;br /&gt;
ExpiresByType application/x-javascript A2592000&lt;br /&gt;
ExpiresByType application/javascript A2592000&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Las mejoras se acumulan a los cachés anteriores.&lt;br /&gt;
&lt;br /&gt;
== Compresión de los recursos por  Apache ==&lt;br /&gt;
Eficacia: ***&lt;br /&gt;
 		&lt;br /&gt;
Principio: Puede configurar Apache para activar la compresión de los recursos reenviados por el servidor gracias a las siguientes directivas:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
# Compress returned resources of type php pages, text file export, css and javascript&lt;br /&gt;
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript application/x-javascript&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Uso del driver mysqli en lugar de mysql ==&lt;br /&gt;
Eficacia: ***&lt;br /&gt;
&lt;br /&gt;
Principio: Si usa una base de datos Mysql, comprueba en su archivo de configuración de Dolibarr htdocs/conf/conf.php que tiene bien la línea&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$dolibarr_main_db_type=&#039;mysqli&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Si el valor tiene &#039;&#039;&#039;mysql&#039;&#039;&#039;, cambie lo por &#039;&#039;&#039;mysqli&#039;&#039;&#039; que da mejor rendimiento (gana 30ms en cada página).&lt;br /&gt;
&lt;br /&gt;
== Búsqueda al inicio del campo ==&lt;br /&gt;
Eficacia: ***&lt;br /&gt;
&lt;br /&gt;
Principio: Si tiene activado en el módulo Productos la búsqueda &amp;quot;autocompletar&amp;quot; y la lista tarda un tiempo en aparecer en cada tecleo de carácter, es por que tiene un número importante de productos. La búsqueda se realiza en cualquier lugar del texto, el índice de la base de datos no puede usarse. Añadiendo la constante PRODUCT_DONOTSEARCH_ANYWHERE con valor 1 en &#039;&#039;&#039;Inicio-Configuración-Varios&#039;&#039;&#039;, limitará la búsqueda al inicio de la cadena, permitiendo el uso del índice y obteniendo una respuesta inmediata.&lt;br /&gt;
	&lt;br /&gt;
== Uso de un navegador reciente ==	&lt;br /&gt;
Eficacia: ***&lt;br /&gt;
	&lt;br /&gt;
Principio: Muchas funcionalidades se basan en las tecnologías Ajax o JavaScript para proporcionar una ergonomía moderna. Estas tecnologías tienen un papel importante en el tiempo de visualización de las páginas y son mucho mejor aprovechadas con un navegador web reciente. Las diferencias de rendimiento de una versión a otra son a veces muy importantes, también hay que considerar el uso de un navegador web optimizado y con la última versión disponible (Firefox, Chrome, Safari u Opera). Evite el IE u otros navegadores exóticos.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Actualizar las estadísticas de la base de datos ==&lt;br /&gt;
Eficacia: **&lt;br /&gt;
&lt;br /&gt;
Principio: Si su base de datos es voluminosa (más de 100 000 registros), compruebe que las estadísticas de sus datos están actualizadas. Requiere de acceso como administrador a la base de datos y de conocimientos de administración. Consulte el manual de la base de datos acerca de como  &amp;quot;actualizar las estadísticas&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Otras soluciones =&lt;br /&gt;
Todas las soluciones que aquí se clasifican por separado en este capítulo &amp;quot;Otras soluciones&amp;quot;, ya que no son recomendables. Pueden requerir conocimientos técnicos avanzados, pueden ser inestables, no soportadas o pueden impedir el funcionamiento de ciertas características... pero existen, así que ¡Uselas solamente si sabe lo que hace!&lt;br /&gt;
&lt;br /&gt;
== Aplicación Cache vía Shared memory ==&lt;br /&gt;
Eficacia: ****&lt;br /&gt;
&lt;br /&gt;
Prerrequisito: Uso del servidor web Apache&lt;br /&gt;
&lt;br /&gt;
Principio: Añadir en &#039;&#039;&#039;Inicio-Configuración-Varios&#039;&#039;&#039; la constante MAIN_OPTIMIZE_SPEED. Si el valor de la constante tiene el bit 1 definido (Ejemplo: MAIN_OPTIMIZE_SPEED=2), la memoria compartida de su SO se utilizará para guardar en caché los archivos lang, aunque también implica que todo el interfaz solamente será visible en un único idioma, el del primero que se conecte al arrancar el servidor web (quien cargue los archivos de idioma en caché). Usar en lugar del [[Módulo MemCached]] para una optimización mediante una aplicación de caché que no tenga ninguna de estas limitaciones y sea de mayor rendimiento.&lt;br /&gt;
&lt;br /&gt;
== Desactivar la generación de PDF &amp;quot;al vuelo&amp;quot; ==&lt;br /&gt;
Eficacia: **&lt;br /&gt;
&lt;br /&gt;
Principio: Añadir en &#039;&#039;&#039;Inicio-Configuración-Varios&#039;&#039;&#039; la constante MAIN_DISABLE_PDF_AUTOUPDATE con valor 1. Esto desactivará la generación de un PDF cada vez que modifique un elemento (factura, pedido, etc.). La generación del PDF solo se realizará mediante el clic al botón &amp;quot;Generar&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Compresión para Dolibarr ==&lt;br /&gt;
Eficacia: **&lt;br /&gt;
&lt;br /&gt;
Principio:  Añadir en &#039;&#039;&#039;Inicio-Configuración-Varios&#039;&#039;&#039; la constante MAIN_OPTIMIZE_SPEED. Si el valor de esta constante tiene el bit 2 definido (Ejemplo: MAIN_OPTIMIZE_SPEED=4), Dolibarr devolverá las páginas comprimidas en GZ (y si el navegador lo soporta). Consume más CPU en el servidor pero reduce el tiempo de transferencia.&lt;br /&gt;
&lt;br /&gt;
== Desactivar la función Canvas ==&lt;br /&gt;
Eficacia: *&lt;br /&gt;
&lt;br /&gt;
Principio: Añadir en &#039;&#039;&#039;Inicio-Configuración-Varios&#039;&#039;&#039; la constante MAIN_DISABLE_CANVAS con valor 1. Esto desactivará las funciones de gestión de canvas, que puede usarse por ciertos módulos externos y que ahorrará una consulta a base de datos cada vez que acceda a la ficha de un objeto.&lt;br /&gt;
Si un módulo externo usa esta función de canvas, esto dejará al módulo defectuoso. Si no tiene instalado ningún módulo complementario externo, no hay ningún riesgo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nota: Para obtener la totalidad de las optimizaciones usando MAIN_OPTIMIZE_SPEED, hay que activar todos los bits (Ejemplo: MAIN_OPTIMIZE_SPEED=7 entonces 1+2+4 contiene el bit 0, 1 y 2).&lt;/div&gt;</summary>
		<author><name>Nnicolashr</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Crear_un_modelo_de_documento_PDF&amp;diff=36285</id>
		<title>Crear un modelo de documento PDF</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Crear_un_modelo_de_documento_PDF&amp;diff=36285"/>
		<updated>2016-10-15T01:22:06Z</updated>

		<summary type="html">&lt;p&gt;Nnicolashr: /* Crear el nuevo modelo */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TemplateDocDesarrollo}}&lt;br /&gt;
&lt;br /&gt;
Este documento describe como crear su propio modelo de generación de documentos PDF para así personalizar sus documentos (presupuestos, facturas, etc.)&lt;br /&gt;
Tomaremos como ejemplo los presupuestos, pero todo ello se aplica a cualquier tipo de documento.&lt;br /&gt;
&lt;br /&gt;
Para documentos ODT, ver [[Crear un modelo de documento ODT]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Encontrar el modelo existente más cercano =&lt;br /&gt;
En Dolibarr probar los modelos existentes activando todos los modelos existentes en la configuración del módulo y, a continuación, generar y visualizar un documento borrador para cada uno de ellos.&lt;br /&gt;
&lt;br /&gt;
Entre los disponibles, elegir el modelo que mejor se adapte a sus necesidades. En este ejemplo, el modelo azur (correspondente al fichero pdf_propale_azur.modules.php).&lt;br /&gt;
&lt;br /&gt;
Para su información, todos los modelos se encuentran en &#039;&#039;&#039;htdocs\core\modules&#039;&#039;&#039; si trabaja bajo Windows y &#039;&#039;&#039;htdocs/core/modules&#039;&#039;&#039; si trabaja bajo Unix.&lt;br /&gt;
&lt;br /&gt;
= Crear el nuevo modelo =&lt;br /&gt;
Por seguridad, hay que conservar los modelos de origen. Para el ejemplo, comenzaremos creando un nuevo modelo de presupuesto al que llamaremos &#039;masocietebleu&#039; y que se inspira en el modelo &#039;azur&#039;:&lt;br /&gt;
* Copiar-pegar pdf_propale_azur.modules.php&lt;br /&gt;
* Renombrar la copia como pdf_propale_masocietebleu.modules.php&lt;br /&gt;
* Editarla realizando las siguientes modificaciones en el código:&lt;br /&gt;
# Renombrar &#039;Class pdf_propale_azur{ &#039;    como &#039;Class pdf_propale_masocietebleu { &#039;&lt;br /&gt;
# Renombrar &#039;Function pdf_propale_azur($db=0)&#039; como &#039;Function pdf_propale_masocietebleu($db=0)&#039;&lt;br /&gt;
# Cambiar nombre del modelo en línea: Original --&amp;gt; &amp;quot;$this-&amp;gt;name = &amp;quot;azur&amp;quot;;&amp;quot;, Nueva --&amp;gt; $this-&amp;gt;name = &amp;quot;masocietebleu&amp;quot;;&lt;br /&gt;
# Guardar : el modelo &#039;masocietebleu&#039; se encuentra disponible en la lista de modelos de presupuestos de Dolibarr&lt;br /&gt;
* Probar este modelo, antes de continuar, para ello seguir los siguientes pasos:&lt;br /&gt;
# En directorio /htdocs/core/modules/propale/doc poner la copia de la nueva plantilla (Dolibarr versión 3.9.2)&lt;br /&gt;
# Ir al sistema Dolibarr--&amp;gt;Inicio--&amp;gt;Configuración--&amp;gt;Módulos--&amp;gt;Presupuestos--&amp;gt;Configuración del módulo Presupuestos&lt;br /&gt;
# Activar nueva plantilla en sección: Modelos de documentos de presupuestos&lt;br /&gt;
# Ir al sistema Dolibarr--&amp;gt;Comercial--&amp;gt;Listado de Presupuestos--&amp;gt;Seleccionar un presupuesto&lt;br /&gt;
# En sección Documentos, seleccionar nueva plantilla&lt;br /&gt;
# Presionar botón: Generar&lt;br /&gt;
# Verificar que se genera archivo PDF y abrirlo, se espera que se abra con éxito sin errores&lt;br /&gt;
* Borrar indicios de prueba de plantilla después de desactivar&lt;br /&gt;
# Desactivar en sistema Dolibarr--&amp;gt;Inicio--&amp;gt;Configuración--&amp;gt;Módulos--&amp;gt;Presupuestos--&amp;gt;Configuración del módulo Presupuestos&lt;br /&gt;
# Mover archivo de plantilla desde directorio /htdocs/core/modules/propale/doc&lt;br /&gt;
# Eliminar registro creado en tabla llx_document_model (verificar)&lt;br /&gt;
&lt;br /&gt;
= Personalizar =&lt;br /&gt;
Personalizar el modelo creado.&lt;br /&gt;
Siempre en pdf_propale_masocietebleu.modules.php, buscar la función &#039;Function _pagehead(&amp;amp;$pdf, $fac)&#039;. Ella gestiona la visualización de la cabecera.&lt;br /&gt;
&lt;br /&gt;
== Librería de creación PDF ==&lt;br /&gt;
La librería utilizada para la creación de documentos PDF se llama FPDF y se puede encontrar en htdocs/includes/tcpdf/tcpdf.class.php. En esta clase también encontraremos muchos métodos utilizados para generar los diferentes elementos de los documentos.&lt;br /&gt;
&lt;br /&gt;
Los modelos instancian ellos mismos la clase FPDF y utilizan sus métodos, combinados con los datos de una factura, pedido u otro tipo de datos.&lt;br /&gt;
&lt;br /&gt;
Normalmente encontraremos las siguientes llamadas en los scripts de creación de documentos:&lt;br /&gt;
* $pdf-&amp;gt;SetFont() - &#039;&#039;Designa la fuente utilizada para el texto que continua&#039;&#039;&lt;br /&gt;
* $pdf-&amp;gt;SetXY() - &#039;&#039;Designa el punto de partida para señalar el siguiente texto en coordenadas X,Y que se expresan en milímetros de la página&#039;&#039;&lt;br /&gt;
* $pdf-&amp;gt;MultiCell() - &#039;&#039;Dibuja una caja que puede contener texto, y que primero debe dar el ancho y altura - muy utilizado&#039;&#039;&lt;br /&gt;
* $pdf-&amp;gt;GetY() - &#039;&#039;Devuelve la posición actual en Y&#039;&#039;&lt;br /&gt;
* $pdf-&amp;gt;SetDrawColor() - &#039;&#039;Designa el color a utilizar para el siguiente texto a ser escrito - generalmente negro (0,0,0) o blanco (255,255,255)&#039;&#039;&lt;br /&gt;
* $pdf-&amp;gt;Rect() - &#039;&#039;Dibuja un rectángulo cuya esquina superior izquierda se encuentra en el punto indicado por los dos primeros parámetros y la esquina inferior derecha por los dos últimos parámetros en modo relativo a los dos primeros&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Estructura de los scripts ==&lt;br /&gt;
Los scripts de generación de documentos PDF, durante el desarrollo de la versión 2.2, disponen de los siguientes métodos (tomando como ejemplo el modelo &amp;quot;crabe&amp;quot;) en el seno de la clase del nombre del modelo:&lt;br /&gt;
* pdf_crabe() - &#039;&#039;Constructor del objeto pdf&#039;&#039;&lt;br /&gt;
* write_pdf_file() - &#039;&#039;	Método general para la generación del archivo. Este método llama a todos los siguientes después de inicializar algunas variables&#039;&#039;&lt;br /&gt;
* _pagehead() - &#039;&#039;Método de dibujo de la cabecera del documento, incluyendo generalmente el logotipo, el título del documento (y la fecha) así como los marcos de datos del emisor y el destinatario del documento&#039;&#039;&lt;br /&gt;
* _tableau() - &#039;&#039;Método de dibujo de la tabla de datos (productos, servicios, etc)&#039;&#039;&lt;br /&gt;
* _tableau_info() - &#039;&#039;Método de dibujo de la tabla con una lista de informaciones de la factura&#039;&#039;&lt;br /&gt;
* _tableau_tot() - &#039;&#039;Método de dibujo de la tabla de los totales&#039;&#039;&lt;br /&gt;
* _tableau_versement() - &#039;&#039;Método de dibujo de la tabla de las forma de pago&#039;&#039;&lt;br /&gt;
* _pagefoot() - &#039;&#039;Método de dibujo del pié de página&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Ejemplo ==&lt;br /&gt;
=== Inserción de un logo ===&lt;br /&gt;
* Añadir la instrucción:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$pdf-&amp;gt;Image(&#039;\www\htdocs\dolibarr\document\societe\logo.jpg&#039;, 10, 5,60.00);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Inserción de una firma u otros en pié de página de la factura ===&lt;br /&gt;
* abrir el modelo a modificar crabe u oursin (en htdocs/core/modules/facture/)&lt;br /&gt;
* insertar (por mi parte, justo antes de la línea 618 // Show payment mode CHQ)&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$pdf-&amp;gt;Image(&#039;http://localhost/dolibarr/doc/images/signature.jpg&#039;,120,250,74);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
la imagen (largo 74mm) aparece en la columna de la derecha justo antes del pie de página.&lt;br /&gt;
* copiar la imagen en el directorio. Parece ser que una imagen png con transparencias trae problemas.&lt;br /&gt;
* generar el pdf, la firma aparece.&lt;br /&gt;
&lt;br /&gt;
=== Inserción de textos ===&lt;br /&gt;
Principales funciones utilizadas&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$pdf-&amp;gt;setX(float a); // establece la posición actual x&lt;br /&gt;
$pdf-&amp;gt;setY(float b); // establece la posición actual y&lt;br /&gt;
$pdf-&amp;gt;setXY(float a,float b); // establece las posición actual x e y&lt;br /&gt;
$pdf-&amp;gt;SetTextColor(0,0,200); // establece el color del texto&lt;br /&gt;
$pdf-&amp;gt;SetFont(&#039;Arial&#039;,&#039;B&#039;,14); // establece la fuente, le tipo ( &#039;B&#039; para negrita, &#039;I&#039; para itálica, &#039;&#039; para normal,...)&lt;br /&gt;
$pdf-&amp;gt;MultiCell(60, 8, &#039;My text&#039;, 0, &#039;L&#039;); // imprime &#039;My text&#039; con salto de línea&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Recuerde: el origen es la esquina superior izquierda&lt;br /&gt;
&lt;br /&gt;
== Para más información ==&lt;br /&gt;
http://www.fpdf.org/?lang=es&lt;br /&gt;
&lt;br /&gt;
= Elegir un modelo por defecto en Dolibarr =&lt;br /&gt;
En  Inicio =&amp;gt; Configuración =&amp;gt; Módulos =&amp;gt; :&lt;br /&gt;
* indicamos que modelos deben de estar activos,&lt;br /&gt;
* precisaremos el modelo propuesto por defecto.&lt;/div&gt;</summary>
		<author><name>Nnicolashr</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Crear_un_modelo_de_documento_PDF&amp;diff=36284</id>
		<title>Crear un modelo de documento PDF</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Crear_un_modelo_de_documento_PDF&amp;diff=36284"/>
		<updated>2016-10-15T01:11:08Z</updated>

		<summary type="html">&lt;p&gt;Nnicolashr: /* Crear el nuevo modelo */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TemplateDocDesarrollo}}&lt;br /&gt;
&lt;br /&gt;
Este documento describe como crear su propio modelo de generación de documentos PDF para así personalizar sus documentos (presupuestos, facturas, etc.)&lt;br /&gt;
Tomaremos como ejemplo los presupuestos, pero todo ello se aplica a cualquier tipo de documento.&lt;br /&gt;
&lt;br /&gt;
Para documentos ODT, ver [[Crear un modelo de documento ODT]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Encontrar el modelo existente más cercano =&lt;br /&gt;
En Dolibarr probar los modelos existentes activando todos los modelos existentes en la configuración del módulo y, a continuación, generar y visualizar un documento borrador para cada uno de ellos.&lt;br /&gt;
&lt;br /&gt;
Entre los disponibles, elegir el modelo que mejor se adapte a sus necesidades. En este ejemplo, el modelo azur (correspondente al fichero pdf_propale_azur.modules.php).&lt;br /&gt;
&lt;br /&gt;
Para su información, todos los modelos se encuentran en &#039;&#039;&#039;htdocs\core\modules&#039;&#039;&#039; si trabaja bajo Windows y &#039;&#039;&#039;htdocs/core/modules&#039;&#039;&#039; si trabaja bajo Unix.&lt;br /&gt;
&lt;br /&gt;
= Crear el nuevo modelo =&lt;br /&gt;
Por seguridad, hay que conservar los modelos de origen. Para el ejemplo, comenzaremos creando un nuevo modelo de presupuesto al que llamaremos &#039;masocietebleu&#039; y que se inspira en el modelo &#039;azur&#039;:&lt;br /&gt;
* Copiar-pegar pdf_propale_azur.modules.php&lt;br /&gt;
* Renombrar la copia como pdf_propale_masocietebleu.modules.php&lt;br /&gt;
* Editarla realizando las siguientes modificaciones en el código:&lt;br /&gt;
# Renombrar &#039;Class pdf_propale_azur{ &#039;    como &#039;Class pdf_propale_masocietebleu { &#039;&lt;br /&gt;
# Renombrar &#039;Function pdf_propale_azur($db=0)&#039; como &#039;Function pdf_propale_masocietebleu($db=0)&#039;&lt;br /&gt;
# Cambiar nombre del modelo en línea: Original --&amp;gt; &amp;quot;$this-&amp;gt;name = &amp;quot;contrato&amp;quot;;&amp;quot;, Nueva --&amp;gt; $this-&amp;gt;name = &amp;quot;masocietebleu&amp;quot;;&lt;br /&gt;
# Guardar : el modelo &#039;masocietebleu&#039; se encuentra disponible en la lista de modelos de presupuestos de Dolibarr&lt;br /&gt;
* Probar este modelo, antes de continuar, para ello seguir los siguientes pasos:&lt;br /&gt;
# En directorio /htdocs/core/modules/propale/doc poner la copia de la nueva plantilla (Dolibarr versión 3.9.2)&lt;br /&gt;
# Ir al sistema Dolibarr--&amp;gt;Inicio--&amp;gt;Configuración--&amp;gt;Módulos--&amp;gt;Presupuestos--&amp;gt;Configuración del módulo Presupuestos&lt;br /&gt;
# Activar nueva plantilla en sección: Modelos de documentos de presupuestos&lt;br /&gt;
# Ir al sistema Dolibarr--&amp;gt;Comercial--&amp;gt;Listado de Presupuestos--&amp;gt;Seleccionar un presupuesto&lt;br /&gt;
# En sección Documentos, seleccionar nueva plantilla&lt;br /&gt;
# Presionar botón: Generar&lt;br /&gt;
# Verificar que se genera archivo PDF y abrirlo, se espera que se abra con éxito sin errores&lt;br /&gt;
* Borrar indicios de prueba de plantilla después de desactivar&lt;br /&gt;
# Desactivar en sistema Dolibarr--&amp;gt;Inicio--&amp;gt;Configuración--&amp;gt;Módulos--&amp;gt;Presupuestos--&amp;gt;Configuración del módulo Presupuestos&lt;br /&gt;
# Mover archivo de plantilla desde directorio /htdocs/core/modules/propale/doc&lt;br /&gt;
# Eliminar registro creado en tabla llx_document_model (verificar)&lt;br /&gt;
&lt;br /&gt;
= Personalizar =&lt;br /&gt;
Personalizar el modelo creado.&lt;br /&gt;
Siempre en pdf_propale_masocietebleu.modules.php, buscar la función &#039;Function _pagehead(&amp;amp;$pdf, $fac)&#039;. Ella gestiona la visualización de la cabecera.&lt;br /&gt;
&lt;br /&gt;
== Librería de creación PDF ==&lt;br /&gt;
La librería utilizada para la creación de documentos PDF se llama FPDF y se puede encontrar en htdocs/includes/tcpdf/tcpdf.class.php. En esta clase también encontraremos muchos métodos utilizados para generar los diferentes elementos de los documentos.&lt;br /&gt;
&lt;br /&gt;
Los modelos instancian ellos mismos la clase FPDF y utilizan sus métodos, combinados con los datos de una factura, pedido u otro tipo de datos.&lt;br /&gt;
&lt;br /&gt;
Normalmente encontraremos las siguientes llamadas en los scripts de creación de documentos:&lt;br /&gt;
* $pdf-&amp;gt;SetFont() - &#039;&#039;Designa la fuente utilizada para el texto que continua&#039;&#039;&lt;br /&gt;
* $pdf-&amp;gt;SetXY() - &#039;&#039;Designa el punto de partida para señalar el siguiente texto en coordenadas X,Y que se expresan en milímetros de la página&#039;&#039;&lt;br /&gt;
* $pdf-&amp;gt;MultiCell() - &#039;&#039;Dibuja una caja que puede contener texto, y que primero debe dar el ancho y altura - muy utilizado&#039;&#039;&lt;br /&gt;
* $pdf-&amp;gt;GetY() - &#039;&#039;Devuelve la posición actual en Y&#039;&#039;&lt;br /&gt;
* $pdf-&amp;gt;SetDrawColor() - &#039;&#039;Designa el color a utilizar para el siguiente texto a ser escrito - generalmente negro (0,0,0) o blanco (255,255,255)&#039;&#039;&lt;br /&gt;
* $pdf-&amp;gt;Rect() - &#039;&#039;Dibuja un rectángulo cuya esquina superior izquierda se encuentra en el punto indicado por los dos primeros parámetros y la esquina inferior derecha por los dos últimos parámetros en modo relativo a los dos primeros&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Estructura de los scripts ==&lt;br /&gt;
Los scripts de generación de documentos PDF, durante el desarrollo de la versión 2.2, disponen de los siguientes métodos (tomando como ejemplo el modelo &amp;quot;crabe&amp;quot;) en el seno de la clase del nombre del modelo:&lt;br /&gt;
* pdf_crabe() - &#039;&#039;Constructor del objeto pdf&#039;&#039;&lt;br /&gt;
* write_pdf_file() - &#039;&#039;	Método general para la generación del archivo. Este método llama a todos los siguientes después de inicializar algunas variables&#039;&#039;&lt;br /&gt;
* _pagehead() - &#039;&#039;Método de dibujo de la cabecera del documento, incluyendo generalmente el logotipo, el título del documento (y la fecha) así como los marcos de datos del emisor y el destinatario del documento&#039;&#039;&lt;br /&gt;
* _tableau() - &#039;&#039;Método de dibujo de la tabla de datos (productos, servicios, etc)&#039;&#039;&lt;br /&gt;
* _tableau_info() - &#039;&#039;Método de dibujo de la tabla con una lista de informaciones de la factura&#039;&#039;&lt;br /&gt;
* _tableau_tot() - &#039;&#039;Método de dibujo de la tabla de los totales&#039;&#039;&lt;br /&gt;
* _tableau_versement() - &#039;&#039;Método de dibujo de la tabla de las forma de pago&#039;&#039;&lt;br /&gt;
* _pagefoot() - &#039;&#039;Método de dibujo del pié de página&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Ejemplo ==&lt;br /&gt;
=== Inserción de un logo ===&lt;br /&gt;
* Añadir la instrucción:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$pdf-&amp;gt;Image(&#039;\www\htdocs\dolibarr\document\societe\logo.jpg&#039;, 10, 5,60.00);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Inserción de una firma u otros en pié de página de la factura ===&lt;br /&gt;
* abrir el modelo a modificar crabe u oursin (en htdocs/core/modules/facture/)&lt;br /&gt;
* insertar (por mi parte, justo antes de la línea 618 // Show payment mode CHQ)&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$pdf-&amp;gt;Image(&#039;http://localhost/dolibarr/doc/images/signature.jpg&#039;,120,250,74);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
la imagen (largo 74mm) aparece en la columna de la derecha justo antes del pie de página.&lt;br /&gt;
* copiar la imagen en el directorio. Parece ser que una imagen png con transparencias trae problemas.&lt;br /&gt;
* generar el pdf, la firma aparece.&lt;br /&gt;
&lt;br /&gt;
=== Inserción de textos ===&lt;br /&gt;
Principales funciones utilizadas&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$pdf-&amp;gt;setX(float a); // establece la posición actual x&lt;br /&gt;
$pdf-&amp;gt;setY(float b); // establece la posición actual y&lt;br /&gt;
$pdf-&amp;gt;setXY(float a,float b); // establece las posición actual x e y&lt;br /&gt;
$pdf-&amp;gt;SetTextColor(0,0,200); // establece el color del texto&lt;br /&gt;
$pdf-&amp;gt;SetFont(&#039;Arial&#039;,&#039;B&#039;,14); // establece la fuente, le tipo ( &#039;B&#039; para negrita, &#039;I&#039; para itálica, &#039;&#039; para normal,...)&lt;br /&gt;
$pdf-&amp;gt;MultiCell(60, 8, &#039;My text&#039;, 0, &#039;L&#039;); // imprime &#039;My text&#039; con salto de línea&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Recuerde: el origen es la esquina superior izquierda&lt;br /&gt;
&lt;br /&gt;
== Para más información ==&lt;br /&gt;
http://www.fpdf.org/?lang=es&lt;br /&gt;
&lt;br /&gt;
= Elegir un modelo por defecto en Dolibarr =&lt;br /&gt;
En  Inicio =&amp;gt; Configuración =&amp;gt; Módulos =&amp;gt; :&lt;br /&gt;
* indicamos que modelos deben de estar activos,&lt;br /&gt;
* precisaremos el modelo propuesto por defecto.&lt;/div&gt;</summary>
		<author><name>Nnicolashr</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Crear_un_modelo_de_documento_PDF&amp;diff=36283</id>
		<title>Crear un modelo de documento PDF</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Crear_un_modelo_de_documento_PDF&amp;diff=36283"/>
		<updated>2016-10-15T01:03:39Z</updated>

		<summary type="html">&lt;p&gt;Nnicolashr: /* Crear el nuevo modelo */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TemplateDocDesarrollo}}&lt;br /&gt;
&lt;br /&gt;
Este documento describe como crear su propio modelo de generación de documentos PDF para así personalizar sus documentos (presupuestos, facturas, etc.)&lt;br /&gt;
Tomaremos como ejemplo los presupuestos, pero todo ello se aplica a cualquier tipo de documento.&lt;br /&gt;
&lt;br /&gt;
Para documentos ODT, ver [[Crear un modelo de documento ODT]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Encontrar el modelo existente más cercano =&lt;br /&gt;
En Dolibarr probar los modelos existentes activando todos los modelos existentes en la configuración del módulo y, a continuación, generar y visualizar un documento borrador para cada uno de ellos.&lt;br /&gt;
&lt;br /&gt;
Entre los disponibles, elegir el modelo que mejor se adapte a sus necesidades. En este ejemplo, el modelo azur (correspondente al fichero pdf_propale_azur.modules.php).&lt;br /&gt;
&lt;br /&gt;
Para su información, todos los modelos se encuentran en &#039;&#039;&#039;htdocs\core\modules&#039;&#039;&#039; si trabaja bajo Windows y &#039;&#039;&#039;htdocs/core/modules&#039;&#039;&#039; si trabaja bajo Unix.&lt;br /&gt;
&lt;br /&gt;
= Crear el nuevo modelo =&lt;br /&gt;
Por seguridad, hay que conservar los modelos de origen. Para el ejemplo, comenzaremos creando un nuevo modelo de presupuesto al que llamaremos &#039;masocietebleu&#039; y que se inspira en el modelo &#039;azur&#039;:&lt;br /&gt;
* Copiar-pegar pdf_propale_azur.modules.php&lt;br /&gt;
* Renombrar la copia como pdf_propale_masocietebleu.modules.php&lt;br /&gt;
* Editarla realizando las siguientes modificaciones en el código:&lt;br /&gt;
# Renombrar &#039;Class pdf_propale_azur{ &#039;    como &#039;Class pdf_propale_masocietebleu { &#039;&lt;br /&gt;
# Renombrar &#039;Function pdf_propale_azur($db=0)&#039; como &#039;Function pdf_propale_masocietebleu($db=0)&#039;&lt;br /&gt;
# Cambiar nombre del modelo en línea: Original --&amp;gt; &amp;quot;$this-&amp;gt;name = &amp;quot;contrato&amp;quot;;&amp;quot;, Nueva --&amp;gt; $this-&amp;gt;name = &amp;quot;masocietebleu&amp;quot;;&lt;br /&gt;
# Guardar : el modelo &#039;masocietebleu&#039; se encuentra disponible en la lista de modelos de presupuestos de Dolibarr&lt;br /&gt;
* Probar este modelo, antes de continuar, para ello seguir los siguientes pasos:&lt;br /&gt;
#En directorio /htdocs/core/modules/propale/doc poner la copia de la nueva plantilla (Dolibarr versión 3.9.2)&lt;br /&gt;
#Ir al sistema Dolibarr--&amp;gt;Inicio--&amp;gt;Configuración--&amp;gt;Módulos--&amp;gt;Presupuestos--&amp;gt;Configuración del módulo Presupuestos&lt;br /&gt;
#Activar nueva plantilla en sección: Modelos de documentos de presupuestos&lt;br /&gt;
#Ir al sistema Dolibarr--&amp;gt;Comercial--&amp;gt;Listado de Presupuestos--&amp;gt;Seleccionar un presupuesto&lt;br /&gt;
#En sección Documentos, seleccionar nueva plantilla&lt;br /&gt;
#Presionar botón: Generar&lt;br /&gt;
#Verificar que se genera archivo PDF y abrirlo, se espera que se abra con éxito sin errores&lt;br /&gt;
&lt;br /&gt;
= Personalizar =&lt;br /&gt;
Personalizar el modelo creado.&lt;br /&gt;
Siempre en pdf_propale_masocietebleu.modules.php, buscar la función &#039;Function _pagehead(&amp;amp;$pdf, $fac)&#039;. Ella gestiona la visualización de la cabecera.&lt;br /&gt;
&lt;br /&gt;
== Librería de creación PDF ==&lt;br /&gt;
La librería utilizada para la creación de documentos PDF se llama FPDF y se puede encontrar en htdocs/includes/tcpdf/tcpdf.class.php. En esta clase también encontraremos muchos métodos utilizados para generar los diferentes elementos de los documentos.&lt;br /&gt;
&lt;br /&gt;
Los modelos instancian ellos mismos la clase FPDF y utilizan sus métodos, combinados con los datos de una factura, pedido u otro tipo de datos.&lt;br /&gt;
&lt;br /&gt;
Normalmente encontraremos las siguientes llamadas en los scripts de creación de documentos:&lt;br /&gt;
* $pdf-&amp;gt;SetFont() - &#039;&#039;Designa la fuente utilizada para el texto que continua&#039;&#039;&lt;br /&gt;
* $pdf-&amp;gt;SetXY() - &#039;&#039;Designa el punto de partida para señalar el siguiente texto en coordenadas X,Y que se expresan en milímetros de la página&#039;&#039;&lt;br /&gt;
* $pdf-&amp;gt;MultiCell() - &#039;&#039;Dibuja una caja que puede contener texto, y que primero debe dar el ancho y altura - muy utilizado&#039;&#039;&lt;br /&gt;
* $pdf-&amp;gt;GetY() - &#039;&#039;Devuelve la posición actual en Y&#039;&#039;&lt;br /&gt;
* $pdf-&amp;gt;SetDrawColor() - &#039;&#039;Designa el color a utilizar para el siguiente texto a ser escrito - generalmente negro (0,0,0) o blanco (255,255,255)&#039;&#039;&lt;br /&gt;
* $pdf-&amp;gt;Rect() - &#039;&#039;Dibuja un rectángulo cuya esquina superior izquierda se encuentra en el punto indicado por los dos primeros parámetros y la esquina inferior derecha por los dos últimos parámetros en modo relativo a los dos primeros&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Estructura de los scripts ==&lt;br /&gt;
Los scripts de generación de documentos PDF, durante el desarrollo de la versión 2.2, disponen de los siguientes métodos (tomando como ejemplo el modelo &amp;quot;crabe&amp;quot;) en el seno de la clase del nombre del modelo:&lt;br /&gt;
* pdf_crabe() - &#039;&#039;Constructor del objeto pdf&#039;&#039;&lt;br /&gt;
* write_pdf_file() - &#039;&#039;	Método general para la generación del archivo. Este método llama a todos los siguientes después de inicializar algunas variables&#039;&#039;&lt;br /&gt;
* _pagehead() - &#039;&#039;Método de dibujo de la cabecera del documento, incluyendo generalmente el logotipo, el título del documento (y la fecha) así como los marcos de datos del emisor y el destinatario del documento&#039;&#039;&lt;br /&gt;
* _tableau() - &#039;&#039;Método de dibujo de la tabla de datos (productos, servicios, etc)&#039;&#039;&lt;br /&gt;
* _tableau_info() - &#039;&#039;Método de dibujo de la tabla con una lista de informaciones de la factura&#039;&#039;&lt;br /&gt;
* _tableau_tot() - &#039;&#039;Método de dibujo de la tabla de los totales&#039;&#039;&lt;br /&gt;
* _tableau_versement() - &#039;&#039;Método de dibujo de la tabla de las forma de pago&#039;&#039;&lt;br /&gt;
* _pagefoot() - &#039;&#039;Método de dibujo del pié de página&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Ejemplo ==&lt;br /&gt;
=== Inserción de un logo ===&lt;br /&gt;
* Añadir la instrucción:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$pdf-&amp;gt;Image(&#039;\www\htdocs\dolibarr\document\societe\logo.jpg&#039;, 10, 5,60.00);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Inserción de una firma u otros en pié de página de la factura ===&lt;br /&gt;
* abrir el modelo a modificar crabe u oursin (en htdocs/core/modules/facture/)&lt;br /&gt;
* insertar (por mi parte, justo antes de la línea 618 // Show payment mode CHQ)&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$pdf-&amp;gt;Image(&#039;http://localhost/dolibarr/doc/images/signature.jpg&#039;,120,250,74);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
la imagen (largo 74mm) aparece en la columna de la derecha justo antes del pie de página.&lt;br /&gt;
* copiar la imagen en el directorio. Parece ser que una imagen png con transparencias trae problemas.&lt;br /&gt;
* generar el pdf, la firma aparece.&lt;br /&gt;
&lt;br /&gt;
=== Inserción de textos ===&lt;br /&gt;
Principales funciones utilizadas&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$pdf-&amp;gt;setX(float a); // establece la posición actual x&lt;br /&gt;
$pdf-&amp;gt;setY(float b); // establece la posición actual y&lt;br /&gt;
$pdf-&amp;gt;setXY(float a,float b); // establece las posición actual x e y&lt;br /&gt;
$pdf-&amp;gt;SetTextColor(0,0,200); // establece el color del texto&lt;br /&gt;
$pdf-&amp;gt;SetFont(&#039;Arial&#039;,&#039;B&#039;,14); // establece la fuente, le tipo ( &#039;B&#039; para negrita, &#039;I&#039; para itálica, &#039;&#039; para normal,...)&lt;br /&gt;
$pdf-&amp;gt;MultiCell(60, 8, &#039;My text&#039;, 0, &#039;L&#039;); // imprime &#039;My text&#039; con salto de línea&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Recuerde: el origen es la esquina superior izquierda&lt;br /&gt;
&lt;br /&gt;
== Para más información ==&lt;br /&gt;
http://www.fpdf.org/?lang=es&lt;br /&gt;
&lt;br /&gt;
= Elegir un modelo por defecto en Dolibarr =&lt;br /&gt;
En  Inicio =&amp;gt; Configuración =&amp;gt; Módulos =&amp;gt; :&lt;br /&gt;
* indicamos que modelos deben de estar activos,&lt;br /&gt;
* precisaremos el modelo propuesto por defecto.&lt;/div&gt;</summary>
		<author><name>Nnicolashr</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Crear_un_modelo_de_documento_PDF&amp;diff=36282</id>
		<title>Crear un modelo de documento PDF</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Crear_un_modelo_de_documento_PDF&amp;diff=36282"/>
		<updated>2016-10-15T00:54:41Z</updated>

		<summary type="html">&lt;p&gt;Nnicolashr: /* Crear el nuevo modelo */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TemplateDocDesarrollo}}&lt;br /&gt;
&lt;br /&gt;
Este documento describe como crear su propio modelo de generación de documentos PDF para así personalizar sus documentos (presupuestos, facturas, etc.)&lt;br /&gt;
Tomaremos como ejemplo los presupuestos, pero todo ello se aplica a cualquier tipo de documento.&lt;br /&gt;
&lt;br /&gt;
Para documentos ODT, ver [[Crear un modelo de documento ODT]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Encontrar el modelo existente más cercano =&lt;br /&gt;
En Dolibarr probar los modelos existentes activando todos los modelos existentes en la configuración del módulo y, a continuación, generar y visualizar un documento borrador para cada uno de ellos.&lt;br /&gt;
&lt;br /&gt;
Entre los disponibles, elegir el modelo que mejor se adapte a sus necesidades. En este ejemplo, el modelo azur (correspondente al fichero pdf_propale_azur.modules.php).&lt;br /&gt;
&lt;br /&gt;
Para su información, todos los modelos se encuentran en &#039;&#039;&#039;htdocs\core\modules&#039;&#039;&#039; si trabaja bajo Windows y &#039;&#039;&#039;htdocs/core/modules&#039;&#039;&#039; si trabaja bajo Unix.&lt;br /&gt;
&lt;br /&gt;
= Crear el nuevo modelo =&lt;br /&gt;
Por seguridad, hay que conservar los modelos de origen. Para el ejemplo, comenzaremos creando un nuevo modelo de presupuesto al que llamaremos &#039;masocietebleu&#039; y que se inspira en el modelo &#039;azur&#039;:&lt;br /&gt;
* Copiar-pegar pdf_propale_azur.modules.php&lt;br /&gt;
* Renombrar la copia como pdf_propale_masocietebleu.modules.php&lt;br /&gt;
* Editarla realizando las siguientes modificaciones en el código:&lt;br /&gt;
# Renombrar &#039;Class pdf_propale_azur{ &#039;    como &#039;Class pdf_propale_masocietebleu { &#039;&lt;br /&gt;
# Renombrar &#039;Function pdf_propale_azur($db=0)&#039; como &#039;Function pdf_propale_masocietebleu($db=0)&#039;&lt;br /&gt;
# Cambiar nombre del modelo en línea: Original --&amp;gt; &amp;quot;$this-&amp;gt;name = &amp;quot;contrato&amp;quot;;&amp;quot;, Nueva --&amp;gt; $this-&amp;gt;name = &amp;quot;masocietebleu&amp;quot;;&lt;br /&gt;
# Guardar : el modelo &#039;masocietebleu&#039; se encuentra disponible en la lista de modelos de presupuestos de Dolibarr&lt;br /&gt;
* Probar este modelo, antes de continuar, para ello seguir los siguientes pasos:&lt;br /&gt;
#a&lt;br /&gt;
#b&lt;br /&gt;
#c&lt;br /&gt;
&lt;br /&gt;
= Personalizar =&lt;br /&gt;
Personalizar el modelo creado.&lt;br /&gt;
Siempre en pdf_propale_masocietebleu.modules.php, buscar la función &#039;Function _pagehead(&amp;amp;$pdf, $fac)&#039;. Ella gestiona la visualización de la cabecera.&lt;br /&gt;
&lt;br /&gt;
== Librería de creación PDF ==&lt;br /&gt;
La librería utilizada para la creación de documentos PDF se llama FPDF y se puede encontrar en htdocs/includes/tcpdf/tcpdf.class.php. En esta clase también encontraremos muchos métodos utilizados para generar los diferentes elementos de los documentos.&lt;br /&gt;
&lt;br /&gt;
Los modelos instancian ellos mismos la clase FPDF y utilizan sus métodos, combinados con los datos de una factura, pedido u otro tipo de datos.&lt;br /&gt;
&lt;br /&gt;
Normalmente encontraremos las siguientes llamadas en los scripts de creación de documentos:&lt;br /&gt;
* $pdf-&amp;gt;SetFont() - &#039;&#039;Designa la fuente utilizada para el texto que continua&#039;&#039;&lt;br /&gt;
* $pdf-&amp;gt;SetXY() - &#039;&#039;Designa el punto de partida para señalar el siguiente texto en coordenadas X,Y que se expresan en milímetros de la página&#039;&#039;&lt;br /&gt;
* $pdf-&amp;gt;MultiCell() - &#039;&#039;Dibuja una caja que puede contener texto, y que primero debe dar el ancho y altura - muy utilizado&#039;&#039;&lt;br /&gt;
* $pdf-&amp;gt;GetY() - &#039;&#039;Devuelve la posición actual en Y&#039;&#039;&lt;br /&gt;
* $pdf-&amp;gt;SetDrawColor() - &#039;&#039;Designa el color a utilizar para el siguiente texto a ser escrito - generalmente negro (0,0,0) o blanco (255,255,255)&#039;&#039;&lt;br /&gt;
* $pdf-&amp;gt;Rect() - &#039;&#039;Dibuja un rectángulo cuya esquina superior izquierda se encuentra en el punto indicado por los dos primeros parámetros y la esquina inferior derecha por los dos últimos parámetros en modo relativo a los dos primeros&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Estructura de los scripts ==&lt;br /&gt;
Los scripts de generación de documentos PDF, durante el desarrollo de la versión 2.2, disponen de los siguientes métodos (tomando como ejemplo el modelo &amp;quot;crabe&amp;quot;) en el seno de la clase del nombre del modelo:&lt;br /&gt;
* pdf_crabe() - &#039;&#039;Constructor del objeto pdf&#039;&#039;&lt;br /&gt;
* write_pdf_file() - &#039;&#039;	Método general para la generación del archivo. Este método llama a todos los siguientes después de inicializar algunas variables&#039;&#039;&lt;br /&gt;
* _pagehead() - &#039;&#039;Método de dibujo de la cabecera del documento, incluyendo generalmente el logotipo, el título del documento (y la fecha) así como los marcos de datos del emisor y el destinatario del documento&#039;&#039;&lt;br /&gt;
* _tableau() - &#039;&#039;Método de dibujo de la tabla de datos (productos, servicios, etc)&#039;&#039;&lt;br /&gt;
* _tableau_info() - &#039;&#039;Método de dibujo de la tabla con una lista de informaciones de la factura&#039;&#039;&lt;br /&gt;
* _tableau_tot() - &#039;&#039;Método de dibujo de la tabla de los totales&#039;&#039;&lt;br /&gt;
* _tableau_versement() - &#039;&#039;Método de dibujo de la tabla de las forma de pago&#039;&#039;&lt;br /&gt;
* _pagefoot() - &#039;&#039;Método de dibujo del pié de página&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Ejemplo ==&lt;br /&gt;
=== Inserción de un logo ===&lt;br /&gt;
* Añadir la instrucción:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$pdf-&amp;gt;Image(&#039;\www\htdocs\dolibarr\document\societe\logo.jpg&#039;, 10, 5,60.00);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Inserción de una firma u otros en pié de página de la factura ===&lt;br /&gt;
* abrir el modelo a modificar crabe u oursin (en htdocs/core/modules/facture/)&lt;br /&gt;
* insertar (por mi parte, justo antes de la línea 618 // Show payment mode CHQ)&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$pdf-&amp;gt;Image(&#039;http://localhost/dolibarr/doc/images/signature.jpg&#039;,120,250,74);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
la imagen (largo 74mm) aparece en la columna de la derecha justo antes del pie de página.&lt;br /&gt;
* copiar la imagen en el directorio. Parece ser que una imagen png con transparencias trae problemas.&lt;br /&gt;
* generar el pdf, la firma aparece.&lt;br /&gt;
&lt;br /&gt;
=== Inserción de textos ===&lt;br /&gt;
Principales funciones utilizadas&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$pdf-&amp;gt;setX(float a); // establece la posición actual x&lt;br /&gt;
$pdf-&amp;gt;setY(float b); // establece la posición actual y&lt;br /&gt;
$pdf-&amp;gt;setXY(float a,float b); // establece las posición actual x e y&lt;br /&gt;
$pdf-&amp;gt;SetTextColor(0,0,200); // establece el color del texto&lt;br /&gt;
$pdf-&amp;gt;SetFont(&#039;Arial&#039;,&#039;B&#039;,14); // establece la fuente, le tipo ( &#039;B&#039; para negrita, &#039;I&#039; para itálica, &#039;&#039; para normal,...)&lt;br /&gt;
$pdf-&amp;gt;MultiCell(60, 8, &#039;My text&#039;, 0, &#039;L&#039;); // imprime &#039;My text&#039; con salto de línea&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Recuerde: el origen es la esquina superior izquierda&lt;br /&gt;
&lt;br /&gt;
== Para más información ==&lt;br /&gt;
http://www.fpdf.org/?lang=es&lt;br /&gt;
&lt;br /&gt;
= Elegir un modelo por defecto en Dolibarr =&lt;br /&gt;
En  Inicio =&amp;gt; Configuración =&amp;gt; Módulos =&amp;gt; :&lt;br /&gt;
* indicamos que modelos deben de estar activos,&lt;br /&gt;
* precisaremos el modelo propuesto por defecto.&lt;/div&gt;</summary>
		<author><name>Nnicolashr</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Crear_un_modelo_de_documento_PDF&amp;diff=36281</id>
		<title>Crear un modelo de documento PDF</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Crear_un_modelo_de_documento_PDF&amp;diff=36281"/>
		<updated>2016-10-15T00:23:53Z</updated>

		<summary type="html">&lt;p&gt;Nnicolashr: /* Crear el nuevo modelo */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TemplateDocDesarrollo}}&lt;br /&gt;
&lt;br /&gt;
Este documento describe como crear su propio modelo de generación de documentos PDF para así personalizar sus documentos (presupuestos, facturas, etc.)&lt;br /&gt;
Tomaremos como ejemplo los presupuestos, pero todo ello se aplica a cualquier tipo de documento.&lt;br /&gt;
&lt;br /&gt;
Para documentos ODT, ver [[Crear un modelo de documento ODT]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Encontrar el modelo existente más cercano =&lt;br /&gt;
En Dolibarr probar los modelos existentes activando todos los modelos existentes en la configuración del módulo y, a continuación, generar y visualizar un documento borrador para cada uno de ellos.&lt;br /&gt;
&lt;br /&gt;
Entre los disponibles, elegir el modelo que mejor se adapte a sus necesidades. En este ejemplo, el modelo azur (correspondente al fichero pdf_propale_azur.modules.php).&lt;br /&gt;
&lt;br /&gt;
Para su información, todos los modelos se encuentran en &#039;&#039;&#039;htdocs\core\modules&#039;&#039;&#039; si trabaja bajo Windows y &#039;&#039;&#039;htdocs/core/modules&#039;&#039;&#039; si trabaja bajo Unix.&lt;br /&gt;
&lt;br /&gt;
= Crear el nuevo modelo =&lt;br /&gt;
Por seguridad, hay que conservar los modelos de origen. Para el ejemplo, comenzaremos creando un nuevo modelo de presupuesto al que llamaremos &#039;masocietebleu&#039; y que se inspira en el modelo &#039;azur&#039;:&lt;br /&gt;
* Copiar-pegar pdf_propale_azur.modules.php&lt;br /&gt;
* Renombrar la copia como pdf_propale_masocietebleu.modules.php&lt;br /&gt;
* Editarla realizando las siguientes modificaciones en el código:&lt;br /&gt;
# Renombrar &#039;Class pdf_propale_azur{ &#039;    como &#039;Class pdf_propale_masocietebleu { &#039;&lt;br /&gt;
# Renombrar &#039;Function pdf_propale_azur($db=0)&#039; como &#039;Function pdf_propale_masocietebleu($db=0)&#039;&lt;br /&gt;
# Guardar : el modelo &#039;masocietebleu&#039; se encuentra disponible en la lista de modelos de presupuestos de Dolibarr&lt;br /&gt;
* Testear este modelo (ver A) antes de ir mas lejos...&lt;br /&gt;
&lt;br /&gt;
= Personalizar =&lt;br /&gt;
Personalizar el modelo creado.&lt;br /&gt;
Siempre en pdf_propale_masocietebleu.modules.php, buscar la función &#039;Function _pagehead(&amp;amp;$pdf, $fac)&#039;. Ella gestiona la visualización de la cabecera.&lt;br /&gt;
&lt;br /&gt;
== Librería de creación PDF ==&lt;br /&gt;
La librería utilizada para la creación de documentos PDF se llama FPDF y se puede encontrar en htdocs/includes/tcpdf/tcpdf.class.php. En esta clase también encontraremos muchos métodos utilizados para generar los diferentes elementos de los documentos.&lt;br /&gt;
&lt;br /&gt;
Los modelos instancian ellos mismos la clase FPDF y utilizan sus métodos, combinados con los datos de una factura, pedido u otro tipo de datos.&lt;br /&gt;
&lt;br /&gt;
Normalmente encontraremos las siguientes llamadas en los scripts de creación de documentos:&lt;br /&gt;
* $pdf-&amp;gt;SetFont() - &#039;&#039;Designa la fuente utilizada para el texto que continua&#039;&#039;&lt;br /&gt;
* $pdf-&amp;gt;SetXY() - &#039;&#039;Designa el punto de partida para señalar el siguiente texto en coordenadas X,Y que se expresan en milímetros de la página&#039;&#039;&lt;br /&gt;
* $pdf-&amp;gt;MultiCell() - &#039;&#039;Dibuja una caja que puede contener texto, y que primero debe dar el ancho y altura - muy utilizado&#039;&#039;&lt;br /&gt;
* $pdf-&amp;gt;GetY() - &#039;&#039;Devuelve la posición actual en Y&#039;&#039;&lt;br /&gt;
* $pdf-&amp;gt;SetDrawColor() - &#039;&#039;Designa el color a utilizar para el siguiente texto a ser escrito - generalmente negro (0,0,0) o blanco (255,255,255)&#039;&#039;&lt;br /&gt;
* $pdf-&amp;gt;Rect() - &#039;&#039;Dibuja un rectángulo cuya esquina superior izquierda se encuentra en el punto indicado por los dos primeros parámetros y la esquina inferior derecha por los dos últimos parámetros en modo relativo a los dos primeros&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Estructura de los scripts ==&lt;br /&gt;
Los scripts de generación de documentos PDF, durante el desarrollo de la versión 2.2, disponen de los siguientes métodos (tomando como ejemplo el modelo &amp;quot;crabe&amp;quot;) en el seno de la clase del nombre del modelo:&lt;br /&gt;
* pdf_crabe() - &#039;&#039;Constructor del objeto pdf&#039;&#039;&lt;br /&gt;
* write_pdf_file() - &#039;&#039;	Método general para la generación del archivo. Este método llama a todos los siguientes después de inicializar algunas variables&#039;&#039;&lt;br /&gt;
* _pagehead() - &#039;&#039;Método de dibujo de la cabecera del documento, incluyendo generalmente el logotipo, el título del documento (y la fecha) así como los marcos de datos del emisor y el destinatario del documento&#039;&#039;&lt;br /&gt;
* _tableau() - &#039;&#039;Método de dibujo de la tabla de datos (productos, servicios, etc)&#039;&#039;&lt;br /&gt;
* _tableau_info() - &#039;&#039;Método de dibujo de la tabla con una lista de informaciones de la factura&#039;&#039;&lt;br /&gt;
* _tableau_tot() - &#039;&#039;Método de dibujo de la tabla de los totales&#039;&#039;&lt;br /&gt;
* _tableau_versement() - &#039;&#039;Método de dibujo de la tabla de las forma de pago&#039;&#039;&lt;br /&gt;
* _pagefoot() - &#039;&#039;Método de dibujo del pié de página&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Ejemplo ==&lt;br /&gt;
=== Inserción de un logo ===&lt;br /&gt;
* Añadir la instrucción:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$pdf-&amp;gt;Image(&#039;\www\htdocs\dolibarr\document\societe\logo.jpg&#039;, 10, 5,60.00);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Inserción de una firma u otros en pié de página de la factura ===&lt;br /&gt;
* abrir el modelo a modificar crabe u oursin (en htdocs/core/modules/facture/)&lt;br /&gt;
* insertar (por mi parte, justo antes de la línea 618 // Show payment mode CHQ)&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$pdf-&amp;gt;Image(&#039;http://localhost/dolibarr/doc/images/signature.jpg&#039;,120,250,74);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
la imagen (largo 74mm) aparece en la columna de la derecha justo antes del pie de página.&lt;br /&gt;
* copiar la imagen en el directorio. Parece ser que una imagen png con transparencias trae problemas.&lt;br /&gt;
* generar el pdf, la firma aparece.&lt;br /&gt;
&lt;br /&gt;
=== Inserción de textos ===&lt;br /&gt;
Principales funciones utilizadas&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$pdf-&amp;gt;setX(float a); // establece la posición actual x&lt;br /&gt;
$pdf-&amp;gt;setY(float b); // establece la posición actual y&lt;br /&gt;
$pdf-&amp;gt;setXY(float a,float b); // establece las posición actual x e y&lt;br /&gt;
$pdf-&amp;gt;SetTextColor(0,0,200); // establece el color del texto&lt;br /&gt;
$pdf-&amp;gt;SetFont(&#039;Arial&#039;,&#039;B&#039;,14); // establece la fuente, le tipo ( &#039;B&#039; para negrita, &#039;I&#039; para itálica, &#039;&#039; para normal,...)&lt;br /&gt;
$pdf-&amp;gt;MultiCell(60, 8, &#039;My text&#039;, 0, &#039;L&#039;); // imprime &#039;My text&#039; con salto de línea&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Recuerde: el origen es la esquina superior izquierda&lt;br /&gt;
&lt;br /&gt;
== Para más información ==&lt;br /&gt;
http://www.fpdf.org/?lang=es&lt;br /&gt;
&lt;br /&gt;
= Elegir un modelo por defecto en Dolibarr =&lt;br /&gt;
En  Inicio =&amp;gt; Configuración =&amp;gt; Módulos =&amp;gt; :&lt;br /&gt;
* indicamos que modelos deben de estar activos,&lt;br /&gt;
* precisaremos el modelo propuesto por defecto.&lt;/div&gt;</summary>
		<author><name>Nnicolashr</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Crear_un_modelo_de_documento_PDF&amp;diff=36280</id>
		<title>Crear un modelo de documento PDF</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Crear_un_modelo_de_documento_PDF&amp;diff=36280"/>
		<updated>2016-10-15T00:03:41Z</updated>

		<summary type="html">&lt;p&gt;Nnicolashr: /* Crear el nuevo modelo */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TemplateDocDesarrollo}}&lt;br /&gt;
&lt;br /&gt;
Este documento describe como crear su propio modelo de generación de documentos PDF para así personalizar sus documentos (presupuestos, facturas, etc.)&lt;br /&gt;
Tomaremos como ejemplo los presupuestos, pero todo ello se aplica a cualquier tipo de documento.&lt;br /&gt;
&lt;br /&gt;
Para documentos ODT, ver [[Crear un modelo de documento ODT]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Encontrar el modelo existente más cercano =&lt;br /&gt;
En Dolibarr probar los modelos existentes activando todos los modelos existentes en la configuración del módulo y, a continuación, generar y visualizar un documento borrador para cada uno de ellos.&lt;br /&gt;
&lt;br /&gt;
Entre los disponibles, elegir el modelo que mejor se adapte a sus necesidades. En este ejemplo, el modelo azur (correspondente al fichero pdf_propale_azur.modules.php).&lt;br /&gt;
&lt;br /&gt;
Para su información, todos los modelos se encuentran en &#039;&#039;&#039;htdocs\core\modules&#039;&#039;&#039; si trabaja bajo Windows y &#039;&#039;&#039;htdocs/core/modules&#039;&#039;&#039; si trabaja bajo Unix.&lt;br /&gt;
&lt;br /&gt;
= Crear el nuevo modelo =&lt;br /&gt;
Por seguridad, hay que conservar los modelos de origen. Para el ejemplo, comenzaremos creando un nuevo modelo de presupuesto al que llamaremos &#039;masocietebleu&#039; y que se inspira en el modelo &#039;azur&#039;:&lt;br /&gt;
* Copiar-pegar pdf_propale_azur.modules.php&lt;br /&gt;
* Renombrar la copia como pdf_propale_masocietebleu.modules.php&lt;br /&gt;
* Editarla realizando las siguientes modificicaciones en el código:&lt;br /&gt;
# Renombrar &#039;Class pdf_propale_azur{ &#039;    como &#039;Class pdf_propale_masocietebleu { &#039;&lt;br /&gt;
# Renombrar &#039;Function pdf_propale_azur($db=0)&#039; como &#039;Function pdf_propale_masocietebleu($db=0)&#039;&lt;br /&gt;
# Guardar : el modelo &#039;masocietebleu&#039; se encuentra disponible en la lista de modelos de presupuestos de Dolibarr&lt;br /&gt;
* Testear este modelo (ver A) antes de ir mas lejos...&lt;br /&gt;
&lt;br /&gt;
= Personalizar =&lt;br /&gt;
Personalizar el modelo creado.&lt;br /&gt;
Siempre en pdf_propale_masocietebleu.modules.php, buscar la función &#039;Function _pagehead(&amp;amp;$pdf, $fac)&#039;. Ella gestiona la visualización de la cabecera.&lt;br /&gt;
&lt;br /&gt;
== Librería de creación PDF ==&lt;br /&gt;
La librería utilizada para la creación de documentos PDF se llama FPDF y se puede encontrar en htdocs/includes/tcpdf/tcpdf.class.php. En esta clase también encontraremos muchos métodos utilizados para generar los diferentes elementos de los documentos.&lt;br /&gt;
&lt;br /&gt;
Los modelos instancian ellos mismos la clase FPDF y utilizan sus métodos, combinados con los datos de una factura, pedido u otro tipo de datos.&lt;br /&gt;
&lt;br /&gt;
Normalmente encontraremos las siguientes llamadas en los scripts de creación de documentos:&lt;br /&gt;
* $pdf-&amp;gt;SetFont() - &#039;&#039;Designa la fuente utilizada para el texto que continua&#039;&#039;&lt;br /&gt;
* $pdf-&amp;gt;SetXY() - &#039;&#039;Designa el punto de partida para señalar el siguiente texto en coordenadas X,Y que se expresan en milímetros de la página&#039;&#039;&lt;br /&gt;
* $pdf-&amp;gt;MultiCell() - &#039;&#039;Dibuja una caja que puede contener texto, y que primero debe dar el ancho y altura - muy utilizado&#039;&#039;&lt;br /&gt;
* $pdf-&amp;gt;GetY() - &#039;&#039;Devuelve la posición actual en Y&#039;&#039;&lt;br /&gt;
* $pdf-&amp;gt;SetDrawColor() - &#039;&#039;Designa el color a utilizar para el siguiente texto a ser escrito - generalmente negro (0,0,0) o blanco (255,255,255)&#039;&#039;&lt;br /&gt;
* $pdf-&amp;gt;Rect() - &#039;&#039;Dibuja un rectángulo cuya esquina superior izquierda se encuentra en el punto indicado por los dos primeros parámetros y la esquina inferior derecha por los dos últimos parámetros en modo relativo a los dos primeros&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Estructura de los scripts ==&lt;br /&gt;
Los scripts de generación de documentos PDF, durante el desarrollo de la versión 2.2, disponen de los siguientes métodos (tomando como ejemplo el modelo &amp;quot;crabe&amp;quot;) en el seno de la clase del nombre del modelo:&lt;br /&gt;
* pdf_crabe() - &#039;&#039;Constructor del objeto pdf&#039;&#039;&lt;br /&gt;
* write_pdf_file() - &#039;&#039;	Método general para la generación del archivo. Este método llama a todos los siguientes después de inicializar algunas variables&#039;&#039;&lt;br /&gt;
* _pagehead() - &#039;&#039;Método de dibujo de la cabecera del documento, incluyendo generalmente el logotipo, el título del documento (y la fecha) así como los marcos de datos del emisor y el destinatario del documento&#039;&#039;&lt;br /&gt;
* _tableau() - &#039;&#039;Método de dibujo de la tabla de datos (productos, servicios, etc)&#039;&#039;&lt;br /&gt;
* _tableau_info() - &#039;&#039;Método de dibujo de la tabla con una lista de informaciones de la factura&#039;&#039;&lt;br /&gt;
* _tableau_tot() - &#039;&#039;Método de dibujo de la tabla de los totales&#039;&#039;&lt;br /&gt;
* _tableau_versement() - &#039;&#039;Método de dibujo de la tabla de las forma de pago&#039;&#039;&lt;br /&gt;
* _pagefoot() - &#039;&#039;Método de dibujo del pié de página&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Ejemplo ==&lt;br /&gt;
=== Inserción de un logo ===&lt;br /&gt;
* Añadir la instrucción:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$pdf-&amp;gt;Image(&#039;\www\htdocs\dolibarr\document\societe\logo.jpg&#039;, 10, 5,60.00);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Inserción de una firma u otros en pié de página de la factura ===&lt;br /&gt;
* abrir el modelo a modificar crabe u oursin (en htdocs/core/modules/facture/)&lt;br /&gt;
* insertar (por mi parte, justo antes de la línea 618 // Show payment mode CHQ)&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$pdf-&amp;gt;Image(&#039;http://localhost/dolibarr/doc/images/signature.jpg&#039;,120,250,74);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
la imagen (largo 74mm) aparece en la columna de la derecha justo antes del pie de página.&lt;br /&gt;
* copiar la imagen en el directorio. Parece ser que una imagen png con transparencias trae problemas.&lt;br /&gt;
* generar el pdf, la firma aparece.&lt;br /&gt;
&lt;br /&gt;
=== Inserción de textos ===&lt;br /&gt;
Principales funciones utilizadas&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$pdf-&amp;gt;setX(float a); // establece la posición actual x&lt;br /&gt;
$pdf-&amp;gt;setY(float b); // establece la posición actual y&lt;br /&gt;
$pdf-&amp;gt;setXY(float a,float b); // establece las posición actual x e y&lt;br /&gt;
$pdf-&amp;gt;SetTextColor(0,0,200); // establece el color del texto&lt;br /&gt;
$pdf-&amp;gt;SetFont(&#039;Arial&#039;,&#039;B&#039;,14); // establece la fuente, le tipo ( &#039;B&#039; para negrita, &#039;I&#039; para itálica, &#039;&#039; para normal,...)&lt;br /&gt;
$pdf-&amp;gt;MultiCell(60, 8, &#039;My text&#039;, 0, &#039;L&#039;); // imprime &#039;My text&#039; con salto de línea&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Recuerde: el origen es la esquina superior izquierda&lt;br /&gt;
&lt;br /&gt;
== Para más información ==&lt;br /&gt;
http://www.fpdf.org/?lang=es&lt;br /&gt;
&lt;br /&gt;
= Elegir un modelo por defecto en Dolibarr =&lt;br /&gt;
En  Inicio =&amp;gt; Configuración =&amp;gt; Módulos =&amp;gt; :&lt;br /&gt;
* indicamos que modelos deben de estar activos,&lt;br /&gt;
* precisaremos el modelo propuesto por defecto.&lt;/div&gt;</summary>
		<author><name>Nnicolashr</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Desarrollo_de_un_m%C3%B3dulo&amp;diff=35947</id>
		<title>Desarrollo de un módulo</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Desarrollo_de_un_m%C3%B3dulo&amp;diff=35947"/>
		<updated>2016-09-15T14:40:19Z</updated>

		<summary type="html">&lt;p&gt;Nnicolashr: /* Crear su página de edición de configuración */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Básico]]&lt;br /&gt;
{{TemplateDocDesarrollo}}&lt;br /&gt;
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:&lt;br /&gt;
* Añadir nuevas tablas a la base de datos.&lt;br /&gt;
* Añadir sus propias entradas en los menús.&lt;br /&gt;
* Añadir pantallas de edición/consulta de nuevas tablas.&lt;br /&gt;
* Añadir o eliminar pestañas en las páginas de vista/edición de objetos (factura, producto, pedido, evento, etc.)&lt;br /&gt;
* Añadir exportaciones predefinidas a la función “Exportar”.&lt;br /&gt;
* Añadir variables de substitución&lt;br /&gt;
* Añadir nuevas cajas a la página de inicio.&lt;br /&gt;
* Definir nuevos permisos.&lt;br /&gt;
* Activar código automático sobre una acción particular de Dolibarr.&lt;br /&gt;
* Insertar nuestro código mediante los hooks de Dolibarr&lt;br /&gt;
* Añadir un módulo de numeración&lt;br /&gt;
* Añadir un modelo de documento&lt;br /&gt;
* Añadir un nuevo tema &lt;br /&gt;
&lt;br /&gt;
etc. Todas estas operaciones sólo están disponibles a partir de la versión 3.2 de Dolibarr.&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Crear un módulo =&lt;br /&gt;
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&lt;br /&gt;
&lt;br /&gt;
== [[File:Art.png]] Crear un descriptor de Módulo (obligatorio) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039;: Obligatorio cada vez que se desarrolla una extensión, cualquiera que sea su finalidad.&lt;br /&gt;
&lt;br /&gt;
=== Crear su descriptor ===&lt;br /&gt;
La primera fase es la de crear un fichero descriptor del módulo. Para ello:&lt;br /&gt;
* Crear el directorio &#039;&#039;&#039;/htdocs/&#039;&#039;mimodulo&#039;&#039;/core/modules&#039;&#039;&#039;. Seguidamente ir al directorio &#039;&#039;&#039;dev/skeletons&#039;&#039;&#039; y copiar el archivo modMyModule.class.php en el directorio &#039;&#039;&#039;htdocs/&#039;&#039;mimodulo&#039;&#039;/core/modules&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A continuación, modificar el contenido del archivo, reemplazando:&lt;br /&gt;
* los &amp;quot;modMyModule&amp;quot; por un valor que corresponda a la finalidad de su módulo. Este valor debe siempre comenzar por mod. &lt;br /&gt;
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.&lt;br /&gt;
* $this-&amp;gt;numero = 100000 por un número de módulo que esté libre. Ver [[List of modules id|Listado de los id de módulos]]&lt;br /&gt;
* Modificar eventualmente otras variables definidas por los desarrolladores (ver el comentario en el código del esqueleto para ver su significado)&lt;br /&gt;
* Crear el directorio /htdocs/mimodulo/ &lt;br /&gt;
Ahora su fichero descriptor está configurado.&lt;br /&gt;
&lt;br /&gt;
=== Probar su descriptor ===&lt;br /&gt;
Ejecute Dolibarr y vaya a la página &amp;quot;Configuración &amp;gt; Módulo&amp;quot;. 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-&amp;gt;special el que determina en qué pestaña se encuentra su módulo.&lt;br /&gt;
&lt;br /&gt;
== [[File:Art.png]] Árbol de un nuevo módulo ==&lt;br /&gt;
Crear un directorio &#039;mimodulo&#039; que contendrá los archivos del módulo. Este directorio debe de estar en el directorio &#039;&#039;&#039;htdocs&#039;&#039;&#039; y contendrá los siguientes subdirectorios:&lt;br /&gt;
{{TemplateModuleTreeSimple}}&lt;br /&gt;
&lt;br /&gt;
== [[File:Art.png]] Crear sus tablas SQL y la clase PHP con los métodos de acceso (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si su módulo necesita gestionar sus propios datos.&lt;br /&gt;
&lt;br /&gt;
===Crear sus ficheros .sql===&lt;br /&gt;
Si su módulo de verdad requiere administrar datos que no existen en la base de datos en la versión estándar de Dolibarr, será necesario definir ciertas tablas SQL para registrar esos datos.&lt;br /&gt;
&lt;br /&gt;
Revisa que en el descriptor de archivo (mymodule/core/modules/mymodule.class.php) la línea&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;_load_tables(&#039;/mymodule/sql/&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
esté descomentada y correctamente configurada.&lt;br /&gt;
&lt;br /&gt;
Cree un subdirectorio sql en el directorio de su módulo (por ejemplo, htdocs/mimodulo/sql), con el fin de colocar los scripts sql que va a crear. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Regla a respetar:&#039;&#039; &lt;br /&gt;
* Agregue los archivos de orden de creación de sus tablas siguiendo el principio de un fichero &#039;&#039;&#039;llx_mitabla.sql&#039;&#039; por tabla, eventualmente acompañado del archivo &#039;&#039;&#039;llx_mitabla.key.sql&#039;&#039;&#039; (ver los archivos existentes en &#039;&#039;install/mysql/tables&#039;&#039;, para tomar ejemplo). &lt;br /&gt;
* En términos de orden de gestión de datos, todos deben estar en un archivo llamado &#039;&#039;&#039;data.sql&#039;&#039;&#039; situado en la misma carpeta &#039;&#039;&#039;/mimodulo/sql/&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Ejemplo de contenido de un fichero data.sql&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
 delete from llx_const where name=&#039;MYMODULE_IT_WORKS&#039; and entity=&#039;__ENTITY__&#039;;&lt;br /&gt;
 insert into llx_const (name, value, type, note, visible, entity) values (&#039;MYMODULE_IT_WORKS&#039;,&#039;1&#039;,&#039;chaine&#039;,&#039;A constant vor my module&#039;,1,&#039;__ENTITY__&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Las órdenes SQL de los archivos deben de ser operacionales para la base de datos &#039;&#039;&#039;mysql&#039;&#039;&#039;.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Probar su archivo .sql ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Generar la clase PHP de acceso (DAO) ===&lt;br /&gt;
Una vez que sus tablas estén creadas en la base de datos, vaya al directorio &#039;&#039;&#039;dev/skeletons&#039;&#039;&#039;, copie el archivo &#039;&#039;&#039;build_class_from_table.php&#039;&#039;&#039; en el directorio sql/ de su módulo module, y ejecute el script&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 php build_class_from_table.php nombretabla&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Nota: Si el comando no funciona, intente con php-cli en lugar de php.&lt;br /&gt;
&lt;br /&gt;
Esto genera un archivo &#039;&#039;&#039;out.nombretabla.class.php&#039;&#039;&#039; que contiene la clase de gestión de la tabla “nombretabla”. En esta clase se encuentran los métodos CRUD (Create/Read/Update/Delete) ya operativos para hacer un &#039;&#039;insert&#039;&#039;, un &#039;&#039;fetch&#039;&#039; (&#039;&#039;select&#039;&#039;), un &#039;&#039;update&#039;&#039;, y un &#039;&#039;delete&#039;&#039; de una línea de la tabla. Suprima justo el &amp;quot;out&amp;quot; del nombre del archivo y póngalo en un subdirectorio de &#039;&#039;&#039;htdocs&#039;&#039;&#039; propio en su módulo (Por ejemplo en &#039;&#039;&#039;htdocs/mimodulo&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Un archivo &#039;&#039;&#039;out.nombretabla_script.php&#039;&#039;&#039; se genera igualmente y contiene un ejemplo de código para utilizar la clase para cada uno de los cuatro métodos CRUD.&lt;br /&gt;
&lt;br /&gt;
== Visualización de pestañas (opcional) ==&lt;br /&gt;
&lt;br /&gt;
=== Añadir o eliminar pestañas en las fichas entidad ===&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039; : Para añadir su propia pestaña en las pestañas estándar de una ficha entidad (factura, pedido, presupuesto, miembro...)&lt;br /&gt;
&lt;br /&gt;
Para ello, vaya al archivo descriptor del módulo creado anteriormente y modifique la tabla $this-&amp;gt;tabs:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
	// Array to add new pages in new tabs or remove existing one&lt;br /&gt;
	$this-&amp;gt;tabs = array(&#039;objecttype:+tabname1:Title1:@mymodule:/mymodule/mynewtab1.php?id=__ID__&#039;,  // To add a new tab identified by code tabname1&lt;br /&gt;
                            &#039;objecttype:+tabname2:Title2:@mymodule:/mymodule/mynewtab2.php?id=__ID__&#039;,  // To add another new tab identified by code tabname2&lt;br /&gt;
                            &#039;objecttype:-tabname&#039;);                                                     // To remove an existing tab identified by code tabname&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La tabla debe contener una lista de cadena, cada cadena representa una nueva pestaña.&lt;br /&gt;
El formato de la cadena se compone de 4 partes separadas por &amp;quot;:&amp;quot;&lt;br /&gt;
* Parte 1: El código de la entidad (objecttype) en la que debe aparecer la pestaña siendo el valor de ella misma:&lt;br /&gt;
{{TemplateModuleTabs-es}}&lt;br /&gt;
* 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.&lt;br /&gt;
* 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&lt;br /&gt;
&lt;br /&gt;
* 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.&lt;br /&gt;
&lt;br /&gt;
Para alimentar el contenido de la pestaña con los datos de la base de datos, vea el capítulo siguiente.&lt;br /&gt;
&lt;br /&gt;
=== Añadir pestañas de una ficha entidad en su propia página ===&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039; : Para mostrar las pestañas estándar de ficha entidad (producto, tercero, etc.) en su propia pestaña de una entidad.&lt;br /&gt;
&lt;br /&gt;
Hay que hacer lo siguiente :&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Incluir los archivos que definen las funciones útiles dentro de sus archivos&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para cada ficha entidad, hay que incluir dos archivos con la instrucción&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;require_once($url_fichier) ;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aquí le mostramos la lista de estos archivos (DOL_DOCUMENT_ROOT correspondiente al directorio &#039;&#039;&#039;dolibarr/htdocs/&#039;&#039;&#039;) :&lt;br /&gt;
* Entidad tercero (thirdparty) :&lt;br /&gt;
** DOL_DOCUMENT_ROOT/societe/class/societe.class.php&lt;br /&gt;
** DOL_DOCUMENT_ROOT/core/lib/company.lib.php&lt;br /&gt;
* Entidad producto (product) :&lt;br /&gt;
** DOL_DOCUMENT_ROOT/product.class.php&lt;br /&gt;
** DOL_DOCUMENT_ROOT/lib/product.lib.php&lt;br /&gt;
* Entidad factura (invoice) :&lt;br /&gt;
** DOL_DOCUMENT_ROOT/facture.class.php&lt;br /&gt;
** DOL_DOCUMENT_ROOT/lib/invoice.lib.php&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Crear y cargar el objeto a mostrar en su pestaña&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Crear el objeto de la clase deseada, y recuperar los datos del objeto a partir de la base de datos. Para ello deberá utilizar las funciones fetch() de la clase correspondiente, pasando el parámetro del indentificador del objeto que recupera desde la url (ej : /mononglet.php?id=1).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Ejemplo :&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$id=$_GET[&amp;quot;id&amp;quot;];&lt;br /&gt;
$product = new Product($db) ;&lt;br /&gt;
$result = $product-&amp;gt;fetch($id) ; //Tester $result pour vérifier que l&#039;accès à la base s&#039;est bien passé&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3. Recuperar la lista de pestañas correspondientes a la entidad seleccionada&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Usar la función XXX_prepare_head($obj), donde XXX es le nombre de la entidad, para crear una tabla que contiene las definiciones de las pestañas a mostrar. El parámetro a pasar es el objeto del que desea mostrar las pestañas.&lt;br /&gt;
&lt;br /&gt;
La tabla devuelta se compone de la siguiente manera :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$head        // Tableau des onglets&lt;br /&gt;
$head[$h]    // Élément décrivant un onglet. Il y aura autant de $h que d&#039;onglets à afficher&lt;br /&gt;
$head[$h][0] // Url de la page affichée quand on clique sur l&#039;onglet&lt;br /&gt;
$head[$h][1] // Titre de l&#039;ongLet&lt;br /&gt;
$head[$h][2] // Code de l&#039;onglet, à utiliser pour choisir quel onglet sera &#039;actif&#039; (voir paragraphe suivant)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Ejemplo :&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$head = product_prepare_head($product, $user) ; //le paramètre $user n&#039;est pas présent sur certaines fonctions&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4. Mostrar las pestañas en su pestaña&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Use la función dol_fiche_head() que muestra las pestañas contenidas en la tabla $head devuelta por XX_prepare_head().&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
dol_fiche_head($links, $active=&#039;0&#039;, $title=&#039;&#039;, $notab=0, $picto=&#039;&#039;)&lt;br /&gt;
$links  // Tableau des onglets, appelé $head plus haut.&lt;br /&gt;
$active // Onglet actif (mettre le nom de l&#039;onglet défini dans votre fichier de module, ou un nom contenu dans $head[$h][2]). Cet onglet sera mis en surbrillance&lt;br /&gt;
$title  // ?&lt;br /&gt;
$notab  // Mettre ce paramètre à 1 permet de ne pas afficher de zone bleue en dessous des onglets.&lt;br /&gt;
$picto  // Nom de l&#039;image à utiliser au début de la barre des onglet. Les choix suivant sont possibles :&lt;br /&gt;
//            product&lt;br /&gt;
//            service&lt;br /&gt;
//            company&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esta función muestra las pestañas deseadas y abre un elemento &#039;&#039;&amp;lt; div class=&amp;quot;&amp;quot; &amp;gt;&#039;&#039; 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 &#039;&#039;&amp;lt; /div &amp;gt;&#039;&#039; en el código PHP.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Nota&#039;&#039;:&lt;br /&gt;
Para más detalles, consulte la [http://www.dolibarr.fr/doxygen/ documentación Doxygen] o directamente el código de Dolibarr.&lt;br /&gt;
&lt;br /&gt;
== Crear sus páginas pantalla PHP (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si su módulo consiste en añadir funcionalidades que necesitan nuevas pantallas.&lt;br /&gt;
&lt;br /&gt;
=== Crear una página pantalla PHP ===&lt;br /&gt;
Debe crear a continuación pantallas PHP que se basen en los datos de sus tablas utilizando los esqueletos como ejemplo del directorio &#039;&#039;&#039;dev/skeletons&#039;&#039;&#039;. (Para el desarrollo de un script en línea de comandos, ver [[Desarrollo de scripts]]).&lt;br /&gt;
&lt;br /&gt;
Para crear una nueva página de usuario, cree un subdirectorio de &#039;&#039;&#039;htdocs&#039;&#039;&#039; (si es que no existe ya) propio en su módulo (En &#039;&#039;&#039;htdocs/mimodulo&#039;&#039;&#039;, por ejemplo), con el fin de ubicar en él las páginas que va a crear.&lt;br /&gt;
&lt;br /&gt;
Copie allí el archivo &#039;&#039;&#039;skeletons_page.php&#039;&#039;&#039;, que va a servir de punto de partida a su página. Modifique el archivo para que la ruta relativa de&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$res=0;&lt;br /&gt;
if (! $res &amp;amp;&amp;amp; file_exists(&amp;quot;../main.inc.php&amp;quot;)) $res=@include(&amp;quot;../main.inc.php&amp;quot;);			// to work if your module directory is into dolibarr root htdocs directory&lt;br /&gt;
if (! $res &amp;amp;&amp;amp; file_exists(&amp;quot;../../main.inc.php&amp;quot;)) $res=@include(&amp;quot;../../main.inc.php&amp;quot;);		// to work if your module directory is into a subdir of root htdocs directory&lt;br /&gt;
if (! $res) die(&amp;quot;Include of main fails&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
sea la correcta, en función de la profundidad del directorio en el que se encuentra el archivo (quitando o añadiendo &amp;quot;../&amp;quot;). Es en el &amp;quot;main&amp;quot; donde se carga el entorno técnico y las habilitaciones. Los objetos variables se posicionan ahora:&lt;br /&gt;
* $user – El objeto que contiene las características del usuario y sus derechos.&lt;br /&gt;
* $conf – El objeto que contiene la configuración de Dolibarr.&lt;br /&gt;
* $db – El objeto que contiene el gestor de conexión abierto a la base de datos.&lt;br /&gt;
* $langs – El objeto que contiene el idioma del usuario.&lt;br /&gt;
&lt;br /&gt;
* 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):&lt;br /&gt;
&#039;&#039;Ejemplo :&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
dol_include_once(&#039;/mimodulo/class/miclass.class.php&#039;, &#039;MiClass&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Las clases de llamadas Dolibarr utilice la siguiente sintaxis:&lt;br /&gt;
&#039;&#039;Ejemplo :&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
require_once DOL_DOCUMENT_ROOT.&#039;/core/class/doli.class.php&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Reemplazar partes de templates de pantalla (versión 3.3+) ===&lt;br /&gt;
Algunas partes de la pantalla de Dolibarr están aisladas en archivos de plantilla. Puede desarrollar un módulo para reemplazar una o más de estas plantillas con las suyas.&lt;br /&gt;
{{ToComplete}}&lt;br /&gt;
&lt;br /&gt;
=== Acceso a la base de datos ===&lt;br /&gt;
Si necesita realizar modificaciones en su tabla de la base de datos, utilice la clase generada más arriba.&lt;br /&gt;
&lt;br /&gt;
Si de todos modos quiere acceder a las tablas sin objeto PHP dedicado, esto es posible (por ejemplo para recuperar una lista de registros). En ese caso, piense en seguir estos ejemplos.&lt;br /&gt;
&lt;br /&gt;
Para un &#039;&#039;insert&#039;&#039;, &#039;&#039;update&#039;&#039; o &#039;&#039;delete&#039;&#039;:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $db-&amp;gt;begin();   // Debut transaction&lt;br /&gt;
 $db-&amp;gt;query(&amp;quot;Ma requete insert, update ou delete&amp;quot;);&lt;br /&gt;
 $db-&amp;gt;commit();       // Valide&lt;br /&gt;
 o $db-&amp;gt;rollback()  // Annule&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para una lectura:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $resql=$db-&amp;gt;query(&amp;quot;Ma requete select&amp;quot;);&lt;br /&gt;
 if ($resql)&lt;br /&gt;
 {&lt;br /&gt;
         $num = $db-&amp;gt;num_rows($resql);&lt;br /&gt;
         $i = 0;&lt;br /&gt;
         if ($num)&lt;br /&gt;
         {&lt;br /&gt;
                 while ($i &amp;lt; $num)&lt;br /&gt;
                 {&lt;br /&gt;
                         $obj = $db-&amp;gt;fetch_object($resql);&lt;br /&gt;
                         if ($obj)&lt;br /&gt;
                         {&lt;br /&gt;
                                 // You can use here results&lt;br /&gt;
                                 print $obj-&amp;gt;field1;&lt;br /&gt;
                                 print $obj-&amp;gt;field2;&lt;br /&gt;
                         }&lt;br /&gt;
                         $i++;&lt;br /&gt;
                 }&lt;br /&gt;
         }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Definición de estilos ===&lt;br /&gt;
Para que el aspecto de la página guarde coherencia con el tema Dolibarr, es necesario utilizar los estilos CSS de Dolibarr.&lt;br /&gt;
&lt;br /&gt;
Por ejemplo:&lt;br /&gt;
&lt;br /&gt;
* class=&amp;quot;liste_titre&amp;quot;1 en las etiquetas tr y td para una línea de título de tabla. &lt;br /&gt;
* class=”pair” o class=”impair” en las etiquetas tr y td de las líneas de datos de la tabla.&lt;br /&gt;
* class=”flat” en todos los campos en los que se teclea (input, select, textarea...)&lt;br /&gt;
* class=”button” en los objetos de tipo input type=”submit”.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Utilizar el selector de fechas de Dolibarr ===&lt;br /&gt;
Si quiere, puede beneficiarse del selector de fechas en las pantallas Dolibarr. Para ello, utilice la siguiente línea:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $form=new Form($db);&lt;br /&gt;
 $form-&amp;gt;select_date(&#039;&#039;,&#039;mykey&#039;,0,0,0,&amp;quot;myform&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La cadena &amp;quot;mikey&amp;quot; identifica el campo fecha. Hace falta introducir un valor diferente en caso de que haya varios campos. La cadena &amp;quot;myform&amp;quot; es el nombre del campo &amp;quot;FORM&amp;quot; (en el formulario, name=&amp;quot;myform&amp;quot; de la página html). La visualización de un selector de fecha debe por tanto estar integrada en un formulario html.&lt;br /&gt;
&lt;br /&gt;
Para recuperar el valor, a la herencia de POST, el comando es:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $mydate = dol_mktime(12, 0 , 0, $_POST[&#039;mykeymonth&#039;], $_POST[&#039;mykeyday&#039;], $_POST[&#039;mykeyyear&#039;]);&lt;br /&gt;
 print strftime(&#039;%A %d %B %Y&#039;, $mydate);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Definir su página de configuración (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si su módulo ofrece varias opciones parametrizables.&lt;br /&gt;
&lt;br /&gt;
=== Crear su página de edición de configuración ===&lt;br /&gt;
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 &#039;&#039;&#039;llx_const&#039;&#039;&#039;]]). Cree una página PHP llamada &#039;&#039;&#039;mimodulo_setuppage.php&#039;&#039;&#039;, que registre las opciones posibles y las ponga al día. Es necesario tomar como ejemplo una página de &#039;&#039;&#039;/admin&#039;&#039;&#039; 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 &#039;&#039;&#039;/admin&#039;&#039;&#039;. 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 &#039;&#039;&#039;/admin&#039;&#039;&#039;).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $this-&amp;gt;config_page_url = array(&amp;quot;monmodule_setuppage.php&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Probar su página ===&lt;br /&gt;
Vaya a la página &#039;&#039;&#039;Configuración &amp;gt; módulo&#039;&#039;&#039;. 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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Definir sus entradas de menú (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si ha creado páginas PHP, es necesario que estas pantallas sean accesibles desde el menú Dolibarr.&lt;br /&gt;
&lt;br /&gt;
=== Definir sus entradas de menú ===&lt;br /&gt;
Para ello, hace falta definir en el archivo descriptor de menú de tabla this-&amp;gt;menu, que declara los menús.&lt;br /&gt;
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&lt;br /&gt;
&lt;br /&gt;
He aquí un ejemplo de declaración de entradas de menú en el fichero descriptor:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Main menu entries&lt;br /&gt;
$this-&amp;gt;menu = array();			// List of menus to add&lt;br /&gt;
$r=0;&lt;br /&gt;
&lt;br /&gt;
// Add here entries to declare new menus&lt;br /&gt;
// Example to declare the Top Menu entry:&lt;br /&gt;
$this-&amp;gt;menu[$r]=array(	&#039;fk_menu&#039;=&amp;gt;0,			// Put 0 if this is a top menu&lt;br /&gt;
			&#039;type&#039;=&amp;gt;&#039;top&#039;,			// This is a Top menu entry&lt;br /&gt;
			&#039;titre&#039;=&amp;gt;&#039;MyModule top menu&#039;,&lt;br /&gt;
			&#039;mainmenu&#039;=&amp;gt;&#039;mymodule&#039;,&lt;br /&gt;
			&#039;leftmenu&#039;=&amp;gt;&#039;mymodule&#039;,&lt;br /&gt;
			&#039;url&#039;=&amp;gt;&#039;/mymodule/pagetop.php&#039;,&lt;br /&gt;
			&#039;langs&#039;=&amp;gt;&#039;mylangfile&#039;,	// Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory.&lt;br /&gt;
			&#039;position&#039;=&amp;gt;100,&lt;br /&gt;
			&#039;enabled&#039;=&amp;gt;&#039;1&#039;,			// Define condition to show or hide menu entry. Use &#039;$conf-&amp;gt;mymodule-&amp;gt;enabled&#039; if entry must be visible if module is enabled.&lt;br /&gt;
			&#039;perms&#039;=&amp;gt;&#039;1&#039;,			// Use &#039;perms&#039;=&amp;gt;&#039;$user-&amp;gt;rights-&amp;gt;mymodule-&amp;gt;level1-&amp;gt;level2&#039; if you want your menu with a permission rules&lt;br /&gt;
			&#039;target&#039;=&amp;gt;&#039;&#039;,&lt;br /&gt;
			&#039;user&#039;=&amp;gt;2);				// 0=Menu for internal users, 1=external users, 2=both&lt;br /&gt;
$r++;&lt;br /&gt;
&lt;br /&gt;
// Example to declare a Left Menu entry:&lt;br /&gt;
$this-&amp;gt;menu[$r]=array(	&#039;fk_menu&#039;=&amp;gt;&#039;fk_mainmenu=xxx&#039;,		    // Use &#039;fk_mainmenu=xxx&#039; or &#039;fk_mainmenu=xxx,fk_leftmenu=yyy&#039; where xxx is mainmenucode and yyy is a leftmenucode of parent menu&lt;br /&gt;
			&#039;type&#039;=&amp;gt;&#039;left&#039;,			        // This is a Left menu entry&lt;br /&gt;
			&#039;titre&#039;=&amp;gt;&#039;MyModule left menu 1&#039;,&lt;br /&gt;
			&#039;mainmenu&#039;=&amp;gt;&#039;xxx&#039;,&lt;br /&gt;
                        &#039;leftmenu&#039;=&amp;gt;&#039;yyy&#039;,&lt;br /&gt;
			&#039;url&#039;=&amp;gt;&#039;/mymodule/pagelevel1.php&#039;,&lt;br /&gt;
			&#039;langs&#039;=&amp;gt;&#039;mylangfile&#039;,	// Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory.&lt;br /&gt;
			&#039;position&#039;=&amp;gt;100,&lt;br /&gt;
			&#039;enabled&#039;=&amp;gt;&#039;1&#039;,			// Define condition to show or hide menu entry. Use &#039;$conf-&amp;gt;mymodule-&amp;gt;enabled&#039; if entry must be visible if module is enabled.&lt;br /&gt;
			&#039;perms&#039;=&amp;gt;&#039;1&#039;,			// Use &#039;perms&#039;=&amp;gt;&#039;$user-&amp;gt;rights-&amp;gt;mymodule-&amp;gt;level1-&amp;gt;level2&#039; if you want your menu with a permission rules&lt;br /&gt;
			&#039;target&#039;=&amp;gt;&#039;&#039;,&lt;br /&gt;
			&#039;user&#039;=&amp;gt;2);				// 0=Menu for internal users,1=external users, 2=both&lt;br /&gt;
$r++;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para condicionar el acceso al menú segun los permisos, modificar la propiedad &#039;&#039;&#039;perms&#039;&#039;&#039; de la tabla. Ver el capítulo sobre permisos, un poco más abajo, para saber como realizar los permisos.&lt;br /&gt;
&lt;br /&gt;
=== Probar sus entradas de menú ===&lt;br /&gt;
Desactive y reactive su módulo bajo Dolibarr. Las entradas del menú deberían aparecer después de hacerlo (si la condición &#039;enabled&#039; está activada).&lt;br /&gt;
&lt;br /&gt;
== Definir sus propios permisos (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si quiere añadir nuevos permisos.&lt;br /&gt;
&lt;br /&gt;
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-&amp;gt;rights_class = &#039;facture&#039; para que diga:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $this-&amp;gt;rights_class = &#039;mimodulo&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A continuación, rellene la tabla $this-&amp;gt;rights con tantas entradas como permisos diferentes vaya a definir:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $this-&amp;gt;rights[$r][0] = 10001;&lt;br /&gt;
 $this-&amp;gt;rights[$r][1] = &#039;Texto por defecto de mi permiso&#039;;&lt;br /&gt;
 $this-&amp;gt;rights[$r][3] = 1;&lt;br /&gt;
 $this-&amp;gt;rights[$r][4] = &#039;accion&#039;;&lt;br /&gt;
 $this-&amp;gt;rights[$r][5] = &#039;subaccion&#039;;&lt;br /&gt;
 $r++;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En $this-&amp;gt;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ú &#039;&#039;&#039;Información del Sistema&#039;&#039;&#039; en una instalación de Dolibarr que esté funcionando. En $this-&amp;gt;rights[$r][3], introduzca 1 si este permiso se atribuye por defecto a los usuarios según son creados. En $this-&amp;gt;rights[$r][1] introduzca un texto por defecto -que será mostrado si no se encuentra traducción para su permiso en el archivo &#039;&#039;&#039;admin.lang&#039;&#039;&#039;). En $this-&amp;gt;rights[$r][4] y $this-&amp;gt;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:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 if ($user-&amp;gt;rights-&amp;gt;mimodulo-&amp;gt;accion-&amp;gt;subaccion) ...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Definir sus propios paneles (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si su módulo tiene uno o varios paneles.&lt;br /&gt;
&lt;br /&gt;
=== Defina sus paneles ===&lt;br /&gt;
Para ello, modifique las tablas $this-&amp;gt;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 &#039;&#039;&#039;htdocs/mimodulo/core/boxes&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Ejemplo:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;boxes[0][&#039;file&#039;]=&#039;mabox0.php@mimodulo&#039;&lt;br /&gt;
$this-&amp;gt;boxes[0][&#039;note&#039;]=&#039;Mi panel 0&#039;&lt;br /&gt;
 ...&lt;br /&gt;
$this-&amp;gt;boxes[n][&#039;file&#039;]=&#039;maboxn.php@mimodulo&#039;&lt;br /&gt;
$this-&amp;gt;boxes[n][&#039;note&#039;]=&#039;Mi panel n&#039;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A continuación cree los archivos &#039;&#039;&#039;htdocs/mimodulo/core/boxes/mabox0.php&#039;&#039;&#039;, &#039;&#039;&#039;htdocs/mimodulo/core/boxes/mabox1.php&#039;&#039;&#039;...  tomando como ejemplo los paneles existentes (en el directorio htdocs/core/boxes)&lt;br /&gt;
&lt;br /&gt;
=== Pruebe sus paneles en Dolibarr ===&lt;br /&gt;
Vaya al menú &#039;&#039;&#039;Inico – Configuración – Paneles&#039;&#039;&#039;. 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.&lt;br /&gt;
&lt;br /&gt;
== Definir sus propias exportaciones (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; 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)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Definir la exportación ===&lt;br /&gt;
Para ello, descomente y modifique las tablas $this-&amp;gt;export_xxx  de su archivo descriptor de módulo.&lt;br /&gt;
&lt;br /&gt;
=== Probar la exportación ===&lt;br /&gt;
Vaya al menú &amp;quot;Herramientas &amp;gt; Exportar&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Definir sus estilos CSS (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si en sus pantallas PHP utiliza clases de estilos distintas a las de los temas de Dolibarr (no recomendado).&lt;br /&gt;
&lt;br /&gt;
Esta funcionalidad todavía no es operativa en la versión 2.4., a pesar de estar ya descrita.&lt;br /&gt;
&lt;br /&gt;
=== Crear y declarar su hoja de estilos ===&lt;br /&gt;
Crear un archivo de estilos llamada &#039;&#039;&#039;mimodulo.css&#039;&#039;&#039; o &#039;&#039;&#039;mimodule.css.php&#039;&#039;&#039; y guardarla en el directorio &#039;&#039;&#039;&#039;&#039;mimodulo&#039;&#039;&#039;&#039;&#039; dentro de &#039;&#039;&#039;htdocs&#039;&#039;&#039;. Solo puede haber un archivo css propio a cada módulo.&lt;br /&gt;
Recordamos que es mejor usar los estilos ya existentes en Dolibarr (el archivo css usado por Dolibarr es el archivo &#039;&#039;&#039;themes/nomtheme/&#039;&#039;nombretema&#039;&#039;.css.php&#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
Una vez su hoja de estilos esté disponible, declárela en su archivo descriptor de módulo modificando la propiedad &#039;&#039;&#039;$this-&amp;gt;module_parts&#039;&#039;&#039;.&lt;br /&gt;
El valor a indicar debe ser la ruta URL relativa de su archivo css.&lt;br /&gt;
Por ejemplo&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;module_parts = array(&#039;css&#039; =&amp;gt; array(&#039;/mimodulo/css/mimodulo.css.php&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Probar su hoja de estilos ===&lt;br /&gt;
Desactivar y reactivar su módulo.&lt;br /&gt;
&lt;br /&gt;
Ir la página de inicio de Dolibarr. Ver el código de la página HTML.&lt;br /&gt;
&lt;br /&gt;
Debería ver en el encabezado HTML, una línea de declaración de su hoja de estilos.&lt;br /&gt;
&lt;br /&gt;
== Definir sus funciones Javascript (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuando&#039;&#039;&#039;: Si en sus pantallas en PHP utiliza funciones de Javascript no disponibles en estandard (archivo lib_head.js)&lt;br /&gt;
&lt;br /&gt;
Si en sus pantallas en PHP utiliza funciones javascript, es necesario asegurarse de que las funciones declaradas en un archivo javascript &#039;&#039;&#039;htdocs/mimodulo/js/monmodule.js&#039;&#039;&#039; sea cargado en la cabecera del head html.&lt;br /&gt;
&lt;br /&gt;
Para pedir a Dolibarr que gestione en la generación de la sección header la inclusión de uno de sus archivos javascript, es necesario proporcionar como parámetro a la función llxHeader(), al inicio de su página, la URL hacia el js a incluir.&lt;br /&gt;
&lt;br /&gt;
Ejemplo para la página /htdocs/mimodulo/mapage.php :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
require(&#039;../main.inc.php&#039;);&lt;br /&gt;
$morejs=array(&amp;quot;/mimomulo/js/monmodule.js&amp;quot;);&lt;br /&gt;
llxHeader(&#039;&#039;,&#039;Titulo&#039;,&#039;&#039;,&#039;&#039;,&#039;&#039;,&#039;&#039;,$morejs,&#039;&#039;,0,0); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ejecutar código sobre un evento Dolibarr (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; 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 &#039;&#039;&#039;disparador (triggers)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Véase también [[Interfaces Dolibarr hacia el exterior]] e [[Interfaces del Exterior hacia Dolibarr]]&lt;br /&gt;
&lt;br /&gt;
== Insertar su código usando los hooks de Dolibarr (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039;: Cuando desee cambiar o añadir otro tipo de código en un evento de negociado (véase lel capítulo anterior para esto).&lt;br /&gt;
&lt;br /&gt;
Véase la página [[El sistema Hooks]].&lt;br /&gt;
&lt;br /&gt;
== Añadir un módulo de numeración (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039;: Si quiere añadir una regla de numeración no cubierta por los módulos por defecto.&lt;br /&gt;
&lt;br /&gt;
Véase la página [[Crear un módulo de numeración]].&lt;br /&gt;
&lt;br /&gt;
== Añadir un nuevo módulo de documento (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039;: Si quiere añadir un nuevo modelo de documento.&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
== Añadir un tema (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039;: Si quiere un interface con colores personalizados.&lt;br /&gt;
&lt;br /&gt;
Véase la página [[Temas]].&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Algunas reglas de código =&lt;br /&gt;
Las reglas de código a seguir se definen en la [[Documentación Desarrolladores| Documentación para desarrolladores]], concretamente en la sección &amp;quot;Lenguaje&amp;quot; del capítulo de &amp;quot;Información General&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Utilización de MDA =&lt;br /&gt;
Un método para generar un módulo funcional desde UML se encuentra en curso de puesta a punto. Más información en la página [[UML2Dolibarr - Crear un módulo usando MDA]].&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Crear un paquete para liberar e instalar su módulo =&lt;br /&gt;
Este proceso debe ser usado para fabricar un paquete con el fin de enviarlo a la tienda oficial http://www.dolistore.com.&lt;br /&gt;
&lt;br /&gt;
También puede usarlo para distribuir fácilmente su módulo vía su propio método de distribución.&lt;br /&gt;
&lt;br /&gt;
* Vaya al directorio &#039;&#039;&#039;/build&#039;&#039;&#039; y copie el archivo &#039;&#039;&#039;makepack-dolibarrmodules.conf&#039;&#039;&#039; como &#039;&#039;&#039;makepack-mimodulo.conf&#039;&#039;&#039;. 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).&lt;br /&gt;
&lt;br /&gt;
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...)&lt;br /&gt;
* Lance el script vía Perl (necesita la versión 5.0. o superiores de Perl)&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 perl makepack-dolibarrmodule.pl&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El script le pide el nombre de su módulo, su versión mayor y menor. Se va a crear un fichero &#039;&#039;&#039;mimodulo.zip&#039;&#039;&#039;, que incluirá su módulo listo para ser liberado.&lt;br /&gt;
* La persona que reciba su módulo deberá ubicar el archivo en el directorio raíz de Dolibarr y ejecutar el comando:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 tar -xvf monmodule.zip&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 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 &amp;quot;Submit a product&amp;quot;).&lt;br /&gt;
** Si su módulo está correctamente realizado, será rápidamente validado.&lt;br /&gt;
** 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).&lt;/div&gt;</summary>
		<author><name>Nnicolashr</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Desarrollo_de_un_m%C3%B3dulo&amp;diff=35946</id>
		<title>Desarrollo de un módulo</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Desarrollo_de_un_m%C3%B3dulo&amp;diff=35946"/>
		<updated>2016-09-15T14:27:12Z</updated>

		<summary type="html">&lt;p&gt;Nnicolashr: /* Crear su página de edición de configuración */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Básico]]&lt;br /&gt;
{{TemplateDocDesarrollo}}&lt;br /&gt;
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:&lt;br /&gt;
* Añadir nuevas tablas a la base de datos.&lt;br /&gt;
* Añadir sus propias entradas en los menús.&lt;br /&gt;
* Añadir pantallas de edición/consulta de nuevas tablas.&lt;br /&gt;
* Añadir o eliminar pestañas en las páginas de vista/edición de objetos (factura, producto, pedido, evento, etc.)&lt;br /&gt;
* Añadir exportaciones predefinidas a la función “Exportar”.&lt;br /&gt;
* Añadir variables de substitución&lt;br /&gt;
* Añadir nuevas cajas a la página de inicio.&lt;br /&gt;
* Definir nuevos permisos.&lt;br /&gt;
* Activar código automático sobre una acción particular de Dolibarr.&lt;br /&gt;
* Insertar nuestro código mediante los hooks de Dolibarr&lt;br /&gt;
* Añadir un módulo de numeración&lt;br /&gt;
* Añadir un modelo de documento&lt;br /&gt;
* Añadir un nuevo tema &lt;br /&gt;
&lt;br /&gt;
etc. Todas estas operaciones sólo están disponibles a partir de la versión 3.2 de Dolibarr.&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Crear un módulo =&lt;br /&gt;
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&lt;br /&gt;
&lt;br /&gt;
== [[File:Art.png]] Crear un descriptor de Módulo (obligatorio) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039;: Obligatorio cada vez que se desarrolla una extensión, cualquiera que sea su finalidad.&lt;br /&gt;
&lt;br /&gt;
=== Crear su descriptor ===&lt;br /&gt;
La primera fase es la de crear un fichero descriptor del módulo. Para ello:&lt;br /&gt;
* Crear el directorio &#039;&#039;&#039;/htdocs/&#039;&#039;mimodulo&#039;&#039;/core/modules&#039;&#039;&#039;. Seguidamente ir al directorio &#039;&#039;&#039;dev/skeletons&#039;&#039;&#039; y copiar el archivo modMyModule.class.php en el directorio &#039;&#039;&#039;htdocs/&#039;&#039;mimodulo&#039;&#039;/core/modules&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A continuación, modificar el contenido del archivo, reemplazando:&lt;br /&gt;
* los &amp;quot;modMyModule&amp;quot; por un valor que corresponda a la finalidad de su módulo. Este valor debe siempre comenzar por mod. &lt;br /&gt;
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.&lt;br /&gt;
* $this-&amp;gt;numero = 100000 por un número de módulo que esté libre. Ver [[List of modules id|Listado de los id de módulos]]&lt;br /&gt;
* Modificar eventualmente otras variables definidas por los desarrolladores (ver el comentario en el código del esqueleto para ver su significado)&lt;br /&gt;
* Crear el directorio /htdocs/mimodulo/ &lt;br /&gt;
Ahora su fichero descriptor está configurado.&lt;br /&gt;
&lt;br /&gt;
=== Probar su descriptor ===&lt;br /&gt;
Ejecute Dolibarr y vaya a la página &amp;quot;Configuración &amp;gt; Módulo&amp;quot;. 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-&amp;gt;special el que determina en qué pestaña se encuentra su módulo.&lt;br /&gt;
&lt;br /&gt;
== [[File:Art.png]] Árbol de un nuevo módulo ==&lt;br /&gt;
Crear un directorio &#039;mimodulo&#039; que contendrá los archivos del módulo. Este directorio debe de estar en el directorio &#039;&#039;&#039;htdocs&#039;&#039;&#039; y contendrá los siguientes subdirectorios:&lt;br /&gt;
{{TemplateModuleTreeSimple}}&lt;br /&gt;
&lt;br /&gt;
== [[File:Art.png]] Crear sus tablas SQL y la clase PHP con los métodos de acceso (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si su módulo necesita gestionar sus propios datos.&lt;br /&gt;
&lt;br /&gt;
===Crear sus ficheros .sql===&lt;br /&gt;
Si su módulo de verdad requiere administrar datos que no existen en la base de datos en la versión estándar de Dolibarr, será necesario definir ciertas tablas SQL para registrar esos datos.&lt;br /&gt;
&lt;br /&gt;
Revisa que en el descriptor de archivo (mymodule/core/modules/mymodule.class.php) la línea&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;_load_tables(&#039;/mymodule/sql/&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
esté descomentada y correctamente configurada.&lt;br /&gt;
&lt;br /&gt;
Cree un subdirectorio sql en el directorio de su módulo (por ejemplo, htdocs/mimodulo/sql), con el fin de colocar los scripts sql que va a crear. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Regla a respetar:&#039;&#039; &lt;br /&gt;
* Agregue los archivos de orden de creación de sus tablas siguiendo el principio de un fichero &#039;&#039;&#039;llx_mitabla.sql&#039;&#039; por tabla, eventualmente acompañado del archivo &#039;&#039;&#039;llx_mitabla.key.sql&#039;&#039;&#039; (ver los archivos existentes en &#039;&#039;install/mysql/tables&#039;&#039;, para tomar ejemplo). &lt;br /&gt;
* En términos de orden de gestión de datos, todos deben estar en un archivo llamado &#039;&#039;&#039;data.sql&#039;&#039;&#039; situado en la misma carpeta &#039;&#039;&#039;/mimodulo/sql/&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Ejemplo de contenido de un fichero data.sql&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
 delete from llx_const where name=&#039;MYMODULE_IT_WORKS&#039; and entity=&#039;__ENTITY__&#039;;&lt;br /&gt;
 insert into llx_const (name, value, type, note, visible, entity) values (&#039;MYMODULE_IT_WORKS&#039;,&#039;1&#039;,&#039;chaine&#039;,&#039;A constant vor my module&#039;,1,&#039;__ENTITY__&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Las órdenes SQL de los archivos deben de ser operacionales para la base de datos &#039;&#039;&#039;mysql&#039;&#039;&#039;.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Probar su archivo .sql ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Generar la clase PHP de acceso (DAO) ===&lt;br /&gt;
Una vez que sus tablas estén creadas en la base de datos, vaya al directorio &#039;&#039;&#039;dev/skeletons&#039;&#039;&#039;, copie el archivo &#039;&#039;&#039;build_class_from_table.php&#039;&#039;&#039; en el directorio sql/ de su módulo module, y ejecute el script&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 php build_class_from_table.php nombretabla&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Nota: Si el comando no funciona, intente con php-cli en lugar de php.&lt;br /&gt;
&lt;br /&gt;
Esto genera un archivo &#039;&#039;&#039;out.nombretabla.class.php&#039;&#039;&#039; que contiene la clase de gestión de la tabla “nombretabla”. En esta clase se encuentran los métodos CRUD (Create/Read/Update/Delete) ya operativos para hacer un &#039;&#039;insert&#039;&#039;, un &#039;&#039;fetch&#039;&#039; (&#039;&#039;select&#039;&#039;), un &#039;&#039;update&#039;&#039;, y un &#039;&#039;delete&#039;&#039; de una línea de la tabla. Suprima justo el &amp;quot;out&amp;quot; del nombre del archivo y póngalo en un subdirectorio de &#039;&#039;&#039;htdocs&#039;&#039;&#039; propio en su módulo (Por ejemplo en &#039;&#039;&#039;htdocs/mimodulo&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Un archivo &#039;&#039;&#039;out.nombretabla_script.php&#039;&#039;&#039; se genera igualmente y contiene un ejemplo de código para utilizar la clase para cada uno de los cuatro métodos CRUD.&lt;br /&gt;
&lt;br /&gt;
== Visualización de pestañas (opcional) ==&lt;br /&gt;
&lt;br /&gt;
=== Añadir o eliminar pestañas en las fichas entidad ===&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039; : Para añadir su propia pestaña en las pestañas estándar de una ficha entidad (factura, pedido, presupuesto, miembro...)&lt;br /&gt;
&lt;br /&gt;
Para ello, vaya al archivo descriptor del módulo creado anteriormente y modifique la tabla $this-&amp;gt;tabs:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
	// Array to add new pages in new tabs or remove existing one&lt;br /&gt;
	$this-&amp;gt;tabs = array(&#039;objecttype:+tabname1:Title1:@mymodule:/mymodule/mynewtab1.php?id=__ID__&#039;,  // To add a new tab identified by code tabname1&lt;br /&gt;
                            &#039;objecttype:+tabname2:Title2:@mymodule:/mymodule/mynewtab2.php?id=__ID__&#039;,  // To add another new tab identified by code tabname2&lt;br /&gt;
                            &#039;objecttype:-tabname&#039;);                                                     // To remove an existing tab identified by code tabname&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La tabla debe contener una lista de cadena, cada cadena representa una nueva pestaña.&lt;br /&gt;
El formato de la cadena se compone de 4 partes separadas por &amp;quot;:&amp;quot;&lt;br /&gt;
* Parte 1: El código de la entidad (objecttype) en la que debe aparecer la pestaña siendo el valor de ella misma:&lt;br /&gt;
{{TemplateModuleTabs-es}}&lt;br /&gt;
* 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.&lt;br /&gt;
* 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&lt;br /&gt;
&lt;br /&gt;
* 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.&lt;br /&gt;
&lt;br /&gt;
Para alimentar el contenido de la pestaña con los datos de la base de datos, vea el capítulo siguiente.&lt;br /&gt;
&lt;br /&gt;
=== Añadir pestañas de una ficha entidad en su propia página ===&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039; : Para mostrar las pestañas estándar de ficha entidad (producto, tercero, etc.) en su propia pestaña de una entidad.&lt;br /&gt;
&lt;br /&gt;
Hay que hacer lo siguiente :&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Incluir los archivos que definen las funciones útiles dentro de sus archivos&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para cada ficha entidad, hay que incluir dos archivos con la instrucción&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;require_once($url_fichier) ;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aquí le mostramos la lista de estos archivos (DOL_DOCUMENT_ROOT correspondiente al directorio &#039;&#039;&#039;dolibarr/htdocs/&#039;&#039;&#039;) :&lt;br /&gt;
* Entidad tercero (thirdparty) :&lt;br /&gt;
** DOL_DOCUMENT_ROOT/societe/class/societe.class.php&lt;br /&gt;
** DOL_DOCUMENT_ROOT/core/lib/company.lib.php&lt;br /&gt;
* Entidad producto (product) :&lt;br /&gt;
** DOL_DOCUMENT_ROOT/product.class.php&lt;br /&gt;
** DOL_DOCUMENT_ROOT/lib/product.lib.php&lt;br /&gt;
* Entidad factura (invoice) :&lt;br /&gt;
** DOL_DOCUMENT_ROOT/facture.class.php&lt;br /&gt;
** DOL_DOCUMENT_ROOT/lib/invoice.lib.php&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Crear y cargar el objeto a mostrar en su pestaña&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Crear el objeto de la clase deseada, y recuperar los datos del objeto a partir de la base de datos. Para ello deberá utilizar las funciones fetch() de la clase correspondiente, pasando el parámetro del indentificador del objeto que recupera desde la url (ej : /mononglet.php?id=1).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Ejemplo :&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$id=$_GET[&amp;quot;id&amp;quot;];&lt;br /&gt;
$product = new Product($db) ;&lt;br /&gt;
$result = $product-&amp;gt;fetch($id) ; //Tester $result pour vérifier que l&#039;accès à la base s&#039;est bien passé&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3. Recuperar la lista de pestañas correspondientes a la entidad seleccionada&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Usar la función XXX_prepare_head($obj), donde XXX es le nombre de la entidad, para crear una tabla que contiene las definiciones de las pestañas a mostrar. El parámetro a pasar es el objeto del que desea mostrar las pestañas.&lt;br /&gt;
&lt;br /&gt;
La tabla devuelta se compone de la siguiente manera :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$head        // Tableau des onglets&lt;br /&gt;
$head[$h]    // Élément décrivant un onglet. Il y aura autant de $h que d&#039;onglets à afficher&lt;br /&gt;
$head[$h][0] // Url de la page affichée quand on clique sur l&#039;onglet&lt;br /&gt;
$head[$h][1] // Titre de l&#039;ongLet&lt;br /&gt;
$head[$h][2] // Code de l&#039;onglet, à utiliser pour choisir quel onglet sera &#039;actif&#039; (voir paragraphe suivant)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Ejemplo :&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$head = product_prepare_head($product, $user) ; //le paramètre $user n&#039;est pas présent sur certaines fonctions&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4. Mostrar las pestañas en su pestaña&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Use la función dol_fiche_head() que muestra las pestañas contenidas en la tabla $head devuelta por XX_prepare_head().&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
dol_fiche_head($links, $active=&#039;0&#039;, $title=&#039;&#039;, $notab=0, $picto=&#039;&#039;)&lt;br /&gt;
$links  // Tableau des onglets, appelé $head plus haut.&lt;br /&gt;
$active // Onglet actif (mettre le nom de l&#039;onglet défini dans votre fichier de module, ou un nom contenu dans $head[$h][2]). Cet onglet sera mis en surbrillance&lt;br /&gt;
$title  // ?&lt;br /&gt;
$notab  // Mettre ce paramètre à 1 permet de ne pas afficher de zone bleue en dessous des onglets.&lt;br /&gt;
$picto  // Nom de l&#039;image à utiliser au début de la barre des onglet. Les choix suivant sont possibles :&lt;br /&gt;
//            product&lt;br /&gt;
//            service&lt;br /&gt;
//            company&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esta función muestra las pestañas deseadas y abre un elemento &#039;&#039;&amp;lt; div class=&amp;quot;&amp;quot; &amp;gt;&#039;&#039; 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 &#039;&#039;&amp;lt; /div &amp;gt;&#039;&#039; en el código PHP.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Nota&#039;&#039;:&lt;br /&gt;
Para más detalles, consulte la [http://www.dolibarr.fr/doxygen/ documentación Doxygen] o directamente el código de Dolibarr.&lt;br /&gt;
&lt;br /&gt;
== Crear sus páginas pantalla PHP (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si su módulo consiste en añadir funcionalidades que necesitan nuevas pantallas.&lt;br /&gt;
&lt;br /&gt;
=== Crear una página pantalla PHP ===&lt;br /&gt;
Debe crear a continuación pantallas PHP que se basen en los datos de sus tablas utilizando los esqueletos como ejemplo del directorio &#039;&#039;&#039;dev/skeletons&#039;&#039;&#039;. (Para el desarrollo de un script en línea de comandos, ver [[Desarrollo de scripts]]).&lt;br /&gt;
&lt;br /&gt;
Para crear una nueva página de usuario, cree un subdirectorio de &#039;&#039;&#039;htdocs&#039;&#039;&#039; (si es que no existe ya) propio en su módulo (En &#039;&#039;&#039;htdocs/mimodulo&#039;&#039;&#039;, por ejemplo), con el fin de ubicar en él las páginas que va a crear.&lt;br /&gt;
&lt;br /&gt;
Copie allí el archivo &#039;&#039;&#039;skeletons_page.php&#039;&#039;&#039;, que va a servir de punto de partida a su página. Modifique el archivo para que la ruta relativa de&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$res=0;&lt;br /&gt;
if (! $res &amp;amp;&amp;amp; file_exists(&amp;quot;../main.inc.php&amp;quot;)) $res=@include(&amp;quot;../main.inc.php&amp;quot;);			// to work if your module directory is into dolibarr root htdocs directory&lt;br /&gt;
if (! $res &amp;amp;&amp;amp; file_exists(&amp;quot;../../main.inc.php&amp;quot;)) $res=@include(&amp;quot;../../main.inc.php&amp;quot;);		// to work if your module directory is into a subdir of root htdocs directory&lt;br /&gt;
if (! $res) die(&amp;quot;Include of main fails&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
sea la correcta, en función de la profundidad del directorio en el que se encuentra el archivo (quitando o añadiendo &amp;quot;../&amp;quot;). Es en el &amp;quot;main&amp;quot; donde se carga el entorno técnico y las habilitaciones. Los objetos variables se posicionan ahora:&lt;br /&gt;
* $user – El objeto que contiene las características del usuario y sus derechos.&lt;br /&gt;
* $conf – El objeto que contiene la configuración de Dolibarr.&lt;br /&gt;
* $db – El objeto que contiene el gestor de conexión abierto a la base de datos.&lt;br /&gt;
* $langs – El objeto que contiene el idioma del usuario.&lt;br /&gt;
&lt;br /&gt;
* 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):&lt;br /&gt;
&#039;&#039;Ejemplo :&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
dol_include_once(&#039;/mimodulo/class/miclass.class.php&#039;, &#039;MiClass&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Las clases de llamadas Dolibarr utilice la siguiente sintaxis:&lt;br /&gt;
&#039;&#039;Ejemplo :&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
require_once DOL_DOCUMENT_ROOT.&#039;/core/class/doli.class.php&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Reemplazar partes de templates de pantalla (versión 3.3+) ===&lt;br /&gt;
Algunas partes de la pantalla de Dolibarr están aisladas en archivos de plantilla. Puede desarrollar un módulo para reemplazar una o más de estas plantillas con las suyas.&lt;br /&gt;
{{ToComplete}}&lt;br /&gt;
&lt;br /&gt;
=== Acceso a la base de datos ===&lt;br /&gt;
Si necesita realizar modificaciones en su tabla de la base de datos, utilice la clase generada más arriba.&lt;br /&gt;
&lt;br /&gt;
Si de todos modos quiere acceder a las tablas sin objeto PHP dedicado, esto es posible (por ejemplo para recuperar una lista de registros). En ese caso, piense en seguir estos ejemplos.&lt;br /&gt;
&lt;br /&gt;
Para un &#039;&#039;insert&#039;&#039;, &#039;&#039;update&#039;&#039; o &#039;&#039;delete&#039;&#039;:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $db-&amp;gt;begin();   // Debut transaction&lt;br /&gt;
 $db-&amp;gt;query(&amp;quot;Ma requete insert, update ou delete&amp;quot;);&lt;br /&gt;
 $db-&amp;gt;commit();       // Valide&lt;br /&gt;
 o $db-&amp;gt;rollback()  // Annule&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para una lectura:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $resql=$db-&amp;gt;query(&amp;quot;Ma requete select&amp;quot;);&lt;br /&gt;
 if ($resql)&lt;br /&gt;
 {&lt;br /&gt;
         $num = $db-&amp;gt;num_rows($resql);&lt;br /&gt;
         $i = 0;&lt;br /&gt;
         if ($num)&lt;br /&gt;
         {&lt;br /&gt;
                 while ($i &amp;lt; $num)&lt;br /&gt;
                 {&lt;br /&gt;
                         $obj = $db-&amp;gt;fetch_object($resql);&lt;br /&gt;
                         if ($obj)&lt;br /&gt;
                         {&lt;br /&gt;
                                 // You can use here results&lt;br /&gt;
                                 print $obj-&amp;gt;field1;&lt;br /&gt;
                                 print $obj-&amp;gt;field2;&lt;br /&gt;
                         }&lt;br /&gt;
                         $i++;&lt;br /&gt;
                 }&lt;br /&gt;
         }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Definición de estilos ===&lt;br /&gt;
Para que el aspecto de la página guarde coherencia con el tema Dolibarr, es necesario utilizar los estilos CSS de Dolibarr.&lt;br /&gt;
&lt;br /&gt;
Por ejemplo:&lt;br /&gt;
&lt;br /&gt;
* class=&amp;quot;liste_titre&amp;quot;1 en las etiquetas tr y td para una línea de título de tabla. &lt;br /&gt;
* class=”pair” o class=”impair” en las etiquetas tr y td de las líneas de datos de la tabla.&lt;br /&gt;
* class=”flat” en todos los campos en los que se teclea (input, select, textarea...)&lt;br /&gt;
* class=”button” en los objetos de tipo input type=”submit”.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Utilizar el selector de fechas de Dolibarr ===&lt;br /&gt;
Si quiere, puede beneficiarse del selector de fechas en las pantallas Dolibarr. Para ello, utilice la siguiente línea:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $form=new Form($db);&lt;br /&gt;
 $form-&amp;gt;select_date(&#039;&#039;,&#039;mykey&#039;,0,0,0,&amp;quot;myform&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La cadena &amp;quot;mikey&amp;quot; identifica el campo fecha. Hace falta introducir un valor diferente en caso de que haya varios campos. La cadena &amp;quot;myform&amp;quot; es el nombre del campo &amp;quot;FORM&amp;quot; (en el formulario, name=&amp;quot;myform&amp;quot; de la página html). La visualización de un selector de fecha debe por tanto estar integrada en un formulario html.&lt;br /&gt;
&lt;br /&gt;
Para recuperar el valor, a la herencia de POST, el comando es:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $mydate = dol_mktime(12, 0 , 0, $_POST[&#039;mykeymonth&#039;], $_POST[&#039;mykeyday&#039;], $_POST[&#039;mykeyyear&#039;]);&lt;br /&gt;
 print strftime(&#039;%A %d %B %Y&#039;, $mydate);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Definir su página de configuración (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si su módulo ofrece varias opciones parametrizables.&lt;br /&gt;
&lt;br /&gt;
=== Crear su página de edición de configuración ===&lt;br /&gt;
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 &#039;&#039;&#039;llx_const&#039;&#039;&#039;]]). Cree una página PHP llamada &#039;&#039;&#039;mimodulo_setuppage.php&#039;&#039;&#039;, que registre las opciones posibles y las ponga al día. Es necesario tomar como ejemplo una página de &#039;&#039;&#039;/admin&#039;&#039;&#039; 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 &#039;&#039;&#039;/admin&#039;&#039;&#039;. 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 &#039;&#039;&#039;/admin&#039;&#039;&#039;).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $this-&amp;gt;config_page_url = array(&amp;quot;monmodule_setupapage.php&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Probar su página ===&lt;br /&gt;
Vaya a la página &#039;&#039;&#039;Configuración &amp;gt; módulo&#039;&#039;&#039;. 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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Definir sus entradas de menú (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si ha creado páginas PHP, es necesario que estas pantallas sean accesibles desde el menú Dolibarr.&lt;br /&gt;
&lt;br /&gt;
=== Definir sus entradas de menú ===&lt;br /&gt;
Para ello, hace falta definir en el archivo descriptor de menú de tabla this-&amp;gt;menu, que declara los menús.&lt;br /&gt;
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&lt;br /&gt;
&lt;br /&gt;
He aquí un ejemplo de declaración de entradas de menú en el fichero descriptor:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Main menu entries&lt;br /&gt;
$this-&amp;gt;menu = array();			// List of menus to add&lt;br /&gt;
$r=0;&lt;br /&gt;
&lt;br /&gt;
// Add here entries to declare new menus&lt;br /&gt;
// Example to declare the Top Menu entry:&lt;br /&gt;
$this-&amp;gt;menu[$r]=array(	&#039;fk_menu&#039;=&amp;gt;0,			// Put 0 if this is a top menu&lt;br /&gt;
			&#039;type&#039;=&amp;gt;&#039;top&#039;,			// This is a Top menu entry&lt;br /&gt;
			&#039;titre&#039;=&amp;gt;&#039;MyModule top menu&#039;,&lt;br /&gt;
			&#039;mainmenu&#039;=&amp;gt;&#039;mymodule&#039;,&lt;br /&gt;
			&#039;leftmenu&#039;=&amp;gt;&#039;mymodule&#039;,&lt;br /&gt;
			&#039;url&#039;=&amp;gt;&#039;/mymodule/pagetop.php&#039;,&lt;br /&gt;
			&#039;langs&#039;=&amp;gt;&#039;mylangfile&#039;,	// Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory.&lt;br /&gt;
			&#039;position&#039;=&amp;gt;100,&lt;br /&gt;
			&#039;enabled&#039;=&amp;gt;&#039;1&#039;,			// Define condition to show or hide menu entry. Use &#039;$conf-&amp;gt;mymodule-&amp;gt;enabled&#039; if entry must be visible if module is enabled.&lt;br /&gt;
			&#039;perms&#039;=&amp;gt;&#039;1&#039;,			// Use &#039;perms&#039;=&amp;gt;&#039;$user-&amp;gt;rights-&amp;gt;mymodule-&amp;gt;level1-&amp;gt;level2&#039; if you want your menu with a permission rules&lt;br /&gt;
			&#039;target&#039;=&amp;gt;&#039;&#039;,&lt;br /&gt;
			&#039;user&#039;=&amp;gt;2);				// 0=Menu for internal users, 1=external users, 2=both&lt;br /&gt;
$r++;&lt;br /&gt;
&lt;br /&gt;
// Example to declare a Left Menu entry:&lt;br /&gt;
$this-&amp;gt;menu[$r]=array(	&#039;fk_menu&#039;=&amp;gt;&#039;fk_mainmenu=xxx&#039;,		    // Use &#039;fk_mainmenu=xxx&#039; or &#039;fk_mainmenu=xxx,fk_leftmenu=yyy&#039; where xxx is mainmenucode and yyy is a leftmenucode of parent menu&lt;br /&gt;
			&#039;type&#039;=&amp;gt;&#039;left&#039;,			        // This is a Left menu entry&lt;br /&gt;
			&#039;titre&#039;=&amp;gt;&#039;MyModule left menu 1&#039;,&lt;br /&gt;
			&#039;mainmenu&#039;=&amp;gt;&#039;xxx&#039;,&lt;br /&gt;
                        &#039;leftmenu&#039;=&amp;gt;&#039;yyy&#039;,&lt;br /&gt;
			&#039;url&#039;=&amp;gt;&#039;/mymodule/pagelevel1.php&#039;,&lt;br /&gt;
			&#039;langs&#039;=&amp;gt;&#039;mylangfile&#039;,	// Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory.&lt;br /&gt;
			&#039;position&#039;=&amp;gt;100,&lt;br /&gt;
			&#039;enabled&#039;=&amp;gt;&#039;1&#039;,			// Define condition to show or hide menu entry. Use &#039;$conf-&amp;gt;mymodule-&amp;gt;enabled&#039; if entry must be visible if module is enabled.&lt;br /&gt;
			&#039;perms&#039;=&amp;gt;&#039;1&#039;,			// Use &#039;perms&#039;=&amp;gt;&#039;$user-&amp;gt;rights-&amp;gt;mymodule-&amp;gt;level1-&amp;gt;level2&#039; if you want your menu with a permission rules&lt;br /&gt;
			&#039;target&#039;=&amp;gt;&#039;&#039;,&lt;br /&gt;
			&#039;user&#039;=&amp;gt;2);				// 0=Menu for internal users,1=external users, 2=both&lt;br /&gt;
$r++;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para condicionar el acceso al menú segun los permisos, modificar la propiedad &#039;&#039;&#039;perms&#039;&#039;&#039; de la tabla. Ver el capítulo sobre permisos, un poco más abajo, para saber como realizar los permisos.&lt;br /&gt;
&lt;br /&gt;
=== Probar sus entradas de menú ===&lt;br /&gt;
Desactive y reactive su módulo bajo Dolibarr. Las entradas del menú deberían aparecer después de hacerlo (si la condición &#039;enabled&#039; está activada).&lt;br /&gt;
&lt;br /&gt;
== Definir sus propios permisos (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si quiere añadir nuevos permisos.&lt;br /&gt;
&lt;br /&gt;
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-&amp;gt;rights_class = &#039;facture&#039; para que diga:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $this-&amp;gt;rights_class = &#039;mimodulo&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A continuación, rellene la tabla $this-&amp;gt;rights con tantas entradas como permisos diferentes vaya a definir:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $this-&amp;gt;rights[$r][0] = 10001;&lt;br /&gt;
 $this-&amp;gt;rights[$r][1] = &#039;Texto por defecto de mi permiso&#039;;&lt;br /&gt;
 $this-&amp;gt;rights[$r][3] = 1;&lt;br /&gt;
 $this-&amp;gt;rights[$r][4] = &#039;accion&#039;;&lt;br /&gt;
 $this-&amp;gt;rights[$r][5] = &#039;subaccion&#039;;&lt;br /&gt;
 $r++;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En $this-&amp;gt;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ú &#039;&#039;&#039;Información del Sistema&#039;&#039;&#039; en una instalación de Dolibarr que esté funcionando. En $this-&amp;gt;rights[$r][3], introduzca 1 si este permiso se atribuye por defecto a los usuarios según son creados. En $this-&amp;gt;rights[$r][1] introduzca un texto por defecto -que será mostrado si no se encuentra traducción para su permiso en el archivo &#039;&#039;&#039;admin.lang&#039;&#039;&#039;). En $this-&amp;gt;rights[$r][4] y $this-&amp;gt;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:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 if ($user-&amp;gt;rights-&amp;gt;mimodulo-&amp;gt;accion-&amp;gt;subaccion) ...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Definir sus propios paneles (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si su módulo tiene uno o varios paneles.&lt;br /&gt;
&lt;br /&gt;
=== Defina sus paneles ===&lt;br /&gt;
Para ello, modifique las tablas $this-&amp;gt;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 &#039;&#039;&#039;htdocs/mimodulo/core/boxes&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Ejemplo:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;boxes[0][&#039;file&#039;]=&#039;mabox0.php@mimodulo&#039;&lt;br /&gt;
$this-&amp;gt;boxes[0][&#039;note&#039;]=&#039;Mi panel 0&#039;&lt;br /&gt;
 ...&lt;br /&gt;
$this-&amp;gt;boxes[n][&#039;file&#039;]=&#039;maboxn.php@mimodulo&#039;&lt;br /&gt;
$this-&amp;gt;boxes[n][&#039;note&#039;]=&#039;Mi panel n&#039;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A continuación cree los archivos &#039;&#039;&#039;htdocs/mimodulo/core/boxes/mabox0.php&#039;&#039;&#039;, &#039;&#039;&#039;htdocs/mimodulo/core/boxes/mabox1.php&#039;&#039;&#039;...  tomando como ejemplo los paneles existentes (en el directorio htdocs/core/boxes)&lt;br /&gt;
&lt;br /&gt;
=== Pruebe sus paneles en Dolibarr ===&lt;br /&gt;
Vaya al menú &#039;&#039;&#039;Inico – Configuración – Paneles&#039;&#039;&#039;. 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.&lt;br /&gt;
&lt;br /&gt;
== Definir sus propias exportaciones (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; 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)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Definir la exportación ===&lt;br /&gt;
Para ello, descomente y modifique las tablas $this-&amp;gt;export_xxx  de su archivo descriptor de módulo.&lt;br /&gt;
&lt;br /&gt;
=== Probar la exportación ===&lt;br /&gt;
Vaya al menú &amp;quot;Herramientas &amp;gt; Exportar&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Definir sus estilos CSS (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si en sus pantallas PHP utiliza clases de estilos distintas a las de los temas de Dolibarr (no recomendado).&lt;br /&gt;
&lt;br /&gt;
Esta funcionalidad todavía no es operativa en la versión 2.4., a pesar de estar ya descrita.&lt;br /&gt;
&lt;br /&gt;
=== Crear y declarar su hoja de estilos ===&lt;br /&gt;
Crear un archivo de estilos llamada &#039;&#039;&#039;mimodulo.css&#039;&#039;&#039; o &#039;&#039;&#039;mimodule.css.php&#039;&#039;&#039; y guardarla en el directorio &#039;&#039;&#039;&#039;&#039;mimodulo&#039;&#039;&#039;&#039;&#039; dentro de &#039;&#039;&#039;htdocs&#039;&#039;&#039;. Solo puede haber un archivo css propio a cada módulo.&lt;br /&gt;
Recordamos que es mejor usar los estilos ya existentes en Dolibarr (el archivo css usado por Dolibarr es el archivo &#039;&#039;&#039;themes/nomtheme/&#039;&#039;nombretema&#039;&#039;.css.php&#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
Una vez su hoja de estilos esté disponible, declárela en su archivo descriptor de módulo modificando la propiedad &#039;&#039;&#039;$this-&amp;gt;module_parts&#039;&#039;&#039;.&lt;br /&gt;
El valor a indicar debe ser la ruta URL relativa de su archivo css.&lt;br /&gt;
Por ejemplo&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;module_parts = array(&#039;css&#039; =&amp;gt; array(&#039;/mimodulo/css/mimodulo.css.php&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Probar su hoja de estilos ===&lt;br /&gt;
Desactivar y reactivar su módulo.&lt;br /&gt;
&lt;br /&gt;
Ir la página de inicio de Dolibarr. Ver el código de la página HTML.&lt;br /&gt;
&lt;br /&gt;
Debería ver en el encabezado HTML, una línea de declaración de su hoja de estilos.&lt;br /&gt;
&lt;br /&gt;
== Definir sus funciones Javascript (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuando&#039;&#039;&#039;: Si en sus pantallas en PHP utiliza funciones de Javascript no disponibles en estandard (archivo lib_head.js)&lt;br /&gt;
&lt;br /&gt;
Si en sus pantallas en PHP utiliza funciones javascript, es necesario asegurarse de que las funciones declaradas en un archivo javascript &#039;&#039;&#039;htdocs/mimodulo/js/monmodule.js&#039;&#039;&#039; sea cargado en la cabecera del head html.&lt;br /&gt;
&lt;br /&gt;
Para pedir a Dolibarr que gestione en la generación de la sección header la inclusión de uno de sus archivos javascript, es necesario proporcionar como parámetro a la función llxHeader(), al inicio de su página, la URL hacia el js a incluir.&lt;br /&gt;
&lt;br /&gt;
Ejemplo para la página /htdocs/mimodulo/mapage.php :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
require(&#039;../main.inc.php&#039;);&lt;br /&gt;
$morejs=array(&amp;quot;/mimomulo/js/monmodule.js&amp;quot;);&lt;br /&gt;
llxHeader(&#039;&#039;,&#039;Titulo&#039;,&#039;&#039;,&#039;&#039;,&#039;&#039;,&#039;&#039;,$morejs,&#039;&#039;,0,0); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ejecutar código sobre un evento Dolibarr (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; 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 &#039;&#039;&#039;disparador (triggers)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Véase también [[Interfaces Dolibarr hacia el exterior]] e [[Interfaces del Exterior hacia Dolibarr]]&lt;br /&gt;
&lt;br /&gt;
== Insertar su código usando los hooks de Dolibarr (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039;: Cuando desee cambiar o añadir otro tipo de código en un evento de negociado (véase lel capítulo anterior para esto).&lt;br /&gt;
&lt;br /&gt;
Véase la página [[El sistema Hooks]].&lt;br /&gt;
&lt;br /&gt;
== Añadir un módulo de numeración (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039;: Si quiere añadir una regla de numeración no cubierta por los módulos por defecto.&lt;br /&gt;
&lt;br /&gt;
Véase la página [[Crear un módulo de numeración]].&lt;br /&gt;
&lt;br /&gt;
== Añadir un nuevo módulo de documento (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039;: Si quiere añadir un nuevo modelo de documento.&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
== Añadir un tema (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039;: Si quiere un interface con colores personalizados.&lt;br /&gt;
&lt;br /&gt;
Véase la página [[Temas]].&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Algunas reglas de código =&lt;br /&gt;
Las reglas de código a seguir se definen en la [[Documentación Desarrolladores| Documentación para desarrolladores]], concretamente en la sección &amp;quot;Lenguaje&amp;quot; del capítulo de &amp;quot;Información General&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Utilización de MDA =&lt;br /&gt;
Un método para generar un módulo funcional desde UML se encuentra en curso de puesta a punto. Más información en la página [[UML2Dolibarr - Crear un módulo usando MDA]].&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Crear un paquete para liberar e instalar su módulo =&lt;br /&gt;
Este proceso debe ser usado para fabricar un paquete con el fin de enviarlo a la tienda oficial http://www.dolistore.com.&lt;br /&gt;
&lt;br /&gt;
También puede usarlo para distribuir fácilmente su módulo vía su propio método de distribución.&lt;br /&gt;
&lt;br /&gt;
* Vaya al directorio &#039;&#039;&#039;/build&#039;&#039;&#039; y copie el archivo &#039;&#039;&#039;makepack-dolibarrmodules.conf&#039;&#039;&#039; como &#039;&#039;&#039;makepack-mimodulo.conf&#039;&#039;&#039;. 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).&lt;br /&gt;
&lt;br /&gt;
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...)&lt;br /&gt;
* Lance el script vía Perl (necesita la versión 5.0. o superiores de Perl)&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 perl makepack-dolibarrmodule.pl&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El script le pide el nombre de su módulo, su versión mayor y menor. Se va a crear un fichero &#039;&#039;&#039;mimodulo.zip&#039;&#039;&#039;, que incluirá su módulo listo para ser liberado.&lt;br /&gt;
* La persona que reciba su módulo deberá ubicar el archivo en el directorio raíz de Dolibarr y ejecutar el comando:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 tar -xvf monmodule.zip&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 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 &amp;quot;Submit a product&amp;quot;).&lt;br /&gt;
** Si su módulo está correctamente realizado, será rápidamente validado.&lt;br /&gt;
** 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).&lt;/div&gt;</summary>
		<author><name>Nnicolashr</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Desarrollo_de_un_m%C3%B3dulo&amp;diff=35945</id>
		<title>Desarrollo de un módulo</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Desarrollo_de_un_m%C3%B3dulo&amp;diff=35945"/>
		<updated>2016-09-15T14:25:25Z</updated>

		<summary type="html">&lt;p&gt;Nnicolashr: /* Crear una página pantalla PHP */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Básico]]&lt;br /&gt;
{{TemplateDocDesarrollo}}&lt;br /&gt;
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:&lt;br /&gt;
* Añadir nuevas tablas a la base de datos.&lt;br /&gt;
* Añadir sus propias entradas en los menús.&lt;br /&gt;
* Añadir pantallas de edición/consulta de nuevas tablas.&lt;br /&gt;
* Añadir o eliminar pestañas en las páginas de vista/edición de objetos (factura, producto, pedido, evento, etc.)&lt;br /&gt;
* Añadir exportaciones predefinidas a la función “Exportar”.&lt;br /&gt;
* Añadir variables de substitución&lt;br /&gt;
* Añadir nuevas cajas a la página de inicio.&lt;br /&gt;
* Definir nuevos permisos.&lt;br /&gt;
* Activar código automático sobre una acción particular de Dolibarr.&lt;br /&gt;
* Insertar nuestro código mediante los hooks de Dolibarr&lt;br /&gt;
* Añadir un módulo de numeración&lt;br /&gt;
* Añadir un modelo de documento&lt;br /&gt;
* Añadir un nuevo tema &lt;br /&gt;
&lt;br /&gt;
etc. Todas estas operaciones sólo están disponibles a partir de la versión 3.2 de Dolibarr.&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Crear un módulo =&lt;br /&gt;
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&lt;br /&gt;
&lt;br /&gt;
== [[File:Art.png]] Crear un descriptor de Módulo (obligatorio) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039;: Obligatorio cada vez que se desarrolla una extensión, cualquiera que sea su finalidad.&lt;br /&gt;
&lt;br /&gt;
=== Crear su descriptor ===&lt;br /&gt;
La primera fase es la de crear un fichero descriptor del módulo. Para ello:&lt;br /&gt;
* Crear el directorio &#039;&#039;&#039;/htdocs/&#039;&#039;mimodulo&#039;&#039;/core/modules&#039;&#039;&#039;. Seguidamente ir al directorio &#039;&#039;&#039;dev/skeletons&#039;&#039;&#039; y copiar el archivo modMyModule.class.php en el directorio &#039;&#039;&#039;htdocs/&#039;&#039;mimodulo&#039;&#039;/core/modules&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A continuación, modificar el contenido del archivo, reemplazando:&lt;br /&gt;
* los &amp;quot;modMyModule&amp;quot; por un valor que corresponda a la finalidad de su módulo. Este valor debe siempre comenzar por mod. &lt;br /&gt;
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.&lt;br /&gt;
* $this-&amp;gt;numero = 100000 por un número de módulo que esté libre. Ver [[List of modules id|Listado de los id de módulos]]&lt;br /&gt;
* Modificar eventualmente otras variables definidas por los desarrolladores (ver el comentario en el código del esqueleto para ver su significado)&lt;br /&gt;
* Crear el directorio /htdocs/mimodulo/ &lt;br /&gt;
Ahora su fichero descriptor está configurado.&lt;br /&gt;
&lt;br /&gt;
=== Probar su descriptor ===&lt;br /&gt;
Ejecute Dolibarr y vaya a la página &amp;quot;Configuración &amp;gt; Módulo&amp;quot;. 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-&amp;gt;special el que determina en qué pestaña se encuentra su módulo.&lt;br /&gt;
&lt;br /&gt;
== [[File:Art.png]] Árbol de un nuevo módulo ==&lt;br /&gt;
Crear un directorio &#039;mimodulo&#039; que contendrá los archivos del módulo. Este directorio debe de estar en el directorio &#039;&#039;&#039;htdocs&#039;&#039;&#039; y contendrá los siguientes subdirectorios:&lt;br /&gt;
{{TemplateModuleTreeSimple}}&lt;br /&gt;
&lt;br /&gt;
== [[File:Art.png]] Crear sus tablas SQL y la clase PHP con los métodos de acceso (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si su módulo necesita gestionar sus propios datos.&lt;br /&gt;
&lt;br /&gt;
===Crear sus ficheros .sql===&lt;br /&gt;
Si su módulo de verdad requiere administrar datos que no existen en la base de datos en la versión estándar de Dolibarr, será necesario definir ciertas tablas SQL para registrar esos datos.&lt;br /&gt;
&lt;br /&gt;
Revisa que en el descriptor de archivo (mymodule/core/modules/mymodule.class.php) la línea&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;_load_tables(&#039;/mymodule/sql/&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
esté descomentada y correctamente configurada.&lt;br /&gt;
&lt;br /&gt;
Cree un subdirectorio sql en el directorio de su módulo (por ejemplo, htdocs/mimodulo/sql), con el fin de colocar los scripts sql que va a crear. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Regla a respetar:&#039;&#039; &lt;br /&gt;
* Agregue los archivos de orden de creación de sus tablas siguiendo el principio de un fichero &#039;&#039;&#039;llx_mitabla.sql&#039;&#039; por tabla, eventualmente acompañado del archivo &#039;&#039;&#039;llx_mitabla.key.sql&#039;&#039;&#039; (ver los archivos existentes en &#039;&#039;install/mysql/tables&#039;&#039;, para tomar ejemplo). &lt;br /&gt;
* En términos de orden de gestión de datos, todos deben estar en un archivo llamado &#039;&#039;&#039;data.sql&#039;&#039;&#039; situado en la misma carpeta &#039;&#039;&#039;/mimodulo/sql/&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Ejemplo de contenido de un fichero data.sql&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
 delete from llx_const where name=&#039;MYMODULE_IT_WORKS&#039; and entity=&#039;__ENTITY__&#039;;&lt;br /&gt;
 insert into llx_const (name, value, type, note, visible, entity) values (&#039;MYMODULE_IT_WORKS&#039;,&#039;1&#039;,&#039;chaine&#039;,&#039;A constant vor my module&#039;,1,&#039;__ENTITY__&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Las órdenes SQL de los archivos deben de ser operacionales para la base de datos &#039;&#039;&#039;mysql&#039;&#039;&#039;.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Probar su archivo .sql ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Generar la clase PHP de acceso (DAO) ===&lt;br /&gt;
Una vez que sus tablas estén creadas en la base de datos, vaya al directorio &#039;&#039;&#039;dev/skeletons&#039;&#039;&#039;, copie el archivo &#039;&#039;&#039;build_class_from_table.php&#039;&#039;&#039; en el directorio sql/ de su módulo module, y ejecute el script&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 php build_class_from_table.php nombretabla&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Nota: Si el comando no funciona, intente con php-cli en lugar de php.&lt;br /&gt;
&lt;br /&gt;
Esto genera un archivo &#039;&#039;&#039;out.nombretabla.class.php&#039;&#039;&#039; que contiene la clase de gestión de la tabla “nombretabla”. En esta clase se encuentran los métodos CRUD (Create/Read/Update/Delete) ya operativos para hacer un &#039;&#039;insert&#039;&#039;, un &#039;&#039;fetch&#039;&#039; (&#039;&#039;select&#039;&#039;), un &#039;&#039;update&#039;&#039;, y un &#039;&#039;delete&#039;&#039; de una línea de la tabla. Suprima justo el &amp;quot;out&amp;quot; del nombre del archivo y póngalo en un subdirectorio de &#039;&#039;&#039;htdocs&#039;&#039;&#039; propio en su módulo (Por ejemplo en &#039;&#039;&#039;htdocs/mimodulo&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Un archivo &#039;&#039;&#039;out.nombretabla_script.php&#039;&#039;&#039; se genera igualmente y contiene un ejemplo de código para utilizar la clase para cada uno de los cuatro métodos CRUD.&lt;br /&gt;
&lt;br /&gt;
== Visualización de pestañas (opcional) ==&lt;br /&gt;
&lt;br /&gt;
=== Añadir o eliminar pestañas en las fichas entidad ===&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039; : Para añadir su propia pestaña en las pestañas estándar de una ficha entidad (factura, pedido, presupuesto, miembro...)&lt;br /&gt;
&lt;br /&gt;
Para ello, vaya al archivo descriptor del módulo creado anteriormente y modifique la tabla $this-&amp;gt;tabs:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
	// Array to add new pages in new tabs or remove existing one&lt;br /&gt;
	$this-&amp;gt;tabs = array(&#039;objecttype:+tabname1:Title1:@mymodule:/mymodule/mynewtab1.php?id=__ID__&#039;,  // To add a new tab identified by code tabname1&lt;br /&gt;
                            &#039;objecttype:+tabname2:Title2:@mymodule:/mymodule/mynewtab2.php?id=__ID__&#039;,  // To add another new tab identified by code tabname2&lt;br /&gt;
                            &#039;objecttype:-tabname&#039;);                                                     // To remove an existing tab identified by code tabname&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La tabla debe contener una lista de cadena, cada cadena representa una nueva pestaña.&lt;br /&gt;
El formato de la cadena se compone de 4 partes separadas por &amp;quot;:&amp;quot;&lt;br /&gt;
* Parte 1: El código de la entidad (objecttype) en la que debe aparecer la pestaña siendo el valor de ella misma:&lt;br /&gt;
{{TemplateModuleTabs-es}}&lt;br /&gt;
* 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.&lt;br /&gt;
* 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&lt;br /&gt;
&lt;br /&gt;
* 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.&lt;br /&gt;
&lt;br /&gt;
Para alimentar el contenido de la pestaña con los datos de la base de datos, vea el capítulo siguiente.&lt;br /&gt;
&lt;br /&gt;
=== Añadir pestañas de una ficha entidad en su propia página ===&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039; : Para mostrar las pestañas estándar de ficha entidad (producto, tercero, etc.) en su propia pestaña de una entidad.&lt;br /&gt;
&lt;br /&gt;
Hay que hacer lo siguiente :&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Incluir los archivos que definen las funciones útiles dentro de sus archivos&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para cada ficha entidad, hay que incluir dos archivos con la instrucción&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;require_once($url_fichier) ;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aquí le mostramos la lista de estos archivos (DOL_DOCUMENT_ROOT correspondiente al directorio &#039;&#039;&#039;dolibarr/htdocs/&#039;&#039;&#039;) :&lt;br /&gt;
* Entidad tercero (thirdparty) :&lt;br /&gt;
** DOL_DOCUMENT_ROOT/societe/class/societe.class.php&lt;br /&gt;
** DOL_DOCUMENT_ROOT/core/lib/company.lib.php&lt;br /&gt;
* Entidad producto (product) :&lt;br /&gt;
** DOL_DOCUMENT_ROOT/product.class.php&lt;br /&gt;
** DOL_DOCUMENT_ROOT/lib/product.lib.php&lt;br /&gt;
* Entidad factura (invoice) :&lt;br /&gt;
** DOL_DOCUMENT_ROOT/facture.class.php&lt;br /&gt;
** DOL_DOCUMENT_ROOT/lib/invoice.lib.php&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Crear y cargar el objeto a mostrar en su pestaña&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Crear el objeto de la clase deseada, y recuperar los datos del objeto a partir de la base de datos. Para ello deberá utilizar las funciones fetch() de la clase correspondiente, pasando el parámetro del indentificador del objeto que recupera desde la url (ej : /mononglet.php?id=1).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Ejemplo :&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$id=$_GET[&amp;quot;id&amp;quot;];&lt;br /&gt;
$product = new Product($db) ;&lt;br /&gt;
$result = $product-&amp;gt;fetch($id) ; //Tester $result pour vérifier que l&#039;accès à la base s&#039;est bien passé&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3. Recuperar la lista de pestañas correspondientes a la entidad seleccionada&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Usar la función XXX_prepare_head($obj), donde XXX es le nombre de la entidad, para crear una tabla que contiene las definiciones de las pestañas a mostrar. El parámetro a pasar es el objeto del que desea mostrar las pestañas.&lt;br /&gt;
&lt;br /&gt;
La tabla devuelta se compone de la siguiente manera :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$head        // Tableau des onglets&lt;br /&gt;
$head[$h]    // Élément décrivant un onglet. Il y aura autant de $h que d&#039;onglets à afficher&lt;br /&gt;
$head[$h][0] // Url de la page affichée quand on clique sur l&#039;onglet&lt;br /&gt;
$head[$h][1] // Titre de l&#039;ongLet&lt;br /&gt;
$head[$h][2] // Code de l&#039;onglet, à utiliser pour choisir quel onglet sera &#039;actif&#039; (voir paragraphe suivant)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Ejemplo :&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$head = product_prepare_head($product, $user) ; //le paramètre $user n&#039;est pas présent sur certaines fonctions&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4. Mostrar las pestañas en su pestaña&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Use la función dol_fiche_head() que muestra las pestañas contenidas en la tabla $head devuelta por XX_prepare_head().&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
dol_fiche_head($links, $active=&#039;0&#039;, $title=&#039;&#039;, $notab=0, $picto=&#039;&#039;)&lt;br /&gt;
$links  // Tableau des onglets, appelé $head plus haut.&lt;br /&gt;
$active // Onglet actif (mettre le nom de l&#039;onglet défini dans votre fichier de module, ou un nom contenu dans $head[$h][2]). Cet onglet sera mis en surbrillance&lt;br /&gt;
$title  // ?&lt;br /&gt;
$notab  // Mettre ce paramètre à 1 permet de ne pas afficher de zone bleue en dessous des onglets.&lt;br /&gt;
$picto  // Nom de l&#039;image à utiliser au début de la barre des onglet. Les choix suivant sont possibles :&lt;br /&gt;
//            product&lt;br /&gt;
//            service&lt;br /&gt;
//            company&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esta función muestra las pestañas deseadas y abre un elemento &#039;&#039;&amp;lt; div class=&amp;quot;&amp;quot; &amp;gt;&#039;&#039; 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 &#039;&#039;&amp;lt; /div &amp;gt;&#039;&#039; en el código PHP.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Nota&#039;&#039;:&lt;br /&gt;
Para más detalles, consulte la [http://www.dolibarr.fr/doxygen/ documentación Doxygen] o directamente el código de Dolibarr.&lt;br /&gt;
&lt;br /&gt;
== Crear sus páginas pantalla PHP (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si su módulo consiste en añadir funcionalidades que necesitan nuevas pantallas.&lt;br /&gt;
&lt;br /&gt;
=== Crear una página pantalla PHP ===&lt;br /&gt;
Debe crear a continuación pantallas PHP que se basen en los datos de sus tablas utilizando los esqueletos como ejemplo del directorio &#039;&#039;&#039;dev/skeletons&#039;&#039;&#039;. (Para el desarrollo de un script en línea de comandos, ver [[Desarrollo de scripts]]).&lt;br /&gt;
&lt;br /&gt;
Para crear una nueva página de usuario, cree un subdirectorio de &#039;&#039;&#039;htdocs&#039;&#039;&#039; (si es que no existe ya) propio en su módulo (En &#039;&#039;&#039;htdocs/mimodulo&#039;&#039;&#039;, por ejemplo), con el fin de ubicar en él las páginas que va a crear.&lt;br /&gt;
&lt;br /&gt;
Copie allí el archivo &#039;&#039;&#039;skeletons_page.php&#039;&#039;&#039;, que va a servir de punto de partida a su página. Modifique el archivo para que la ruta relativa de&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$res=0;&lt;br /&gt;
if (! $res &amp;amp;&amp;amp; file_exists(&amp;quot;../main.inc.php&amp;quot;)) $res=@include(&amp;quot;../main.inc.php&amp;quot;);			// to work if your module directory is into dolibarr root htdocs directory&lt;br /&gt;
if (! $res &amp;amp;&amp;amp; file_exists(&amp;quot;../../main.inc.php&amp;quot;)) $res=@include(&amp;quot;../../main.inc.php&amp;quot;);		// to work if your module directory is into a subdir of root htdocs directory&lt;br /&gt;
if (! $res) die(&amp;quot;Include of main fails&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
sea la correcta, en función de la profundidad del directorio en el que se encuentra el archivo (quitando o añadiendo &amp;quot;../&amp;quot;). Es en el &amp;quot;main&amp;quot; donde se carga el entorno técnico y las habilitaciones. Los objetos variables se posicionan ahora:&lt;br /&gt;
* $user – El objeto que contiene las características del usuario y sus derechos.&lt;br /&gt;
* $conf – El objeto que contiene la configuración de Dolibarr.&lt;br /&gt;
* $db – El objeto que contiene el gestor de conexión abierto a la base de datos.&lt;br /&gt;
* $langs – El objeto que contiene el idioma del usuario.&lt;br /&gt;
&lt;br /&gt;
* 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):&lt;br /&gt;
&#039;&#039;Ejemplo :&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
dol_include_once(&#039;/mimodulo/class/miclass.class.php&#039;, &#039;MiClass&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Las clases de llamadas Dolibarr utilice la siguiente sintaxis:&lt;br /&gt;
&#039;&#039;Ejemplo :&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
require_once DOL_DOCUMENT_ROOT.&#039;/core/class/doli.class.php&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Reemplazar partes de templates de pantalla (versión 3.3+) ===&lt;br /&gt;
Algunas partes de la pantalla de Dolibarr están aisladas en archivos de plantilla. Puede desarrollar un módulo para reemplazar una o más de estas plantillas con las suyas.&lt;br /&gt;
{{ToComplete}}&lt;br /&gt;
&lt;br /&gt;
=== Acceso a la base de datos ===&lt;br /&gt;
Si necesita realizar modificaciones en su tabla de la base de datos, utilice la clase generada más arriba.&lt;br /&gt;
&lt;br /&gt;
Si de todos modos quiere acceder a las tablas sin objeto PHP dedicado, esto es posible (por ejemplo para recuperar una lista de registros). En ese caso, piense en seguir estos ejemplos.&lt;br /&gt;
&lt;br /&gt;
Para un &#039;&#039;insert&#039;&#039;, &#039;&#039;update&#039;&#039; o &#039;&#039;delete&#039;&#039;:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $db-&amp;gt;begin();   // Debut transaction&lt;br /&gt;
 $db-&amp;gt;query(&amp;quot;Ma requete insert, update ou delete&amp;quot;);&lt;br /&gt;
 $db-&amp;gt;commit();       // Valide&lt;br /&gt;
 o $db-&amp;gt;rollback()  // Annule&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para una lectura:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $resql=$db-&amp;gt;query(&amp;quot;Ma requete select&amp;quot;);&lt;br /&gt;
 if ($resql)&lt;br /&gt;
 {&lt;br /&gt;
         $num = $db-&amp;gt;num_rows($resql);&lt;br /&gt;
         $i = 0;&lt;br /&gt;
         if ($num)&lt;br /&gt;
         {&lt;br /&gt;
                 while ($i &amp;lt; $num)&lt;br /&gt;
                 {&lt;br /&gt;
                         $obj = $db-&amp;gt;fetch_object($resql);&lt;br /&gt;
                         if ($obj)&lt;br /&gt;
                         {&lt;br /&gt;
                                 // You can use here results&lt;br /&gt;
                                 print $obj-&amp;gt;field1;&lt;br /&gt;
                                 print $obj-&amp;gt;field2;&lt;br /&gt;
                         }&lt;br /&gt;
                         $i++;&lt;br /&gt;
                 }&lt;br /&gt;
         }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Definición de estilos ===&lt;br /&gt;
Para que el aspecto de la página guarde coherencia con el tema Dolibarr, es necesario utilizar los estilos CSS de Dolibarr.&lt;br /&gt;
&lt;br /&gt;
Por ejemplo:&lt;br /&gt;
&lt;br /&gt;
* class=&amp;quot;liste_titre&amp;quot;1 en las etiquetas tr y td para una línea de título de tabla. &lt;br /&gt;
* class=”pair” o class=”impair” en las etiquetas tr y td de las líneas de datos de la tabla.&lt;br /&gt;
* class=”flat” en todos los campos en los que se teclea (input, select, textarea...)&lt;br /&gt;
* class=”button” en los objetos de tipo input type=”submit”.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Utilizar el selector de fechas de Dolibarr ===&lt;br /&gt;
Si quiere, puede beneficiarse del selector de fechas en las pantallas Dolibarr. Para ello, utilice la siguiente línea:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $form=new Form($db);&lt;br /&gt;
 $form-&amp;gt;select_date(&#039;&#039;,&#039;mykey&#039;,0,0,0,&amp;quot;myform&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La cadena &amp;quot;mikey&amp;quot; identifica el campo fecha. Hace falta introducir un valor diferente en caso de que haya varios campos. La cadena &amp;quot;myform&amp;quot; es el nombre del campo &amp;quot;FORM&amp;quot; (en el formulario, name=&amp;quot;myform&amp;quot; de la página html). La visualización de un selector de fecha debe por tanto estar integrada en un formulario html.&lt;br /&gt;
&lt;br /&gt;
Para recuperar el valor, a la herencia de POST, el comando es:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $mydate = dol_mktime(12, 0 , 0, $_POST[&#039;mykeymonth&#039;], $_POST[&#039;mykeyday&#039;], $_POST[&#039;mykeyyear&#039;]);&lt;br /&gt;
 print strftime(&#039;%A %d %B %Y&#039;, $mydate);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Definir su página de configuración (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si su módulo ofrece varias opciones parametrizables.&lt;br /&gt;
&lt;br /&gt;
=== Crear su página de edición de configuración ===&lt;br /&gt;
Si su módulo ofrece varias opciones parametrizacles, es necesario crear una página PHP para editar las opciones (que serán guardadas en la [[Table llx_const|tabla &#039;&#039;&#039;llx_const&#039;&#039;&#039;]]). Cree una página PHP llamada &#039;&#039;&#039;mimodulo_setuppage.php&#039;&#039;&#039;, que registre las opciones posibles y las ponga al día. Es necesario tomar como ejemplo una página de &#039;&#039;&#039;/admin&#039;&#039;&#039; 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 &#039;&#039;&#039;/admin&#039;&#039;&#039;. 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 &#039;&#039;&#039;/admin&#039;&#039;&#039;).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $this-&amp;gt;config_page_url = array(&amp;quot;monmodule_setupapage.php&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Probar su página ===&lt;br /&gt;
Vaya a la página &#039;&#039;&#039;Configuración &amp;gt; módulo&#039;&#039;&#039;. 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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Definir sus entradas de menú (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si ha creado páginas PHP, es necesario que estas pantallas sean accesibles desde el menú Dolibarr.&lt;br /&gt;
&lt;br /&gt;
=== Definir sus entradas de menú ===&lt;br /&gt;
Para ello, hace falta definir en el archivo descriptor de menú de tabla this-&amp;gt;menu, que declara los menús.&lt;br /&gt;
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&lt;br /&gt;
&lt;br /&gt;
He aquí un ejemplo de declaración de entradas de menú en el fichero descriptor:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Main menu entries&lt;br /&gt;
$this-&amp;gt;menu = array();			// List of menus to add&lt;br /&gt;
$r=0;&lt;br /&gt;
&lt;br /&gt;
// Add here entries to declare new menus&lt;br /&gt;
// Example to declare the Top Menu entry:&lt;br /&gt;
$this-&amp;gt;menu[$r]=array(	&#039;fk_menu&#039;=&amp;gt;0,			// Put 0 if this is a top menu&lt;br /&gt;
			&#039;type&#039;=&amp;gt;&#039;top&#039;,			// This is a Top menu entry&lt;br /&gt;
			&#039;titre&#039;=&amp;gt;&#039;MyModule top menu&#039;,&lt;br /&gt;
			&#039;mainmenu&#039;=&amp;gt;&#039;mymodule&#039;,&lt;br /&gt;
			&#039;leftmenu&#039;=&amp;gt;&#039;mymodule&#039;,&lt;br /&gt;
			&#039;url&#039;=&amp;gt;&#039;/mymodule/pagetop.php&#039;,&lt;br /&gt;
			&#039;langs&#039;=&amp;gt;&#039;mylangfile&#039;,	// Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory.&lt;br /&gt;
			&#039;position&#039;=&amp;gt;100,&lt;br /&gt;
			&#039;enabled&#039;=&amp;gt;&#039;1&#039;,			// Define condition to show or hide menu entry. Use &#039;$conf-&amp;gt;mymodule-&amp;gt;enabled&#039; if entry must be visible if module is enabled.&lt;br /&gt;
			&#039;perms&#039;=&amp;gt;&#039;1&#039;,			// Use &#039;perms&#039;=&amp;gt;&#039;$user-&amp;gt;rights-&amp;gt;mymodule-&amp;gt;level1-&amp;gt;level2&#039; if you want your menu with a permission rules&lt;br /&gt;
			&#039;target&#039;=&amp;gt;&#039;&#039;,&lt;br /&gt;
			&#039;user&#039;=&amp;gt;2);				// 0=Menu for internal users, 1=external users, 2=both&lt;br /&gt;
$r++;&lt;br /&gt;
&lt;br /&gt;
// Example to declare a Left Menu entry:&lt;br /&gt;
$this-&amp;gt;menu[$r]=array(	&#039;fk_menu&#039;=&amp;gt;&#039;fk_mainmenu=xxx&#039;,		    // Use &#039;fk_mainmenu=xxx&#039; or &#039;fk_mainmenu=xxx,fk_leftmenu=yyy&#039; where xxx is mainmenucode and yyy is a leftmenucode of parent menu&lt;br /&gt;
			&#039;type&#039;=&amp;gt;&#039;left&#039;,			        // This is a Left menu entry&lt;br /&gt;
			&#039;titre&#039;=&amp;gt;&#039;MyModule left menu 1&#039;,&lt;br /&gt;
			&#039;mainmenu&#039;=&amp;gt;&#039;xxx&#039;,&lt;br /&gt;
                        &#039;leftmenu&#039;=&amp;gt;&#039;yyy&#039;,&lt;br /&gt;
			&#039;url&#039;=&amp;gt;&#039;/mymodule/pagelevel1.php&#039;,&lt;br /&gt;
			&#039;langs&#039;=&amp;gt;&#039;mylangfile&#039;,	// Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory.&lt;br /&gt;
			&#039;position&#039;=&amp;gt;100,&lt;br /&gt;
			&#039;enabled&#039;=&amp;gt;&#039;1&#039;,			// Define condition to show or hide menu entry. Use &#039;$conf-&amp;gt;mymodule-&amp;gt;enabled&#039; if entry must be visible if module is enabled.&lt;br /&gt;
			&#039;perms&#039;=&amp;gt;&#039;1&#039;,			// Use &#039;perms&#039;=&amp;gt;&#039;$user-&amp;gt;rights-&amp;gt;mymodule-&amp;gt;level1-&amp;gt;level2&#039; if you want your menu with a permission rules&lt;br /&gt;
			&#039;target&#039;=&amp;gt;&#039;&#039;,&lt;br /&gt;
			&#039;user&#039;=&amp;gt;2);				// 0=Menu for internal users,1=external users, 2=both&lt;br /&gt;
$r++;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para condicionar el acceso al menú segun los permisos, modificar la propiedad &#039;&#039;&#039;perms&#039;&#039;&#039; de la tabla. Ver el capítulo sobre permisos, un poco más abajo, para saber como realizar los permisos.&lt;br /&gt;
&lt;br /&gt;
=== Probar sus entradas de menú ===&lt;br /&gt;
Desactive y reactive su módulo bajo Dolibarr. Las entradas del menú deberían aparecer después de hacerlo (si la condición &#039;enabled&#039; está activada).&lt;br /&gt;
&lt;br /&gt;
== Definir sus propios permisos (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si quiere añadir nuevos permisos.&lt;br /&gt;
&lt;br /&gt;
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-&amp;gt;rights_class = &#039;facture&#039; para que diga:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $this-&amp;gt;rights_class = &#039;mimodulo&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A continuación, rellene la tabla $this-&amp;gt;rights con tantas entradas como permisos diferentes vaya a definir:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $this-&amp;gt;rights[$r][0] = 10001;&lt;br /&gt;
 $this-&amp;gt;rights[$r][1] = &#039;Texto por defecto de mi permiso&#039;;&lt;br /&gt;
 $this-&amp;gt;rights[$r][3] = 1;&lt;br /&gt;
 $this-&amp;gt;rights[$r][4] = &#039;accion&#039;;&lt;br /&gt;
 $this-&amp;gt;rights[$r][5] = &#039;subaccion&#039;;&lt;br /&gt;
 $r++;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En $this-&amp;gt;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ú &#039;&#039;&#039;Información del Sistema&#039;&#039;&#039; en una instalación de Dolibarr que esté funcionando. En $this-&amp;gt;rights[$r][3], introduzca 1 si este permiso se atribuye por defecto a los usuarios según son creados. En $this-&amp;gt;rights[$r][1] introduzca un texto por defecto -que será mostrado si no se encuentra traducción para su permiso en el archivo &#039;&#039;&#039;admin.lang&#039;&#039;&#039;). En $this-&amp;gt;rights[$r][4] y $this-&amp;gt;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:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 if ($user-&amp;gt;rights-&amp;gt;mimodulo-&amp;gt;accion-&amp;gt;subaccion) ...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Definir sus propios paneles (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si su módulo tiene uno o varios paneles.&lt;br /&gt;
&lt;br /&gt;
=== Defina sus paneles ===&lt;br /&gt;
Para ello, modifique las tablas $this-&amp;gt;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 &#039;&#039;&#039;htdocs/mimodulo/core/boxes&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Ejemplo:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;boxes[0][&#039;file&#039;]=&#039;mabox0.php@mimodulo&#039;&lt;br /&gt;
$this-&amp;gt;boxes[0][&#039;note&#039;]=&#039;Mi panel 0&#039;&lt;br /&gt;
 ...&lt;br /&gt;
$this-&amp;gt;boxes[n][&#039;file&#039;]=&#039;maboxn.php@mimodulo&#039;&lt;br /&gt;
$this-&amp;gt;boxes[n][&#039;note&#039;]=&#039;Mi panel n&#039;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A continuación cree los archivos &#039;&#039;&#039;htdocs/mimodulo/core/boxes/mabox0.php&#039;&#039;&#039;, &#039;&#039;&#039;htdocs/mimodulo/core/boxes/mabox1.php&#039;&#039;&#039;...  tomando como ejemplo los paneles existentes (en el directorio htdocs/core/boxes)&lt;br /&gt;
&lt;br /&gt;
=== Pruebe sus paneles en Dolibarr ===&lt;br /&gt;
Vaya al menú &#039;&#039;&#039;Inico – Configuración – Paneles&#039;&#039;&#039;. 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.&lt;br /&gt;
&lt;br /&gt;
== Definir sus propias exportaciones (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; 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)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Definir la exportación ===&lt;br /&gt;
Para ello, descomente y modifique las tablas $this-&amp;gt;export_xxx  de su archivo descriptor de módulo.&lt;br /&gt;
&lt;br /&gt;
=== Probar la exportación ===&lt;br /&gt;
Vaya al menú &amp;quot;Herramientas &amp;gt; Exportar&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Definir sus estilos CSS (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si en sus pantallas PHP utiliza clases de estilos distintas a las de los temas de Dolibarr (no recomendado).&lt;br /&gt;
&lt;br /&gt;
Esta funcionalidad todavía no es operativa en la versión 2.4., a pesar de estar ya descrita.&lt;br /&gt;
&lt;br /&gt;
=== Crear y declarar su hoja de estilos ===&lt;br /&gt;
Crear un archivo de estilos llamada &#039;&#039;&#039;mimodulo.css&#039;&#039;&#039; o &#039;&#039;&#039;mimodule.css.php&#039;&#039;&#039; y guardarla en el directorio &#039;&#039;&#039;&#039;&#039;mimodulo&#039;&#039;&#039;&#039;&#039; dentro de &#039;&#039;&#039;htdocs&#039;&#039;&#039;. Solo puede haber un archivo css propio a cada módulo.&lt;br /&gt;
Recordamos que es mejor usar los estilos ya existentes en Dolibarr (el archivo css usado por Dolibarr es el archivo &#039;&#039;&#039;themes/nomtheme/&#039;&#039;nombretema&#039;&#039;.css.php&#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
Una vez su hoja de estilos esté disponible, declárela en su archivo descriptor de módulo modificando la propiedad &#039;&#039;&#039;$this-&amp;gt;module_parts&#039;&#039;&#039;.&lt;br /&gt;
El valor a indicar debe ser la ruta URL relativa de su archivo css.&lt;br /&gt;
Por ejemplo&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;module_parts = array(&#039;css&#039; =&amp;gt; array(&#039;/mimodulo/css/mimodulo.css.php&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Probar su hoja de estilos ===&lt;br /&gt;
Desactivar y reactivar su módulo.&lt;br /&gt;
&lt;br /&gt;
Ir la página de inicio de Dolibarr. Ver el código de la página HTML.&lt;br /&gt;
&lt;br /&gt;
Debería ver en el encabezado HTML, una línea de declaración de su hoja de estilos.&lt;br /&gt;
&lt;br /&gt;
== Definir sus funciones Javascript (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuando&#039;&#039;&#039;: Si en sus pantallas en PHP utiliza funciones de Javascript no disponibles en estandard (archivo lib_head.js)&lt;br /&gt;
&lt;br /&gt;
Si en sus pantallas en PHP utiliza funciones javascript, es necesario asegurarse de que las funciones declaradas en un archivo javascript &#039;&#039;&#039;htdocs/mimodulo/js/monmodule.js&#039;&#039;&#039; sea cargado en la cabecera del head html.&lt;br /&gt;
&lt;br /&gt;
Para pedir a Dolibarr que gestione en la generación de la sección header la inclusión de uno de sus archivos javascript, es necesario proporcionar como parámetro a la función llxHeader(), al inicio de su página, la URL hacia el js a incluir.&lt;br /&gt;
&lt;br /&gt;
Ejemplo para la página /htdocs/mimodulo/mapage.php :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
require(&#039;../main.inc.php&#039;);&lt;br /&gt;
$morejs=array(&amp;quot;/mimomulo/js/monmodule.js&amp;quot;);&lt;br /&gt;
llxHeader(&#039;&#039;,&#039;Titulo&#039;,&#039;&#039;,&#039;&#039;,&#039;&#039;,&#039;&#039;,$morejs,&#039;&#039;,0,0); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ejecutar código sobre un evento Dolibarr (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; 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 &#039;&#039;&#039;disparador (triggers)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Véase también [[Interfaces Dolibarr hacia el exterior]] e [[Interfaces del Exterior hacia Dolibarr]]&lt;br /&gt;
&lt;br /&gt;
== Insertar su código usando los hooks de Dolibarr (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039;: Cuando desee cambiar o añadir otro tipo de código en un evento de negociado (véase lel capítulo anterior para esto).&lt;br /&gt;
&lt;br /&gt;
Véase la página [[El sistema Hooks]].&lt;br /&gt;
&lt;br /&gt;
== Añadir un módulo de numeración (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039;: Si quiere añadir una regla de numeración no cubierta por los módulos por defecto.&lt;br /&gt;
&lt;br /&gt;
Véase la página [[Crear un módulo de numeración]].&lt;br /&gt;
&lt;br /&gt;
== Añadir un nuevo módulo de documento (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039;: Si quiere añadir un nuevo modelo de documento.&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
== Añadir un tema (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039;: Si quiere un interface con colores personalizados.&lt;br /&gt;
&lt;br /&gt;
Véase la página [[Temas]].&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Algunas reglas de código =&lt;br /&gt;
Las reglas de código a seguir se definen en la [[Documentación Desarrolladores| Documentación para desarrolladores]], concretamente en la sección &amp;quot;Lenguaje&amp;quot; del capítulo de &amp;quot;Información General&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Utilización de MDA =&lt;br /&gt;
Un método para generar un módulo funcional desde UML se encuentra en curso de puesta a punto. Más información en la página [[UML2Dolibarr - Crear un módulo usando MDA]].&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Crear un paquete para liberar e instalar su módulo =&lt;br /&gt;
Este proceso debe ser usado para fabricar un paquete con el fin de enviarlo a la tienda oficial http://www.dolistore.com.&lt;br /&gt;
&lt;br /&gt;
También puede usarlo para distribuir fácilmente su módulo vía su propio método de distribución.&lt;br /&gt;
&lt;br /&gt;
* Vaya al directorio &#039;&#039;&#039;/build&#039;&#039;&#039; y copie el archivo &#039;&#039;&#039;makepack-dolibarrmodules.conf&#039;&#039;&#039; como &#039;&#039;&#039;makepack-mimodulo.conf&#039;&#039;&#039;. 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).&lt;br /&gt;
&lt;br /&gt;
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...)&lt;br /&gt;
* Lance el script vía Perl (necesita la versión 5.0. o superiores de Perl)&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 perl makepack-dolibarrmodule.pl&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El script le pide el nombre de su módulo, su versión mayor y menor. Se va a crear un fichero &#039;&#039;&#039;mimodulo.zip&#039;&#039;&#039;, que incluirá su módulo listo para ser liberado.&lt;br /&gt;
* La persona que reciba su módulo deberá ubicar el archivo en el directorio raíz de Dolibarr y ejecutar el comando:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 tar -xvf monmodule.zip&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 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 &amp;quot;Submit a product&amp;quot;).&lt;br /&gt;
** Si su módulo está correctamente realizado, será rápidamente validado.&lt;br /&gt;
** 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).&lt;/div&gt;</summary>
		<author><name>Nnicolashr</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Desarrollo_de_un_m%C3%B3dulo&amp;diff=35928</id>
		<title>Desarrollo de un módulo</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Desarrollo_de_un_m%C3%B3dulo&amp;diff=35928"/>
		<updated>2016-09-12T05:01:26Z</updated>

		<summary type="html">&lt;p&gt;Nnicolashr: /* Generar la clase PHP de acceso (DAO) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Básico]]&lt;br /&gt;
{{TemplateDocDesarrollo}}&lt;br /&gt;
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:&lt;br /&gt;
* Añadir nuevas tablas a la base de datos.&lt;br /&gt;
* Añadir sus propias entradas en los menús.&lt;br /&gt;
* Añadir pantallas de edición/consulta de nuevas tablas.&lt;br /&gt;
* Añadir o eliminar pestañas en las páginas de vista/edición de objetos (factura, producto, pedido, evento, etc.)&lt;br /&gt;
* Añadir exportaciones predefinidas a la función “Exportar”.&lt;br /&gt;
* Añadir variables de substitución&lt;br /&gt;
* Añadir nuevas cajas a la página de inicio.&lt;br /&gt;
* Definir nuevos permisos.&lt;br /&gt;
* Activar código automático sobre una acción particular de Dolibarr.&lt;br /&gt;
* Insertar nuestro código mediante los hooks de Dolibarr&lt;br /&gt;
* Añadir un módulo de numeración&lt;br /&gt;
* Añadir un modelo de documento&lt;br /&gt;
* Añadir un nuevo tema &lt;br /&gt;
&lt;br /&gt;
etc. Todas estas operaciones sólo están disponibles a partir de la versión 3.2 de Dolibarr.&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Crear un módulo =&lt;br /&gt;
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&lt;br /&gt;
&lt;br /&gt;
== [[File:Art.png]] Crear un descriptor de Módulo (obligatorio) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039;: Obligatorio cada vez que se desarrolla una extensión, cualquiera que sea su finalidad.&lt;br /&gt;
&lt;br /&gt;
=== Crear su descriptor ===&lt;br /&gt;
La primera fase es la de crear un fichero descriptor del módulo. Para ello:&lt;br /&gt;
* Crear el directorio &#039;&#039;&#039;/htdocs/&#039;&#039;mimodulo&#039;&#039;/core/modules&#039;&#039;&#039;. Seguidamente ir al directorio &#039;&#039;&#039;dev/skeletons&#039;&#039;&#039; y copiar el archivo modMyModule.class.php en el directorio &#039;&#039;&#039;htdocs/&#039;&#039;mimodulo&#039;&#039;/core/modules&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A continuación, modificar el contenido del archivo, reemplazando:&lt;br /&gt;
* los &amp;quot;modMyModule&amp;quot; por un valor que corresponda a la finalidad de su módulo. Este valor debe siempre comenzar por mod. &lt;br /&gt;
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.&lt;br /&gt;
* $this-&amp;gt;numero = 100000 por un número de módulo que esté libre. Ver [[List of modules id|Listado de los id de módulos]]&lt;br /&gt;
* Modificar eventualmente otras variables definidas por los desarrolladores (ver el comentario en el código del esqueleto para ver su significado)&lt;br /&gt;
* Crear el directorio /htdocs/mimodulo/ &lt;br /&gt;
Ahora su fichero descriptor está configurado.&lt;br /&gt;
&lt;br /&gt;
=== Probar su descriptor ===&lt;br /&gt;
Ejecute Dolibarr y vaya a la página &amp;quot;Configuración &amp;gt; Módulo&amp;quot;. 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-&amp;gt;special el que determina en qué pestaña se encuentra su módulo.&lt;br /&gt;
&lt;br /&gt;
== [[File:Art.png]] Árbol de un nuevo módulo ==&lt;br /&gt;
Crear un directorio &#039;mimodulo&#039; que contendrá los archivos del módulo. Este directorio debe de estar en el directorio &#039;&#039;&#039;htdocs&#039;&#039;&#039; y contendrá los siguientes subdirectorios:&lt;br /&gt;
{{TemplateModuleTreeSimple}}&lt;br /&gt;
&lt;br /&gt;
== [[File:Art.png]] Crear sus tablas SQL y la clase PHP con los métodos de acceso (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si su módulo necesita gestionar sus propios datos.&lt;br /&gt;
&lt;br /&gt;
===Crear sus ficheros .sql===&lt;br /&gt;
Si su módulo de verdad requiere administrar datos que no existen en la base de datos en la versión estándar de Dolibarr, será necesario definir ciertas tablas SQL para registrar esos datos.&lt;br /&gt;
&lt;br /&gt;
Revisa que en el descriptor de archivo (mymodule/core/modules/mymodule.class.php) la línea&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;_load_tables(&#039;/mymodule/sql/&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
esté descomentada y correctamente configurada.&lt;br /&gt;
&lt;br /&gt;
Cree un subdirectorio sql en el directorio de su módulo (por ejemplo, htdocs/mimodulo/sql), con el fin de colocar los scripts sql que va a crear. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Regla a respetar:&#039;&#039; &lt;br /&gt;
* Agregue los archivos de orden de creación de sus tablas siguiendo el principio de un fichero &#039;&#039;&#039;llx_mitabla.sql&#039;&#039; por tabla, eventualmente acompañado del archivo &#039;&#039;&#039;llx_mitabla.key.sql&#039;&#039;&#039; (ver los archivos existentes en &#039;&#039;install/mysql/tables&#039;&#039;, para tomar ejemplo). &lt;br /&gt;
* En términos de orden de gestión de datos, todos deben estar en un archivo llamado &#039;&#039;&#039;data.sql&#039;&#039;&#039; situado en la misma carpeta &#039;&#039;&#039;/mimodulo/sql/&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Ejemplo de contenido de un fichero data.sql&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
 delete from llx_const where name=&#039;MYMODULE_IT_WORKS&#039; and entity=&#039;__ENTITY__&#039;;&lt;br /&gt;
 insert into llx_const (name, value, type, note, visible, entity) values (&#039;MYMODULE_IT_WORKS&#039;,&#039;1&#039;,&#039;chaine&#039;,&#039;A constant vor my module&#039;,1,&#039;__ENTITY__&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Las órdenes SQL de los archivos deben de ser operacionales para la base de datos &#039;&#039;&#039;mysql&#039;&#039;&#039;.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Probar su archivo .sql ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Generar la clase PHP de acceso (DAO) ===&lt;br /&gt;
Una vez que sus tablas estén creadas en la base de datos, vaya al directorio &#039;&#039;&#039;dev/skeletons&#039;&#039;&#039;, copie el archivo &#039;&#039;&#039;build_class_from_table.php&#039;&#039;&#039; en el directorio sql/ de su módulo module, y ejecute el script&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 php build_class_from_table.php nombretabla&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Nota: Si el comando no funciona, intente con php-cli en lugar de php.&lt;br /&gt;
&lt;br /&gt;
Esto genera un archivo &#039;&#039;&#039;out.nombretabla.class.php&#039;&#039;&#039; que contiene la clase de gestión de la tabla “nombretabla”. En esta clase se encuentran los métodos CRUD (Create/Read/Update/Delete) ya operativos para hacer un &#039;&#039;insert&#039;&#039;, un &#039;&#039;fetch&#039;&#039; (&#039;&#039;select&#039;&#039;), un &#039;&#039;update&#039;&#039;, y un &#039;&#039;delete&#039;&#039; de una línea de la tabla. Suprima justo el &amp;quot;out&amp;quot; del nombre del archivo y póngalo en un subdirectorio de &#039;&#039;&#039;htdocs&#039;&#039;&#039; propio en su módulo (Por ejemplo en &#039;&#039;&#039;htdocs/mimodulo&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Un archivo &#039;&#039;&#039;out.nombretabla_script.php&#039;&#039;&#039; se genera igualmente y contiene un ejemplo de código para utilizar la clase para cada uno de los cuatro métodos CRUD.&lt;br /&gt;
&lt;br /&gt;
== Visualización de pestañas (opcional) ==&lt;br /&gt;
&lt;br /&gt;
=== Añadir o eliminar pestañas en las fichas entidad ===&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039; : Para añadir su propia pestaña en las pestañas estándar de una ficha entidad (factura, pedido, presupuesto, miembro...)&lt;br /&gt;
&lt;br /&gt;
Para ello, vaya al archivo descriptor del módulo creado anteriormente y modifique la tabla $this-&amp;gt;tabs:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
	// Array to add new pages in new tabs or remove existing one&lt;br /&gt;
	$this-&amp;gt;tabs = array(&#039;objecttype:+tabname1:Title1:@mymodule:/mymodule/mynewtab1.php?id=__ID__&#039;,  // To add a new tab identified by code tabname1&lt;br /&gt;
                            &#039;objecttype:+tabname2:Title2:@mymodule:/mymodule/mynewtab2.php?id=__ID__&#039;,  // To add another new tab identified by code tabname2&lt;br /&gt;
                            &#039;objecttype:-tabname&#039;);                                                     // To remove an existing tab identified by code tabname&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La tabla debe contener una lista de cadena, cada cadena representa una nueva pestaña.&lt;br /&gt;
El formato de la cadena se compone de 4 partes separadas por &amp;quot;:&amp;quot;&lt;br /&gt;
* Parte 1: El código de la entidad (objecttype) en la que debe aparecer la pestaña siendo el valor de ella misma:&lt;br /&gt;
{{TemplateModuleTabs-es}}&lt;br /&gt;
* 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.&lt;br /&gt;
* 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&lt;br /&gt;
&lt;br /&gt;
* 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.&lt;br /&gt;
&lt;br /&gt;
Para alimentar el contenido de la pestaña con los datos de la base de datos, vea el capítulo siguiente.&lt;br /&gt;
&lt;br /&gt;
=== Añadir pestañas de una ficha entidad en su propia página ===&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039; : Para mostrar las pestañas estándar de ficha entidad (producto, tercero, etc.) en su propia pestaña de una entidad.&lt;br /&gt;
&lt;br /&gt;
Hay que hacer lo siguiente :&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Incluir los archivos que definen las funciones útiles dentro de sus archivos&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para cada ficha entidad, hay que incluir dos archivos con la instrucción&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;require_once($url_fichier) ;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aquí le mostramos la lista de estos archivos (DOL_DOCUMENT_ROOT correspondiente al directorio &#039;&#039;&#039;dolibarr/htdocs/&#039;&#039;&#039;) :&lt;br /&gt;
* Entidad tercero (thirdparty) :&lt;br /&gt;
** DOL_DOCUMENT_ROOT/societe/class/societe.class.php&lt;br /&gt;
** DOL_DOCUMENT_ROOT/core/lib/company.lib.php&lt;br /&gt;
* Entidad producto (product) :&lt;br /&gt;
** DOL_DOCUMENT_ROOT/product.class.php&lt;br /&gt;
** DOL_DOCUMENT_ROOT/lib/product.lib.php&lt;br /&gt;
* Entidad factura (invoice) :&lt;br /&gt;
** DOL_DOCUMENT_ROOT/facture.class.php&lt;br /&gt;
** DOL_DOCUMENT_ROOT/lib/invoice.lib.php&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Crear y cargar el objeto a mostrar en su pestaña&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Crear el objeto de la clase deseada, y recuperar los datos del objeto a partir de la base de datos. Para ello deberá utilizar las funciones fetch() de la clase correspondiente, pasando el parámetro del indentificador del objeto que recupera desde la url (ej : /mononglet.php?id=1).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Ejemplo :&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$id=$_GET[&amp;quot;id&amp;quot;];&lt;br /&gt;
$product = new Product($db) ;&lt;br /&gt;
$result = $product-&amp;gt;fetch($id) ; //Tester $result pour vérifier que l&#039;accès à la base s&#039;est bien passé&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3. Recuperar la lista de pestañas correspondientes a la entidad seleccionada&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Usar la función XXX_prepare_head($obj), donde XXX es le nombre de la entidad, para crear una tabla que contiene las definiciones de las pestañas a mostrar. El parámetro a pasar es el objeto del que desea mostrar las pestañas.&lt;br /&gt;
&lt;br /&gt;
La tabla devuelta se compone de la siguiente manera :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$head        // Tableau des onglets&lt;br /&gt;
$head[$h]    // Élément décrivant un onglet. Il y aura autant de $h que d&#039;onglets à afficher&lt;br /&gt;
$head[$h][0] // Url de la page affichée quand on clique sur l&#039;onglet&lt;br /&gt;
$head[$h][1] // Titre de l&#039;ongLet&lt;br /&gt;
$head[$h][2] // Code de l&#039;onglet, à utiliser pour choisir quel onglet sera &#039;actif&#039; (voir paragraphe suivant)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Ejemplo :&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$head = product_prepare_head($product, $user) ; //le paramètre $user n&#039;est pas présent sur certaines fonctions&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4. Mostrar las pestañas en su pestaña&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Use la función dol_fiche_head() que muestra las pestañas contenidas en la tabla $head devuelta por XX_prepare_head().&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
dol_fiche_head($links, $active=&#039;0&#039;, $title=&#039;&#039;, $notab=0, $picto=&#039;&#039;)&lt;br /&gt;
$links  // Tableau des onglets, appelé $head plus haut.&lt;br /&gt;
$active // Onglet actif (mettre le nom de l&#039;onglet défini dans votre fichier de module, ou un nom contenu dans $head[$h][2]). Cet onglet sera mis en surbrillance&lt;br /&gt;
$title  // ?&lt;br /&gt;
$notab  // Mettre ce paramètre à 1 permet de ne pas afficher de zone bleue en dessous des onglets.&lt;br /&gt;
$picto  // Nom de l&#039;image à utiliser au début de la barre des onglet. Les choix suivant sont possibles :&lt;br /&gt;
//            product&lt;br /&gt;
//            service&lt;br /&gt;
//            company&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esta función muestra las pestañas deseadas y abre un elemento &#039;&#039;&amp;lt; div class=&amp;quot;&amp;quot; &amp;gt;&#039;&#039; 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 &#039;&#039;&amp;lt; /div &amp;gt;&#039;&#039; en el código PHP.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Nota&#039;&#039;:&lt;br /&gt;
Para más detalles, consulte la [http://www.dolibarr.fr/doxygen/ documentación Doxygen] o directamente el código de Dolibarr.&lt;br /&gt;
&lt;br /&gt;
== Crear sus páginas pantalla PHP (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si su módulo consiste en añadir funcionalidades que necesitan nuevas pantallas.&lt;br /&gt;
&lt;br /&gt;
=== Crear una página pantalla PHP ===&lt;br /&gt;
Debe crear a continuación pantallas PHP que se basen en los datos de sus tablas utilizando los esqueletos como ejemplo del directorio &#039;&#039;&#039;dev/skeletons&#039;&#039;&#039;. (Para el desarrollo de un script en línea de comandos, ver [[Desarrollo de scripts]]).&lt;br /&gt;
&lt;br /&gt;
Para crear una nueva página de usuario, cree un subdirectorio de &#039;&#039;&#039;htdocs&#039;&#039;&#039; (si es que no existe ya) propio en su módulo (En &#039;&#039;&#039;htdocs/mimodulo&#039;&#039;&#039;, por ejemplo), con el fin de ubicar en él las páginas que va a crear.&lt;br /&gt;
&lt;br /&gt;
Copie allí el archivo &#039;&#039;&#039;skeletons_page.php&#039;&#039;&#039;, que va a servir de punto de partida a su página. Modifique el archivo para que la ruta relativa de&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$res=0;&lt;br /&gt;
if (! $res &amp;amp;&amp;amp; file_exists(&amp;quot;../main.inc.php&amp;quot;)) $res=@include(&amp;quot;../main.inc.php&amp;quot;);			// to work if your module directory is into dolibarr root htdocs directory&lt;br /&gt;
if (! $res &amp;amp;&amp;amp; file_exists(&amp;quot;../../main.inc.php&amp;quot;)) $res=@include(&amp;quot;../../main.inc.php&amp;quot;);		// to work if your module directory is into a subdir of root htdocs directory&lt;br /&gt;
if (! $res) die(&amp;quot;Include of main fails&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
sea la correcta, en función de la profundidad del directorio en el que se encuentra el archivo (quitando o añadiendo &amp;quot;../&amp;quot;). Es en el &amp;quot;main&amp;quot; donde se carga el entorno técnico y las habilitaciones. Los objetos variables se posicionan ahora:&lt;br /&gt;
* $user – El objeto que contiene las características del usuario y sus derechos.&lt;br /&gt;
* $conf – El objeto que contiene la configuración de Dolibarr.&lt;br /&gt;
* $db – El objeto que contiene el gestor de conexión abierto a la base de datos.&lt;br /&gt;
* $langs – El objeto que contiene el idioma del usuario.&lt;br /&gt;
&lt;br /&gt;
* 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):&lt;br /&gt;
&#039;&#039;Exemple :&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
dol_include_once(&#039;/mimodulo/class/miclass.class.php&#039;, &#039;MiClass&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Las clases de llamadas Dolibarr utilice la siguiente sintaxis:&lt;br /&gt;
&#039;&#039;Exemple :&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
require_once DOL_DOCUMENT_ROOT.&#039;/core/class/doli.class.php&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Reemplazar partes de templates de pantalla (versión 3.3+) ===&lt;br /&gt;
Algunas partes de la pantalla de Dolibarr están aisladas en archivos de plantilla. Puede desarrollar un módulo para reemplazar una o más de estas plantillas con las suyas.&lt;br /&gt;
{{ToComplete}}&lt;br /&gt;
&lt;br /&gt;
=== Acceso a la base de datos ===&lt;br /&gt;
Si necesita realizar modificaciones en su tabla de la base de datos, utilice la clase generada más arriba.&lt;br /&gt;
&lt;br /&gt;
Si de todos modos quiere acceder a las tablas sin objeto PHP dedicado, esto es posible (por ejemplo para recuperar una lista de registros). En ese caso, piense en seguir estos ejemplos.&lt;br /&gt;
&lt;br /&gt;
Para un &#039;&#039;insert&#039;&#039;, &#039;&#039;update&#039;&#039; o &#039;&#039;delete&#039;&#039;:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $db-&amp;gt;begin();   // Debut transaction&lt;br /&gt;
 $db-&amp;gt;query(&amp;quot;Ma requete insert, update ou delete&amp;quot;);&lt;br /&gt;
 $db-&amp;gt;commit();       // Valide&lt;br /&gt;
 o $db-&amp;gt;rollback()  // Annule&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para una lectura:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $resql=$db-&amp;gt;query(&amp;quot;Ma requete select&amp;quot;);&lt;br /&gt;
 if ($resql)&lt;br /&gt;
 {&lt;br /&gt;
         $num = $db-&amp;gt;num_rows($resql);&lt;br /&gt;
         $i = 0;&lt;br /&gt;
         if ($num)&lt;br /&gt;
         {&lt;br /&gt;
                 while ($i &amp;lt; $num)&lt;br /&gt;
                 {&lt;br /&gt;
                         $obj = $db-&amp;gt;fetch_object($resql);&lt;br /&gt;
                         if ($obj)&lt;br /&gt;
                         {&lt;br /&gt;
                                 // You can use here results&lt;br /&gt;
                                 print $obj-&amp;gt;field1;&lt;br /&gt;
                                 print $obj-&amp;gt;field2;&lt;br /&gt;
                         }&lt;br /&gt;
                         $i++;&lt;br /&gt;
                 }&lt;br /&gt;
         }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Definición de estilos ===&lt;br /&gt;
Para que el aspecto de la página guarde coherencia con el tema Dolibarr, es necesario utilizar los estilos CSS de Dolibarr.&lt;br /&gt;
&lt;br /&gt;
Por ejemplo:&lt;br /&gt;
&lt;br /&gt;
* class=&amp;quot;liste_titre&amp;quot;1 en las etiquetas tr y td para una línea de título de tabla. &lt;br /&gt;
* class=”pair” o class=”impair” en las etiquetas tr y td de las líneas de datos de la tabla.&lt;br /&gt;
* class=”flat” en todos los campos en los que se teclea (input, select, textarea...)&lt;br /&gt;
* class=”button” en los objetos de tipo input type=”submit”.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Utilizar el selector de fechas de Dolibarr ===&lt;br /&gt;
Si quiere, puede beneficiarse del selector de fechas en las pantallas Dolibarr. Para ello, utilice la siguiente línea:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $form=new Form($db);&lt;br /&gt;
 $form-&amp;gt;select_date(&#039;&#039;,&#039;mykey&#039;,0,0,0,&amp;quot;myform&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La cadena &amp;quot;mikey&amp;quot; identifica el campo fecha. Hace falta introducir un valor diferente en caso de que haya varios campos. La cadena &amp;quot;myform&amp;quot; es el nombre del campo &amp;quot;FORM&amp;quot; (en el formulario, name=&amp;quot;myform&amp;quot; de la página html). La visualización de un selector de fecha debe por tanto estar integrada en un formulario html.&lt;br /&gt;
&lt;br /&gt;
Para recuperar el valor, a la herencia de POST, el comando es:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $mydate = dol_mktime(12, 0 , 0, $_POST[&#039;mykeymonth&#039;], $_POST[&#039;mykeyday&#039;], $_POST[&#039;mykeyyear&#039;]);&lt;br /&gt;
 print strftime(&#039;%A %d %B %Y&#039;, $mydate);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Definir su página de configuración (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si su módulo ofrece varias opciones parametrizables.&lt;br /&gt;
&lt;br /&gt;
=== Crear su página de edición de configuración ===&lt;br /&gt;
Si su módulo ofrece varias opciones parametrizacles, es necesario crear una página PHP para editar las opciones (que serán guardadas en la [[Table llx_const|tabla &#039;&#039;&#039;llx_const&#039;&#039;&#039;]]). Cree una página PHP llamada &#039;&#039;&#039;mimodulo_setuppage.php&#039;&#039;&#039;, que registre las opciones posibles y las ponga al día. Es necesario tomar como ejemplo una página de &#039;&#039;&#039;/admin&#039;&#039;&#039; 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 &#039;&#039;&#039;/admin&#039;&#039;&#039;. 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 &#039;&#039;&#039;/admin&#039;&#039;&#039;).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $this-&amp;gt;config_page_url = array(&amp;quot;monmodule_setupapage.php&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Probar su página ===&lt;br /&gt;
Vaya a la página &#039;&#039;&#039;Configuración &amp;gt; módulo&#039;&#039;&#039;. 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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Definir sus entradas de menú (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si ha creado páginas PHP, es necesario que estas pantallas sean accesibles desde el menú Dolibarr.&lt;br /&gt;
&lt;br /&gt;
=== Definir sus entradas de menú ===&lt;br /&gt;
Para ello, hace falta definir en el archivo descriptor de menú de tabla this-&amp;gt;menu, que declara los menús.&lt;br /&gt;
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&lt;br /&gt;
&lt;br /&gt;
He aquí un ejemplo de declaración de entradas de menú en el fichero descriptor:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Main menu entries&lt;br /&gt;
$this-&amp;gt;menu = array();			// List of menus to add&lt;br /&gt;
$r=0;&lt;br /&gt;
&lt;br /&gt;
// Add here entries to declare new menus&lt;br /&gt;
// Example to declare the Top Menu entry:&lt;br /&gt;
$this-&amp;gt;menu[$r]=array(	&#039;fk_menu&#039;=&amp;gt;0,			// Put 0 if this is a top menu&lt;br /&gt;
			&#039;type&#039;=&amp;gt;&#039;top&#039;,			// This is a Top menu entry&lt;br /&gt;
			&#039;titre&#039;=&amp;gt;&#039;MyModule top menu&#039;,&lt;br /&gt;
			&#039;mainmenu&#039;=&amp;gt;&#039;mymodule&#039;,&lt;br /&gt;
			&#039;leftmenu&#039;=&amp;gt;&#039;mymodule&#039;,&lt;br /&gt;
			&#039;url&#039;=&amp;gt;&#039;/mymodule/pagetop.php&#039;,&lt;br /&gt;
			&#039;langs&#039;=&amp;gt;&#039;mylangfile&#039;,	// Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory.&lt;br /&gt;
			&#039;position&#039;=&amp;gt;100,&lt;br /&gt;
			&#039;enabled&#039;=&amp;gt;&#039;1&#039;,			// Define condition to show or hide menu entry. Use &#039;$conf-&amp;gt;mymodule-&amp;gt;enabled&#039; if entry must be visible if module is enabled.&lt;br /&gt;
			&#039;perms&#039;=&amp;gt;&#039;1&#039;,			// Use &#039;perms&#039;=&amp;gt;&#039;$user-&amp;gt;rights-&amp;gt;mymodule-&amp;gt;level1-&amp;gt;level2&#039; if you want your menu with a permission rules&lt;br /&gt;
			&#039;target&#039;=&amp;gt;&#039;&#039;,&lt;br /&gt;
			&#039;user&#039;=&amp;gt;2);				// 0=Menu for internal users, 1=external users, 2=both&lt;br /&gt;
$r++;&lt;br /&gt;
&lt;br /&gt;
// Example to declare a Left Menu entry:&lt;br /&gt;
$this-&amp;gt;menu[$r]=array(	&#039;fk_menu&#039;=&amp;gt;&#039;fk_mainmenu=xxx&#039;,		    // Use &#039;fk_mainmenu=xxx&#039; or &#039;fk_mainmenu=xxx,fk_leftmenu=yyy&#039; where xxx is mainmenucode and yyy is a leftmenucode of parent menu&lt;br /&gt;
			&#039;type&#039;=&amp;gt;&#039;left&#039;,			        // This is a Left menu entry&lt;br /&gt;
			&#039;titre&#039;=&amp;gt;&#039;MyModule left menu 1&#039;,&lt;br /&gt;
			&#039;mainmenu&#039;=&amp;gt;&#039;xxx&#039;,&lt;br /&gt;
                        &#039;leftmenu&#039;=&amp;gt;&#039;yyy&#039;,&lt;br /&gt;
			&#039;url&#039;=&amp;gt;&#039;/mymodule/pagelevel1.php&#039;,&lt;br /&gt;
			&#039;langs&#039;=&amp;gt;&#039;mylangfile&#039;,	// Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory.&lt;br /&gt;
			&#039;position&#039;=&amp;gt;100,&lt;br /&gt;
			&#039;enabled&#039;=&amp;gt;&#039;1&#039;,			// Define condition to show or hide menu entry. Use &#039;$conf-&amp;gt;mymodule-&amp;gt;enabled&#039; if entry must be visible if module is enabled.&lt;br /&gt;
			&#039;perms&#039;=&amp;gt;&#039;1&#039;,			// Use &#039;perms&#039;=&amp;gt;&#039;$user-&amp;gt;rights-&amp;gt;mymodule-&amp;gt;level1-&amp;gt;level2&#039; if you want your menu with a permission rules&lt;br /&gt;
			&#039;target&#039;=&amp;gt;&#039;&#039;,&lt;br /&gt;
			&#039;user&#039;=&amp;gt;2);				// 0=Menu for internal users,1=external users, 2=both&lt;br /&gt;
$r++;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para condicionar el acceso al menú segun los permisos, modificar la propiedad &#039;&#039;&#039;perms&#039;&#039;&#039; de la tabla. Ver el capítulo sobre permisos, un poco más abajo, para saber como realizar los permisos.&lt;br /&gt;
&lt;br /&gt;
=== Probar sus entradas de menú ===&lt;br /&gt;
Desactive y reactive su módulo bajo Dolibarr. Las entradas del menú deberían aparecer después de hacerlo (si la condición &#039;enabled&#039; está activada).&lt;br /&gt;
&lt;br /&gt;
== Definir sus propios permisos (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si quiere añadir nuevos permisos.&lt;br /&gt;
&lt;br /&gt;
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-&amp;gt;rights_class = &#039;facture&#039; para que diga:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $this-&amp;gt;rights_class = &#039;mimodulo&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A continuación, rellene la tabla $this-&amp;gt;rights con tantas entradas como permisos diferentes vaya a definir:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $this-&amp;gt;rights[$r][0] = 10001;&lt;br /&gt;
 $this-&amp;gt;rights[$r][1] = &#039;Texto por defecto de mi permiso&#039;;&lt;br /&gt;
 $this-&amp;gt;rights[$r][3] = 1;&lt;br /&gt;
 $this-&amp;gt;rights[$r][4] = &#039;accion&#039;;&lt;br /&gt;
 $this-&amp;gt;rights[$r][5] = &#039;subaccion&#039;;&lt;br /&gt;
 $r++;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En $this-&amp;gt;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ú &#039;&#039;&#039;Información del Sistema&#039;&#039;&#039; en una instalación de Dolibarr que esté funcionando. En $this-&amp;gt;rights[$r][3], introduzca 1 si este permiso se atribuye por defecto a los usuarios según son creados. En $this-&amp;gt;rights[$r][1] introduzca un texto por defecto -que será mostrado si no se encuentra traducción para su permiso en el archivo &#039;&#039;&#039;admin.lang&#039;&#039;&#039;). En $this-&amp;gt;rights[$r][4] y $this-&amp;gt;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:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 if ($user-&amp;gt;rights-&amp;gt;mimodulo-&amp;gt;accion-&amp;gt;subaccion) ...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Definir sus propios paneles (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si su módulo tiene uno o varios paneles.&lt;br /&gt;
&lt;br /&gt;
=== Defina sus paneles ===&lt;br /&gt;
Para ello, modifique las tablas $this-&amp;gt;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 &#039;&#039;&#039;htdocs/mimodulo/core/boxes&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Ejemplo:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;boxes[0][&#039;file&#039;]=&#039;mabox0.php@mimodulo&#039;&lt;br /&gt;
$this-&amp;gt;boxes[0][&#039;note&#039;]=&#039;Mi panel 0&#039;&lt;br /&gt;
 ...&lt;br /&gt;
$this-&amp;gt;boxes[n][&#039;file&#039;]=&#039;maboxn.php@mimodulo&#039;&lt;br /&gt;
$this-&amp;gt;boxes[n][&#039;note&#039;]=&#039;Mi panel n&#039;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A continuación cree los archivos &#039;&#039;&#039;htdocs/mimodulo/core/boxes/mabox0.php&#039;&#039;&#039;, &#039;&#039;&#039;htdocs/mimodulo/core/boxes/mabox1.php&#039;&#039;&#039;...  tomando como ejemplo los paneles existentes (en el directorio htdocs/core/boxes)&lt;br /&gt;
&lt;br /&gt;
=== Pruebe sus paneles en Dolibarr ===&lt;br /&gt;
Vaya al menú &#039;&#039;&#039;Inico – Configuración – Paneles&#039;&#039;&#039;. 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.&lt;br /&gt;
&lt;br /&gt;
== Definir sus propias exportaciones (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; 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)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Definir la exportación ===&lt;br /&gt;
Para ello, descomente y modifique las tablas $this-&amp;gt;export_xxx  de su archivo descriptor de módulo.&lt;br /&gt;
&lt;br /&gt;
=== Probar la exportación ===&lt;br /&gt;
Vaya al menú &amp;quot;Herramientas &amp;gt; Exportar&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Definir sus estilos CSS (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si en sus pantallas PHP utiliza clases de estilos distintas a las de los temas de Dolibarr (no recomendado).&lt;br /&gt;
&lt;br /&gt;
Esta funcionalidad todavía no es operativa en la versión 2.4., a pesar de estar ya descrita.&lt;br /&gt;
&lt;br /&gt;
=== Crear y declarar su hoja de estilos ===&lt;br /&gt;
Crear un archivo de estilos llamada &#039;&#039;&#039;mimodulo.css&#039;&#039;&#039; o &#039;&#039;&#039;mimodule.css.php&#039;&#039;&#039; y guardarla en el directorio &#039;&#039;&#039;&#039;&#039;mimodulo&#039;&#039;&#039;&#039;&#039; dentro de &#039;&#039;&#039;htdocs&#039;&#039;&#039;. Solo puede haber un archivo css propio a cada módulo.&lt;br /&gt;
Recordamos que es mejor usar los estilos ya existentes en Dolibarr (el archivo css usado por Dolibarr es el archivo &#039;&#039;&#039;themes/nomtheme/&#039;&#039;nombretema&#039;&#039;.css.php&#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
Una vez su hoja de estilos esté disponible, declárela en su archivo descriptor de módulo modificando la propiedad &#039;&#039;&#039;$this-&amp;gt;module_parts&#039;&#039;&#039;.&lt;br /&gt;
El valor a indicar debe ser la ruta URL relativa de su archivo css.&lt;br /&gt;
Por ejemplo&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;module_parts = array(&#039;css&#039; =&amp;gt; array(&#039;/mimodulo/css/mimodulo.css.php&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Probar su hoja de estilos ===&lt;br /&gt;
Desactivar y reactivar su módulo.&lt;br /&gt;
&lt;br /&gt;
Ir la página de inicio de Dolibarr. Ver el código de la página HTML.&lt;br /&gt;
&lt;br /&gt;
Debería ver en el encabezado HTML, una línea de declaración de su hoja de estilos.&lt;br /&gt;
&lt;br /&gt;
== Definir sus funciones Javascript (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuando&#039;&#039;&#039;: Si en sus pantallas en PHP utiliza funciones de Javascript no disponibles en estandard (archivo lib_head.js)&lt;br /&gt;
&lt;br /&gt;
Si en sus pantallas en PHP utiliza funciones javascript, es necesario asegurarse de que las funciones declaradas en un archivo javascript &#039;&#039;&#039;htdocs/mimodulo/js/monmodule.js&#039;&#039;&#039; sea cargado en la cabecera del head html.&lt;br /&gt;
&lt;br /&gt;
Para pedir a Dolibarr que gestione en la generación de la sección header la inclusión de uno de sus archivos javascript, es necesario proporcionar como parámetro a la función llxHeader(), al inicio de su página, la URL hacia el js a incluir.&lt;br /&gt;
&lt;br /&gt;
Ejemplo para la página /htdocs/mimodulo/mapage.php :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
require(&#039;../main.inc.php&#039;);&lt;br /&gt;
$morejs=array(&amp;quot;/mimomulo/js/monmodule.js&amp;quot;);&lt;br /&gt;
llxHeader(&#039;&#039;,&#039;Titulo&#039;,&#039;&#039;,&#039;&#039;,&#039;&#039;,&#039;&#039;,$morejs,&#039;&#039;,0,0); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ejecutar código sobre un evento Dolibarr (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; 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 &#039;&#039;&#039;disparador (triggers)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Véase también [[Interfaces Dolibarr hacia el exterior]] e [[Interfaces del Exterior hacia Dolibarr]]&lt;br /&gt;
&lt;br /&gt;
== Insertar su código usando los hooks de Dolibarr (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039;: Cuando desee cambiar o añadir otro tipo de código en un evento de negociado (véase lel capítulo anterior para esto).&lt;br /&gt;
&lt;br /&gt;
Véase la página [[El sistema Hooks]].&lt;br /&gt;
&lt;br /&gt;
== Añadir un módulo de numeración (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039;: Si quiere añadir una regla de numeración no cubierta por los módulos por defecto.&lt;br /&gt;
&lt;br /&gt;
Véase la página [[Crear un módulo de numeración]].&lt;br /&gt;
&lt;br /&gt;
== Añadir un nuevo módulo de documento (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039;: Si quiere añadir un nuevo modelo de documento.&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
== Añadir un tema (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039;: Si quiere un interface con colores personalizados.&lt;br /&gt;
&lt;br /&gt;
Véase la página [[Temas]].&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Algunas reglas de código =&lt;br /&gt;
Las reglas de código a seguir se definen en la [[Documentación Desarrolladores| Documentación para desarrolladores]], concretamente en la sección &amp;quot;Lenguaje&amp;quot; del capítulo de &amp;quot;Información General&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Utilización de MDA =&lt;br /&gt;
Un método para generar un módulo funcional desde UML se encuentra en curso de puesta a punto. Más información en la página [[UML2Dolibarr - Crear un módulo usando MDA]].&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Crear un paquete para liberar e instalar su módulo =&lt;br /&gt;
Este proceso debe ser usado para fabricar un paquete con el fin de enviarlo a la tienda oficial http://www.dolistore.com.&lt;br /&gt;
&lt;br /&gt;
También puede usarlo para distribuir fácilmente su módulo vía su propio método de distribución.&lt;br /&gt;
&lt;br /&gt;
* Vaya al directorio &#039;&#039;&#039;/build&#039;&#039;&#039; y copie el archivo &#039;&#039;&#039;makepack-dolibarrmodules.conf&#039;&#039;&#039; como &#039;&#039;&#039;makepack-mimodulo.conf&#039;&#039;&#039;. 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).&lt;br /&gt;
&lt;br /&gt;
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...)&lt;br /&gt;
* Lance el script vía Perl (necesita la versión 5.0. o superiores de Perl)&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 perl makepack-dolibarrmodule.pl&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El script le pide el nombre de su módulo, su versión mayor y menor. Se va a crear un fichero &#039;&#039;&#039;mimodulo.zip&#039;&#039;&#039;, que incluirá su módulo listo para ser liberado.&lt;br /&gt;
* La persona que reciba su módulo deberá ubicar el archivo en el directorio raíz de Dolibarr y ejecutar el comando:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 tar -xvf monmodule.zip&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 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 &amp;quot;Submit a product&amp;quot;).&lt;br /&gt;
** Si su módulo está correctamente realizado, será rápidamente validado.&lt;br /&gt;
** 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).&lt;/div&gt;</summary>
		<author><name>Nnicolashr</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Desarrollo_de_un_m%C3%B3dulo&amp;diff=35927</id>
		<title>Desarrollo de un módulo</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Desarrollo_de_un_m%C3%B3dulo&amp;diff=35927"/>
		<updated>2016-09-12T05:00:35Z</updated>

		<summary type="html">&lt;p&gt;Nnicolashr: /* Generar la clase PHP de acceso (DAO) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Básico]]&lt;br /&gt;
{{TemplateDocDesarrollo}}&lt;br /&gt;
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:&lt;br /&gt;
* Añadir nuevas tablas a la base de datos.&lt;br /&gt;
* Añadir sus propias entradas en los menús.&lt;br /&gt;
* Añadir pantallas de edición/consulta de nuevas tablas.&lt;br /&gt;
* Añadir o eliminar pestañas en las páginas de vista/edición de objetos (factura, producto, pedido, evento, etc.)&lt;br /&gt;
* Añadir exportaciones predefinidas a la función “Exportar”.&lt;br /&gt;
* Añadir variables de substitución&lt;br /&gt;
* Añadir nuevas cajas a la página de inicio.&lt;br /&gt;
* Definir nuevos permisos.&lt;br /&gt;
* Activar código automático sobre una acción particular de Dolibarr.&lt;br /&gt;
* Insertar nuestro código mediante los hooks de Dolibarr&lt;br /&gt;
* Añadir un módulo de numeración&lt;br /&gt;
* Añadir un modelo de documento&lt;br /&gt;
* Añadir un nuevo tema &lt;br /&gt;
&lt;br /&gt;
etc. Todas estas operaciones sólo están disponibles a partir de la versión 3.2 de Dolibarr.&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Crear un módulo =&lt;br /&gt;
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&lt;br /&gt;
&lt;br /&gt;
== [[File:Art.png]] Crear un descriptor de Módulo (obligatorio) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039;: Obligatorio cada vez que se desarrolla una extensión, cualquiera que sea su finalidad.&lt;br /&gt;
&lt;br /&gt;
=== Crear su descriptor ===&lt;br /&gt;
La primera fase es la de crear un fichero descriptor del módulo. Para ello:&lt;br /&gt;
* Crear el directorio &#039;&#039;&#039;/htdocs/&#039;&#039;mimodulo&#039;&#039;/core/modules&#039;&#039;&#039;. Seguidamente ir al directorio &#039;&#039;&#039;dev/skeletons&#039;&#039;&#039; y copiar el archivo modMyModule.class.php en el directorio &#039;&#039;&#039;htdocs/&#039;&#039;mimodulo&#039;&#039;/core/modules&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A continuación, modificar el contenido del archivo, reemplazando:&lt;br /&gt;
* los &amp;quot;modMyModule&amp;quot; por un valor que corresponda a la finalidad de su módulo. Este valor debe siempre comenzar por mod. &lt;br /&gt;
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.&lt;br /&gt;
* $this-&amp;gt;numero = 100000 por un número de módulo que esté libre. Ver [[List of modules id|Listado de los id de módulos]]&lt;br /&gt;
* Modificar eventualmente otras variables definidas por los desarrolladores (ver el comentario en el código del esqueleto para ver su significado)&lt;br /&gt;
* Crear el directorio /htdocs/mimodulo/ &lt;br /&gt;
Ahora su fichero descriptor está configurado.&lt;br /&gt;
&lt;br /&gt;
=== Probar su descriptor ===&lt;br /&gt;
Ejecute Dolibarr y vaya a la página &amp;quot;Configuración &amp;gt; Módulo&amp;quot;. 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-&amp;gt;special el que determina en qué pestaña se encuentra su módulo.&lt;br /&gt;
&lt;br /&gt;
== [[File:Art.png]] Árbol de un nuevo módulo ==&lt;br /&gt;
Crear un directorio &#039;mimodulo&#039; que contendrá los archivos del módulo. Este directorio debe de estar en el directorio &#039;&#039;&#039;htdocs&#039;&#039;&#039; y contendrá los siguientes subdirectorios:&lt;br /&gt;
{{TemplateModuleTreeSimple}}&lt;br /&gt;
&lt;br /&gt;
== [[File:Art.png]] Crear sus tablas SQL y la clase PHP con los métodos de acceso (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si su módulo necesita gestionar sus propios datos.&lt;br /&gt;
&lt;br /&gt;
===Crear sus ficheros .sql===&lt;br /&gt;
Si su módulo de verdad requiere administrar datos que no existen en la base de datos en la versión estándar de Dolibarr, será necesario definir ciertas tablas SQL para registrar esos datos.&lt;br /&gt;
&lt;br /&gt;
Revisa que en el descriptor de archivo (mymodule/core/modules/mymodule.class.php) la línea&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;_load_tables(&#039;/mymodule/sql/&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
esté descomentada y correctamente configurada.&lt;br /&gt;
&lt;br /&gt;
Cree un subdirectorio sql en el directorio de su módulo (por ejemplo, htdocs/mimodulo/sql), con el fin de colocar los scripts sql que va a crear. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Regla a respetar:&#039;&#039; &lt;br /&gt;
* Agregue los archivos de orden de creación de sus tablas siguiendo el principio de un fichero &#039;&#039;&#039;llx_mitabla.sql&#039;&#039; por tabla, eventualmente acompañado del archivo &#039;&#039;&#039;llx_mitabla.key.sql&#039;&#039;&#039; (ver los archivos existentes en &#039;&#039;install/mysql/tables&#039;&#039;, para tomar ejemplo). &lt;br /&gt;
* En términos de orden de gestión de datos, todos deben estar en un archivo llamado &#039;&#039;&#039;data.sql&#039;&#039;&#039; situado en la misma carpeta &#039;&#039;&#039;/mimodulo/sql/&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Ejemplo de contenido de un fichero data.sql&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
 delete from llx_const where name=&#039;MYMODULE_IT_WORKS&#039; and entity=&#039;__ENTITY__&#039;;&lt;br /&gt;
 insert into llx_const (name, value, type, note, visible, entity) values (&#039;MYMODULE_IT_WORKS&#039;,&#039;1&#039;,&#039;chaine&#039;,&#039;A constant vor my module&#039;,1,&#039;__ENTITY__&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Las órdenes SQL de los archivos deben de ser operacionales para la base de datos &#039;&#039;&#039;mysql&#039;&#039;&#039;.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Probar su archivo .sql ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Generar la clase PHP de acceso (DAO) ===&lt;br /&gt;
Una vez que su/s tabla/s estén creadas en la base de datos, vaya al directorio &#039;&#039;&#039;dev/skeletons&#039;&#039;&#039;, copie el archivo &#039;&#039;&#039;build_class_from_table.php&#039;&#039;&#039; en la el directorio sql/ de su módulo module, y ejecute el script&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 php build_class_from_table.php nombretabla&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Nota: Si el comando no funciona, intente con php-cli en lugar de php.&lt;br /&gt;
&lt;br /&gt;
Esto genera un archivo &#039;&#039;&#039;out.nombretabla.class.php&#039;&#039;&#039; que contiene la clase de gestión de la tabla “nombretabla”. En esta clase se encuentran los métodos CRUD (Create/Read/Update/Delete) ya operativos para hacer un &#039;&#039;insert&#039;&#039;, un &#039;&#039;fetch&#039;&#039; (&#039;&#039;select&#039;&#039;), un &#039;&#039;update&#039;&#039;, y un &#039;&#039;delete&#039;&#039; de una línea de la tabla. Suprima justo el &amp;quot;out&amp;quot; del nombre del archivo y póngalo en un subdirectorio de &#039;&#039;&#039;htdocs&#039;&#039;&#039; propio en su módulo (Por ejemplo en &#039;&#039;&#039;htdocs/mimodulo&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Un archivo &#039;&#039;&#039;out.nombretabla_script.php&#039;&#039;&#039; se genera igualmente y contiene un ejemplo de código para utilizar la clase para cada uno de los cuatro métodos CRUD.&lt;br /&gt;
&lt;br /&gt;
== Visualización de pestañas (opcional) ==&lt;br /&gt;
&lt;br /&gt;
=== Añadir o eliminar pestañas en las fichas entidad ===&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039; : Para añadir su propia pestaña en las pestañas estándar de una ficha entidad (factura, pedido, presupuesto, miembro...)&lt;br /&gt;
&lt;br /&gt;
Para ello, vaya al archivo descriptor del módulo creado anteriormente y modifique la tabla $this-&amp;gt;tabs:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
	// Array to add new pages in new tabs or remove existing one&lt;br /&gt;
	$this-&amp;gt;tabs = array(&#039;objecttype:+tabname1:Title1:@mymodule:/mymodule/mynewtab1.php?id=__ID__&#039;,  // To add a new tab identified by code tabname1&lt;br /&gt;
                            &#039;objecttype:+tabname2:Title2:@mymodule:/mymodule/mynewtab2.php?id=__ID__&#039;,  // To add another new tab identified by code tabname2&lt;br /&gt;
                            &#039;objecttype:-tabname&#039;);                                                     // To remove an existing tab identified by code tabname&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La tabla debe contener una lista de cadena, cada cadena representa una nueva pestaña.&lt;br /&gt;
El formato de la cadena se compone de 4 partes separadas por &amp;quot;:&amp;quot;&lt;br /&gt;
* Parte 1: El código de la entidad (objecttype) en la que debe aparecer la pestaña siendo el valor de ella misma:&lt;br /&gt;
{{TemplateModuleTabs-es}}&lt;br /&gt;
* 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.&lt;br /&gt;
* 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&lt;br /&gt;
&lt;br /&gt;
* 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.&lt;br /&gt;
&lt;br /&gt;
Para alimentar el contenido de la pestaña con los datos de la base de datos, vea el capítulo siguiente.&lt;br /&gt;
&lt;br /&gt;
=== Añadir pestañas de una ficha entidad en su propia página ===&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039; : Para mostrar las pestañas estándar de ficha entidad (producto, tercero, etc.) en su propia pestaña de una entidad.&lt;br /&gt;
&lt;br /&gt;
Hay que hacer lo siguiente :&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Incluir los archivos que definen las funciones útiles dentro de sus archivos&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para cada ficha entidad, hay que incluir dos archivos con la instrucción&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;require_once($url_fichier) ;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aquí le mostramos la lista de estos archivos (DOL_DOCUMENT_ROOT correspondiente al directorio &#039;&#039;&#039;dolibarr/htdocs/&#039;&#039;&#039;) :&lt;br /&gt;
* Entidad tercero (thirdparty) :&lt;br /&gt;
** DOL_DOCUMENT_ROOT/societe/class/societe.class.php&lt;br /&gt;
** DOL_DOCUMENT_ROOT/core/lib/company.lib.php&lt;br /&gt;
* Entidad producto (product) :&lt;br /&gt;
** DOL_DOCUMENT_ROOT/product.class.php&lt;br /&gt;
** DOL_DOCUMENT_ROOT/lib/product.lib.php&lt;br /&gt;
* Entidad factura (invoice) :&lt;br /&gt;
** DOL_DOCUMENT_ROOT/facture.class.php&lt;br /&gt;
** DOL_DOCUMENT_ROOT/lib/invoice.lib.php&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Crear y cargar el objeto a mostrar en su pestaña&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Crear el objeto de la clase deseada, y recuperar los datos del objeto a partir de la base de datos. Para ello deberá utilizar las funciones fetch() de la clase correspondiente, pasando el parámetro del indentificador del objeto que recupera desde la url (ej : /mononglet.php?id=1).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Ejemplo :&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$id=$_GET[&amp;quot;id&amp;quot;];&lt;br /&gt;
$product = new Product($db) ;&lt;br /&gt;
$result = $product-&amp;gt;fetch($id) ; //Tester $result pour vérifier que l&#039;accès à la base s&#039;est bien passé&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3. Recuperar la lista de pestañas correspondientes a la entidad seleccionada&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Usar la función XXX_prepare_head($obj), donde XXX es le nombre de la entidad, para crear una tabla que contiene las definiciones de las pestañas a mostrar. El parámetro a pasar es el objeto del que desea mostrar las pestañas.&lt;br /&gt;
&lt;br /&gt;
La tabla devuelta se compone de la siguiente manera :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$head        // Tableau des onglets&lt;br /&gt;
$head[$h]    // Élément décrivant un onglet. Il y aura autant de $h que d&#039;onglets à afficher&lt;br /&gt;
$head[$h][0] // Url de la page affichée quand on clique sur l&#039;onglet&lt;br /&gt;
$head[$h][1] // Titre de l&#039;ongLet&lt;br /&gt;
$head[$h][2] // Code de l&#039;onglet, à utiliser pour choisir quel onglet sera &#039;actif&#039; (voir paragraphe suivant)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Ejemplo :&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$head = product_prepare_head($product, $user) ; //le paramètre $user n&#039;est pas présent sur certaines fonctions&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4. Mostrar las pestañas en su pestaña&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Use la función dol_fiche_head() que muestra las pestañas contenidas en la tabla $head devuelta por XX_prepare_head().&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
dol_fiche_head($links, $active=&#039;0&#039;, $title=&#039;&#039;, $notab=0, $picto=&#039;&#039;)&lt;br /&gt;
$links  // Tableau des onglets, appelé $head plus haut.&lt;br /&gt;
$active // Onglet actif (mettre le nom de l&#039;onglet défini dans votre fichier de module, ou un nom contenu dans $head[$h][2]). Cet onglet sera mis en surbrillance&lt;br /&gt;
$title  // ?&lt;br /&gt;
$notab  // Mettre ce paramètre à 1 permet de ne pas afficher de zone bleue en dessous des onglets.&lt;br /&gt;
$picto  // Nom de l&#039;image à utiliser au début de la barre des onglet. Les choix suivant sont possibles :&lt;br /&gt;
//            product&lt;br /&gt;
//            service&lt;br /&gt;
//            company&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esta función muestra las pestañas deseadas y abre un elemento &#039;&#039;&amp;lt; div class=&amp;quot;&amp;quot; &amp;gt;&#039;&#039; 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 &#039;&#039;&amp;lt; /div &amp;gt;&#039;&#039; en el código PHP.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Nota&#039;&#039;:&lt;br /&gt;
Para más detalles, consulte la [http://www.dolibarr.fr/doxygen/ documentación Doxygen] o directamente el código de Dolibarr.&lt;br /&gt;
&lt;br /&gt;
== Crear sus páginas pantalla PHP (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si su módulo consiste en añadir funcionalidades que necesitan nuevas pantallas.&lt;br /&gt;
&lt;br /&gt;
=== Crear una página pantalla PHP ===&lt;br /&gt;
Debe crear a continuación pantallas PHP que se basen en los datos de sus tablas utilizando los esqueletos como ejemplo del directorio &#039;&#039;&#039;dev/skeletons&#039;&#039;&#039;. (Para el desarrollo de un script en línea de comandos, ver [[Desarrollo de scripts]]).&lt;br /&gt;
&lt;br /&gt;
Para crear una nueva página de usuario, cree un subdirectorio de &#039;&#039;&#039;htdocs&#039;&#039;&#039; (si es que no existe ya) propio en su módulo (En &#039;&#039;&#039;htdocs/mimodulo&#039;&#039;&#039;, por ejemplo), con el fin de ubicar en él las páginas que va a crear.&lt;br /&gt;
&lt;br /&gt;
Copie allí el archivo &#039;&#039;&#039;skeletons_page.php&#039;&#039;&#039;, que va a servir de punto de partida a su página. Modifique el archivo para que la ruta relativa de&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$res=0;&lt;br /&gt;
if (! $res &amp;amp;&amp;amp; file_exists(&amp;quot;../main.inc.php&amp;quot;)) $res=@include(&amp;quot;../main.inc.php&amp;quot;);			// to work if your module directory is into dolibarr root htdocs directory&lt;br /&gt;
if (! $res &amp;amp;&amp;amp; file_exists(&amp;quot;../../main.inc.php&amp;quot;)) $res=@include(&amp;quot;../../main.inc.php&amp;quot;);		// to work if your module directory is into a subdir of root htdocs directory&lt;br /&gt;
if (! $res) die(&amp;quot;Include of main fails&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
sea la correcta, en función de la profundidad del directorio en el que se encuentra el archivo (quitando o añadiendo &amp;quot;../&amp;quot;). Es en el &amp;quot;main&amp;quot; donde se carga el entorno técnico y las habilitaciones. Los objetos variables se posicionan ahora:&lt;br /&gt;
* $user – El objeto que contiene las características del usuario y sus derechos.&lt;br /&gt;
* $conf – El objeto que contiene la configuración de Dolibarr.&lt;br /&gt;
* $db – El objeto que contiene el gestor de conexión abierto a la base de datos.&lt;br /&gt;
* $langs – El objeto que contiene el idioma del usuario.&lt;br /&gt;
&lt;br /&gt;
* 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):&lt;br /&gt;
&#039;&#039;Exemple :&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
dol_include_once(&#039;/mimodulo/class/miclass.class.php&#039;, &#039;MiClass&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Las clases de llamadas Dolibarr utilice la siguiente sintaxis:&lt;br /&gt;
&#039;&#039;Exemple :&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
require_once DOL_DOCUMENT_ROOT.&#039;/core/class/doli.class.php&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Reemplazar partes de templates de pantalla (versión 3.3+) ===&lt;br /&gt;
Algunas partes de la pantalla de Dolibarr están aisladas en archivos de plantilla. Puede desarrollar un módulo para reemplazar una o más de estas plantillas con las suyas.&lt;br /&gt;
{{ToComplete}}&lt;br /&gt;
&lt;br /&gt;
=== Acceso a la base de datos ===&lt;br /&gt;
Si necesita realizar modificaciones en su tabla de la base de datos, utilice la clase generada más arriba.&lt;br /&gt;
&lt;br /&gt;
Si de todos modos quiere acceder a las tablas sin objeto PHP dedicado, esto es posible (por ejemplo para recuperar una lista de registros). En ese caso, piense en seguir estos ejemplos.&lt;br /&gt;
&lt;br /&gt;
Para un &#039;&#039;insert&#039;&#039;, &#039;&#039;update&#039;&#039; o &#039;&#039;delete&#039;&#039;:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $db-&amp;gt;begin();   // Debut transaction&lt;br /&gt;
 $db-&amp;gt;query(&amp;quot;Ma requete insert, update ou delete&amp;quot;);&lt;br /&gt;
 $db-&amp;gt;commit();       // Valide&lt;br /&gt;
 o $db-&amp;gt;rollback()  // Annule&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para una lectura:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $resql=$db-&amp;gt;query(&amp;quot;Ma requete select&amp;quot;);&lt;br /&gt;
 if ($resql)&lt;br /&gt;
 {&lt;br /&gt;
         $num = $db-&amp;gt;num_rows($resql);&lt;br /&gt;
         $i = 0;&lt;br /&gt;
         if ($num)&lt;br /&gt;
         {&lt;br /&gt;
                 while ($i &amp;lt; $num)&lt;br /&gt;
                 {&lt;br /&gt;
                         $obj = $db-&amp;gt;fetch_object($resql);&lt;br /&gt;
                         if ($obj)&lt;br /&gt;
                         {&lt;br /&gt;
                                 // You can use here results&lt;br /&gt;
                                 print $obj-&amp;gt;field1;&lt;br /&gt;
                                 print $obj-&amp;gt;field2;&lt;br /&gt;
                         }&lt;br /&gt;
                         $i++;&lt;br /&gt;
                 }&lt;br /&gt;
         }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Definición de estilos ===&lt;br /&gt;
Para que el aspecto de la página guarde coherencia con el tema Dolibarr, es necesario utilizar los estilos CSS de Dolibarr.&lt;br /&gt;
&lt;br /&gt;
Por ejemplo:&lt;br /&gt;
&lt;br /&gt;
* class=&amp;quot;liste_titre&amp;quot;1 en las etiquetas tr y td para una línea de título de tabla. &lt;br /&gt;
* class=”pair” o class=”impair” en las etiquetas tr y td de las líneas de datos de la tabla.&lt;br /&gt;
* class=”flat” en todos los campos en los que se teclea (input, select, textarea...)&lt;br /&gt;
* class=”button” en los objetos de tipo input type=”submit”.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Utilizar el selector de fechas de Dolibarr ===&lt;br /&gt;
Si quiere, puede beneficiarse del selector de fechas en las pantallas Dolibarr. Para ello, utilice la siguiente línea:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $form=new Form($db);&lt;br /&gt;
 $form-&amp;gt;select_date(&#039;&#039;,&#039;mykey&#039;,0,0,0,&amp;quot;myform&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La cadena &amp;quot;mikey&amp;quot; identifica el campo fecha. Hace falta introducir un valor diferente en caso de que haya varios campos. La cadena &amp;quot;myform&amp;quot; es el nombre del campo &amp;quot;FORM&amp;quot; (en el formulario, name=&amp;quot;myform&amp;quot; de la página html). La visualización de un selector de fecha debe por tanto estar integrada en un formulario html.&lt;br /&gt;
&lt;br /&gt;
Para recuperar el valor, a la herencia de POST, el comando es:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $mydate = dol_mktime(12, 0 , 0, $_POST[&#039;mykeymonth&#039;], $_POST[&#039;mykeyday&#039;], $_POST[&#039;mykeyyear&#039;]);&lt;br /&gt;
 print strftime(&#039;%A %d %B %Y&#039;, $mydate);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Definir su página de configuración (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si su módulo ofrece varias opciones parametrizables.&lt;br /&gt;
&lt;br /&gt;
=== Crear su página de edición de configuración ===&lt;br /&gt;
Si su módulo ofrece varias opciones parametrizacles, es necesario crear una página PHP para editar las opciones (que serán guardadas en la [[Table llx_const|tabla &#039;&#039;&#039;llx_const&#039;&#039;&#039;]]). Cree una página PHP llamada &#039;&#039;&#039;mimodulo_setuppage.php&#039;&#039;&#039;, que registre las opciones posibles y las ponga al día. Es necesario tomar como ejemplo una página de &#039;&#039;&#039;/admin&#039;&#039;&#039; 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 &#039;&#039;&#039;/admin&#039;&#039;&#039;. 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 &#039;&#039;&#039;/admin&#039;&#039;&#039;).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $this-&amp;gt;config_page_url = array(&amp;quot;monmodule_setupapage.php&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Probar su página ===&lt;br /&gt;
Vaya a la página &#039;&#039;&#039;Configuración &amp;gt; módulo&#039;&#039;&#039;. 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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Definir sus entradas de menú (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si ha creado páginas PHP, es necesario que estas pantallas sean accesibles desde el menú Dolibarr.&lt;br /&gt;
&lt;br /&gt;
=== Definir sus entradas de menú ===&lt;br /&gt;
Para ello, hace falta definir en el archivo descriptor de menú de tabla this-&amp;gt;menu, que declara los menús.&lt;br /&gt;
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&lt;br /&gt;
&lt;br /&gt;
He aquí un ejemplo de declaración de entradas de menú en el fichero descriptor:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Main menu entries&lt;br /&gt;
$this-&amp;gt;menu = array();			// List of menus to add&lt;br /&gt;
$r=0;&lt;br /&gt;
&lt;br /&gt;
// Add here entries to declare new menus&lt;br /&gt;
// Example to declare the Top Menu entry:&lt;br /&gt;
$this-&amp;gt;menu[$r]=array(	&#039;fk_menu&#039;=&amp;gt;0,			// Put 0 if this is a top menu&lt;br /&gt;
			&#039;type&#039;=&amp;gt;&#039;top&#039;,			// This is a Top menu entry&lt;br /&gt;
			&#039;titre&#039;=&amp;gt;&#039;MyModule top menu&#039;,&lt;br /&gt;
			&#039;mainmenu&#039;=&amp;gt;&#039;mymodule&#039;,&lt;br /&gt;
			&#039;leftmenu&#039;=&amp;gt;&#039;mymodule&#039;,&lt;br /&gt;
			&#039;url&#039;=&amp;gt;&#039;/mymodule/pagetop.php&#039;,&lt;br /&gt;
			&#039;langs&#039;=&amp;gt;&#039;mylangfile&#039;,	// Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory.&lt;br /&gt;
			&#039;position&#039;=&amp;gt;100,&lt;br /&gt;
			&#039;enabled&#039;=&amp;gt;&#039;1&#039;,			// Define condition to show or hide menu entry. Use &#039;$conf-&amp;gt;mymodule-&amp;gt;enabled&#039; if entry must be visible if module is enabled.&lt;br /&gt;
			&#039;perms&#039;=&amp;gt;&#039;1&#039;,			// Use &#039;perms&#039;=&amp;gt;&#039;$user-&amp;gt;rights-&amp;gt;mymodule-&amp;gt;level1-&amp;gt;level2&#039; if you want your menu with a permission rules&lt;br /&gt;
			&#039;target&#039;=&amp;gt;&#039;&#039;,&lt;br /&gt;
			&#039;user&#039;=&amp;gt;2);				// 0=Menu for internal users, 1=external users, 2=both&lt;br /&gt;
$r++;&lt;br /&gt;
&lt;br /&gt;
// Example to declare a Left Menu entry:&lt;br /&gt;
$this-&amp;gt;menu[$r]=array(	&#039;fk_menu&#039;=&amp;gt;&#039;fk_mainmenu=xxx&#039;,		    // Use &#039;fk_mainmenu=xxx&#039; or &#039;fk_mainmenu=xxx,fk_leftmenu=yyy&#039; where xxx is mainmenucode and yyy is a leftmenucode of parent menu&lt;br /&gt;
			&#039;type&#039;=&amp;gt;&#039;left&#039;,			        // This is a Left menu entry&lt;br /&gt;
			&#039;titre&#039;=&amp;gt;&#039;MyModule left menu 1&#039;,&lt;br /&gt;
			&#039;mainmenu&#039;=&amp;gt;&#039;xxx&#039;,&lt;br /&gt;
                        &#039;leftmenu&#039;=&amp;gt;&#039;yyy&#039;,&lt;br /&gt;
			&#039;url&#039;=&amp;gt;&#039;/mymodule/pagelevel1.php&#039;,&lt;br /&gt;
			&#039;langs&#039;=&amp;gt;&#039;mylangfile&#039;,	// Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory.&lt;br /&gt;
			&#039;position&#039;=&amp;gt;100,&lt;br /&gt;
			&#039;enabled&#039;=&amp;gt;&#039;1&#039;,			// Define condition to show or hide menu entry. Use &#039;$conf-&amp;gt;mymodule-&amp;gt;enabled&#039; if entry must be visible if module is enabled.&lt;br /&gt;
			&#039;perms&#039;=&amp;gt;&#039;1&#039;,			// Use &#039;perms&#039;=&amp;gt;&#039;$user-&amp;gt;rights-&amp;gt;mymodule-&amp;gt;level1-&amp;gt;level2&#039; if you want your menu with a permission rules&lt;br /&gt;
			&#039;target&#039;=&amp;gt;&#039;&#039;,&lt;br /&gt;
			&#039;user&#039;=&amp;gt;2);				// 0=Menu for internal users,1=external users, 2=both&lt;br /&gt;
$r++;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para condicionar el acceso al menú segun los permisos, modificar la propiedad &#039;&#039;&#039;perms&#039;&#039;&#039; de la tabla. Ver el capítulo sobre permisos, un poco más abajo, para saber como realizar los permisos.&lt;br /&gt;
&lt;br /&gt;
=== Probar sus entradas de menú ===&lt;br /&gt;
Desactive y reactive su módulo bajo Dolibarr. Las entradas del menú deberían aparecer después de hacerlo (si la condición &#039;enabled&#039; está activada).&lt;br /&gt;
&lt;br /&gt;
== Definir sus propios permisos (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si quiere añadir nuevos permisos.&lt;br /&gt;
&lt;br /&gt;
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-&amp;gt;rights_class = &#039;facture&#039; para que diga:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $this-&amp;gt;rights_class = &#039;mimodulo&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A continuación, rellene la tabla $this-&amp;gt;rights con tantas entradas como permisos diferentes vaya a definir:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $this-&amp;gt;rights[$r][0] = 10001;&lt;br /&gt;
 $this-&amp;gt;rights[$r][1] = &#039;Texto por defecto de mi permiso&#039;;&lt;br /&gt;
 $this-&amp;gt;rights[$r][3] = 1;&lt;br /&gt;
 $this-&amp;gt;rights[$r][4] = &#039;accion&#039;;&lt;br /&gt;
 $this-&amp;gt;rights[$r][5] = &#039;subaccion&#039;;&lt;br /&gt;
 $r++;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En $this-&amp;gt;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ú &#039;&#039;&#039;Información del Sistema&#039;&#039;&#039; en una instalación de Dolibarr que esté funcionando. En $this-&amp;gt;rights[$r][3], introduzca 1 si este permiso se atribuye por defecto a los usuarios según son creados. En $this-&amp;gt;rights[$r][1] introduzca un texto por defecto -que será mostrado si no se encuentra traducción para su permiso en el archivo &#039;&#039;&#039;admin.lang&#039;&#039;&#039;). En $this-&amp;gt;rights[$r][4] y $this-&amp;gt;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:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 if ($user-&amp;gt;rights-&amp;gt;mimodulo-&amp;gt;accion-&amp;gt;subaccion) ...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Definir sus propios paneles (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si su módulo tiene uno o varios paneles.&lt;br /&gt;
&lt;br /&gt;
=== Defina sus paneles ===&lt;br /&gt;
Para ello, modifique las tablas $this-&amp;gt;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 &#039;&#039;&#039;htdocs/mimodulo/core/boxes&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Ejemplo:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;boxes[0][&#039;file&#039;]=&#039;mabox0.php@mimodulo&#039;&lt;br /&gt;
$this-&amp;gt;boxes[0][&#039;note&#039;]=&#039;Mi panel 0&#039;&lt;br /&gt;
 ...&lt;br /&gt;
$this-&amp;gt;boxes[n][&#039;file&#039;]=&#039;maboxn.php@mimodulo&#039;&lt;br /&gt;
$this-&amp;gt;boxes[n][&#039;note&#039;]=&#039;Mi panel n&#039;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A continuación cree los archivos &#039;&#039;&#039;htdocs/mimodulo/core/boxes/mabox0.php&#039;&#039;&#039;, &#039;&#039;&#039;htdocs/mimodulo/core/boxes/mabox1.php&#039;&#039;&#039;...  tomando como ejemplo los paneles existentes (en el directorio htdocs/core/boxes)&lt;br /&gt;
&lt;br /&gt;
=== Pruebe sus paneles en Dolibarr ===&lt;br /&gt;
Vaya al menú &#039;&#039;&#039;Inico – Configuración – Paneles&#039;&#039;&#039;. 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.&lt;br /&gt;
&lt;br /&gt;
== Definir sus propias exportaciones (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; 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)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Definir la exportación ===&lt;br /&gt;
Para ello, descomente y modifique las tablas $this-&amp;gt;export_xxx  de su archivo descriptor de módulo.&lt;br /&gt;
&lt;br /&gt;
=== Probar la exportación ===&lt;br /&gt;
Vaya al menú &amp;quot;Herramientas &amp;gt; Exportar&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Definir sus estilos CSS (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si en sus pantallas PHP utiliza clases de estilos distintas a las de los temas de Dolibarr (no recomendado).&lt;br /&gt;
&lt;br /&gt;
Esta funcionalidad todavía no es operativa en la versión 2.4., a pesar de estar ya descrita.&lt;br /&gt;
&lt;br /&gt;
=== Crear y declarar su hoja de estilos ===&lt;br /&gt;
Crear un archivo de estilos llamada &#039;&#039;&#039;mimodulo.css&#039;&#039;&#039; o &#039;&#039;&#039;mimodule.css.php&#039;&#039;&#039; y guardarla en el directorio &#039;&#039;&#039;&#039;&#039;mimodulo&#039;&#039;&#039;&#039;&#039; dentro de &#039;&#039;&#039;htdocs&#039;&#039;&#039;. Solo puede haber un archivo css propio a cada módulo.&lt;br /&gt;
Recordamos que es mejor usar los estilos ya existentes en Dolibarr (el archivo css usado por Dolibarr es el archivo &#039;&#039;&#039;themes/nomtheme/&#039;&#039;nombretema&#039;&#039;.css.php&#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
Una vez su hoja de estilos esté disponible, declárela en su archivo descriptor de módulo modificando la propiedad &#039;&#039;&#039;$this-&amp;gt;module_parts&#039;&#039;&#039;.&lt;br /&gt;
El valor a indicar debe ser la ruta URL relativa de su archivo css.&lt;br /&gt;
Por ejemplo&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;module_parts = array(&#039;css&#039; =&amp;gt; array(&#039;/mimodulo/css/mimodulo.css.php&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Probar su hoja de estilos ===&lt;br /&gt;
Desactivar y reactivar su módulo.&lt;br /&gt;
&lt;br /&gt;
Ir la página de inicio de Dolibarr. Ver el código de la página HTML.&lt;br /&gt;
&lt;br /&gt;
Debería ver en el encabezado HTML, una línea de declaración de su hoja de estilos.&lt;br /&gt;
&lt;br /&gt;
== Definir sus funciones Javascript (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuando&#039;&#039;&#039;: Si en sus pantallas en PHP utiliza funciones de Javascript no disponibles en estandard (archivo lib_head.js)&lt;br /&gt;
&lt;br /&gt;
Si en sus pantallas en PHP utiliza funciones javascript, es necesario asegurarse de que las funciones declaradas en un archivo javascript &#039;&#039;&#039;htdocs/mimodulo/js/monmodule.js&#039;&#039;&#039; sea cargado en la cabecera del head html.&lt;br /&gt;
&lt;br /&gt;
Para pedir a Dolibarr que gestione en la generación de la sección header la inclusión de uno de sus archivos javascript, es necesario proporcionar como parámetro a la función llxHeader(), al inicio de su página, la URL hacia el js a incluir.&lt;br /&gt;
&lt;br /&gt;
Ejemplo para la página /htdocs/mimodulo/mapage.php :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
require(&#039;../main.inc.php&#039;);&lt;br /&gt;
$morejs=array(&amp;quot;/mimomulo/js/monmodule.js&amp;quot;);&lt;br /&gt;
llxHeader(&#039;&#039;,&#039;Titulo&#039;,&#039;&#039;,&#039;&#039;,&#039;&#039;,&#039;&#039;,$morejs,&#039;&#039;,0,0); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ejecutar código sobre un evento Dolibarr (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; 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 &#039;&#039;&#039;disparador (triggers)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Véase también [[Interfaces Dolibarr hacia el exterior]] e [[Interfaces del Exterior hacia Dolibarr]]&lt;br /&gt;
&lt;br /&gt;
== Insertar su código usando los hooks de Dolibarr (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039;: Cuando desee cambiar o añadir otro tipo de código en un evento de negociado (véase lel capítulo anterior para esto).&lt;br /&gt;
&lt;br /&gt;
Véase la página [[El sistema Hooks]].&lt;br /&gt;
&lt;br /&gt;
== Añadir un módulo de numeración (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039;: Si quiere añadir una regla de numeración no cubierta por los módulos por defecto.&lt;br /&gt;
&lt;br /&gt;
Véase la página [[Crear un módulo de numeración]].&lt;br /&gt;
&lt;br /&gt;
== Añadir un nuevo módulo de documento (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039;: Si quiere añadir un nuevo modelo de documento.&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
== Añadir un tema (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039;: Si quiere un interface con colores personalizados.&lt;br /&gt;
&lt;br /&gt;
Véase la página [[Temas]].&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Algunas reglas de código =&lt;br /&gt;
Las reglas de código a seguir se definen en la [[Documentación Desarrolladores| Documentación para desarrolladores]], concretamente en la sección &amp;quot;Lenguaje&amp;quot; del capítulo de &amp;quot;Información General&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Utilización de MDA =&lt;br /&gt;
Un método para generar un módulo funcional desde UML se encuentra en curso de puesta a punto. Más información en la página [[UML2Dolibarr - Crear un módulo usando MDA]].&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Crear un paquete para liberar e instalar su módulo =&lt;br /&gt;
Este proceso debe ser usado para fabricar un paquete con el fin de enviarlo a la tienda oficial http://www.dolistore.com.&lt;br /&gt;
&lt;br /&gt;
También puede usarlo para distribuir fácilmente su módulo vía su propio método de distribución.&lt;br /&gt;
&lt;br /&gt;
* Vaya al directorio &#039;&#039;&#039;/build&#039;&#039;&#039; y copie el archivo &#039;&#039;&#039;makepack-dolibarrmodules.conf&#039;&#039;&#039; como &#039;&#039;&#039;makepack-mimodulo.conf&#039;&#039;&#039;. 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).&lt;br /&gt;
&lt;br /&gt;
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...)&lt;br /&gt;
* Lance el script vía Perl (necesita la versión 5.0. o superiores de Perl)&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 perl makepack-dolibarrmodule.pl&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El script le pide el nombre de su módulo, su versión mayor y menor. Se va a crear un fichero &#039;&#039;&#039;mimodulo.zip&#039;&#039;&#039;, que incluirá su módulo listo para ser liberado.&lt;br /&gt;
* La persona que reciba su módulo deberá ubicar el archivo en el directorio raíz de Dolibarr y ejecutar el comando:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 tar -xvf monmodule.zip&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 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 &amp;quot;Submit a product&amp;quot;).&lt;br /&gt;
** Si su módulo está correctamente realizado, será rápidamente validado.&lt;br /&gt;
** 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).&lt;/div&gt;</summary>
		<author><name>Nnicolashr</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Desarrollo_de_un_m%C3%B3dulo&amp;diff=35920</id>
		<title>Desarrollo de un módulo</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Desarrollo_de_un_m%C3%B3dulo&amp;diff=35920"/>
		<updated>2016-09-10T01:48:59Z</updated>

		<summary type="html">&lt;p&gt;Nnicolashr: /* Crear su descriptor */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Básico]]&lt;br /&gt;
{{TemplateDocDesarrollo}}&lt;br /&gt;
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:&lt;br /&gt;
* Añadir nuevas tablas a la base de datos.&lt;br /&gt;
* Añadir sus propias entradas en los menús.&lt;br /&gt;
* Añadir pantallas de edición/consulta de nuevas tablas.&lt;br /&gt;
* Añadir o eliminar pestañas en las páginas de vista/edición de objetos (factura, producto, pedido, evento, etc.)&lt;br /&gt;
* Añadir exportaciones predefinidas a la función “Exportar”.&lt;br /&gt;
* Añadir variables de substitución&lt;br /&gt;
* Añadir nuevas cajas a la página de inicio.&lt;br /&gt;
* Definir nuevos permisos.&lt;br /&gt;
* Activar código automático sobre una acción particular de Dolibarr.&lt;br /&gt;
* Insertar nuestro código mediante los hooks de Dolibarr&lt;br /&gt;
* Añadir un módulo de numeración&lt;br /&gt;
* Añadir un modelo de documento&lt;br /&gt;
* Añadir un nuevo tema &lt;br /&gt;
&lt;br /&gt;
etc. Todas estas operaciones sólo están disponibles a partir de la versión 3.2 de Dolibarr.&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Crear un módulo =&lt;br /&gt;
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&lt;br /&gt;
&lt;br /&gt;
== [[File:Art.png]] Crear un descriptor de Módulo (obligatorio) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039;: Obligatorio cada vez que se desarrolla una extensión, cualquiera que sea su finalidad.&lt;br /&gt;
&lt;br /&gt;
=== Crear su descriptor ===&lt;br /&gt;
La primera fase es la de crear un fichero descriptor del módulo. Para ello:&lt;br /&gt;
* Crear el directorio &#039;&#039;&#039;/htdocs/&#039;&#039;mimodulo&#039;&#039;/core/modules&#039;&#039;&#039;. Seguidamente ir al directorio &#039;&#039;&#039;dev/skeletons&#039;&#039;&#039; y copiar el archivo modMyModule.class.php en el directorio &#039;&#039;&#039;htdocs/&#039;&#039;mimodulo&#039;&#039;/core/modules&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A continuación, modificar el contenido del archivo, reemplazando:&lt;br /&gt;
* los &amp;quot;modMyModule&amp;quot; por un valor que corresponda a la finalidad de su módulo. Este valor debe siempre comenzar por mod. &lt;br /&gt;
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.&lt;br /&gt;
* $this-&amp;gt;numero = 100000 por un número de módulo que esté libre. Ver [[List of modules id|Listado de los id de módulos]]&lt;br /&gt;
* Modificar eventualmente otras variables definidas por los desarrolladores (ver el comentario en el código del esqueleto para ver su significado)&lt;br /&gt;
* Crear el directorio /htdocs/mimodulo/ &lt;br /&gt;
Ahora su fichero descriptor está configurado.&lt;br /&gt;
&lt;br /&gt;
=== Probar su descriptor ===&lt;br /&gt;
Ejecute Dolibarr y vaya a la página &amp;quot;Configuración &amp;gt; Módulo&amp;quot;. 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-&amp;gt;special el que determina en qué pestaña se encuentra su módulo.&lt;br /&gt;
&lt;br /&gt;
== [[File:Art.png]] Árbol de un nuevo módulo ==&lt;br /&gt;
Crear un directorio &#039;mimodulo&#039; que contendrá los archivos del módulo. Este directorio debe de estar en el directorio &#039;&#039;&#039;htdocs&#039;&#039;&#039; y contendrá los siguientes subdirectorios:&lt;br /&gt;
{{TemplateModuleTreeSimple}}&lt;br /&gt;
&lt;br /&gt;
== [[File:Art.png]] Crear sus tablas SQL y la clase PHP con los métodos de acceso (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si su módulo necesita gestionar sus propios datos.&lt;br /&gt;
&lt;br /&gt;
===Crear sus ficheros .sql===&lt;br /&gt;
Si su módulo de verdad requiere administrar datos que no existen en la base de datos en la versión estándar de Dolibarr, será necesario definir ciertas tablas SQL para registrar esos datos.&lt;br /&gt;
&lt;br /&gt;
Revisa que en el descriptor de archivo (mymodule/core/modules/mymodule.class.php) la línea&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;_load_tables(&#039;/mymodule/sql/&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
esté descomentada y correctamente configurada.&lt;br /&gt;
&lt;br /&gt;
Cree un subdirectorio sql en el directorio de su módulo (por ejemplo, htdocs/mimodulo/sql), con el fin de colocar los scripts sql que va a crear. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Regla a respetar:&#039;&#039; &lt;br /&gt;
* Agregue los archivos de orden de creación de sus tablas siguiendo el principio de un fichero &#039;&#039;&#039;llx_mitabla.sql&#039;&#039; por tabla, eventualmente acompañado del archivo &#039;&#039;&#039;llx_mitabla.key.sql&#039;&#039;&#039; (ver los archivos existentes en &#039;&#039;install/mysql/tables&#039;&#039;, para tomar ejemplo). &lt;br /&gt;
* En términos de orden de gestión de datos, todos deben estar en un archivo llamado &#039;&#039;&#039;data.sql&#039;&#039;&#039; situado en la misma carpeta &#039;&#039;&#039;/mimodulo/sql/&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Ejemplo de contenido de un fichero data.sql&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
 delete from llx_const where name=&#039;MYMODULE_IT_WORKS&#039; and entity=&#039;__ENTITY__&#039;;&lt;br /&gt;
 insert into llx_const (name, value, type, note, visible, entity) values (&#039;MYMODULE_IT_WORKS&#039;,&#039;1&#039;,&#039;chaine&#039;,&#039;A constant vor my module&#039;,1,&#039;__ENTITY__&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Las órdenes SQL de los archivos deben de ser operacionales para la base de datos &#039;&#039;&#039;mysql&#039;&#039;&#039;.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Probar su archivo .sql ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Generar la clase PHP de acceso (DAO) ===&lt;br /&gt;
Una vez que su/s tabla/s estén creadas en la base de datos, vaya al directorio &#039;&#039;&#039;dev/skeletons&#039;&#039;&#039;, copie el archivo &#039;&#039;&#039;build_class_from_table.php&#039;&#039;&#039; en la el directorio sql/ de su módulo module, y ejecute el script&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 php build_class_from_table.php nombretabla&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Nota: Si el comando no funciona, intente con php-cli en lugar de php.&lt;br /&gt;
&lt;br /&gt;
Esto genera un archivo &#039;&#039;&#039;out.nombretabla.class.php&#039;&#039;&#039; que contiene la clase de gestión de la tabla “nombretabla”. En esta clase se encuentran los métodos CRUD (Create/Read/Update/Delete) ya operativos para hacer un &#039;&#039;insert&#039;&#039;, un &#039;&#039;fetch&#039;&#039; (&#039;&#039;select&#039;&#039;), un &#039;&#039;update&#039;&#039;, y un &#039;&#039;delete&#039;&#039; de una línea de la tabla. Suprima justo el &amp;quot;out&amp;quot; del nombre del archivo y pógalo en un subdirectorio de &#039;&#039;&#039;htdocs&#039;&#039;&#039; propio en su módulo (Por ejemplo en &#039;&#039;&#039;htdocs/mimodulo&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Un archivo &#039;&#039;&#039;out.nombretabla_script.php&#039;&#039;&#039; se genera igualmente y contiene un ejemplo de código para utilizar la clase para cada uno de los cuatro métodos CRUD.&lt;br /&gt;
&lt;br /&gt;
== Visualización de pestañas (opcional) ==&lt;br /&gt;
&lt;br /&gt;
=== Añadir o eliminar pestañas en las fichas entidad ===&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039; : Para añadir su propia pestaña en las pestañas estándar de una ficha entidad (factura, pedido, presupuesto, miembro...)&lt;br /&gt;
&lt;br /&gt;
Para ello, vaya al archivo descriptor del módulo creado anteriormente y modifique la tabla $this-&amp;gt;tabs:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
	// Array to add new pages in new tabs or remove existing one&lt;br /&gt;
	$this-&amp;gt;tabs = array(&#039;objecttype:+tabname1:Title1:@mymodule:/mymodule/mynewtab1.php?id=__ID__&#039;,  // To add a new tab identified by code tabname1&lt;br /&gt;
                            &#039;objecttype:+tabname2:Title2:@mymodule:/mymodule/mynewtab2.php?id=__ID__&#039;,  // To add another new tab identified by code tabname2&lt;br /&gt;
                            &#039;objecttype:-tabname&#039;);                                                     // To remove an existing tab identified by code tabname&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La tabla debe contener una lista de cadena, cada cadena representa una nueva pestaña.&lt;br /&gt;
El formato de la cadena se compone de 4 partes separadas por &amp;quot;:&amp;quot;&lt;br /&gt;
* Parte 1: El código de la entidad (objecttype) en la que debe aparecer la pestaña siendo el valor de ella misma:&lt;br /&gt;
{{TemplateModuleTabs-es}}&lt;br /&gt;
* 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.&lt;br /&gt;
* 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&lt;br /&gt;
&lt;br /&gt;
* 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.&lt;br /&gt;
&lt;br /&gt;
Para alimentar el contenido de la pestaña con los datos de la base de datos, vea el capítulo siguiente.&lt;br /&gt;
&lt;br /&gt;
=== Añadir pestañas de una ficha entidad en su propia página ===&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039; : Para mostrar las pestañas estándar de ficha entidad (producto, tercero, etc.) en su propia pestaña de una entidad.&lt;br /&gt;
&lt;br /&gt;
Hay que hacer lo siguiente :&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Incluir los archivos que definen las funciones útiles dentro de sus archivos&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para cada ficha entidad, hay que incluir dos archivos con la instrucción&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;require_once($url_fichier) ;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aquí le mostramos la lista de estos archivos (DOL_DOCUMENT_ROOT correspondiente al directorio &#039;&#039;&#039;dolibarr/htdocs/&#039;&#039;&#039;) :&lt;br /&gt;
* Entidad tercero (thirdparty) :&lt;br /&gt;
** DOL_DOCUMENT_ROOT/societe/class/societe.class.php&lt;br /&gt;
** DOL_DOCUMENT_ROOT/core/lib/company.lib.php&lt;br /&gt;
* Entidad producto (product) :&lt;br /&gt;
** DOL_DOCUMENT_ROOT/product.class.php&lt;br /&gt;
** DOL_DOCUMENT_ROOT/lib/product.lib.php&lt;br /&gt;
* Entidad factura (invoice) :&lt;br /&gt;
** DOL_DOCUMENT_ROOT/facture.class.php&lt;br /&gt;
** DOL_DOCUMENT_ROOT/lib/invoice.lib.php&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Crear y cargar el objeto a mostrar en su pestaña&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Crear el objeto de la clase deseada, y recuperar los datos del objeto a partir de la base de datos. Para ello deberá utilizar las funciones fetch() de la clase correspondiente, pasando el parámetro del indentificador del objeto que recupera desde la url (ej : /mononglet.php?id=1).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Ejemplo :&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$id=$_GET[&amp;quot;id&amp;quot;];&lt;br /&gt;
$product = new Product($db) ;&lt;br /&gt;
$result = $product-&amp;gt;fetch($id) ; //Tester $result pour vérifier que l&#039;accès à la base s&#039;est bien passé&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3. Recuperar la lista de pestañas correspondientes a la entidad seleccionada&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Usar la función XXX_prepare_head($obj), donde XXX es le nombre de la entidad, para crear una tabla que contiene las definiciones de las pestañas a mostrar. El parámetro a pasar es el objeto del que desea mostrar las pestañas.&lt;br /&gt;
&lt;br /&gt;
La tabla devuelta se compone de la siguiente manera :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$head        // Tableau des onglets&lt;br /&gt;
$head[$h]    // Élément décrivant un onglet. Il y aura autant de $h que d&#039;onglets à afficher&lt;br /&gt;
$head[$h][0] // Url de la page affichée quand on clique sur l&#039;onglet&lt;br /&gt;
$head[$h][1] // Titre de l&#039;ongLet&lt;br /&gt;
$head[$h][2] // Code de l&#039;onglet, à utiliser pour choisir quel onglet sera &#039;actif&#039; (voir paragraphe suivant)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Ejemplo :&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$head = product_prepare_head($product, $user) ; //le paramètre $user n&#039;est pas présent sur certaines fonctions&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4. Mostrar las pestañas en su pestaña&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Use la función dol_fiche_head() que muestra las pestañas contenidas en la tabla $head devuelta por XX_prepare_head().&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
dol_fiche_head($links, $active=&#039;0&#039;, $title=&#039;&#039;, $notab=0, $picto=&#039;&#039;)&lt;br /&gt;
$links  // Tableau des onglets, appelé $head plus haut.&lt;br /&gt;
$active // Onglet actif (mettre le nom de l&#039;onglet défini dans votre fichier de module, ou un nom contenu dans $head[$h][2]). Cet onglet sera mis en surbrillance&lt;br /&gt;
$title  // ?&lt;br /&gt;
$notab  // Mettre ce paramètre à 1 permet de ne pas afficher de zone bleue en dessous des onglets.&lt;br /&gt;
$picto  // Nom de l&#039;image à utiliser au début de la barre des onglet. Les choix suivant sont possibles :&lt;br /&gt;
//            product&lt;br /&gt;
//            service&lt;br /&gt;
//            company&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esta función muestra las pestañas deseadas y abre un elemento &#039;&#039;&amp;lt; div class=&amp;quot;&amp;quot; &amp;gt;&#039;&#039; 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 &#039;&#039;&amp;lt; /div &amp;gt;&#039;&#039; en el código PHP.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Nota&#039;&#039;:&lt;br /&gt;
Para más detalles, consulte la [http://www.dolibarr.fr/doxygen/ documentación Doxygen] o directamente el código de Dolibarr.&lt;br /&gt;
&lt;br /&gt;
== Crear sus páginas pantalla PHP (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si su módulo consiste en añadir funcionalidades que necesitan nuevas pantallas.&lt;br /&gt;
&lt;br /&gt;
=== Crear una página pantalla PHP ===&lt;br /&gt;
Debe crear a continuación pantallas PHP que se basen en los datos de sus tablas utilizando los esqueletos como ejemplo del directorio &#039;&#039;&#039;dev/skeletons&#039;&#039;&#039;. (Para el desarrollo de un script en línea de comandos, ver [[Desarrollo de scripts]]).&lt;br /&gt;
&lt;br /&gt;
Para crear una nueva página de usuario, cree un subdirectorio de &#039;&#039;&#039;htdocs&#039;&#039;&#039; (si es que no existe ya) propio en su módulo (En &#039;&#039;&#039;htdocs/mimodulo&#039;&#039;&#039;, por ejemplo), con el fin de ubicar en él las páginas que va a crear.&lt;br /&gt;
&lt;br /&gt;
Copie allí el archivo &#039;&#039;&#039;skeletons_page.php&#039;&#039;&#039;, que va a servir de punto de partida a su página. Modifique el archivo para que la ruta relativa de&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$res=0;&lt;br /&gt;
if (! $res &amp;amp;&amp;amp; file_exists(&amp;quot;../main.inc.php&amp;quot;)) $res=@include(&amp;quot;../main.inc.php&amp;quot;);			// to work if your module directory is into dolibarr root htdocs directory&lt;br /&gt;
if (! $res &amp;amp;&amp;amp; file_exists(&amp;quot;../../main.inc.php&amp;quot;)) $res=@include(&amp;quot;../../main.inc.php&amp;quot;);		// to work if your module directory is into a subdir of root htdocs directory&lt;br /&gt;
if (! $res) die(&amp;quot;Include of main fails&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
sea la correcta, en función de la profundidad del directorio en el que se encuentra el archivo (quitando o añadiendo &amp;quot;../&amp;quot;). Es en el &amp;quot;main&amp;quot; donde se carga el entorno técnico y las habilitaciones. Los objetos variables se posicionan ahora:&lt;br /&gt;
* $user – El objeto que contiene las características del usuario y sus derechos.&lt;br /&gt;
* $conf – El objeto que contiene la configuración de Dolibarr.&lt;br /&gt;
* $db – El objeto que contiene el gestor de conexión abierto a la base de datos.&lt;br /&gt;
* $langs – El objeto que contiene el idioma del usuario.&lt;br /&gt;
&lt;br /&gt;
* 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):&lt;br /&gt;
&#039;&#039;Exemple :&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
dol_include_once(&#039;/mimodulo/class/miclass.class.php&#039;, &#039;MiClass&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Las clases de llamadas Dolibarr utilice la siguiente sintaxis:&lt;br /&gt;
&#039;&#039;Exemple :&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
require_once DOL_DOCUMENT_ROOT.&#039;/core/class/doli.class.php&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Reemplazar partes de templates de pantalla (versión 3.3+) ===&lt;br /&gt;
Algunas partes de la pantalla de Dolibarr están aisladas en archivos de plantilla. Puede desarrollar un módulo para reemplazar una o más de estas plantillas con las suyas.&lt;br /&gt;
{{ToComplete}}&lt;br /&gt;
&lt;br /&gt;
=== Acceso a la base de datos ===&lt;br /&gt;
Si necesita realizar modificaciones en su tabla de la base de datos, utilice la clase generada más arriba.&lt;br /&gt;
&lt;br /&gt;
Si de todos modos quiere acceder a las tablas sin objeto PHP dedicado, esto es posible (por ejemplo para recuperar una lista de registros). En ese caso, piense en seguir estos ejemplos.&lt;br /&gt;
&lt;br /&gt;
Para un &#039;&#039;insert&#039;&#039;, &#039;&#039;update&#039;&#039; o &#039;&#039;delete&#039;&#039;:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $db-&amp;gt;begin();   // Debut transaction&lt;br /&gt;
 $db-&amp;gt;query(&amp;quot;Ma requete insert, update ou delete&amp;quot;);&lt;br /&gt;
 $db-&amp;gt;commit();       // Valide&lt;br /&gt;
 o $db-&amp;gt;rollback()  // Annule&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para una lectura:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $resql=$db-&amp;gt;query(&amp;quot;Ma requete select&amp;quot;);&lt;br /&gt;
 if ($resql)&lt;br /&gt;
 {&lt;br /&gt;
         $num = $db-&amp;gt;num_rows($resql);&lt;br /&gt;
         $i = 0;&lt;br /&gt;
         if ($num)&lt;br /&gt;
         {&lt;br /&gt;
                 while ($i &amp;lt; $num)&lt;br /&gt;
                 {&lt;br /&gt;
                         $obj = $db-&amp;gt;fetch_object($resql);&lt;br /&gt;
                         if ($obj)&lt;br /&gt;
                         {&lt;br /&gt;
                                 // You can use here results&lt;br /&gt;
                                 print $obj-&amp;gt;field1;&lt;br /&gt;
                                 print $obj-&amp;gt;field2;&lt;br /&gt;
                         }&lt;br /&gt;
                         $i++;&lt;br /&gt;
                 }&lt;br /&gt;
         }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Definición de estilos ===&lt;br /&gt;
Para que el aspecto de la página guarde coherencia con el tema Dolibarr, es necesario utilizar los estilos CSS de Dolibarr.&lt;br /&gt;
&lt;br /&gt;
Por ejemplo:&lt;br /&gt;
&lt;br /&gt;
* class=&amp;quot;liste_titre&amp;quot;1 en las etiquetas tr y td para una línea de título de tabla. &lt;br /&gt;
* class=”pair” o class=”impair” en las etiquetas tr y td de las líneas de datos de la tabla.&lt;br /&gt;
* class=”flat” en todos los campos en los que se teclea (input, select, textarea...)&lt;br /&gt;
* class=”button” en los objetos de tipo input type=”submit”.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Utilizar el selector de fechas de Dolibarr ===&lt;br /&gt;
Si quiere, puede beneficiarse del selector de fechas en las pantallas Dolibarr. Para ello, utilice la siguiente línea:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $form=new Form($db);&lt;br /&gt;
 $form-&amp;gt;select_date(&#039;&#039;,&#039;mykey&#039;,0,0,0,&amp;quot;myform&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La cadena &amp;quot;mikey&amp;quot; identifica el campo fecha. Hace falta introducir un valor diferente en caso de que haya varios campos. La cadena &amp;quot;myform&amp;quot; es el nombre del campo &amp;quot;FORM&amp;quot; (en el formulario, name=&amp;quot;myform&amp;quot; de la página html). La visualización de un selector de fecha debe por tanto estar integrada en un formulario html.&lt;br /&gt;
&lt;br /&gt;
Para recuperar el valor, a la herencia de POST, el comando es:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $mydate = dol_mktime(12, 0 , 0, $_POST[&#039;mykeymonth&#039;], $_POST[&#039;mykeyday&#039;], $_POST[&#039;mykeyyear&#039;]);&lt;br /&gt;
 print strftime(&#039;%A %d %B %Y&#039;, $mydate);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Definir su página de configuración (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si su módulo ofrece varias opciones parametrizables.&lt;br /&gt;
&lt;br /&gt;
=== Crear su página de edición de configuración ===&lt;br /&gt;
Si su módulo ofrece varias opciones parametrizacles, es necesario crear una página PHP para editar las opciones (que serán guardadas en la [[Table llx_const|tabla &#039;&#039;&#039;llx_const&#039;&#039;&#039;]]). Cree una página PHP llamada &#039;&#039;&#039;mimodulo_setuppage.php&#039;&#039;&#039;, que registre las opciones posibles y las ponga al día. Es necesario tomar como ejemplo una página de &#039;&#039;&#039;/admin&#039;&#039;&#039; 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 &#039;&#039;&#039;/admin&#039;&#039;&#039;. 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 &#039;&#039;&#039;/admin&#039;&#039;&#039;).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $this-&amp;gt;config_page_url = array(&amp;quot;monmodule_setupapage.php&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Probar su página ===&lt;br /&gt;
Vaya a la página &#039;&#039;&#039;Configuración &amp;gt; módulo&#039;&#039;&#039;. 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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Definir sus entradas de menú (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si ha creado páginas PHP, es necesario que estas pantallas sean accesibles desde el menú Dolibarr.&lt;br /&gt;
&lt;br /&gt;
=== Definir sus entradas de menú ===&lt;br /&gt;
Para ello, hace falta definir en el archivo descriptor de menú de tabla this-&amp;gt;menu, que declara los menús.&lt;br /&gt;
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&lt;br /&gt;
&lt;br /&gt;
He aquí un ejemplo de declaración de entradas de menú en el fichero descriptor:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Main menu entries&lt;br /&gt;
$this-&amp;gt;menu = array();			// List of menus to add&lt;br /&gt;
$r=0;&lt;br /&gt;
&lt;br /&gt;
// Add here entries to declare new menus&lt;br /&gt;
// Example to declare the Top Menu entry:&lt;br /&gt;
$this-&amp;gt;menu[$r]=array(	&#039;fk_menu&#039;=&amp;gt;0,			// Put 0 if this is a top menu&lt;br /&gt;
			&#039;type&#039;=&amp;gt;&#039;top&#039;,			// This is a Top menu entry&lt;br /&gt;
			&#039;titre&#039;=&amp;gt;&#039;MyModule top menu&#039;,&lt;br /&gt;
			&#039;mainmenu&#039;=&amp;gt;&#039;mymodule&#039;,&lt;br /&gt;
			&#039;leftmenu&#039;=&amp;gt;&#039;mymodule&#039;,&lt;br /&gt;
			&#039;url&#039;=&amp;gt;&#039;/mymodule/pagetop.php&#039;,&lt;br /&gt;
			&#039;langs&#039;=&amp;gt;&#039;mylangfile&#039;,	// Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory.&lt;br /&gt;
			&#039;position&#039;=&amp;gt;100,&lt;br /&gt;
			&#039;enabled&#039;=&amp;gt;&#039;1&#039;,			// Define condition to show or hide menu entry. Use &#039;$conf-&amp;gt;mymodule-&amp;gt;enabled&#039; if entry must be visible if module is enabled.&lt;br /&gt;
			&#039;perms&#039;=&amp;gt;&#039;1&#039;,			// Use &#039;perms&#039;=&amp;gt;&#039;$user-&amp;gt;rights-&amp;gt;mymodule-&amp;gt;level1-&amp;gt;level2&#039; if you want your menu with a permission rules&lt;br /&gt;
			&#039;target&#039;=&amp;gt;&#039;&#039;,&lt;br /&gt;
			&#039;user&#039;=&amp;gt;2);				// 0=Menu for internal users, 1=external users, 2=both&lt;br /&gt;
$r++;&lt;br /&gt;
&lt;br /&gt;
// Example to declare a Left Menu entry:&lt;br /&gt;
$this-&amp;gt;menu[$r]=array(	&#039;fk_menu&#039;=&amp;gt;&#039;fk_mainmenu=xxx&#039;,		    // Use &#039;fk_mainmenu=xxx&#039; or &#039;fk_mainmenu=xxx,fk_leftmenu=yyy&#039; where xxx is mainmenucode and yyy is a leftmenucode of parent menu&lt;br /&gt;
			&#039;type&#039;=&amp;gt;&#039;left&#039;,			        // This is a Left menu entry&lt;br /&gt;
			&#039;titre&#039;=&amp;gt;&#039;MyModule left menu 1&#039;,&lt;br /&gt;
			&#039;mainmenu&#039;=&amp;gt;&#039;xxx&#039;,&lt;br /&gt;
                        &#039;leftmenu&#039;=&amp;gt;&#039;yyy&#039;,&lt;br /&gt;
			&#039;url&#039;=&amp;gt;&#039;/mymodule/pagelevel1.php&#039;,&lt;br /&gt;
			&#039;langs&#039;=&amp;gt;&#039;mylangfile&#039;,	// Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory.&lt;br /&gt;
			&#039;position&#039;=&amp;gt;100,&lt;br /&gt;
			&#039;enabled&#039;=&amp;gt;&#039;1&#039;,			// Define condition to show or hide menu entry. Use &#039;$conf-&amp;gt;mymodule-&amp;gt;enabled&#039; if entry must be visible if module is enabled.&lt;br /&gt;
			&#039;perms&#039;=&amp;gt;&#039;1&#039;,			// Use &#039;perms&#039;=&amp;gt;&#039;$user-&amp;gt;rights-&amp;gt;mymodule-&amp;gt;level1-&amp;gt;level2&#039; if you want your menu with a permission rules&lt;br /&gt;
			&#039;target&#039;=&amp;gt;&#039;&#039;,&lt;br /&gt;
			&#039;user&#039;=&amp;gt;2);				// 0=Menu for internal users,1=external users, 2=both&lt;br /&gt;
$r++;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para condicionar el acceso al menú segun los permisos, modificar la propiedad &#039;&#039;&#039;perms&#039;&#039;&#039; de la tabla. Ver el capítulo sobre permisos, un poco más abajo, para saber como realizar los permisos.&lt;br /&gt;
&lt;br /&gt;
=== Probar sus entradas de menú ===&lt;br /&gt;
Desactive y reactive su módulo bajo Dolibarr. Las entradas del menú deberían aparecer después de hacerlo (si la condición &#039;enabled&#039; está activada).&lt;br /&gt;
&lt;br /&gt;
== Definir sus propios permisos (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si quiere añadir nuevos permisos.&lt;br /&gt;
&lt;br /&gt;
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-&amp;gt;rights_class = &#039;facture&#039; para que diga:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $this-&amp;gt;rights_class = &#039;mimodulo&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A continuación, rellene la tabla $this-&amp;gt;rights con tantas entradas como permisos diferentes vaya a definir:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $this-&amp;gt;rights[$r][0] = 10001;&lt;br /&gt;
 $this-&amp;gt;rights[$r][1] = &#039;Texto por defecto de mi permiso&#039;;&lt;br /&gt;
 $this-&amp;gt;rights[$r][3] = 1;&lt;br /&gt;
 $this-&amp;gt;rights[$r][4] = &#039;accion&#039;;&lt;br /&gt;
 $this-&amp;gt;rights[$r][5] = &#039;subaccion&#039;;&lt;br /&gt;
 $r++;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En $this-&amp;gt;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ú &#039;&#039;&#039;Información del Sistema&#039;&#039;&#039; en una instalación de Dolibarr que esté funcionando. En $this-&amp;gt;rights[$r][3], introduzca 1 si este permiso se atribuye por defecto a los usuarios según son creados. En $this-&amp;gt;rights[$r][1] introduzca un texto por defecto -que será mostrado si no se encuentra traducción para su permiso en el archivo &#039;&#039;&#039;admin.lang&#039;&#039;&#039;). En $this-&amp;gt;rights[$r][4] y $this-&amp;gt;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:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 if ($user-&amp;gt;rights-&amp;gt;mimodulo-&amp;gt;accion-&amp;gt;subaccion) ...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Definir sus propios paneles (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si su módulo tiene uno o varios paneles.&lt;br /&gt;
&lt;br /&gt;
=== Defina sus paneles ===&lt;br /&gt;
Para ello, modifique las tablas $this-&amp;gt;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 &#039;&#039;&#039;htdocs/mimodulo/core/boxes&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Ejemplo:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;boxes[0][&#039;file&#039;]=&#039;mabox0.php@mimodulo&#039;&lt;br /&gt;
$this-&amp;gt;boxes[0][&#039;note&#039;]=&#039;Mi panel 0&#039;&lt;br /&gt;
 ...&lt;br /&gt;
$this-&amp;gt;boxes[n][&#039;file&#039;]=&#039;maboxn.php@mimodulo&#039;&lt;br /&gt;
$this-&amp;gt;boxes[n][&#039;note&#039;]=&#039;Mi panel n&#039;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A continuación cree los archivos &#039;&#039;&#039;htdocs/mimodulo/core/boxes/mabox0.php&#039;&#039;&#039;, &#039;&#039;&#039;htdocs/mimodulo/core/boxes/mabox1.php&#039;&#039;&#039;...  tomando como ejemplo los paneles existentes (en el directorio htdocs/core/boxes)&lt;br /&gt;
&lt;br /&gt;
=== Pruebe sus paneles en Dolibarr ===&lt;br /&gt;
Vaya al menú &#039;&#039;&#039;Inico – Configuración – Paneles&#039;&#039;&#039;. 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.&lt;br /&gt;
&lt;br /&gt;
== Definir sus propias exportaciones (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; 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)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Definir la exportación ===&lt;br /&gt;
Para ello, descomente y modifique las tablas $this-&amp;gt;export_xxx  de su archivo descriptor de módulo.&lt;br /&gt;
&lt;br /&gt;
=== Probar la exportación ===&lt;br /&gt;
Vaya al menú &amp;quot;Herramientas &amp;gt; Exportar&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Definir sus estilos CSS (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si en sus pantallas PHP utiliza clases de estilos distintas a las de los temas de Dolibarr (no recomendado).&lt;br /&gt;
&lt;br /&gt;
Esta funcionalidad todavía no es operativa en la versión 2.4., a pesar de estar ya descrita.&lt;br /&gt;
&lt;br /&gt;
=== Crear y declarar su hoja de estilos ===&lt;br /&gt;
Crear un archivo de estilos llamada &#039;&#039;&#039;mimodulo.css&#039;&#039;&#039; o &#039;&#039;&#039;mimodule.css.php&#039;&#039;&#039; y guardarla en el directorio &#039;&#039;&#039;&#039;&#039;mimodulo&#039;&#039;&#039;&#039;&#039; dentro de &#039;&#039;&#039;htdocs&#039;&#039;&#039;. Solo puede haber un archivo css propio a cada módulo.&lt;br /&gt;
Recordamos que es mejor usar los estilos ya existentes en Dolibarr (el archivo css usado por Dolibarr es el archivo &#039;&#039;&#039;themes/nomtheme/&#039;&#039;nombretema&#039;&#039;.css.php&#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
Una vez su hoja de estilos esté disponible, declárela en su archivo descriptor de módulo modificando la propiedad &#039;&#039;&#039;$this-&amp;gt;module_parts&#039;&#039;&#039;.&lt;br /&gt;
El valor a indicar debe ser la ruta URL relativa de su archivo css.&lt;br /&gt;
Por ejemplo&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;module_parts = array(&#039;css&#039; =&amp;gt; array(&#039;/mimodulo/css/mimodulo.css.php&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Probar su hoja de estilos ===&lt;br /&gt;
Desactivar y reactivar su módulo.&lt;br /&gt;
&lt;br /&gt;
Ir la página de inicio de Dolibarr. Ver el código de la página HTML.&lt;br /&gt;
&lt;br /&gt;
Debería ver en el encabezado HTML, una línea de declaración de su hoja de estilos.&lt;br /&gt;
&lt;br /&gt;
== Definir sus funciones Javascript (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuando&#039;&#039;&#039;: Si en sus pantallas en PHP utiliza funciones de Javascript no disponibles en estandard (archivo lib_head.js)&lt;br /&gt;
&lt;br /&gt;
Si en sus pantallas en PHP utiliza funciones javascript, es necesario asegurarse de que las funciones declaradas en un archivo javascript &#039;&#039;&#039;htdocs/mimodulo/js/monmodule.js&#039;&#039;&#039; sea cargado en la cabecera del head html.&lt;br /&gt;
&lt;br /&gt;
Para pedir a Dolibarr que gestione en la generación de la sección header la inclusión de uno de sus archivos javascript, es necesario proporcionar como parámetro a la función llxHeader(), al inicio de su página, la URL hacia el js a incluir.&lt;br /&gt;
&lt;br /&gt;
Ejemplo para la página /htdocs/mimodulo/mapage.php :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
require(&#039;../main.inc.php&#039;);&lt;br /&gt;
$morejs=array(&amp;quot;/mimomulo/js/monmodule.js&amp;quot;);&lt;br /&gt;
llxHeader(&#039;&#039;,&#039;Titulo&#039;,&#039;&#039;,&#039;&#039;,&#039;&#039;,&#039;&#039;,$morejs,&#039;&#039;,0,0); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ejecutar código sobre un evento Dolibarr (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; 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 &#039;&#039;&#039;disparador (triggers)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Véase también [[Interfaces Dolibarr hacia el exterior]] e [[Interfaces del Exterior hacia Dolibarr]]&lt;br /&gt;
&lt;br /&gt;
== Insertar su código usando los hooks de Dolibarr (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039;: Cuando desee cambiar o añadir otro tipo de código en un evento de negociado (véase lel capítulo anterior para esto).&lt;br /&gt;
&lt;br /&gt;
Véase la página [[El sistema Hooks]].&lt;br /&gt;
&lt;br /&gt;
== Añadir un módulo de numeración (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039;: Si quiere añadir una regla de numeración no cubierta por los módulos por defecto.&lt;br /&gt;
&lt;br /&gt;
Véase la página [[Crear un módulo de numeración]].&lt;br /&gt;
&lt;br /&gt;
== Añadir un nuevo módulo de documento (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039;: Si quiere añadir un nuevo modelo de documento.&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
== Añadir un tema (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039;: Si quiere un interface con colores personalizados.&lt;br /&gt;
&lt;br /&gt;
Véase la página [[Temas]].&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Algunas reglas de código =&lt;br /&gt;
Las reglas de código a seguir se definen en la [[Documentación Desarrolladores| Documentación para desarrolladores]], concretamente en la sección &amp;quot;Lenguaje&amp;quot; del capítulo de &amp;quot;Información General&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Utilización de MDA =&lt;br /&gt;
Un método para generar un módulo funcional desde UML se encuentra en curso de puesta a punto. Más información en la página [[UML2Dolibarr - Crear un módulo usando MDA]].&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Crear un paquete para liberar e instalar su módulo =&lt;br /&gt;
Este proceso debe ser usado para fabricar un paquete con el fin de enviarlo a la tienda oficial http://www.dolistore.com.&lt;br /&gt;
&lt;br /&gt;
También puede usarlo para distribuir fácilmente su módulo vía su propio método de distribución.&lt;br /&gt;
&lt;br /&gt;
* Vaya al directorio &#039;&#039;&#039;/build&#039;&#039;&#039; y copie el archivo &#039;&#039;&#039;makepack-dolibarrmodules.conf&#039;&#039;&#039; como &#039;&#039;&#039;makepack-mimodulo.conf&#039;&#039;&#039;. 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).&lt;br /&gt;
&lt;br /&gt;
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...)&lt;br /&gt;
* Lance el script vía Perl (necesita la versión 5.0. o superiores de Perl)&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 perl makepack-dolibarrmodule.pl&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El script le pide el nombre de su módulo, su versión mayor y menor. Se va a crear un fichero &#039;&#039;&#039;mimodulo.zip&#039;&#039;&#039;, que incluirá su módulo listo para ser liberado.&lt;br /&gt;
* La persona que reciba su módulo deberá ubicar el archivo en el directorio raíz de Dolibarr y ejecutar el comando:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 tar -xvf monmodule.zip&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 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 &amp;quot;Submit a product&amp;quot;).&lt;br /&gt;
** Si su módulo está correctamente realizado, será rápidamente validado.&lt;br /&gt;
** 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).&lt;/div&gt;</summary>
		<author><name>Nnicolashr</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Desarrollo_de_un_m%C3%B3dulo&amp;diff=35888</id>
		<title>Desarrollo de un módulo</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Desarrollo_de_un_m%C3%B3dulo&amp;diff=35888"/>
		<updated>2016-09-08T02:21:18Z</updated>

		<summary type="html">&lt;p&gt;Nnicolashr: /* Añadir pestañas de una ficha entidad en su propia página */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Básico]]&lt;br /&gt;
{{TemplateDocDesarrollo}}&lt;br /&gt;
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:&lt;br /&gt;
* Añadir nuevas tablas a la base de datos.&lt;br /&gt;
* Añadir sus propias entradas en los menús.&lt;br /&gt;
* Añadir pantallas de edición/consulta de nuevas tablas.&lt;br /&gt;
* Añadir o eliminar pestañas en las páginas de vista/edición de objetos (factura, producto, pedido, evento, etc.)&lt;br /&gt;
* Añadir exportaciones predefinidas a la función “Exportar”.&lt;br /&gt;
* Añadir variables de substitución&lt;br /&gt;
* Añadir nuevas cajas a la página de inicio.&lt;br /&gt;
* Definir nuevos permisos.&lt;br /&gt;
* Activar código automático sobre una acción particular de Dolibarr.&lt;br /&gt;
* Insertar nuestro código mediante los hooks de Dolibarr&lt;br /&gt;
* Añadir un módulo de numeración&lt;br /&gt;
* Añadir un modelo de documento&lt;br /&gt;
* Añadir un nuevo tema &lt;br /&gt;
&lt;br /&gt;
etc. Todas estas operaciones sólo están disponibles a partir de la versión 3.2 de Dolibarr.&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Crear un módulo =&lt;br /&gt;
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&lt;br /&gt;
&lt;br /&gt;
== [[File:Art.png]] Crear un descriptor de Módulo (obligatorio) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039;: Obligatorio cada vez que se desarrolla una extensión, cualquiera que sea su finalidad.&lt;br /&gt;
&lt;br /&gt;
=== Crear su descriptor ===&lt;br /&gt;
La primera fase es la de crear un fichero descriptor del módulo. Para ello:&lt;br /&gt;
* Crear el directorio &#039;&#039;&#039;/htdocs/&#039;&#039;mimodulo&#039;&#039;/core/modules&#039;&#039;&#039;. Seguidamente ir al directorio &#039;&#039;&#039;dev/skeletons&#039;&#039;&#039; y copiar el archivo modMyModule.class.php en el directorio &#039;&#039;&#039;htdocs/&#039;&#039;mimodulo&#039;&#039;/core/modules&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
 Nota: En versión 3.9.2 de Dolibarr, el directorio donde se ubican los ficheros descriptor de módulo es &#039;&#039;&#039;/htdocs/&#039;&#039;core/modules&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A continuación, modificar el contenido del archivo, reemplazando:&lt;br /&gt;
* los &amp;quot;modMyModule&amp;quot; por un valor que corresponda a la finalidad de su módulo. Este valor debe siempre comenzar por mod. &lt;br /&gt;
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.&lt;br /&gt;
* $this-&amp;gt;numero = 100000 por un número de módulo que esté libre. Ver [[List of modules id|Listado de los id de módulos]]&lt;br /&gt;
* Modificar eventualmente otras variables definidas por los desarrolladores (ver el comentario en el código del esqueleto para ver su significado)&lt;br /&gt;
* Crear el directorio /htdocs/mimodulo/ &lt;br /&gt;
Ahora su fichero descriptor está configurado.&lt;br /&gt;
&lt;br /&gt;
=== Probar su descriptor ===&lt;br /&gt;
Ejecute Dolibarr y vaya a la página &amp;quot;Configuración &amp;gt; Módulo&amp;quot;. 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-&amp;gt;special el que determina en qué pestaña se encuentra su módulo.&lt;br /&gt;
&lt;br /&gt;
== [[File:Art.png]] Árbol de un nuevo módulo ==&lt;br /&gt;
Crear un directorio &#039;mimodulo&#039; que contendrá los archivos del módulo. Este directorio debe de estar en el directorio &#039;&#039;&#039;htdocs&#039;&#039;&#039; y contendrá los siguientes subdirectorios:&lt;br /&gt;
{{TemplateModuleTreeSimple}}&lt;br /&gt;
&lt;br /&gt;
== [[File:Art.png]] Crear sus tablas SQL y la clase PHP con los métodos de acceso (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si su módulo necesita gestionar sus propios datos.&lt;br /&gt;
&lt;br /&gt;
===Crear sus ficheros .sql===&lt;br /&gt;
Si su módulo de verdad requiere administrar datos que no existen en la base de datos en la versión estándar de Dolibarr, será necesario definir ciertas tablas SQL para registrar esos datos.&lt;br /&gt;
&lt;br /&gt;
Revisa que en el descriptor de archivo (mymodule/core/modules/mymodule.class.php) la línea&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;_load_tables(&#039;/mymodule/sql/&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
esté descomentada y correctamente configurada.&lt;br /&gt;
&lt;br /&gt;
Cree un subdirectorio sql en el directorio de su módulo (por ejemplo, htdocs/mimodulo/sql), con el fin de colocar los scripts sql que va a crear. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Regla a respetar:&#039;&#039; &lt;br /&gt;
* Agregue los archivos de orden de creación de sus tablas siguiendo el principio de un fichero &#039;&#039;&#039;llx_mitabla.sql&#039;&#039; por tabla, eventualmente acompañado del archivo &#039;&#039;&#039;llx_mitabla.key.sql&#039;&#039;&#039; (ver los archivos existentes en &#039;&#039;install/mysql/tables&#039;&#039;, para tomar ejemplo). &lt;br /&gt;
* En términos de orden de gestión de datos, todos deben estar en un archivo llamado &#039;&#039;&#039;data.sql&#039;&#039;&#039; situado en la misma carpeta &#039;&#039;&#039;/mimodulo/sql/&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Ejemplo de contenido de un fichero data.sql&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
 delete from llx_const where name=&#039;MYMODULE_IT_WORKS&#039; and entity=&#039;__ENTITY__&#039;;&lt;br /&gt;
 insert into llx_const (name, value, type, note, visible, entity) values (&#039;MYMODULE_IT_WORKS&#039;,&#039;1&#039;,&#039;chaine&#039;,&#039;A constant vor my module&#039;,1,&#039;__ENTITY__&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Las órdenes SQL de los archivos deben de ser operacionales para la base de datos &#039;&#039;&#039;mysql&#039;&#039;&#039;.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Probar su archivo .sql ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Generar la clase PHP de acceso (DAO) ===&lt;br /&gt;
Una vez que su/s tabla/s estén creadas en la base de datos, vaya al directorio &#039;&#039;&#039;dev/skeletons&#039;&#039;&#039;, copie el archivo &#039;&#039;&#039;build_class_from_table.php&#039;&#039;&#039; en la el directorio sql/ de su módulo module, y ejecute el script&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 php build_class_from_table.php nombretabla&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Nota: Si el comando no funciona, intente con php-cli en lugar de php.&lt;br /&gt;
&lt;br /&gt;
Esto genera un archivo &#039;&#039;&#039;out.nombretabla.class.php&#039;&#039;&#039; que contiene la clase de gestión de la tabla “nombretabla”. En esta clase se encuentran los métodos CRUD (Create/Read/Update/Delete) ya operativos para hacer un &#039;&#039;insert&#039;&#039;, un &#039;&#039;fetch&#039;&#039; (&#039;&#039;select&#039;&#039;), un &#039;&#039;update&#039;&#039;, y un &#039;&#039;delete&#039;&#039; de una línea de la tabla. Suprima justo el &amp;quot;out&amp;quot; del nombre del archivo y pógalo en un subdirectorio de &#039;&#039;&#039;htdocs&#039;&#039;&#039; propio en su módulo (Por ejemplo en &#039;&#039;&#039;htdocs/mimodulo&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Un archivo &#039;&#039;&#039;out.nombretabla_script.php&#039;&#039;&#039; se genera igualmente y contiene un ejemplo de código para utilizar la clase para cada uno de los cuatro métodos CRUD.&lt;br /&gt;
&lt;br /&gt;
== Visualización de pestañas (opcional) ==&lt;br /&gt;
&lt;br /&gt;
=== Añadir o eliminar pestañas en las fichas entidad ===&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039; : Para añadir su propia pestaña en las pestañas estándar de una ficha entidad (factura, pedido, presupuesto, miembro...)&lt;br /&gt;
&lt;br /&gt;
Para ello, vaya al archivo descriptor del módulo creado anteriormente y modifique la tabla $this-&amp;gt;tabs:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
	// Array to add new pages in new tabs or remove existing one&lt;br /&gt;
	$this-&amp;gt;tabs = array(&#039;objecttype:+tabname1:Title1:@mymodule:/mymodule/mynewtab1.php?id=__ID__&#039;,  // To add a new tab identified by code tabname1&lt;br /&gt;
                            &#039;objecttype:+tabname2:Title2:@mymodule:/mymodule/mynewtab2.php?id=__ID__&#039;,  // To add another new tab identified by code tabname2&lt;br /&gt;
                            &#039;objecttype:-tabname&#039;);                                                     // To remove an existing tab identified by code tabname&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La tabla debe contener una lista de cadena, cada cadena representa una nueva pestaña.&lt;br /&gt;
El formato de la cadena se compone de 4 partes separadas por &amp;quot;:&amp;quot;&lt;br /&gt;
* Parte 1: El código de la entidad (objecttype) en la que debe aparecer la pestaña siendo el valor de ella misma:&lt;br /&gt;
{{TemplateModuleTabs-es}}&lt;br /&gt;
* 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.&lt;br /&gt;
* 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&lt;br /&gt;
&lt;br /&gt;
* 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.&lt;br /&gt;
&lt;br /&gt;
Para alimentar el contenido de la pestaña con los datos de la base de datos, vea el capítulo siguiente.&lt;br /&gt;
&lt;br /&gt;
=== Añadir pestañas de una ficha entidad en su propia página ===&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039; : Para mostrar las pestañas estándar de ficha entidad (producto, tercero, etc.) en su propia pestaña de una entidad.&lt;br /&gt;
&lt;br /&gt;
Hay que hacer lo siguiente :&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Incluir los archivos que definen las funciones útiles dentro de sus archivos&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para cada ficha entidad, hay que incluir dos archivos con la instrucción&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;require_once($url_fichier) ;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aquí le mostramos la lista de estos archivos (DOL_DOCUMENT_ROOT correspondiente al directorio &#039;&#039;&#039;dolibarr/htdocs/&#039;&#039;&#039;) :&lt;br /&gt;
* Entidad tercero (thirdparty) :&lt;br /&gt;
** DOL_DOCUMENT_ROOT/societe/class/societe.class.php&lt;br /&gt;
** DOL_DOCUMENT_ROOT/core/lib/company.lib.php&lt;br /&gt;
* Entidad producto (product) :&lt;br /&gt;
** DOL_DOCUMENT_ROOT/product.class.php&lt;br /&gt;
** DOL_DOCUMENT_ROOT/lib/product.lib.php&lt;br /&gt;
* Entidad factura (invoice) :&lt;br /&gt;
** DOL_DOCUMENT_ROOT/facture.class.php&lt;br /&gt;
** DOL_DOCUMENT_ROOT/lib/invoice.lib.php&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Crear y cargar el objeto a mostrar en su pestaña&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Crear el objeto de la clase deseada, y recuperar los datos del objeto a partir de la base de datos. Para ello deberá utilizar las funciones fetch() de la clase correspondiente, pasando el parámetro del indentificador del objeto que recupera desde la url (ej : /mononglet.php?id=1).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Ejemplo :&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$id=$_GET[&amp;quot;id&amp;quot;];&lt;br /&gt;
$product = new Product($db) ;&lt;br /&gt;
$result = $product-&amp;gt;fetch($id) ; //Tester $result pour vérifier que l&#039;accès à la base s&#039;est bien passé&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3. Recuperar la lista de pestañas correspondientes a la entidad seleccionada&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Usar la función XXX_prepare_head($obj), donde XXX es le nombre de la entidad, para crear una tabla que contiene las definiciones de las pestañas a mostrar. El parámetro a pasar es el objeto del que desea mostrar las pestañas.&lt;br /&gt;
&lt;br /&gt;
La tabla devuelta se compone de la siguiente manera :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$head        // Tableau des onglets&lt;br /&gt;
$head[$h]    // Élément décrivant un onglet. Il y aura autant de $h que d&#039;onglets à afficher&lt;br /&gt;
$head[$h][0] // Url de la page affichée quand on clique sur l&#039;onglet&lt;br /&gt;
$head[$h][1] // Titre de l&#039;ongLet&lt;br /&gt;
$head[$h][2] // Code de l&#039;onglet, à utiliser pour choisir quel onglet sera &#039;actif&#039; (voir paragraphe suivant)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Ejemplo :&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$head = product_prepare_head($product, $user) ; //le paramètre $user n&#039;est pas présent sur certaines fonctions&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4. Mostrar las pestañas en su pestaña&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Use la función dol_fiche_head() que muestra las pestañas contenidas en la tabla $head devuelta por XX_prepare_head().&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
dol_fiche_head($links, $active=&#039;0&#039;, $title=&#039;&#039;, $notab=0, $picto=&#039;&#039;)&lt;br /&gt;
$links  // Tableau des onglets, appelé $head plus haut.&lt;br /&gt;
$active // Onglet actif (mettre le nom de l&#039;onglet défini dans votre fichier de module, ou un nom contenu dans $head[$h][2]). Cet onglet sera mis en surbrillance&lt;br /&gt;
$title  // ?&lt;br /&gt;
$notab  // Mettre ce paramètre à 1 permet de ne pas afficher de zone bleue en dessous des onglets.&lt;br /&gt;
$picto  // Nom de l&#039;image à utiliser au début de la barre des onglet. Les choix suivant sont possibles :&lt;br /&gt;
//            product&lt;br /&gt;
//            service&lt;br /&gt;
//            company&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esta función muestra las pestañas deseadas y abre un elemento &#039;&#039;&amp;lt; div class=&amp;quot;&amp;quot; &amp;gt;&#039;&#039; 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 &#039;&#039;&amp;lt; /div &amp;gt;&#039;&#039; en el código PHP.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Nota&#039;&#039;:&lt;br /&gt;
Para más detalles, consulte la [http://www.dolibarr.fr/doxygen/ documentación Doxygen] o directamente el código de Dolibarr.&lt;br /&gt;
&lt;br /&gt;
== Crear sus páginas pantalla PHP (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si su módulo consiste en añadir funcionalidades que necesitan nuevas pantallas.&lt;br /&gt;
&lt;br /&gt;
=== Crear una página pantalla PHP ===&lt;br /&gt;
Debe crear a continuación pantallas PHP que se basen en los datos de sus tablas utilizando los esqueletos como ejemplo del directorio &#039;&#039;&#039;dev/skeletons&#039;&#039;&#039;. (Para el desarrollo de un script en línea de comandos, ver [[Desarrollo de scripts]]).&lt;br /&gt;
&lt;br /&gt;
Para crear una nueva página de usuario, cree un subdirectorio de &#039;&#039;&#039;htdocs&#039;&#039;&#039; (si es que no existe ya) propio en su módulo (En &#039;&#039;&#039;htdocs/mimodulo&#039;&#039;&#039;, por ejemplo), con el fin de ubicar en él las páginas que va a crear.&lt;br /&gt;
&lt;br /&gt;
Copie allí el archivo &#039;&#039;&#039;skeletons_page.php&#039;&#039;&#039;, que va a servir de punto de partida a su página. Modifique el archivo para que la ruta relativa de&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$res=0;&lt;br /&gt;
if (! $res &amp;amp;&amp;amp; file_exists(&amp;quot;../main.inc.php&amp;quot;)) $res=@include(&amp;quot;../main.inc.php&amp;quot;);			// to work if your module directory is into dolibarr root htdocs directory&lt;br /&gt;
if (! $res &amp;amp;&amp;amp; file_exists(&amp;quot;../../main.inc.php&amp;quot;)) $res=@include(&amp;quot;../../main.inc.php&amp;quot;);		// to work if your module directory is into a subdir of root htdocs directory&lt;br /&gt;
if (! $res) die(&amp;quot;Include of main fails&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
sea la correcta, en función de la profundidad del directorio en el que se encuentra el archivo (quitando o añadiendo &amp;quot;../&amp;quot;). Es en el &amp;quot;main&amp;quot; donde se carga el entorno técnico y las habilitaciones. Los objetos variables se posicionan ahora:&lt;br /&gt;
* $user – El objeto que contiene las características del usuario y sus derechos.&lt;br /&gt;
* $conf – El objeto que contiene la configuración de Dolibarr.&lt;br /&gt;
* $db – El objeto que contiene el gestor de conexión abierto a la base de datos.&lt;br /&gt;
* $langs – El objeto que contiene el idioma del usuario.&lt;br /&gt;
&lt;br /&gt;
* 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):&lt;br /&gt;
&#039;&#039;Exemple :&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
dol_include_once(&#039;/mimodulo/class/miclass.class.php&#039;, &#039;MiClass&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Las clases de llamadas Dolibarr utilice la siguiente sintaxis:&lt;br /&gt;
&#039;&#039;Exemple :&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
require_once DOL_DOCUMENT_ROOT.&#039;/core/class/doli.class.php&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Reemplazar partes de templates de pantalla (versión 3.3+) ===&lt;br /&gt;
Algunas partes de la pantalla de Dolibarr están aisladas en archivos de plantilla. Puede desarrollar un módulo para reemplazar una o más de estas plantillas con las suyas.&lt;br /&gt;
{{ToComplete}}&lt;br /&gt;
&lt;br /&gt;
=== Acceso a la base de datos ===&lt;br /&gt;
Si necesita realizar modificaciones en su tabla de la base de datos, utilice la clase generada más arriba.&lt;br /&gt;
&lt;br /&gt;
Si de todos modos quiere acceder a las tablas sin objeto PHP dedicado, esto es posible (por ejemplo para recuperar una lista de registros). En ese caso, piense en seguir estos ejemplos.&lt;br /&gt;
&lt;br /&gt;
Para un &#039;&#039;insert&#039;&#039;, &#039;&#039;update&#039;&#039; o &#039;&#039;delete&#039;&#039;:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $db-&amp;gt;begin();   // Debut transaction&lt;br /&gt;
 $db-&amp;gt;query(&amp;quot;Ma requete insert, update ou delete&amp;quot;);&lt;br /&gt;
 $db-&amp;gt;commit();       // Valide&lt;br /&gt;
 o $db-&amp;gt;rollback()  // Annule&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para una lectura:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $resql=$db-&amp;gt;query(&amp;quot;Ma requete select&amp;quot;);&lt;br /&gt;
 if ($resql)&lt;br /&gt;
 {&lt;br /&gt;
         $num = $db-&amp;gt;num_rows($resql);&lt;br /&gt;
         $i = 0;&lt;br /&gt;
         if ($num)&lt;br /&gt;
         {&lt;br /&gt;
                 while ($i &amp;lt; $num)&lt;br /&gt;
                 {&lt;br /&gt;
                         $obj = $db-&amp;gt;fetch_object($resql);&lt;br /&gt;
                         if ($obj)&lt;br /&gt;
                         {&lt;br /&gt;
                                 // You can use here results&lt;br /&gt;
                                 print $obj-&amp;gt;field1;&lt;br /&gt;
                                 print $obj-&amp;gt;field2;&lt;br /&gt;
                         }&lt;br /&gt;
                         $i++;&lt;br /&gt;
                 }&lt;br /&gt;
         }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Definición de estilos ===&lt;br /&gt;
Para que el aspecto de la página guarde coherencia con el tema Dolibarr, es necesario utilizar los estilos CSS de Dolibarr.&lt;br /&gt;
&lt;br /&gt;
Por ejemplo:&lt;br /&gt;
&lt;br /&gt;
* class=&amp;quot;liste_titre&amp;quot;1 en las etiquetas tr y td para una línea de título de tabla. &lt;br /&gt;
* class=”pair” o class=”impair” en las etiquetas tr y td de las líneas de datos de la tabla.&lt;br /&gt;
* class=”flat” en todos los campos en los que se teclea (input, select, textarea...)&lt;br /&gt;
* class=”button” en los objetos de tipo input type=”submit”.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Utilizar el selector de fechas de Dolibarr ===&lt;br /&gt;
Si quiere, puede beneficiarse del selector de fechas en las pantallas Dolibarr. Para ello, utilice la siguiente línea:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $form=new Form($db);&lt;br /&gt;
 $form-&amp;gt;select_date(&#039;&#039;,&#039;mykey&#039;,0,0,0,&amp;quot;myform&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La cadena &amp;quot;mikey&amp;quot; identifica el campo fecha. Hace falta introducir un valor diferente en caso de que haya varios campos. La cadena &amp;quot;myform&amp;quot; es el nombre del campo &amp;quot;FORM&amp;quot; (en el formulario, name=&amp;quot;myform&amp;quot; de la página html). La visualización de un selector de fecha debe por tanto estar integrada en un formulario html.&lt;br /&gt;
&lt;br /&gt;
Para recuperar el valor, a la herencia de POST, el comando es:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $mydate = dol_mktime(12, 0 , 0, $_POST[&#039;mykeymonth&#039;], $_POST[&#039;mykeyday&#039;], $_POST[&#039;mykeyyear&#039;]);&lt;br /&gt;
 print strftime(&#039;%A %d %B %Y&#039;, $mydate);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Definir su página de configuración (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si su módulo ofrece varias opciones parametrizables.&lt;br /&gt;
&lt;br /&gt;
=== Crear su página de edición de configuración ===&lt;br /&gt;
Si su módulo ofrece varias opciones parametrizacles, es necesario crear una página PHP para editar las opciones (que serán guardadas en la [[Table llx_const|tabla &#039;&#039;&#039;llx_const&#039;&#039;&#039;]]). Cree una página PHP llamada &#039;&#039;&#039;mimodulo_setuppage.php&#039;&#039;&#039;, que registre las opciones posibles y las ponga al día. Es necesario tomar como ejemplo una página de &#039;&#039;&#039;/admin&#039;&#039;&#039; 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 &#039;&#039;&#039;/admin&#039;&#039;&#039;. 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 &#039;&#039;&#039;/admin&#039;&#039;&#039;).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $this-&amp;gt;config_page_url = array(&amp;quot;monmodule_setupapage.php&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Probar su página ===&lt;br /&gt;
Vaya a la página &#039;&#039;&#039;Configuración &amp;gt; módulo&#039;&#039;&#039;. 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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Definir sus entradas de menú (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si ha creado páginas PHP, es necesario que estas pantallas sean accesibles desde el menú Dolibarr.&lt;br /&gt;
&lt;br /&gt;
=== Definir sus entradas de menú ===&lt;br /&gt;
Para ello, hace falta definir en el archivo descriptor de menú de tabla this-&amp;gt;menu, que declara los menús.&lt;br /&gt;
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&lt;br /&gt;
&lt;br /&gt;
He aquí un ejemplo de declaración de entradas de menú en el fichero descriptor:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Main menu entries&lt;br /&gt;
$this-&amp;gt;menu = array();			// List of menus to add&lt;br /&gt;
$r=0;&lt;br /&gt;
&lt;br /&gt;
// Add here entries to declare new menus&lt;br /&gt;
// Example to declare the Top Menu entry:&lt;br /&gt;
$this-&amp;gt;menu[$r]=array(	&#039;fk_menu&#039;=&amp;gt;0,			// Put 0 if this is a top menu&lt;br /&gt;
			&#039;type&#039;=&amp;gt;&#039;top&#039;,			// This is a Top menu entry&lt;br /&gt;
			&#039;titre&#039;=&amp;gt;&#039;MyModule top menu&#039;,&lt;br /&gt;
			&#039;mainmenu&#039;=&amp;gt;&#039;mymodule&#039;,&lt;br /&gt;
			&#039;leftmenu&#039;=&amp;gt;&#039;mymodule&#039;,&lt;br /&gt;
			&#039;url&#039;=&amp;gt;&#039;/mymodule/pagetop.php&#039;,&lt;br /&gt;
			&#039;langs&#039;=&amp;gt;&#039;mylangfile&#039;,	// Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory.&lt;br /&gt;
			&#039;position&#039;=&amp;gt;100,&lt;br /&gt;
			&#039;enabled&#039;=&amp;gt;&#039;1&#039;,			// Define condition to show or hide menu entry. Use &#039;$conf-&amp;gt;mymodule-&amp;gt;enabled&#039; if entry must be visible if module is enabled.&lt;br /&gt;
			&#039;perms&#039;=&amp;gt;&#039;1&#039;,			// Use &#039;perms&#039;=&amp;gt;&#039;$user-&amp;gt;rights-&amp;gt;mymodule-&amp;gt;level1-&amp;gt;level2&#039; if you want your menu with a permission rules&lt;br /&gt;
			&#039;target&#039;=&amp;gt;&#039;&#039;,&lt;br /&gt;
			&#039;user&#039;=&amp;gt;2);				// 0=Menu for internal users, 1=external users, 2=both&lt;br /&gt;
$r++;&lt;br /&gt;
&lt;br /&gt;
// Example to declare a Left Menu entry:&lt;br /&gt;
$this-&amp;gt;menu[$r]=array(	&#039;fk_menu&#039;=&amp;gt;&#039;fk_mainmenu=xxx&#039;,		    // Use &#039;fk_mainmenu=xxx&#039; or &#039;fk_mainmenu=xxx,fk_leftmenu=yyy&#039; where xxx is mainmenucode and yyy is a leftmenucode of parent menu&lt;br /&gt;
			&#039;type&#039;=&amp;gt;&#039;left&#039;,			        // This is a Left menu entry&lt;br /&gt;
			&#039;titre&#039;=&amp;gt;&#039;MyModule left menu 1&#039;,&lt;br /&gt;
			&#039;mainmenu&#039;=&amp;gt;&#039;xxx&#039;,&lt;br /&gt;
                        &#039;leftmenu&#039;=&amp;gt;&#039;yyy&#039;,&lt;br /&gt;
			&#039;url&#039;=&amp;gt;&#039;/mymodule/pagelevel1.php&#039;,&lt;br /&gt;
			&#039;langs&#039;=&amp;gt;&#039;mylangfile&#039;,	// Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory.&lt;br /&gt;
			&#039;position&#039;=&amp;gt;100,&lt;br /&gt;
			&#039;enabled&#039;=&amp;gt;&#039;1&#039;,			// Define condition to show or hide menu entry. Use &#039;$conf-&amp;gt;mymodule-&amp;gt;enabled&#039; if entry must be visible if module is enabled.&lt;br /&gt;
			&#039;perms&#039;=&amp;gt;&#039;1&#039;,			// Use &#039;perms&#039;=&amp;gt;&#039;$user-&amp;gt;rights-&amp;gt;mymodule-&amp;gt;level1-&amp;gt;level2&#039; if you want your menu with a permission rules&lt;br /&gt;
			&#039;target&#039;=&amp;gt;&#039;&#039;,&lt;br /&gt;
			&#039;user&#039;=&amp;gt;2);				// 0=Menu for internal users,1=external users, 2=both&lt;br /&gt;
$r++;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para condicionar el acceso al menú segun los permisos, modificar la propiedad &#039;&#039;&#039;perms&#039;&#039;&#039; de la tabla. Ver el capítulo sobre permisos, un poco más abajo, para saber como realizar los permisos.&lt;br /&gt;
&lt;br /&gt;
=== Probar sus entradas de menú ===&lt;br /&gt;
Desactive y reactive su módulo bajo Dolibarr. Las entradas del menú deberían aparecer después de hacerlo (si la condición &#039;enabled&#039; está activada).&lt;br /&gt;
&lt;br /&gt;
== Definir sus propios permisos (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si quiere añadir nuevos permisos.&lt;br /&gt;
&lt;br /&gt;
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-&amp;gt;rights_class = &#039;facture&#039; para que diga:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $this-&amp;gt;rights_class = &#039;mimodulo&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A continuación, rellene la tabla $this-&amp;gt;rights con tantas entradas como permisos diferentes vaya a definir:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $this-&amp;gt;rights[$r][0] = 10001;&lt;br /&gt;
 $this-&amp;gt;rights[$r][1] = &#039;Texto por defecto de mi permiso&#039;;&lt;br /&gt;
 $this-&amp;gt;rights[$r][3] = 1;&lt;br /&gt;
 $this-&amp;gt;rights[$r][4] = &#039;accion&#039;;&lt;br /&gt;
 $this-&amp;gt;rights[$r][5] = &#039;subaccion&#039;;&lt;br /&gt;
 $r++;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En $this-&amp;gt;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ú &#039;&#039;&#039;Información del Sistema&#039;&#039;&#039; en una instalación de Dolibarr que esté funcionando. En $this-&amp;gt;rights[$r][3], introduzca 1 si este permiso se atribuye por defecto a los usuarios según son creados. En $this-&amp;gt;rights[$r][1] introduzca un texto por defecto -que será mostrado si no se encuentra traducción para su permiso en el archivo &#039;&#039;&#039;admin.lang&#039;&#039;&#039;). En $this-&amp;gt;rights[$r][4] y $this-&amp;gt;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:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 if ($user-&amp;gt;rights-&amp;gt;mimodulo-&amp;gt;accion-&amp;gt;subaccion) ...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Definir sus propios paneles (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si su módulo tiene uno o varios paneles.&lt;br /&gt;
&lt;br /&gt;
=== Defina sus paneles ===&lt;br /&gt;
Para ello, modifique las tablas $this-&amp;gt;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 &#039;&#039;&#039;htdocs/mimodulo/core/boxes&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Ejemplo:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;boxes[0][&#039;file&#039;]=&#039;mabox0.php@mimodulo&#039;&lt;br /&gt;
$this-&amp;gt;boxes[0][&#039;note&#039;]=&#039;Mi panel 0&#039;&lt;br /&gt;
 ...&lt;br /&gt;
$this-&amp;gt;boxes[n][&#039;file&#039;]=&#039;maboxn.php@mimodulo&#039;&lt;br /&gt;
$this-&amp;gt;boxes[n][&#039;note&#039;]=&#039;Mi panel n&#039;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A continuación cree los archivos &#039;&#039;&#039;htdocs/mimodulo/core/boxes/mabox0.php&#039;&#039;&#039;, &#039;&#039;&#039;htdocs/mimodulo/core/boxes/mabox1.php&#039;&#039;&#039;...  tomando como ejemplo los paneles existentes (en el directorio htdocs/core/boxes)&lt;br /&gt;
&lt;br /&gt;
=== Pruebe sus paneles en Dolibarr ===&lt;br /&gt;
Vaya al menú &#039;&#039;&#039;Inico – Configuración – Paneles&#039;&#039;&#039;. 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.&lt;br /&gt;
&lt;br /&gt;
== Definir sus propias exportaciones (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; 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)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Definir la exportación ===&lt;br /&gt;
Para ello, descomente y modifique las tablas $this-&amp;gt;export_xxx  de su archivo descriptor de módulo.&lt;br /&gt;
&lt;br /&gt;
=== Probar la exportación ===&lt;br /&gt;
Vaya al menú &amp;quot;Herramientas &amp;gt; Exportar&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Definir sus estilos CSS (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si en sus pantallas PHP utiliza clases de estilos distintas a las de los temas de Dolibarr (no recomendado).&lt;br /&gt;
&lt;br /&gt;
Esta funcionalidad todavía no es operativa en la versión 2.4., a pesar de estar ya descrita.&lt;br /&gt;
&lt;br /&gt;
=== Crear y declarar su hoja de estilos ===&lt;br /&gt;
Crear un archivo de estilos llamada &#039;&#039;&#039;mimodulo.css&#039;&#039;&#039; o &#039;&#039;&#039;mimodule.css.php&#039;&#039;&#039; y guardarla en el directorio &#039;&#039;&#039;&#039;&#039;mimodulo&#039;&#039;&#039;&#039;&#039; dentro de &#039;&#039;&#039;htdocs&#039;&#039;&#039;. Solo puede haber un archivo css propio a cada módulo.&lt;br /&gt;
Recordamos que es mejor usar los estilos ya existentes en Dolibarr (el archivo css usado por Dolibarr es el archivo &#039;&#039;&#039;themes/nomtheme/&#039;&#039;nombretema&#039;&#039;.css.php&#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
Una vez su hoja de estilos esté disponible, declárela en su archivo descriptor de módulo modificando la propiedad &#039;&#039;&#039;$this-&amp;gt;module_parts&#039;&#039;&#039;.&lt;br /&gt;
El valor a indicar debe ser la ruta URL relativa de su archivo css.&lt;br /&gt;
Por ejemplo&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;module_parts = array(&#039;css&#039; =&amp;gt; array(&#039;/mimodulo/css/mimodulo.css.php&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Probar su hoja de estilos ===&lt;br /&gt;
Desactivar y reactivar su módulo.&lt;br /&gt;
&lt;br /&gt;
Ir la página de inicio de Dolibarr. Ver el código de la página HTML.&lt;br /&gt;
&lt;br /&gt;
Debería ver en el encabezado HTML, una línea de declaración de su hoja de estilos.&lt;br /&gt;
&lt;br /&gt;
== Definir sus funciones Javascript (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuando&#039;&#039;&#039;: Si en sus pantallas en PHP utiliza funciones de Javascript no disponibles en estandard (archivo lib_head.js)&lt;br /&gt;
&lt;br /&gt;
Si en sus pantallas en PHP utiliza funciones javascript, es necesario asegurarse de que las funciones declaradas en un archivo javascript &#039;&#039;&#039;htdocs/mimodulo/js/monmodule.js&#039;&#039;&#039; sea cargado en la cabecera del head html.&lt;br /&gt;
&lt;br /&gt;
Para pedir a Dolibarr que gestione en la generación de la sección header la inclusión de uno de sus archivos javascript, es necesario proporcionar como parámetro a la función llxHeader(), al inicio de su página, la URL hacia el js a incluir.&lt;br /&gt;
&lt;br /&gt;
Ejemplo para la página /htdocs/mimodulo/mapage.php :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
require(&#039;../main.inc.php&#039;);&lt;br /&gt;
$morejs=array(&amp;quot;/mimomulo/js/monmodule.js&amp;quot;);&lt;br /&gt;
llxHeader(&#039;&#039;,&#039;Titulo&#039;,&#039;&#039;,&#039;&#039;,&#039;&#039;,&#039;&#039;,$morejs,&#039;&#039;,0,0); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ejecutar código sobre un evento Dolibarr (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; 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 &#039;&#039;&#039;disparador (triggers)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Véase también [[Interfaces Dolibarr hacia el exterior]] e [[Interfaces del Exterior hacia Dolibarr]]&lt;br /&gt;
&lt;br /&gt;
== Insertar su código usando los hooks de Dolibarr (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039;: Cuando desee cambiar o añadir otro tipo de código en un evento de negociado (véase lel capítulo anterior para esto).&lt;br /&gt;
&lt;br /&gt;
Véase la página [[El sistema Hooks]].&lt;br /&gt;
&lt;br /&gt;
== Añadir un módulo de numeración (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039;: Si quiere añadir una regla de numeración no cubierta por los módulos por defecto.&lt;br /&gt;
&lt;br /&gt;
Véase la página [[Crear un módulo de numeración]].&lt;br /&gt;
&lt;br /&gt;
== Añadir un nuevo módulo de documento (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039;: Si quiere añadir un nuevo modelo de documento.&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
== Añadir un tema (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039;: Si quiere un interface con colores personalizados.&lt;br /&gt;
&lt;br /&gt;
Véase la página [[Temas]].&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Algunas reglas de código =&lt;br /&gt;
Las reglas de código a seguir se definen en la [[Documentación Desarrolladores| Documentación para desarrolladores]], concretamente en la sección &amp;quot;Lenguaje&amp;quot; del capítulo de &amp;quot;Información General&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Utilización de MDA =&lt;br /&gt;
Un método para generar un módulo funcional desde UML se encuentra en curso de puesta a punto. Más información en la página [[UML2Dolibarr - Crear un módulo usando MDA]].&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Crear un paquete para liberar e instalar su módulo =&lt;br /&gt;
Este proceso debe ser usado para fabricar un paquete con el fin de enviarlo a la tienda oficial http://www.dolistore.com.&lt;br /&gt;
&lt;br /&gt;
También puede usarlo para distribuir fácilmente su módulo vía su propio método de distribución.&lt;br /&gt;
&lt;br /&gt;
* Vaya al directorio &#039;&#039;&#039;/build&#039;&#039;&#039; y copie el archivo &#039;&#039;&#039;makepack-dolibarrmodules.conf&#039;&#039;&#039; como &#039;&#039;&#039;makepack-mimodulo.conf&#039;&#039;&#039;. 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).&lt;br /&gt;
&lt;br /&gt;
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...)&lt;br /&gt;
* Lance el script vía Perl (necesita la versión 5.0. o superiores de Perl)&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 perl makepack-dolibarrmodule.pl&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El script le pide el nombre de su módulo, su versión mayor y menor. Se va a crear un fichero &#039;&#039;&#039;mimodulo.zip&#039;&#039;&#039;, que incluirá su módulo listo para ser liberado.&lt;br /&gt;
* La persona que reciba su módulo deberá ubicar el archivo en el directorio raíz de Dolibarr y ejecutar el comando:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 tar -xvf monmodule.zip&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 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 &amp;quot;Submit a product&amp;quot;).&lt;br /&gt;
** Si su módulo está correctamente realizado, será rápidamente validado.&lt;br /&gt;
** 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).&lt;/div&gt;</summary>
		<author><name>Nnicolashr</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Desarrollo_de_un_m%C3%B3dulo&amp;diff=35887</id>
		<title>Desarrollo de un módulo</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Desarrollo_de_un_m%C3%B3dulo&amp;diff=35887"/>
		<updated>2016-09-08T02:04:25Z</updated>

		<summary type="html">&lt;p&gt;Nnicolashr: /* Añadir pestañas de una ficha entidad en su propia página */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Básico]]&lt;br /&gt;
{{TemplateDocDesarrollo}}&lt;br /&gt;
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:&lt;br /&gt;
* Añadir nuevas tablas a la base de datos.&lt;br /&gt;
* Añadir sus propias entradas en los menús.&lt;br /&gt;
* Añadir pantallas de edición/consulta de nuevas tablas.&lt;br /&gt;
* Añadir o eliminar pestañas en las páginas de vista/edición de objetos (factura, producto, pedido, evento, etc.)&lt;br /&gt;
* Añadir exportaciones predefinidas a la función “Exportar”.&lt;br /&gt;
* Añadir variables de substitución&lt;br /&gt;
* Añadir nuevas cajas a la página de inicio.&lt;br /&gt;
* Definir nuevos permisos.&lt;br /&gt;
* Activar código automático sobre una acción particular de Dolibarr.&lt;br /&gt;
* Insertar nuestro código mediante los hooks de Dolibarr&lt;br /&gt;
* Añadir un módulo de numeración&lt;br /&gt;
* Añadir un modelo de documento&lt;br /&gt;
* Añadir un nuevo tema &lt;br /&gt;
&lt;br /&gt;
etc. Todas estas operaciones sólo están disponibles a partir de la versión 3.2 de Dolibarr.&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Crear un módulo =&lt;br /&gt;
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&lt;br /&gt;
&lt;br /&gt;
== [[File:Art.png]] Crear un descriptor de Módulo (obligatorio) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039;: Obligatorio cada vez que se desarrolla una extensión, cualquiera que sea su finalidad.&lt;br /&gt;
&lt;br /&gt;
=== Crear su descriptor ===&lt;br /&gt;
La primera fase es la de crear un fichero descriptor del módulo. Para ello:&lt;br /&gt;
* Crear el directorio &#039;&#039;&#039;/htdocs/&#039;&#039;mimodulo&#039;&#039;/core/modules&#039;&#039;&#039;. Seguidamente ir al directorio &#039;&#039;&#039;dev/skeletons&#039;&#039;&#039; y copiar el archivo modMyModule.class.php en el directorio &#039;&#039;&#039;htdocs/&#039;&#039;mimodulo&#039;&#039;/core/modules&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
 Nota: En versión 3.9.2 de Dolibarr, el directorio donde se ubican los ficheros descriptor de módulo es &#039;&#039;&#039;/htdocs/&#039;&#039;core/modules&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A continuación, modificar el contenido del archivo, reemplazando:&lt;br /&gt;
* los &amp;quot;modMyModule&amp;quot; por un valor que corresponda a la finalidad de su módulo. Este valor debe siempre comenzar por mod. &lt;br /&gt;
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.&lt;br /&gt;
* $this-&amp;gt;numero = 100000 por un número de módulo que esté libre. Ver [[List of modules id|Listado de los id de módulos]]&lt;br /&gt;
* Modificar eventualmente otras variables definidas por los desarrolladores (ver el comentario en el código del esqueleto para ver su significado)&lt;br /&gt;
* Crear el directorio /htdocs/mimodulo/ &lt;br /&gt;
Ahora su fichero descriptor está configurado.&lt;br /&gt;
&lt;br /&gt;
=== Probar su descriptor ===&lt;br /&gt;
Ejecute Dolibarr y vaya a la página &amp;quot;Configuración &amp;gt; Módulo&amp;quot;. 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-&amp;gt;special el que determina en qué pestaña se encuentra su módulo.&lt;br /&gt;
&lt;br /&gt;
== [[File:Art.png]] Árbol de un nuevo módulo ==&lt;br /&gt;
Crear un directorio &#039;mimodulo&#039; que contendrá los archivos del módulo. Este directorio debe de estar en el directorio &#039;&#039;&#039;htdocs&#039;&#039;&#039; y contendrá los siguientes subdirectorios:&lt;br /&gt;
{{TemplateModuleTreeSimple}}&lt;br /&gt;
&lt;br /&gt;
== [[File:Art.png]] Crear sus tablas SQL y la clase PHP con los métodos de acceso (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si su módulo necesita gestionar sus propios datos.&lt;br /&gt;
&lt;br /&gt;
===Crear sus ficheros .sql===&lt;br /&gt;
Si su módulo de verdad requiere administrar datos que no existen en la base de datos en la versión estándar de Dolibarr, será necesario definir ciertas tablas SQL para registrar esos datos.&lt;br /&gt;
&lt;br /&gt;
Revisa que en el descriptor de archivo (mymodule/core/modules/mymodule.class.php) la línea&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;_load_tables(&#039;/mymodule/sql/&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
esté descomentada y correctamente configurada.&lt;br /&gt;
&lt;br /&gt;
Cree un subdirectorio sql en el directorio de su módulo (por ejemplo, htdocs/mimodulo/sql), con el fin de colocar los scripts sql que va a crear. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Regla a respetar:&#039;&#039; &lt;br /&gt;
* Agregue los archivos de orden de creación de sus tablas siguiendo el principio de un fichero &#039;&#039;&#039;llx_mitabla.sql&#039;&#039; por tabla, eventualmente acompañado del archivo &#039;&#039;&#039;llx_mitabla.key.sql&#039;&#039;&#039; (ver los archivos existentes en &#039;&#039;install/mysql/tables&#039;&#039;, para tomar ejemplo). &lt;br /&gt;
* En términos de orden de gestión de datos, todos deben estar en un archivo llamado &#039;&#039;&#039;data.sql&#039;&#039;&#039; situado en la misma carpeta &#039;&#039;&#039;/mimodulo/sql/&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Ejemplo de contenido de un fichero data.sql&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
 delete from llx_const where name=&#039;MYMODULE_IT_WORKS&#039; and entity=&#039;__ENTITY__&#039;;&lt;br /&gt;
 insert into llx_const (name, value, type, note, visible, entity) values (&#039;MYMODULE_IT_WORKS&#039;,&#039;1&#039;,&#039;chaine&#039;,&#039;A constant vor my module&#039;,1,&#039;__ENTITY__&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Las órdenes SQL de los archivos deben de ser operacionales para la base de datos &#039;&#039;&#039;mysql&#039;&#039;&#039;.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Probar su archivo .sql ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Generar la clase PHP de acceso (DAO) ===&lt;br /&gt;
Una vez que su/s tabla/s estén creadas en la base de datos, vaya al directorio &#039;&#039;&#039;dev/skeletons&#039;&#039;&#039;, copie el archivo &#039;&#039;&#039;build_class_from_table.php&#039;&#039;&#039; en la el directorio sql/ de su módulo module, y ejecute el script&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 php build_class_from_table.php nombretabla&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Nota: Si el comando no funciona, intente con php-cli en lugar de php.&lt;br /&gt;
&lt;br /&gt;
Esto genera un archivo &#039;&#039;&#039;out.nombretabla.class.php&#039;&#039;&#039; que contiene la clase de gestión de la tabla “nombretabla”. En esta clase se encuentran los métodos CRUD (Create/Read/Update/Delete) ya operativos para hacer un &#039;&#039;insert&#039;&#039;, un &#039;&#039;fetch&#039;&#039; (&#039;&#039;select&#039;&#039;), un &#039;&#039;update&#039;&#039;, y un &#039;&#039;delete&#039;&#039; de una línea de la tabla. Suprima justo el &amp;quot;out&amp;quot; del nombre del archivo y pógalo en un subdirectorio de &#039;&#039;&#039;htdocs&#039;&#039;&#039; propio en su módulo (Por ejemplo en &#039;&#039;&#039;htdocs/mimodulo&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Un archivo &#039;&#039;&#039;out.nombretabla_script.php&#039;&#039;&#039; se genera igualmente y contiene un ejemplo de código para utilizar la clase para cada uno de los cuatro métodos CRUD.&lt;br /&gt;
&lt;br /&gt;
== Visualización de pestañas (opcional) ==&lt;br /&gt;
&lt;br /&gt;
=== Añadir o eliminar pestañas en las fichas entidad ===&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039; : Para añadir su propia pestaña en las pestañas estándar de una ficha entidad (factura, pedido, presupuesto, miembro...)&lt;br /&gt;
&lt;br /&gt;
Para ello, vaya al archivo descriptor del módulo creado anteriormente y modifique la tabla $this-&amp;gt;tabs:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
	// Array to add new pages in new tabs or remove existing one&lt;br /&gt;
	$this-&amp;gt;tabs = array(&#039;objecttype:+tabname1:Title1:@mymodule:/mymodule/mynewtab1.php?id=__ID__&#039;,  // To add a new tab identified by code tabname1&lt;br /&gt;
                            &#039;objecttype:+tabname2:Title2:@mymodule:/mymodule/mynewtab2.php?id=__ID__&#039;,  // To add another new tab identified by code tabname2&lt;br /&gt;
                            &#039;objecttype:-tabname&#039;);                                                     // To remove an existing tab identified by code tabname&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La tabla debe contener una lista de cadena, cada cadena representa una nueva pestaña.&lt;br /&gt;
El formato de la cadena se compone de 4 partes separadas por &amp;quot;:&amp;quot;&lt;br /&gt;
* Parte 1: El código de la entidad (objecttype) en la que debe aparecer la pestaña siendo el valor de ella misma:&lt;br /&gt;
{{TemplateModuleTabs-es}}&lt;br /&gt;
* 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.&lt;br /&gt;
* 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&lt;br /&gt;
&lt;br /&gt;
* 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.&lt;br /&gt;
&lt;br /&gt;
Para alimentar el contenido de la pestaña con los datos de la base de datos, vea el capítulo siguiente.&lt;br /&gt;
&lt;br /&gt;
=== Añadir pestañas de una ficha entidad en su propia página ===&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039; : Para mostrar las pestañas estándar de ficha entidad (producto, tercero, etc.) en su propia pestaña de una entidad.&lt;br /&gt;
&lt;br /&gt;
Hay que hacer lo siguiente :&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Incluir los archivos que definen las funciones útiles dentro de sus archivos&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para cada ficha entidad, hay que incluir dos archivos con la instrucción&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;require_once($url_fichier) ;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aquí le mostramos la lista de estos archivos (DOL_DOCUMENT_ROOT correspondiente al directorio &#039;&#039;&#039;dolibarr/htdocs/&#039;&#039;&#039;) :&lt;br /&gt;
* Entidad tercero (thirdparty) :&lt;br /&gt;
** DOL_DOCUMENT_ROOT/societe.class.php&lt;br /&gt;
** DOL_DOCUMENT_ROOT/lib/company.lib.php&lt;br /&gt;
* Entidad producto (product) :&lt;br /&gt;
** DOL_DOCUMENT_ROOT/product.class.php&lt;br /&gt;
** DOL_DOCUMENT_ROOT/lib/product.lib.php&lt;br /&gt;
* Entidad factura (invoice) :&lt;br /&gt;
** DOL_DOCUMENT_ROOT/facture.class.php&lt;br /&gt;
** DOL_DOCUMENT_ROOT/lib/invoice.lib.php&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Crear y cargar el objeto a mostrar en su pestaña&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Crear el objeto de la clase deseada, y recuperar los datos del objeto a partir de la base de datos. Para ello deberá utilizar las funciones fetch() de la clase correspondiente, pasando el parámetro del indentificador del objeto que recupera desde la url (ej : /mononglet.php?id=1).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Ejemplo :&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$id=$_GET[&amp;quot;id&amp;quot;];&lt;br /&gt;
$product = new Product($db) ;&lt;br /&gt;
$result = $product-&amp;gt;fetch($id) ; //Tester $result pour vérifier que l&#039;accès à la base s&#039;est bien passé&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3. Recuperar la lista de pestañas correspondientes a la entidad seleccionada&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Usar la función XXX_prepare_head($obj), donde XXX es le nombre de la entidad, para crear una tabla que contiene las definiciones de las pestañas a mostrar. El parámetro a pasar es el objeto del que desea mostrar las pestañas.&lt;br /&gt;
&lt;br /&gt;
La tabla devuelta se compone de la siguiente manera :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$head        // Tableau des onglets&lt;br /&gt;
$head[$h]    // Élément décrivant un onglet. Il y aura autant de $h que d&#039;onglets à afficher&lt;br /&gt;
$head[$h][0] // Url de la page affichée quand on clique sur l&#039;onglet&lt;br /&gt;
$head[$h][1] // Titre de l&#039;ongLet&lt;br /&gt;
$head[$h][2] // Code de l&#039;onglet, à utiliser pour choisir quel onglet sera &#039;actif&#039; (voir paragraphe suivant)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Ejemplo :&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$head = product_prepare_head($product, $user) ; //le paramètre $user n&#039;est pas présent sur certaines fonctions&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4. Mostrar las pestañas en su pestaña&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Use la función dol_fiche_head() que muestra las pestañas contenidas en la tabla $head devuelta por XX_prepare_head().&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
dol_fiche_head($links, $active=&#039;0&#039;, $title=&#039;&#039;, $notab=0, $picto=&#039;&#039;)&lt;br /&gt;
$links  // Tableau des onglets, appelé $head plus haut.&lt;br /&gt;
$active // Onglet actif (mettre le nom de l&#039;onglet défini dans votre fichier de module, ou un nom contenu dans $head[$h][2]). Cet onglet sera mis en surbrillance&lt;br /&gt;
$title  // ?&lt;br /&gt;
$notab  // Mettre ce paramètre à 1 permet de ne pas afficher de zone bleue en dessous des onglets.&lt;br /&gt;
$picto  // Nom de l&#039;image à utiliser au début de la barre des onglet. Les choix suivant sont possibles :&lt;br /&gt;
//            product&lt;br /&gt;
//            service&lt;br /&gt;
//            company&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esta función muestra las pestañas deseadas y abre un elemento &#039;&#039;&amp;lt; div class=&amp;quot;&amp;quot; &amp;gt;&#039;&#039; 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 &#039;&#039;&amp;lt; /div &amp;gt;&#039;&#039; en el código PHP.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Nota&#039;&#039;:&lt;br /&gt;
Para más detalles, consulte la [http://www.dolibarr.fr/doxygen/ documentación Doxygen] o directamente el código de Dolibarr.&lt;br /&gt;
&lt;br /&gt;
== Crear sus páginas pantalla PHP (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si su módulo consiste en añadir funcionalidades que necesitan nuevas pantallas.&lt;br /&gt;
&lt;br /&gt;
=== Crear una página pantalla PHP ===&lt;br /&gt;
Debe crear a continuación pantallas PHP que se basen en los datos de sus tablas utilizando los esqueletos como ejemplo del directorio &#039;&#039;&#039;dev/skeletons&#039;&#039;&#039;. (Para el desarrollo de un script en línea de comandos, ver [[Desarrollo de scripts]]).&lt;br /&gt;
&lt;br /&gt;
Para crear una nueva página de usuario, cree un subdirectorio de &#039;&#039;&#039;htdocs&#039;&#039;&#039; (si es que no existe ya) propio en su módulo (En &#039;&#039;&#039;htdocs/mimodulo&#039;&#039;&#039;, por ejemplo), con el fin de ubicar en él las páginas que va a crear.&lt;br /&gt;
&lt;br /&gt;
Copie allí el archivo &#039;&#039;&#039;skeletons_page.php&#039;&#039;&#039;, que va a servir de punto de partida a su página. Modifique el archivo para que la ruta relativa de&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$res=0;&lt;br /&gt;
if (! $res &amp;amp;&amp;amp; file_exists(&amp;quot;../main.inc.php&amp;quot;)) $res=@include(&amp;quot;../main.inc.php&amp;quot;);			// to work if your module directory is into dolibarr root htdocs directory&lt;br /&gt;
if (! $res &amp;amp;&amp;amp; file_exists(&amp;quot;../../main.inc.php&amp;quot;)) $res=@include(&amp;quot;../../main.inc.php&amp;quot;);		// to work if your module directory is into a subdir of root htdocs directory&lt;br /&gt;
if (! $res) die(&amp;quot;Include of main fails&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
sea la correcta, en función de la profundidad del directorio en el que se encuentra el archivo (quitando o añadiendo &amp;quot;../&amp;quot;). Es en el &amp;quot;main&amp;quot; donde se carga el entorno técnico y las habilitaciones. Los objetos variables se posicionan ahora:&lt;br /&gt;
* $user – El objeto que contiene las características del usuario y sus derechos.&lt;br /&gt;
* $conf – El objeto que contiene la configuración de Dolibarr.&lt;br /&gt;
* $db – El objeto que contiene el gestor de conexión abierto a la base de datos.&lt;br /&gt;
* $langs – El objeto que contiene el idioma del usuario.&lt;br /&gt;
&lt;br /&gt;
* 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):&lt;br /&gt;
&#039;&#039;Exemple :&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
dol_include_once(&#039;/mimodulo/class/miclass.class.php&#039;, &#039;MiClass&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Las clases de llamadas Dolibarr utilice la siguiente sintaxis:&lt;br /&gt;
&#039;&#039;Exemple :&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
require_once DOL_DOCUMENT_ROOT.&#039;/core/class/doli.class.php&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Reemplazar partes de templates de pantalla (versión 3.3+) ===&lt;br /&gt;
Algunas partes de la pantalla de Dolibarr están aisladas en archivos de plantilla. Puede desarrollar un módulo para reemplazar una o más de estas plantillas con las suyas.&lt;br /&gt;
{{ToComplete}}&lt;br /&gt;
&lt;br /&gt;
=== Acceso a la base de datos ===&lt;br /&gt;
Si necesita realizar modificaciones en su tabla de la base de datos, utilice la clase generada más arriba.&lt;br /&gt;
&lt;br /&gt;
Si de todos modos quiere acceder a las tablas sin objeto PHP dedicado, esto es posible (por ejemplo para recuperar una lista de registros). En ese caso, piense en seguir estos ejemplos.&lt;br /&gt;
&lt;br /&gt;
Para un &#039;&#039;insert&#039;&#039;, &#039;&#039;update&#039;&#039; o &#039;&#039;delete&#039;&#039;:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $db-&amp;gt;begin();   // Debut transaction&lt;br /&gt;
 $db-&amp;gt;query(&amp;quot;Ma requete insert, update ou delete&amp;quot;);&lt;br /&gt;
 $db-&amp;gt;commit();       // Valide&lt;br /&gt;
 o $db-&amp;gt;rollback()  // Annule&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para una lectura:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $resql=$db-&amp;gt;query(&amp;quot;Ma requete select&amp;quot;);&lt;br /&gt;
 if ($resql)&lt;br /&gt;
 {&lt;br /&gt;
         $num = $db-&amp;gt;num_rows($resql);&lt;br /&gt;
         $i = 0;&lt;br /&gt;
         if ($num)&lt;br /&gt;
         {&lt;br /&gt;
                 while ($i &amp;lt; $num)&lt;br /&gt;
                 {&lt;br /&gt;
                         $obj = $db-&amp;gt;fetch_object($resql);&lt;br /&gt;
                         if ($obj)&lt;br /&gt;
                         {&lt;br /&gt;
                                 // You can use here results&lt;br /&gt;
                                 print $obj-&amp;gt;field1;&lt;br /&gt;
                                 print $obj-&amp;gt;field2;&lt;br /&gt;
                         }&lt;br /&gt;
                         $i++;&lt;br /&gt;
                 }&lt;br /&gt;
         }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Definición de estilos ===&lt;br /&gt;
Para que el aspecto de la página guarde coherencia con el tema Dolibarr, es necesario utilizar los estilos CSS de Dolibarr.&lt;br /&gt;
&lt;br /&gt;
Por ejemplo:&lt;br /&gt;
&lt;br /&gt;
* class=&amp;quot;liste_titre&amp;quot;1 en las etiquetas tr y td para una línea de título de tabla. &lt;br /&gt;
* class=”pair” o class=”impair” en las etiquetas tr y td de las líneas de datos de la tabla.&lt;br /&gt;
* class=”flat” en todos los campos en los que se teclea (input, select, textarea...)&lt;br /&gt;
* class=”button” en los objetos de tipo input type=”submit”.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Utilizar el selector de fechas de Dolibarr ===&lt;br /&gt;
Si quiere, puede beneficiarse del selector de fechas en las pantallas Dolibarr. Para ello, utilice la siguiente línea:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $form=new Form($db);&lt;br /&gt;
 $form-&amp;gt;select_date(&#039;&#039;,&#039;mykey&#039;,0,0,0,&amp;quot;myform&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La cadena &amp;quot;mikey&amp;quot; identifica el campo fecha. Hace falta introducir un valor diferente en caso de que haya varios campos. La cadena &amp;quot;myform&amp;quot; es el nombre del campo &amp;quot;FORM&amp;quot; (en el formulario, name=&amp;quot;myform&amp;quot; de la página html). La visualización de un selector de fecha debe por tanto estar integrada en un formulario html.&lt;br /&gt;
&lt;br /&gt;
Para recuperar el valor, a la herencia de POST, el comando es:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $mydate = dol_mktime(12, 0 , 0, $_POST[&#039;mykeymonth&#039;], $_POST[&#039;mykeyday&#039;], $_POST[&#039;mykeyyear&#039;]);&lt;br /&gt;
 print strftime(&#039;%A %d %B %Y&#039;, $mydate);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Definir su página de configuración (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si su módulo ofrece varias opciones parametrizables.&lt;br /&gt;
&lt;br /&gt;
=== Crear su página de edición de configuración ===&lt;br /&gt;
Si su módulo ofrece varias opciones parametrizacles, es necesario crear una página PHP para editar las opciones (que serán guardadas en la [[Table llx_const|tabla &#039;&#039;&#039;llx_const&#039;&#039;&#039;]]). Cree una página PHP llamada &#039;&#039;&#039;mimodulo_setuppage.php&#039;&#039;&#039;, que registre las opciones posibles y las ponga al día. Es necesario tomar como ejemplo una página de &#039;&#039;&#039;/admin&#039;&#039;&#039; 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 &#039;&#039;&#039;/admin&#039;&#039;&#039;. 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 &#039;&#039;&#039;/admin&#039;&#039;&#039;).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $this-&amp;gt;config_page_url = array(&amp;quot;monmodule_setupapage.php&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Probar su página ===&lt;br /&gt;
Vaya a la página &#039;&#039;&#039;Configuración &amp;gt; módulo&#039;&#039;&#039;. 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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Definir sus entradas de menú (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si ha creado páginas PHP, es necesario que estas pantallas sean accesibles desde el menú Dolibarr.&lt;br /&gt;
&lt;br /&gt;
=== Definir sus entradas de menú ===&lt;br /&gt;
Para ello, hace falta definir en el archivo descriptor de menú de tabla this-&amp;gt;menu, que declara los menús.&lt;br /&gt;
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&lt;br /&gt;
&lt;br /&gt;
He aquí un ejemplo de declaración de entradas de menú en el fichero descriptor:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Main menu entries&lt;br /&gt;
$this-&amp;gt;menu = array();			// List of menus to add&lt;br /&gt;
$r=0;&lt;br /&gt;
&lt;br /&gt;
// Add here entries to declare new menus&lt;br /&gt;
// Example to declare the Top Menu entry:&lt;br /&gt;
$this-&amp;gt;menu[$r]=array(	&#039;fk_menu&#039;=&amp;gt;0,			// Put 0 if this is a top menu&lt;br /&gt;
			&#039;type&#039;=&amp;gt;&#039;top&#039;,			// This is a Top menu entry&lt;br /&gt;
			&#039;titre&#039;=&amp;gt;&#039;MyModule top menu&#039;,&lt;br /&gt;
			&#039;mainmenu&#039;=&amp;gt;&#039;mymodule&#039;,&lt;br /&gt;
			&#039;leftmenu&#039;=&amp;gt;&#039;mymodule&#039;,&lt;br /&gt;
			&#039;url&#039;=&amp;gt;&#039;/mymodule/pagetop.php&#039;,&lt;br /&gt;
			&#039;langs&#039;=&amp;gt;&#039;mylangfile&#039;,	// Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory.&lt;br /&gt;
			&#039;position&#039;=&amp;gt;100,&lt;br /&gt;
			&#039;enabled&#039;=&amp;gt;&#039;1&#039;,			// Define condition to show or hide menu entry. Use &#039;$conf-&amp;gt;mymodule-&amp;gt;enabled&#039; if entry must be visible if module is enabled.&lt;br /&gt;
			&#039;perms&#039;=&amp;gt;&#039;1&#039;,			// Use &#039;perms&#039;=&amp;gt;&#039;$user-&amp;gt;rights-&amp;gt;mymodule-&amp;gt;level1-&amp;gt;level2&#039; if you want your menu with a permission rules&lt;br /&gt;
			&#039;target&#039;=&amp;gt;&#039;&#039;,&lt;br /&gt;
			&#039;user&#039;=&amp;gt;2);				// 0=Menu for internal users, 1=external users, 2=both&lt;br /&gt;
$r++;&lt;br /&gt;
&lt;br /&gt;
// Example to declare a Left Menu entry:&lt;br /&gt;
$this-&amp;gt;menu[$r]=array(	&#039;fk_menu&#039;=&amp;gt;&#039;fk_mainmenu=xxx&#039;,		    // Use &#039;fk_mainmenu=xxx&#039; or &#039;fk_mainmenu=xxx,fk_leftmenu=yyy&#039; where xxx is mainmenucode and yyy is a leftmenucode of parent menu&lt;br /&gt;
			&#039;type&#039;=&amp;gt;&#039;left&#039;,			        // This is a Left menu entry&lt;br /&gt;
			&#039;titre&#039;=&amp;gt;&#039;MyModule left menu 1&#039;,&lt;br /&gt;
			&#039;mainmenu&#039;=&amp;gt;&#039;xxx&#039;,&lt;br /&gt;
                        &#039;leftmenu&#039;=&amp;gt;&#039;yyy&#039;,&lt;br /&gt;
			&#039;url&#039;=&amp;gt;&#039;/mymodule/pagelevel1.php&#039;,&lt;br /&gt;
			&#039;langs&#039;=&amp;gt;&#039;mylangfile&#039;,	// Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory.&lt;br /&gt;
			&#039;position&#039;=&amp;gt;100,&lt;br /&gt;
			&#039;enabled&#039;=&amp;gt;&#039;1&#039;,			// Define condition to show or hide menu entry. Use &#039;$conf-&amp;gt;mymodule-&amp;gt;enabled&#039; if entry must be visible if module is enabled.&lt;br /&gt;
			&#039;perms&#039;=&amp;gt;&#039;1&#039;,			// Use &#039;perms&#039;=&amp;gt;&#039;$user-&amp;gt;rights-&amp;gt;mymodule-&amp;gt;level1-&amp;gt;level2&#039; if you want your menu with a permission rules&lt;br /&gt;
			&#039;target&#039;=&amp;gt;&#039;&#039;,&lt;br /&gt;
			&#039;user&#039;=&amp;gt;2);				// 0=Menu for internal users,1=external users, 2=both&lt;br /&gt;
$r++;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para condicionar el acceso al menú segun los permisos, modificar la propiedad &#039;&#039;&#039;perms&#039;&#039;&#039; de la tabla. Ver el capítulo sobre permisos, un poco más abajo, para saber como realizar los permisos.&lt;br /&gt;
&lt;br /&gt;
=== Probar sus entradas de menú ===&lt;br /&gt;
Desactive y reactive su módulo bajo Dolibarr. Las entradas del menú deberían aparecer después de hacerlo (si la condición &#039;enabled&#039; está activada).&lt;br /&gt;
&lt;br /&gt;
== Definir sus propios permisos (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si quiere añadir nuevos permisos.&lt;br /&gt;
&lt;br /&gt;
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-&amp;gt;rights_class = &#039;facture&#039; para que diga:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $this-&amp;gt;rights_class = &#039;mimodulo&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A continuación, rellene la tabla $this-&amp;gt;rights con tantas entradas como permisos diferentes vaya a definir:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $this-&amp;gt;rights[$r][0] = 10001;&lt;br /&gt;
 $this-&amp;gt;rights[$r][1] = &#039;Texto por defecto de mi permiso&#039;;&lt;br /&gt;
 $this-&amp;gt;rights[$r][3] = 1;&lt;br /&gt;
 $this-&amp;gt;rights[$r][4] = &#039;accion&#039;;&lt;br /&gt;
 $this-&amp;gt;rights[$r][5] = &#039;subaccion&#039;;&lt;br /&gt;
 $r++;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En $this-&amp;gt;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ú &#039;&#039;&#039;Información del Sistema&#039;&#039;&#039; en una instalación de Dolibarr que esté funcionando. En $this-&amp;gt;rights[$r][3], introduzca 1 si este permiso se atribuye por defecto a los usuarios según son creados. En $this-&amp;gt;rights[$r][1] introduzca un texto por defecto -que será mostrado si no se encuentra traducción para su permiso en el archivo &#039;&#039;&#039;admin.lang&#039;&#039;&#039;). En $this-&amp;gt;rights[$r][4] y $this-&amp;gt;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:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 if ($user-&amp;gt;rights-&amp;gt;mimodulo-&amp;gt;accion-&amp;gt;subaccion) ...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Definir sus propios paneles (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si su módulo tiene uno o varios paneles.&lt;br /&gt;
&lt;br /&gt;
=== Defina sus paneles ===&lt;br /&gt;
Para ello, modifique las tablas $this-&amp;gt;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 &#039;&#039;&#039;htdocs/mimodulo/core/boxes&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Ejemplo:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;boxes[0][&#039;file&#039;]=&#039;mabox0.php@mimodulo&#039;&lt;br /&gt;
$this-&amp;gt;boxes[0][&#039;note&#039;]=&#039;Mi panel 0&#039;&lt;br /&gt;
 ...&lt;br /&gt;
$this-&amp;gt;boxes[n][&#039;file&#039;]=&#039;maboxn.php@mimodulo&#039;&lt;br /&gt;
$this-&amp;gt;boxes[n][&#039;note&#039;]=&#039;Mi panel n&#039;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A continuación cree los archivos &#039;&#039;&#039;htdocs/mimodulo/core/boxes/mabox0.php&#039;&#039;&#039;, &#039;&#039;&#039;htdocs/mimodulo/core/boxes/mabox1.php&#039;&#039;&#039;...  tomando como ejemplo los paneles existentes (en el directorio htdocs/core/boxes)&lt;br /&gt;
&lt;br /&gt;
=== Pruebe sus paneles en Dolibarr ===&lt;br /&gt;
Vaya al menú &#039;&#039;&#039;Inico – Configuración – Paneles&#039;&#039;&#039;. 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.&lt;br /&gt;
&lt;br /&gt;
== Definir sus propias exportaciones (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; 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)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Definir la exportación ===&lt;br /&gt;
Para ello, descomente y modifique las tablas $this-&amp;gt;export_xxx  de su archivo descriptor de módulo.&lt;br /&gt;
&lt;br /&gt;
=== Probar la exportación ===&lt;br /&gt;
Vaya al menú &amp;quot;Herramientas &amp;gt; Exportar&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Definir sus estilos CSS (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si en sus pantallas PHP utiliza clases de estilos distintas a las de los temas de Dolibarr (no recomendado).&lt;br /&gt;
&lt;br /&gt;
Esta funcionalidad todavía no es operativa en la versión 2.4., a pesar de estar ya descrita.&lt;br /&gt;
&lt;br /&gt;
=== Crear y declarar su hoja de estilos ===&lt;br /&gt;
Crear un archivo de estilos llamada &#039;&#039;&#039;mimodulo.css&#039;&#039;&#039; o &#039;&#039;&#039;mimodule.css.php&#039;&#039;&#039; y guardarla en el directorio &#039;&#039;&#039;&#039;&#039;mimodulo&#039;&#039;&#039;&#039;&#039; dentro de &#039;&#039;&#039;htdocs&#039;&#039;&#039;. Solo puede haber un archivo css propio a cada módulo.&lt;br /&gt;
Recordamos que es mejor usar los estilos ya existentes en Dolibarr (el archivo css usado por Dolibarr es el archivo &#039;&#039;&#039;themes/nomtheme/&#039;&#039;nombretema&#039;&#039;.css.php&#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
Una vez su hoja de estilos esté disponible, declárela en su archivo descriptor de módulo modificando la propiedad &#039;&#039;&#039;$this-&amp;gt;module_parts&#039;&#039;&#039;.&lt;br /&gt;
El valor a indicar debe ser la ruta URL relativa de su archivo css.&lt;br /&gt;
Por ejemplo&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;module_parts = array(&#039;css&#039; =&amp;gt; array(&#039;/mimodulo/css/mimodulo.css.php&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Probar su hoja de estilos ===&lt;br /&gt;
Desactivar y reactivar su módulo.&lt;br /&gt;
&lt;br /&gt;
Ir la página de inicio de Dolibarr. Ver el código de la página HTML.&lt;br /&gt;
&lt;br /&gt;
Debería ver en el encabezado HTML, una línea de declaración de su hoja de estilos.&lt;br /&gt;
&lt;br /&gt;
== Definir sus funciones Javascript (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuando&#039;&#039;&#039;: Si en sus pantallas en PHP utiliza funciones de Javascript no disponibles en estandard (archivo lib_head.js)&lt;br /&gt;
&lt;br /&gt;
Si en sus pantallas en PHP utiliza funciones javascript, es necesario asegurarse de que las funciones declaradas en un archivo javascript &#039;&#039;&#039;htdocs/mimodulo/js/monmodule.js&#039;&#039;&#039; sea cargado en la cabecera del head html.&lt;br /&gt;
&lt;br /&gt;
Para pedir a Dolibarr que gestione en la generación de la sección header la inclusión de uno de sus archivos javascript, es necesario proporcionar como parámetro a la función llxHeader(), al inicio de su página, la URL hacia el js a incluir.&lt;br /&gt;
&lt;br /&gt;
Ejemplo para la página /htdocs/mimodulo/mapage.php :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
require(&#039;../main.inc.php&#039;);&lt;br /&gt;
$morejs=array(&amp;quot;/mimomulo/js/monmodule.js&amp;quot;);&lt;br /&gt;
llxHeader(&#039;&#039;,&#039;Titulo&#039;,&#039;&#039;,&#039;&#039;,&#039;&#039;,&#039;&#039;,$morejs,&#039;&#039;,0,0); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ejecutar código sobre un evento Dolibarr (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; 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 &#039;&#039;&#039;disparador (triggers)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Véase también [[Interfaces Dolibarr hacia el exterior]] e [[Interfaces del Exterior hacia Dolibarr]]&lt;br /&gt;
&lt;br /&gt;
== Insertar su código usando los hooks de Dolibarr (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039;: Cuando desee cambiar o añadir otro tipo de código en un evento de negociado (véase lel capítulo anterior para esto).&lt;br /&gt;
&lt;br /&gt;
Véase la página [[El sistema Hooks]].&lt;br /&gt;
&lt;br /&gt;
== Añadir un módulo de numeración (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039;: Si quiere añadir una regla de numeración no cubierta por los módulos por defecto.&lt;br /&gt;
&lt;br /&gt;
Véase la página [[Crear un módulo de numeración]].&lt;br /&gt;
&lt;br /&gt;
== Añadir un nuevo módulo de documento (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039;: Si quiere añadir un nuevo modelo de documento.&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
== Añadir un tema (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039;: Si quiere un interface con colores personalizados.&lt;br /&gt;
&lt;br /&gt;
Véase la página [[Temas]].&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Algunas reglas de código =&lt;br /&gt;
Las reglas de código a seguir se definen en la [[Documentación Desarrolladores| Documentación para desarrolladores]], concretamente en la sección &amp;quot;Lenguaje&amp;quot; del capítulo de &amp;quot;Información General&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Utilización de MDA =&lt;br /&gt;
Un método para generar un módulo funcional desde UML se encuentra en curso de puesta a punto. Más información en la página [[UML2Dolibarr - Crear un módulo usando MDA]].&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Crear un paquete para liberar e instalar su módulo =&lt;br /&gt;
Este proceso debe ser usado para fabricar un paquete con el fin de enviarlo a la tienda oficial http://www.dolistore.com.&lt;br /&gt;
&lt;br /&gt;
También puede usarlo para distribuir fácilmente su módulo vía su propio método de distribución.&lt;br /&gt;
&lt;br /&gt;
* Vaya al directorio &#039;&#039;&#039;/build&#039;&#039;&#039; y copie el archivo &#039;&#039;&#039;makepack-dolibarrmodules.conf&#039;&#039;&#039; como &#039;&#039;&#039;makepack-mimodulo.conf&#039;&#039;&#039;. 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).&lt;br /&gt;
&lt;br /&gt;
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...)&lt;br /&gt;
* Lance el script vía Perl (necesita la versión 5.0. o superiores de Perl)&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 perl makepack-dolibarrmodule.pl&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El script le pide el nombre de su módulo, su versión mayor y menor. Se va a crear un fichero &#039;&#039;&#039;mimodulo.zip&#039;&#039;&#039;, que incluirá su módulo listo para ser liberado.&lt;br /&gt;
* La persona que reciba su módulo deberá ubicar el archivo en el directorio raíz de Dolibarr y ejecutar el comando:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 tar -xvf monmodule.zip&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 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 &amp;quot;Submit a product&amp;quot;).&lt;br /&gt;
** Si su módulo está correctamente realizado, será rápidamente validado.&lt;br /&gt;
** 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).&lt;/div&gt;</summary>
		<author><name>Nnicolashr</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Desarrollo_de_un_m%C3%B3dulo&amp;diff=35886</id>
		<title>Desarrollo de un módulo</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Desarrollo_de_un_m%C3%B3dulo&amp;diff=35886"/>
		<updated>2016-09-08T02:02:26Z</updated>

		<summary type="html">&lt;p&gt;Nnicolashr: /* Añadir pestañas de una ficha entidad en su propia página */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Básico]]&lt;br /&gt;
{{TemplateDocDesarrollo}}&lt;br /&gt;
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:&lt;br /&gt;
* Añadir nuevas tablas a la base de datos.&lt;br /&gt;
* Añadir sus propias entradas en los menús.&lt;br /&gt;
* Añadir pantallas de edición/consulta de nuevas tablas.&lt;br /&gt;
* Añadir o eliminar pestañas en las páginas de vista/edición de objetos (factura, producto, pedido, evento, etc.)&lt;br /&gt;
* Añadir exportaciones predefinidas a la función “Exportar”.&lt;br /&gt;
* Añadir variables de substitución&lt;br /&gt;
* Añadir nuevas cajas a la página de inicio.&lt;br /&gt;
* Definir nuevos permisos.&lt;br /&gt;
* Activar código automático sobre una acción particular de Dolibarr.&lt;br /&gt;
* Insertar nuestro código mediante los hooks de Dolibarr&lt;br /&gt;
* Añadir un módulo de numeración&lt;br /&gt;
* Añadir un modelo de documento&lt;br /&gt;
* Añadir un nuevo tema &lt;br /&gt;
&lt;br /&gt;
etc. Todas estas operaciones sólo están disponibles a partir de la versión 3.2 de Dolibarr.&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Crear un módulo =&lt;br /&gt;
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&lt;br /&gt;
&lt;br /&gt;
== [[File:Art.png]] Crear un descriptor de Módulo (obligatorio) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039;: Obligatorio cada vez que se desarrolla una extensión, cualquiera que sea su finalidad.&lt;br /&gt;
&lt;br /&gt;
=== Crear su descriptor ===&lt;br /&gt;
La primera fase es la de crear un fichero descriptor del módulo. Para ello:&lt;br /&gt;
* Crear el directorio &#039;&#039;&#039;/htdocs/&#039;&#039;mimodulo&#039;&#039;/core/modules&#039;&#039;&#039;. Seguidamente ir al directorio &#039;&#039;&#039;dev/skeletons&#039;&#039;&#039; y copiar el archivo modMyModule.class.php en el directorio &#039;&#039;&#039;htdocs/&#039;&#039;mimodulo&#039;&#039;/core/modules&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
 Nota: En versión 3.9.2 de Dolibarr, el directorio donde se ubican los ficheros descriptor de módulo es &#039;&#039;&#039;/htdocs/&#039;&#039;core/modules&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A continuación, modificar el contenido del archivo, reemplazando:&lt;br /&gt;
* los &amp;quot;modMyModule&amp;quot; por un valor que corresponda a la finalidad de su módulo. Este valor debe siempre comenzar por mod. &lt;br /&gt;
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.&lt;br /&gt;
* $this-&amp;gt;numero = 100000 por un número de módulo que esté libre. Ver [[List of modules id|Listado de los id de módulos]]&lt;br /&gt;
* Modificar eventualmente otras variables definidas por los desarrolladores (ver el comentario en el código del esqueleto para ver su significado)&lt;br /&gt;
* Crear el directorio /htdocs/mimodulo/ &lt;br /&gt;
Ahora su fichero descriptor está configurado.&lt;br /&gt;
&lt;br /&gt;
=== Probar su descriptor ===&lt;br /&gt;
Ejecute Dolibarr y vaya a la página &amp;quot;Configuración &amp;gt; Módulo&amp;quot;. 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-&amp;gt;special el que determina en qué pestaña se encuentra su módulo.&lt;br /&gt;
&lt;br /&gt;
== [[File:Art.png]] Árbol de un nuevo módulo ==&lt;br /&gt;
Crear un directorio &#039;mimodulo&#039; que contendrá los archivos del módulo. Este directorio debe de estar en el directorio &#039;&#039;&#039;htdocs&#039;&#039;&#039; y contendrá los siguientes subdirectorios:&lt;br /&gt;
{{TemplateModuleTreeSimple}}&lt;br /&gt;
&lt;br /&gt;
== [[File:Art.png]] Crear sus tablas SQL y la clase PHP con los métodos de acceso (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si su módulo necesita gestionar sus propios datos.&lt;br /&gt;
&lt;br /&gt;
===Crear sus ficheros .sql===&lt;br /&gt;
Si su módulo de verdad requiere administrar datos que no existen en la base de datos en la versión estándar de Dolibarr, será necesario definir ciertas tablas SQL para registrar esos datos.&lt;br /&gt;
&lt;br /&gt;
Revisa que en el descriptor de archivo (mymodule/core/modules/mymodule.class.php) la línea&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;_load_tables(&#039;/mymodule/sql/&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
esté descomentada y correctamente configurada.&lt;br /&gt;
&lt;br /&gt;
Cree un subdirectorio sql en el directorio de su módulo (por ejemplo, htdocs/mimodulo/sql), con el fin de colocar los scripts sql que va a crear. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Regla a respetar:&#039;&#039; &lt;br /&gt;
* Agregue los archivos de orden de creación de sus tablas siguiendo el principio de un fichero &#039;&#039;&#039;llx_mitabla.sql&#039;&#039; por tabla, eventualmente acompañado del archivo &#039;&#039;&#039;llx_mitabla.key.sql&#039;&#039;&#039; (ver los archivos existentes en &#039;&#039;install/mysql/tables&#039;&#039;, para tomar ejemplo). &lt;br /&gt;
* En términos de orden de gestión de datos, todos deben estar en un archivo llamado &#039;&#039;&#039;data.sql&#039;&#039;&#039; situado en la misma carpeta &#039;&#039;&#039;/mimodulo/sql/&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Ejemplo de contenido de un fichero data.sql&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
 delete from llx_const where name=&#039;MYMODULE_IT_WORKS&#039; and entity=&#039;__ENTITY__&#039;;&lt;br /&gt;
 insert into llx_const (name, value, type, note, visible, entity) values (&#039;MYMODULE_IT_WORKS&#039;,&#039;1&#039;,&#039;chaine&#039;,&#039;A constant vor my module&#039;,1,&#039;__ENTITY__&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Las órdenes SQL de los archivos deben de ser operacionales para la base de datos &#039;&#039;&#039;mysql&#039;&#039;&#039;.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Probar su archivo .sql ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Generar la clase PHP de acceso (DAO) ===&lt;br /&gt;
Una vez que su/s tabla/s estén creadas en la base de datos, vaya al directorio &#039;&#039;&#039;dev/skeletons&#039;&#039;&#039;, copie el archivo &#039;&#039;&#039;build_class_from_table.php&#039;&#039;&#039; en la el directorio sql/ de su módulo module, y ejecute el script&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 php build_class_from_table.php nombretabla&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Nota: Si el comando no funciona, intente con php-cli en lugar de php.&lt;br /&gt;
&lt;br /&gt;
Esto genera un archivo &#039;&#039;&#039;out.nombretabla.class.php&#039;&#039;&#039; que contiene la clase de gestión de la tabla “nombretabla”. En esta clase se encuentran los métodos CRUD (Create/Read/Update/Delete) ya operativos para hacer un &#039;&#039;insert&#039;&#039;, un &#039;&#039;fetch&#039;&#039; (&#039;&#039;select&#039;&#039;), un &#039;&#039;update&#039;&#039;, y un &#039;&#039;delete&#039;&#039; de una línea de la tabla. Suprima justo el &amp;quot;out&amp;quot; del nombre del archivo y pógalo en un subdirectorio de &#039;&#039;&#039;htdocs&#039;&#039;&#039; propio en su módulo (Por ejemplo en &#039;&#039;&#039;htdocs/mimodulo&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Un archivo &#039;&#039;&#039;out.nombretabla_script.php&#039;&#039;&#039; se genera igualmente y contiene un ejemplo de código para utilizar la clase para cada uno de los cuatro métodos CRUD.&lt;br /&gt;
&lt;br /&gt;
== Visualización de pestañas (opcional) ==&lt;br /&gt;
&lt;br /&gt;
=== Añadir o eliminar pestañas en las fichas entidad ===&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039; : Para añadir su propia pestaña en las pestañas estándar de una ficha entidad (factura, pedido, presupuesto, miembro...)&lt;br /&gt;
&lt;br /&gt;
Para ello, vaya al archivo descriptor del módulo creado anteriormente y modifique la tabla $this-&amp;gt;tabs:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
	// Array to add new pages in new tabs or remove existing one&lt;br /&gt;
	$this-&amp;gt;tabs = array(&#039;objecttype:+tabname1:Title1:@mymodule:/mymodule/mynewtab1.php?id=__ID__&#039;,  // To add a new tab identified by code tabname1&lt;br /&gt;
                            &#039;objecttype:+tabname2:Title2:@mymodule:/mymodule/mynewtab2.php?id=__ID__&#039;,  // To add another new tab identified by code tabname2&lt;br /&gt;
                            &#039;objecttype:-tabname&#039;);                                                     // To remove an existing tab identified by code tabname&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La tabla debe contener una lista de cadena, cada cadena representa una nueva pestaña.&lt;br /&gt;
El formato de la cadena se compone de 4 partes separadas por &amp;quot;:&amp;quot;&lt;br /&gt;
* Parte 1: El código de la entidad (objecttype) en la que debe aparecer la pestaña siendo el valor de ella misma:&lt;br /&gt;
{{TemplateModuleTabs-es}}&lt;br /&gt;
* 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.&lt;br /&gt;
* 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&lt;br /&gt;
&lt;br /&gt;
* 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.&lt;br /&gt;
&lt;br /&gt;
Para alimentar el contenido de la pestaña con los datos de la base de datos, vea el capítulo siguiente.&lt;br /&gt;
&lt;br /&gt;
=== Añadir pestañas de una ficha entidad en su propia página ===&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039; : Para mostrar las pestañas estándar de ficha entidad (producto, tercero, etc.) en su propia pestaña de una entidad.&lt;br /&gt;
&lt;br /&gt;
Hay que hacer lo siguiente :&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Incluir los archivos que definen las funciones útiles dentro de sus archivos&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para cada ficha entidad, hay que incluir dos archivos con la instrucción&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;require_once($url_fichier) ;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aquí le mostramos la lista de estos archivos (DOL_DOCUMENT_ROOT correspond au dossier dolibarr/htdocs/) :&lt;br /&gt;
* Entidad tercero (thirdparty) :&lt;br /&gt;
** DOL_DOCUMENT_ROOT/societe.class.php&lt;br /&gt;
** DOL_DOCUMENT_ROOT/lib/company.lib.php&lt;br /&gt;
* Entidad producto (product) :&lt;br /&gt;
** DOL_DOCUMENT_ROOT/product.class.php&lt;br /&gt;
** DOL_DOCUMENT_ROOT/lib/product.lib.php&lt;br /&gt;
* Entidad factura (invoice) :&lt;br /&gt;
** DOL_DOCUMENT_ROOT/facture.class.php&lt;br /&gt;
** DOL_DOCUMENT_ROOT/lib/invoice.lib.php&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Crear y cargar el objeto a mostrar en su pestaña&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Crear el objeto de la clase deseada, y recuperar los datos del objeto a partir de la base de datos. Para ello deberá utilizar las funciones fetch() de la clase correspondiente, pasando el parámetro del indentificador del objeto que recupera desde la url (ej : /mononglet.php?id=1).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Ejemplo :&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$id=$_GET[&amp;quot;id&amp;quot;];&lt;br /&gt;
$product = new Product($db) ;&lt;br /&gt;
$result = $product-&amp;gt;fetch($id) ; //Tester $result pour vérifier que l&#039;accès à la base s&#039;est bien passé&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3. Recuperar la lista de pestañas correspondientes a la entidad seleccionada&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Usar la función XXX_prepare_head($obj), donde XXX es le nombre de la entidad, para crear una tabla que contiene las definiciones de las pestañas a mostrar. El parámetro a pasar es el objeto del que desea mostrar las pestañas.&lt;br /&gt;
&lt;br /&gt;
La tabla devuelta se compone de la siguiente manera :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$head        // Tableau des onglets&lt;br /&gt;
$head[$h]    // Élément décrivant un onglet. Il y aura autant de $h que d&#039;onglets à afficher&lt;br /&gt;
$head[$h][0] // Url de la page affichée quand on clique sur l&#039;onglet&lt;br /&gt;
$head[$h][1] // Titre de l&#039;ongLet&lt;br /&gt;
$head[$h][2] // Code de l&#039;onglet, à utiliser pour choisir quel onglet sera &#039;actif&#039; (voir paragraphe suivant)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Ejemplo :&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$head = product_prepare_head($product, $user) ; //le paramètre $user n&#039;est pas présent sur certaines fonctions&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4. Mostrar las pestañas en su pestaña&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Use la función dol_fiche_head() que muestra las pestañas contenidas en la tabla $head devuelta por XX_prepare_head().&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
dol_fiche_head($links, $active=&#039;0&#039;, $title=&#039;&#039;, $notab=0, $picto=&#039;&#039;)&lt;br /&gt;
$links  // Tableau des onglets, appelé $head plus haut.&lt;br /&gt;
$active // Onglet actif (mettre le nom de l&#039;onglet défini dans votre fichier de module, ou un nom contenu dans $head[$h][2]). Cet onglet sera mis en surbrillance&lt;br /&gt;
$title  // ?&lt;br /&gt;
$notab  // Mettre ce paramètre à 1 permet de ne pas afficher de zone bleue en dessous des onglets.&lt;br /&gt;
$picto  // Nom de l&#039;image à utiliser au début de la barre des onglet. Les choix suivant sont possibles :&lt;br /&gt;
//            product&lt;br /&gt;
//            service&lt;br /&gt;
//            company&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esta función muestra las pestañas deseadas y abre un elemento &#039;&#039;&amp;lt; div class=&amp;quot;&amp;quot; &amp;gt;&#039;&#039; 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 &#039;&#039;&amp;lt; /div &amp;gt;&#039;&#039; en el código PHP.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Nota&#039;&#039;:&lt;br /&gt;
Para más detalles, consulte la [http://www.dolibarr.fr/doxygen/ documentación Doxygen] o directamente el código de Dolibarr.&lt;br /&gt;
&lt;br /&gt;
== Crear sus páginas pantalla PHP (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si su módulo consiste en añadir funcionalidades que necesitan nuevas pantallas.&lt;br /&gt;
&lt;br /&gt;
=== Crear una página pantalla PHP ===&lt;br /&gt;
Debe crear a continuación pantallas PHP que se basen en los datos de sus tablas utilizando los esqueletos como ejemplo del directorio &#039;&#039;&#039;dev/skeletons&#039;&#039;&#039;. (Para el desarrollo de un script en línea de comandos, ver [[Desarrollo de scripts]]).&lt;br /&gt;
&lt;br /&gt;
Para crear una nueva página de usuario, cree un subdirectorio de &#039;&#039;&#039;htdocs&#039;&#039;&#039; (si es que no existe ya) propio en su módulo (En &#039;&#039;&#039;htdocs/mimodulo&#039;&#039;&#039;, por ejemplo), con el fin de ubicar en él las páginas que va a crear.&lt;br /&gt;
&lt;br /&gt;
Copie allí el archivo &#039;&#039;&#039;skeletons_page.php&#039;&#039;&#039;, que va a servir de punto de partida a su página. Modifique el archivo para que la ruta relativa de&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$res=0;&lt;br /&gt;
if (! $res &amp;amp;&amp;amp; file_exists(&amp;quot;../main.inc.php&amp;quot;)) $res=@include(&amp;quot;../main.inc.php&amp;quot;);			// to work if your module directory is into dolibarr root htdocs directory&lt;br /&gt;
if (! $res &amp;amp;&amp;amp; file_exists(&amp;quot;../../main.inc.php&amp;quot;)) $res=@include(&amp;quot;../../main.inc.php&amp;quot;);		// to work if your module directory is into a subdir of root htdocs directory&lt;br /&gt;
if (! $res) die(&amp;quot;Include of main fails&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
sea la correcta, en función de la profundidad del directorio en el que se encuentra el archivo (quitando o añadiendo &amp;quot;../&amp;quot;). Es en el &amp;quot;main&amp;quot; donde se carga el entorno técnico y las habilitaciones. Los objetos variables se posicionan ahora:&lt;br /&gt;
* $user – El objeto que contiene las características del usuario y sus derechos.&lt;br /&gt;
* $conf – El objeto que contiene la configuración de Dolibarr.&lt;br /&gt;
* $db – El objeto que contiene el gestor de conexión abierto a la base de datos.&lt;br /&gt;
* $langs – El objeto que contiene el idioma del usuario.&lt;br /&gt;
&lt;br /&gt;
* 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):&lt;br /&gt;
&#039;&#039;Exemple :&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
dol_include_once(&#039;/mimodulo/class/miclass.class.php&#039;, &#039;MiClass&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Las clases de llamadas Dolibarr utilice la siguiente sintaxis:&lt;br /&gt;
&#039;&#039;Exemple :&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
require_once DOL_DOCUMENT_ROOT.&#039;/core/class/doli.class.php&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Reemplazar partes de templates de pantalla (versión 3.3+) ===&lt;br /&gt;
Algunas partes de la pantalla de Dolibarr están aisladas en archivos de plantilla. Puede desarrollar un módulo para reemplazar una o más de estas plantillas con las suyas.&lt;br /&gt;
{{ToComplete}}&lt;br /&gt;
&lt;br /&gt;
=== Acceso a la base de datos ===&lt;br /&gt;
Si necesita realizar modificaciones en su tabla de la base de datos, utilice la clase generada más arriba.&lt;br /&gt;
&lt;br /&gt;
Si de todos modos quiere acceder a las tablas sin objeto PHP dedicado, esto es posible (por ejemplo para recuperar una lista de registros). En ese caso, piense en seguir estos ejemplos.&lt;br /&gt;
&lt;br /&gt;
Para un &#039;&#039;insert&#039;&#039;, &#039;&#039;update&#039;&#039; o &#039;&#039;delete&#039;&#039;:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $db-&amp;gt;begin();   // Debut transaction&lt;br /&gt;
 $db-&amp;gt;query(&amp;quot;Ma requete insert, update ou delete&amp;quot;);&lt;br /&gt;
 $db-&amp;gt;commit();       // Valide&lt;br /&gt;
 o $db-&amp;gt;rollback()  // Annule&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para una lectura:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $resql=$db-&amp;gt;query(&amp;quot;Ma requete select&amp;quot;);&lt;br /&gt;
 if ($resql)&lt;br /&gt;
 {&lt;br /&gt;
         $num = $db-&amp;gt;num_rows($resql);&lt;br /&gt;
         $i = 0;&lt;br /&gt;
         if ($num)&lt;br /&gt;
         {&lt;br /&gt;
                 while ($i &amp;lt; $num)&lt;br /&gt;
                 {&lt;br /&gt;
                         $obj = $db-&amp;gt;fetch_object($resql);&lt;br /&gt;
                         if ($obj)&lt;br /&gt;
                         {&lt;br /&gt;
                                 // You can use here results&lt;br /&gt;
                                 print $obj-&amp;gt;field1;&lt;br /&gt;
                                 print $obj-&amp;gt;field2;&lt;br /&gt;
                         }&lt;br /&gt;
                         $i++;&lt;br /&gt;
                 }&lt;br /&gt;
         }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Definición de estilos ===&lt;br /&gt;
Para que el aspecto de la página guarde coherencia con el tema Dolibarr, es necesario utilizar los estilos CSS de Dolibarr.&lt;br /&gt;
&lt;br /&gt;
Por ejemplo:&lt;br /&gt;
&lt;br /&gt;
* class=&amp;quot;liste_titre&amp;quot;1 en las etiquetas tr y td para una línea de título de tabla. &lt;br /&gt;
* class=”pair” o class=”impair” en las etiquetas tr y td de las líneas de datos de la tabla.&lt;br /&gt;
* class=”flat” en todos los campos en los que se teclea (input, select, textarea...)&lt;br /&gt;
* class=”button” en los objetos de tipo input type=”submit”.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Utilizar el selector de fechas de Dolibarr ===&lt;br /&gt;
Si quiere, puede beneficiarse del selector de fechas en las pantallas Dolibarr. Para ello, utilice la siguiente línea:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $form=new Form($db);&lt;br /&gt;
 $form-&amp;gt;select_date(&#039;&#039;,&#039;mykey&#039;,0,0,0,&amp;quot;myform&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La cadena &amp;quot;mikey&amp;quot; identifica el campo fecha. Hace falta introducir un valor diferente en caso de que haya varios campos. La cadena &amp;quot;myform&amp;quot; es el nombre del campo &amp;quot;FORM&amp;quot; (en el formulario, name=&amp;quot;myform&amp;quot; de la página html). La visualización de un selector de fecha debe por tanto estar integrada en un formulario html.&lt;br /&gt;
&lt;br /&gt;
Para recuperar el valor, a la herencia de POST, el comando es:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $mydate = dol_mktime(12, 0 , 0, $_POST[&#039;mykeymonth&#039;], $_POST[&#039;mykeyday&#039;], $_POST[&#039;mykeyyear&#039;]);&lt;br /&gt;
 print strftime(&#039;%A %d %B %Y&#039;, $mydate);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Definir su página de configuración (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si su módulo ofrece varias opciones parametrizables.&lt;br /&gt;
&lt;br /&gt;
=== Crear su página de edición de configuración ===&lt;br /&gt;
Si su módulo ofrece varias opciones parametrizacles, es necesario crear una página PHP para editar las opciones (que serán guardadas en la [[Table llx_const|tabla &#039;&#039;&#039;llx_const&#039;&#039;&#039;]]). Cree una página PHP llamada &#039;&#039;&#039;mimodulo_setuppage.php&#039;&#039;&#039;, que registre las opciones posibles y las ponga al día. Es necesario tomar como ejemplo una página de &#039;&#039;&#039;/admin&#039;&#039;&#039; 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 &#039;&#039;&#039;/admin&#039;&#039;&#039;. 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 &#039;&#039;&#039;/admin&#039;&#039;&#039;).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $this-&amp;gt;config_page_url = array(&amp;quot;monmodule_setupapage.php&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Probar su página ===&lt;br /&gt;
Vaya a la página &#039;&#039;&#039;Configuración &amp;gt; módulo&#039;&#039;&#039;. 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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Definir sus entradas de menú (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si ha creado páginas PHP, es necesario que estas pantallas sean accesibles desde el menú Dolibarr.&lt;br /&gt;
&lt;br /&gt;
=== Definir sus entradas de menú ===&lt;br /&gt;
Para ello, hace falta definir en el archivo descriptor de menú de tabla this-&amp;gt;menu, que declara los menús.&lt;br /&gt;
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&lt;br /&gt;
&lt;br /&gt;
He aquí un ejemplo de declaración de entradas de menú en el fichero descriptor:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Main menu entries&lt;br /&gt;
$this-&amp;gt;menu = array();			// List of menus to add&lt;br /&gt;
$r=0;&lt;br /&gt;
&lt;br /&gt;
// Add here entries to declare new menus&lt;br /&gt;
// Example to declare the Top Menu entry:&lt;br /&gt;
$this-&amp;gt;menu[$r]=array(	&#039;fk_menu&#039;=&amp;gt;0,			// Put 0 if this is a top menu&lt;br /&gt;
			&#039;type&#039;=&amp;gt;&#039;top&#039;,			// This is a Top menu entry&lt;br /&gt;
			&#039;titre&#039;=&amp;gt;&#039;MyModule top menu&#039;,&lt;br /&gt;
			&#039;mainmenu&#039;=&amp;gt;&#039;mymodule&#039;,&lt;br /&gt;
			&#039;leftmenu&#039;=&amp;gt;&#039;mymodule&#039;,&lt;br /&gt;
			&#039;url&#039;=&amp;gt;&#039;/mymodule/pagetop.php&#039;,&lt;br /&gt;
			&#039;langs&#039;=&amp;gt;&#039;mylangfile&#039;,	// Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory.&lt;br /&gt;
			&#039;position&#039;=&amp;gt;100,&lt;br /&gt;
			&#039;enabled&#039;=&amp;gt;&#039;1&#039;,			// Define condition to show or hide menu entry. Use &#039;$conf-&amp;gt;mymodule-&amp;gt;enabled&#039; if entry must be visible if module is enabled.&lt;br /&gt;
			&#039;perms&#039;=&amp;gt;&#039;1&#039;,			// Use &#039;perms&#039;=&amp;gt;&#039;$user-&amp;gt;rights-&amp;gt;mymodule-&amp;gt;level1-&amp;gt;level2&#039; if you want your menu with a permission rules&lt;br /&gt;
			&#039;target&#039;=&amp;gt;&#039;&#039;,&lt;br /&gt;
			&#039;user&#039;=&amp;gt;2);				// 0=Menu for internal users, 1=external users, 2=both&lt;br /&gt;
$r++;&lt;br /&gt;
&lt;br /&gt;
// Example to declare a Left Menu entry:&lt;br /&gt;
$this-&amp;gt;menu[$r]=array(	&#039;fk_menu&#039;=&amp;gt;&#039;fk_mainmenu=xxx&#039;,		    // Use &#039;fk_mainmenu=xxx&#039; or &#039;fk_mainmenu=xxx,fk_leftmenu=yyy&#039; where xxx is mainmenucode and yyy is a leftmenucode of parent menu&lt;br /&gt;
			&#039;type&#039;=&amp;gt;&#039;left&#039;,			        // This is a Left menu entry&lt;br /&gt;
			&#039;titre&#039;=&amp;gt;&#039;MyModule left menu 1&#039;,&lt;br /&gt;
			&#039;mainmenu&#039;=&amp;gt;&#039;xxx&#039;,&lt;br /&gt;
                        &#039;leftmenu&#039;=&amp;gt;&#039;yyy&#039;,&lt;br /&gt;
			&#039;url&#039;=&amp;gt;&#039;/mymodule/pagelevel1.php&#039;,&lt;br /&gt;
			&#039;langs&#039;=&amp;gt;&#039;mylangfile&#039;,	// Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory.&lt;br /&gt;
			&#039;position&#039;=&amp;gt;100,&lt;br /&gt;
			&#039;enabled&#039;=&amp;gt;&#039;1&#039;,			// Define condition to show or hide menu entry. Use &#039;$conf-&amp;gt;mymodule-&amp;gt;enabled&#039; if entry must be visible if module is enabled.&lt;br /&gt;
			&#039;perms&#039;=&amp;gt;&#039;1&#039;,			// Use &#039;perms&#039;=&amp;gt;&#039;$user-&amp;gt;rights-&amp;gt;mymodule-&amp;gt;level1-&amp;gt;level2&#039; if you want your menu with a permission rules&lt;br /&gt;
			&#039;target&#039;=&amp;gt;&#039;&#039;,&lt;br /&gt;
			&#039;user&#039;=&amp;gt;2);				// 0=Menu for internal users,1=external users, 2=both&lt;br /&gt;
$r++;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para condicionar el acceso al menú segun los permisos, modificar la propiedad &#039;&#039;&#039;perms&#039;&#039;&#039; de la tabla. Ver el capítulo sobre permisos, un poco más abajo, para saber como realizar los permisos.&lt;br /&gt;
&lt;br /&gt;
=== Probar sus entradas de menú ===&lt;br /&gt;
Desactive y reactive su módulo bajo Dolibarr. Las entradas del menú deberían aparecer después de hacerlo (si la condición &#039;enabled&#039; está activada).&lt;br /&gt;
&lt;br /&gt;
== Definir sus propios permisos (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si quiere añadir nuevos permisos.&lt;br /&gt;
&lt;br /&gt;
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-&amp;gt;rights_class = &#039;facture&#039; para que diga:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $this-&amp;gt;rights_class = &#039;mimodulo&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A continuación, rellene la tabla $this-&amp;gt;rights con tantas entradas como permisos diferentes vaya a definir:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $this-&amp;gt;rights[$r][0] = 10001;&lt;br /&gt;
 $this-&amp;gt;rights[$r][1] = &#039;Texto por defecto de mi permiso&#039;;&lt;br /&gt;
 $this-&amp;gt;rights[$r][3] = 1;&lt;br /&gt;
 $this-&amp;gt;rights[$r][4] = &#039;accion&#039;;&lt;br /&gt;
 $this-&amp;gt;rights[$r][5] = &#039;subaccion&#039;;&lt;br /&gt;
 $r++;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En $this-&amp;gt;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ú &#039;&#039;&#039;Información del Sistema&#039;&#039;&#039; en una instalación de Dolibarr que esté funcionando. En $this-&amp;gt;rights[$r][3], introduzca 1 si este permiso se atribuye por defecto a los usuarios según son creados. En $this-&amp;gt;rights[$r][1] introduzca un texto por defecto -que será mostrado si no se encuentra traducción para su permiso en el archivo &#039;&#039;&#039;admin.lang&#039;&#039;&#039;). En $this-&amp;gt;rights[$r][4] y $this-&amp;gt;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:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 if ($user-&amp;gt;rights-&amp;gt;mimodulo-&amp;gt;accion-&amp;gt;subaccion) ...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Definir sus propios paneles (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si su módulo tiene uno o varios paneles.&lt;br /&gt;
&lt;br /&gt;
=== Defina sus paneles ===&lt;br /&gt;
Para ello, modifique las tablas $this-&amp;gt;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 &#039;&#039;&#039;htdocs/mimodulo/core/boxes&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Ejemplo:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;boxes[0][&#039;file&#039;]=&#039;mabox0.php@mimodulo&#039;&lt;br /&gt;
$this-&amp;gt;boxes[0][&#039;note&#039;]=&#039;Mi panel 0&#039;&lt;br /&gt;
 ...&lt;br /&gt;
$this-&amp;gt;boxes[n][&#039;file&#039;]=&#039;maboxn.php@mimodulo&#039;&lt;br /&gt;
$this-&amp;gt;boxes[n][&#039;note&#039;]=&#039;Mi panel n&#039;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A continuación cree los archivos &#039;&#039;&#039;htdocs/mimodulo/core/boxes/mabox0.php&#039;&#039;&#039;, &#039;&#039;&#039;htdocs/mimodulo/core/boxes/mabox1.php&#039;&#039;&#039;...  tomando como ejemplo los paneles existentes (en el directorio htdocs/core/boxes)&lt;br /&gt;
&lt;br /&gt;
=== Pruebe sus paneles en Dolibarr ===&lt;br /&gt;
Vaya al menú &#039;&#039;&#039;Inico – Configuración – Paneles&#039;&#039;&#039;. 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.&lt;br /&gt;
&lt;br /&gt;
== Definir sus propias exportaciones (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; 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)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Definir la exportación ===&lt;br /&gt;
Para ello, descomente y modifique las tablas $this-&amp;gt;export_xxx  de su archivo descriptor de módulo.&lt;br /&gt;
&lt;br /&gt;
=== Probar la exportación ===&lt;br /&gt;
Vaya al menú &amp;quot;Herramientas &amp;gt; Exportar&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Definir sus estilos CSS (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si en sus pantallas PHP utiliza clases de estilos distintas a las de los temas de Dolibarr (no recomendado).&lt;br /&gt;
&lt;br /&gt;
Esta funcionalidad todavía no es operativa en la versión 2.4., a pesar de estar ya descrita.&lt;br /&gt;
&lt;br /&gt;
=== Crear y declarar su hoja de estilos ===&lt;br /&gt;
Crear un archivo de estilos llamada &#039;&#039;&#039;mimodulo.css&#039;&#039;&#039; o &#039;&#039;&#039;mimodule.css.php&#039;&#039;&#039; y guardarla en el directorio &#039;&#039;&#039;&#039;&#039;mimodulo&#039;&#039;&#039;&#039;&#039; dentro de &#039;&#039;&#039;htdocs&#039;&#039;&#039;. Solo puede haber un archivo css propio a cada módulo.&lt;br /&gt;
Recordamos que es mejor usar los estilos ya existentes en Dolibarr (el archivo css usado por Dolibarr es el archivo &#039;&#039;&#039;themes/nomtheme/&#039;&#039;nombretema&#039;&#039;.css.php&#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
Una vez su hoja de estilos esté disponible, declárela en su archivo descriptor de módulo modificando la propiedad &#039;&#039;&#039;$this-&amp;gt;module_parts&#039;&#039;&#039;.&lt;br /&gt;
El valor a indicar debe ser la ruta URL relativa de su archivo css.&lt;br /&gt;
Por ejemplo&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;module_parts = array(&#039;css&#039; =&amp;gt; array(&#039;/mimodulo/css/mimodulo.css.php&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Probar su hoja de estilos ===&lt;br /&gt;
Desactivar y reactivar su módulo.&lt;br /&gt;
&lt;br /&gt;
Ir la página de inicio de Dolibarr. Ver el código de la página HTML.&lt;br /&gt;
&lt;br /&gt;
Debería ver en el encabezado HTML, una línea de declaración de su hoja de estilos.&lt;br /&gt;
&lt;br /&gt;
== Definir sus funciones Javascript (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuando&#039;&#039;&#039;: Si en sus pantallas en PHP utiliza funciones de Javascript no disponibles en estandard (archivo lib_head.js)&lt;br /&gt;
&lt;br /&gt;
Si en sus pantallas en PHP utiliza funciones javascript, es necesario asegurarse de que las funciones declaradas en un archivo javascript &#039;&#039;&#039;htdocs/mimodulo/js/monmodule.js&#039;&#039;&#039; sea cargado en la cabecera del head html.&lt;br /&gt;
&lt;br /&gt;
Para pedir a Dolibarr que gestione en la generación de la sección header la inclusión de uno de sus archivos javascript, es necesario proporcionar como parámetro a la función llxHeader(), al inicio de su página, la URL hacia el js a incluir.&lt;br /&gt;
&lt;br /&gt;
Ejemplo para la página /htdocs/mimodulo/mapage.php :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
require(&#039;../main.inc.php&#039;);&lt;br /&gt;
$morejs=array(&amp;quot;/mimomulo/js/monmodule.js&amp;quot;);&lt;br /&gt;
llxHeader(&#039;&#039;,&#039;Titulo&#039;,&#039;&#039;,&#039;&#039;,&#039;&#039;,&#039;&#039;,$morejs,&#039;&#039;,0,0); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ejecutar código sobre un evento Dolibarr (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; 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 &#039;&#039;&#039;disparador (triggers)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Véase también [[Interfaces Dolibarr hacia el exterior]] e [[Interfaces del Exterior hacia Dolibarr]]&lt;br /&gt;
&lt;br /&gt;
== Insertar su código usando los hooks de Dolibarr (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039;: Cuando desee cambiar o añadir otro tipo de código en un evento de negociado (véase lel capítulo anterior para esto).&lt;br /&gt;
&lt;br /&gt;
Véase la página [[El sistema Hooks]].&lt;br /&gt;
&lt;br /&gt;
== Añadir un módulo de numeración (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039;: Si quiere añadir una regla de numeración no cubierta por los módulos por defecto.&lt;br /&gt;
&lt;br /&gt;
Véase la página [[Crear un módulo de numeración]].&lt;br /&gt;
&lt;br /&gt;
== Añadir un nuevo módulo de documento (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039;: Si quiere añadir un nuevo modelo de documento.&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
== Añadir un tema (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039;: Si quiere un interface con colores personalizados.&lt;br /&gt;
&lt;br /&gt;
Véase la página [[Temas]].&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Algunas reglas de código =&lt;br /&gt;
Las reglas de código a seguir se definen en la [[Documentación Desarrolladores| Documentación para desarrolladores]], concretamente en la sección &amp;quot;Lenguaje&amp;quot; del capítulo de &amp;quot;Información General&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Utilización de MDA =&lt;br /&gt;
Un método para generar un módulo funcional desde UML se encuentra en curso de puesta a punto. Más información en la página [[UML2Dolibarr - Crear un módulo usando MDA]].&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Crear un paquete para liberar e instalar su módulo =&lt;br /&gt;
Este proceso debe ser usado para fabricar un paquete con el fin de enviarlo a la tienda oficial http://www.dolistore.com.&lt;br /&gt;
&lt;br /&gt;
También puede usarlo para distribuir fácilmente su módulo vía su propio método de distribución.&lt;br /&gt;
&lt;br /&gt;
* Vaya al directorio &#039;&#039;&#039;/build&#039;&#039;&#039; y copie el archivo &#039;&#039;&#039;makepack-dolibarrmodules.conf&#039;&#039;&#039; como &#039;&#039;&#039;makepack-mimodulo.conf&#039;&#039;&#039;. 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).&lt;br /&gt;
&lt;br /&gt;
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...)&lt;br /&gt;
* Lance el script vía Perl (necesita la versión 5.0. o superiores de Perl)&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 perl makepack-dolibarrmodule.pl&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El script le pide el nombre de su módulo, su versión mayor y menor. Se va a crear un fichero &#039;&#039;&#039;mimodulo.zip&#039;&#039;&#039;, que incluirá su módulo listo para ser liberado.&lt;br /&gt;
* La persona que reciba su módulo deberá ubicar el archivo en el directorio raíz de Dolibarr y ejecutar el comando:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 tar -xvf monmodule.zip&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 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 &amp;quot;Submit a product&amp;quot;).&lt;br /&gt;
** Si su módulo está correctamente realizado, será rápidamente validado.&lt;br /&gt;
** 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).&lt;/div&gt;</summary>
		<author><name>Nnicolashr</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Desarrollo_de_un_m%C3%B3dulo&amp;diff=35885</id>
		<title>Desarrollo de un módulo</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Desarrollo_de_un_m%C3%B3dulo&amp;diff=35885"/>
		<updated>2016-09-08T01:38:38Z</updated>

		<summary type="html">&lt;p&gt;Nnicolashr: /* Crear su descriptor */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Básico]]&lt;br /&gt;
{{TemplateDocDesarrollo}}&lt;br /&gt;
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:&lt;br /&gt;
* Añadir nuevas tablas a la base de datos.&lt;br /&gt;
* Añadir sus propias entradas en los menús.&lt;br /&gt;
* Añadir pantallas de edición/consulta de nuevas tablas.&lt;br /&gt;
* Añadir o eliminar pestañas en las páginas de vista/edición de objetos (factura, producto, pedido, evento, etc.)&lt;br /&gt;
* Añadir exportaciones predefinidas a la función “Exportar”.&lt;br /&gt;
* Añadir variables de substitución&lt;br /&gt;
* Añadir nuevas cajas a la página de inicio.&lt;br /&gt;
* Definir nuevos permisos.&lt;br /&gt;
* Activar código automático sobre una acción particular de Dolibarr.&lt;br /&gt;
* Insertar nuestro código mediante los hooks de Dolibarr&lt;br /&gt;
* Añadir un módulo de numeración&lt;br /&gt;
* Añadir un modelo de documento&lt;br /&gt;
* Añadir un nuevo tema &lt;br /&gt;
&lt;br /&gt;
etc. Todas estas operaciones sólo están disponibles a partir de la versión 3.2 de Dolibarr.&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Crear un módulo =&lt;br /&gt;
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&lt;br /&gt;
&lt;br /&gt;
== [[File:Art.png]] Crear un descriptor de Módulo (obligatorio) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039;: Obligatorio cada vez que se desarrolla una extensión, cualquiera que sea su finalidad.&lt;br /&gt;
&lt;br /&gt;
=== Crear su descriptor ===&lt;br /&gt;
La primera fase es la de crear un fichero descriptor del módulo. Para ello:&lt;br /&gt;
* Crear el directorio &#039;&#039;&#039;/htdocs/&#039;&#039;mimodulo&#039;&#039;/core/modules&#039;&#039;&#039;. Seguidamente ir al directorio &#039;&#039;&#039;dev/skeletons&#039;&#039;&#039; y copiar el archivo modMyModule.class.php en el directorio &#039;&#039;&#039;htdocs/&#039;&#039;mimodulo&#039;&#039;/core/modules&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
 Nota: En versión 3.9.2 de Dolibarr, el directorio donde se ubican los ficheros descriptor de módulo es &#039;&#039;&#039;/htdocs/&#039;&#039;core/modules&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
A continuación, modificar el contenido del archivo, reemplazando:&lt;br /&gt;
* los &amp;quot;modMyModule&amp;quot; por un valor que corresponda a la finalidad de su módulo. Este valor debe siempre comenzar por mod. &lt;br /&gt;
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.&lt;br /&gt;
* $this-&amp;gt;numero = 100000 por un número de módulo que esté libre. Ver [[List of modules id|Listado de los id de módulos]]&lt;br /&gt;
* Modificar eventualmente otras variables definidas por los desarrolladores (ver el comentario en el código del esqueleto para ver su significado)&lt;br /&gt;
* Crear el directorio /htdocs/mimodulo/ &lt;br /&gt;
Ahora su fichero descriptor está configurado.&lt;br /&gt;
&lt;br /&gt;
=== Probar su descriptor ===&lt;br /&gt;
Ejecute Dolibarr y vaya a la página &amp;quot;Configuración &amp;gt; Módulo&amp;quot;. 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-&amp;gt;special el que determina en qué pestaña se encuentra su módulo.&lt;br /&gt;
&lt;br /&gt;
== [[File:Art.png]] Árbol de un nuevo módulo ==&lt;br /&gt;
Crear un directorio &#039;mimodulo&#039; que contendrá los archivos del módulo. Este directorio debe de estar en el directorio &#039;&#039;&#039;htdocs&#039;&#039;&#039; y contendrá los siguientes subdirectorios:&lt;br /&gt;
{{TemplateModuleTreeSimple}}&lt;br /&gt;
&lt;br /&gt;
== [[File:Art.png]] Crear sus tablas SQL y la clase PHP con los métodos de acceso (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si su módulo necesita gestionar sus propios datos.&lt;br /&gt;
&lt;br /&gt;
===Crear sus ficheros .sql===&lt;br /&gt;
Si su módulo de verdad requiere administrar datos que no existen en la base de datos en la versión estándar de Dolibarr, será necesario definir ciertas tablas SQL para registrar esos datos.&lt;br /&gt;
&lt;br /&gt;
Revisa que en el descriptor de archivo (mymodule/core/modules/mymodule.class.php) la línea&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;_load_tables(&#039;/mymodule/sql/&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
esté descomentada y correctamente configurada.&lt;br /&gt;
&lt;br /&gt;
Cree un subdirectorio sql en el directorio de su módulo (por ejemplo, htdocs/mimodulo/sql), con el fin de colocar los scripts sql que va a crear. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Regla a respetar:&#039;&#039; &lt;br /&gt;
* Agregue los archivos de orden de creación de sus tablas siguiendo el principio de un fichero &#039;&#039;&#039;llx_mitabla.sql&#039;&#039; por tabla, eventualmente acompañado del archivo &#039;&#039;&#039;llx_mitabla.key.sql&#039;&#039;&#039; (ver los archivos existentes en &#039;&#039;install/mysql/tables&#039;&#039;, para tomar ejemplo). &lt;br /&gt;
* En términos de orden de gestión de datos, todos deben estar en un archivo llamado &#039;&#039;&#039;data.sql&#039;&#039;&#039; situado en la misma carpeta &#039;&#039;&#039;/mimodulo/sql/&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Ejemplo de contenido de un fichero data.sql&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
 delete from llx_const where name=&#039;MYMODULE_IT_WORKS&#039; and entity=&#039;__ENTITY__&#039;;&lt;br /&gt;
 insert into llx_const (name, value, type, note, visible, entity) values (&#039;MYMODULE_IT_WORKS&#039;,&#039;1&#039;,&#039;chaine&#039;,&#039;A constant vor my module&#039;,1,&#039;__ENTITY__&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Las órdenes SQL de los archivos deben de ser operacionales para la base de datos &#039;&#039;&#039;mysql&#039;&#039;&#039;.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Probar su archivo .sql ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Generar la clase PHP de acceso (DAO) ===&lt;br /&gt;
Una vez que su/s tabla/s estén creadas en la base de datos, vaya al directorio &#039;&#039;&#039;dev/skeletons&#039;&#039;&#039;, copie el archivo &#039;&#039;&#039;build_class_from_table.php&#039;&#039;&#039; en la el directorio sql/ de su módulo module, y ejecute el script&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 php build_class_from_table.php nombretabla&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Nota: Si el comando no funciona, intente con php-cli en lugar de php.&lt;br /&gt;
&lt;br /&gt;
Esto genera un archivo &#039;&#039;&#039;out.nombretabla.class.php&#039;&#039;&#039; que contiene la clase de gestión de la tabla “nombretabla”. En esta clase se encuentran los métodos CRUD (Create/Read/Update/Delete) ya operativos para hacer un &#039;&#039;insert&#039;&#039;, un &#039;&#039;fetch&#039;&#039; (&#039;&#039;select&#039;&#039;), un &#039;&#039;update&#039;&#039;, y un &#039;&#039;delete&#039;&#039; de una línea de la tabla. Suprima justo el &amp;quot;out&amp;quot; del nombre del archivo y pógalo en un subdirectorio de &#039;&#039;&#039;htdocs&#039;&#039;&#039; propio en su módulo (Por ejemplo en &#039;&#039;&#039;htdocs/mimodulo&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Un archivo &#039;&#039;&#039;out.nombretabla_script.php&#039;&#039;&#039; se genera igualmente y contiene un ejemplo de código para utilizar la clase para cada uno de los cuatro métodos CRUD.&lt;br /&gt;
&lt;br /&gt;
== Visualización de pestañas (opcional) ==&lt;br /&gt;
&lt;br /&gt;
=== Añadir o eliminar pestañas en las fichas entidad ===&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039; : Para añadir su propia pestaña en las pestañas estándar de una ficha entidad (factura, pedido, presupuesto, miembro...)&lt;br /&gt;
&lt;br /&gt;
Para ello, vaya al archivo descriptor del módulo creado anteriormente y modifique la tabla $this-&amp;gt;tabs:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
	// Array to add new pages in new tabs or remove existing one&lt;br /&gt;
	$this-&amp;gt;tabs = array(&#039;objecttype:+tabname1:Title1:@mymodule:/mymodule/mynewtab1.php?id=__ID__&#039;,  // To add a new tab identified by code tabname1&lt;br /&gt;
                            &#039;objecttype:+tabname2:Title2:@mymodule:/mymodule/mynewtab2.php?id=__ID__&#039;,  // To add another new tab identified by code tabname2&lt;br /&gt;
                            &#039;objecttype:-tabname&#039;);                                                     // To remove an existing tab identified by code tabname&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La tabla debe contener una lista de cadena, cada cadena representa una nueva pestaña.&lt;br /&gt;
El formato de la cadena se compone de 4 partes separadas por &amp;quot;:&amp;quot;&lt;br /&gt;
* Parte 1: El código de la entidad (objecttype) en la que debe aparecer la pestaña siendo el valor de ella misma:&lt;br /&gt;
{{TemplateModuleTabs-es}}&lt;br /&gt;
* 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.&lt;br /&gt;
* 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&lt;br /&gt;
&lt;br /&gt;
* 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.&lt;br /&gt;
&lt;br /&gt;
Para alimentar el contenido de la pestaña con los datos de la base de datos, vea el capítulo siguiente.&lt;br /&gt;
&lt;br /&gt;
=== Añadir pestañas de una ficha entidad en su propia página ===&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039; : Para mostrar las pestañas estandard de ficha entidad (producto, tercero, etc.) en su propia pestaña de una entidad.&lt;br /&gt;
&lt;br /&gt;
Hay que hacer lo siguiente :&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Incluir los archivos que definen las funciones útiles dentro de sus archivos&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para cada ficha entidad, hay que incluir dos archivos con la instrucción&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;require_once($url_fichier) ;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aquí le mostramos la lista de estos archivos (DOL_DOCUMENT_ROOT correspond au dossier dolibarr/htdocs/) :&lt;br /&gt;
* Entidad tercero (thirdparty) :&lt;br /&gt;
** DOL_DOCUMENT_ROOT/societe.class.php&lt;br /&gt;
** DOL_DOCUMENT_ROOT/lib/company.lib.php&lt;br /&gt;
* Entidad producto (product) :&lt;br /&gt;
** DOL_DOCUMENT_ROOT/product.class.php&lt;br /&gt;
** DOL_DOCUMENT_ROOT/lib/product.lib.php&lt;br /&gt;
* Entidad factura (invoice) :&lt;br /&gt;
** DOL_DOCUMENT_ROOT/facture.class.php&lt;br /&gt;
** DOL_DOCUMENT_ROOT/lib/invoice.lib.php&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Crear y cargar el objeto a mostrar en su pestaña&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Crear el objeto de la clase deseada, y recuperar los datos del objeto a partir de la base de datos. Para ello deberá utilizar las funciones fetch() de la clase correspondiente, pasando el parámetro del indentificador del objeto que recupera desde la url (ej : /mononglet.php?id=1).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Ejemplo :&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$id=$_GET[&amp;quot;id&amp;quot;];&lt;br /&gt;
$product = new Product($db) ;&lt;br /&gt;
$result = $product-&amp;gt;fetch($id) ; //Tester $result pour vérifier que l&#039;accès à la base s&#039;est bien passé&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3. Recuperar la lista de pestañas correspondientes a la entidad seleccionada&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Usar la función XXX_prepare_head($obj), donde XXX es le nombre de la entidad, para crear una tabla que contiene las definiciones de las pestañas a mostrar. El parámetro a pasar es el objeto del que desea mostrar las pestañas.&lt;br /&gt;
&lt;br /&gt;
La tabla devuelta se compone de la siguiente manera :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$head        // Tableau des onglets&lt;br /&gt;
$head[$h]    // Élément décrivant un onglet. Il y aura autant de $h que d&#039;onglets à afficher&lt;br /&gt;
$head[$h][0] // Url de la page affichée quand on clique sur l&#039;onglet&lt;br /&gt;
$head[$h][1] // Titre de l&#039;ongLet&lt;br /&gt;
$head[$h][2] // Code de l&#039;onglet, à utiliser pour choisir quel onglet sera &#039;actif&#039; (voir paragraphe suivant)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Ejemplo :&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$head = product_prepare_head($product, $user) ; //le paramètre $user n&#039;est pas présent sur certaines fonctions&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4. Mostrar las pestañas en su pestaña&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Use la función dol_fiche_head() que muestra las pestañas contenidas en la tabla $head devuelta por XX_prepare_head().&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
dol_fiche_head($links, $active=&#039;0&#039;, $title=&#039;&#039;, $notab=0, $picto=&#039;&#039;)&lt;br /&gt;
$links  // Tableau des onglets, appelé $head plus haut.&lt;br /&gt;
$active // Onglet actif (mettre le nom de l&#039;onglet défini dans votre fichier de module, ou un nom contenu dans $head[$h][2]). Cet onglet sera mis en surbrillance&lt;br /&gt;
$title  // ?&lt;br /&gt;
$notab  // Mettre ce paramètre à 1 permet de ne pas afficher de zone bleue en dessous des onglets.&lt;br /&gt;
$picto  // Nom de l&#039;image à utiliser au début de la barre des onglet. Les choix suivant sont possibles :&lt;br /&gt;
//            product&lt;br /&gt;
//            service&lt;br /&gt;
//            company&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esta función muestra las pestañas deseadas y abre un elemento &#039;&#039;&amp;lt; div class=&amp;quot;&amp;quot; &amp;gt;&#039;&#039; 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 &#039;&#039;&amp;lt; /div &amp;gt;&#039;&#039; en el código PHP.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Nota&#039;&#039;:&lt;br /&gt;
Para más detalles, consulte la [http://www.dolibarr.fr/doxygen/ documentación Doxygen] o directamente el código de Dolibarr.&lt;br /&gt;
&lt;br /&gt;
== Crear sus páginas pantalla PHP (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si su módulo consiste en añadir funcionalidades que necesitan nuevas pantallas.&lt;br /&gt;
&lt;br /&gt;
=== Crear una página pantalla PHP ===&lt;br /&gt;
Debe crear a continuación pantallas PHP que se basen en los datos de sus tablas utilizando los esqueletos como ejemplo del directorio &#039;&#039;&#039;dev/skeletons&#039;&#039;&#039;. (Para el desarrollo de un script en línea de comandos, ver [[Desarrollo de scripts]]).&lt;br /&gt;
&lt;br /&gt;
Para crear una nueva página de usuario, cree un subdirectorio de &#039;&#039;&#039;htdocs&#039;&#039;&#039; (si es que no existe ya) propio en su módulo (En &#039;&#039;&#039;htdocs/mimodulo&#039;&#039;&#039;, por ejemplo), con el fin de ubicar en él las páginas que va a crear.&lt;br /&gt;
&lt;br /&gt;
Copie allí el archivo &#039;&#039;&#039;skeletons_page.php&#039;&#039;&#039;, que va a servir de punto de partida a su página. Modifique el archivo para que la ruta relativa de&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$res=0;&lt;br /&gt;
if (! $res &amp;amp;&amp;amp; file_exists(&amp;quot;../main.inc.php&amp;quot;)) $res=@include(&amp;quot;../main.inc.php&amp;quot;);			// to work if your module directory is into dolibarr root htdocs directory&lt;br /&gt;
if (! $res &amp;amp;&amp;amp; file_exists(&amp;quot;../../main.inc.php&amp;quot;)) $res=@include(&amp;quot;../../main.inc.php&amp;quot;);		// to work if your module directory is into a subdir of root htdocs directory&lt;br /&gt;
if (! $res) die(&amp;quot;Include of main fails&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
sea la correcta, en función de la profundidad del directorio en el que se encuentra el archivo (quitando o añadiendo &amp;quot;../&amp;quot;). Es en el &amp;quot;main&amp;quot; donde se carga el entorno técnico y las habilitaciones. Los objetos variables se posicionan ahora:&lt;br /&gt;
* $user – El objeto que contiene las características del usuario y sus derechos.&lt;br /&gt;
* $conf – El objeto que contiene la configuración de Dolibarr.&lt;br /&gt;
* $db – El objeto que contiene el gestor de conexión abierto a la base de datos.&lt;br /&gt;
* $langs – El objeto que contiene el idioma del usuario.&lt;br /&gt;
&lt;br /&gt;
* 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):&lt;br /&gt;
&#039;&#039;Exemple :&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
dol_include_once(&#039;/mimodulo/class/miclass.class.php&#039;, &#039;MiClass&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Las clases de llamadas Dolibarr utilice la siguiente sintaxis:&lt;br /&gt;
&#039;&#039;Exemple :&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
require_once DOL_DOCUMENT_ROOT.&#039;/core/class/doli.class.php&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Reemplazar partes de templates de pantalla (versión 3.3+) ===&lt;br /&gt;
Algunas partes de la pantalla de Dolibarr están aisladas en archivos de plantilla. Puede desarrollar un módulo para reemplazar una o más de estas plantillas con las suyas.&lt;br /&gt;
{{ToComplete}}&lt;br /&gt;
&lt;br /&gt;
=== Acceso a la base de datos ===&lt;br /&gt;
Si necesita realizar modificaciones en su tabla de la base de datos, utilice la clase generada más arriba.&lt;br /&gt;
&lt;br /&gt;
Si de todos modos quiere acceder a las tablas sin objeto PHP dedicado, esto es posible (por ejemplo para recuperar una lista de registros). En ese caso, piense en seguir estos ejemplos.&lt;br /&gt;
&lt;br /&gt;
Para un &#039;&#039;insert&#039;&#039;, &#039;&#039;update&#039;&#039; o &#039;&#039;delete&#039;&#039;:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $db-&amp;gt;begin();   // Debut transaction&lt;br /&gt;
 $db-&amp;gt;query(&amp;quot;Ma requete insert, update ou delete&amp;quot;);&lt;br /&gt;
 $db-&amp;gt;commit();       // Valide&lt;br /&gt;
 o $db-&amp;gt;rollback()  // Annule&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para una lectura:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $resql=$db-&amp;gt;query(&amp;quot;Ma requete select&amp;quot;);&lt;br /&gt;
 if ($resql)&lt;br /&gt;
 {&lt;br /&gt;
         $num = $db-&amp;gt;num_rows($resql);&lt;br /&gt;
         $i = 0;&lt;br /&gt;
         if ($num)&lt;br /&gt;
         {&lt;br /&gt;
                 while ($i &amp;lt; $num)&lt;br /&gt;
                 {&lt;br /&gt;
                         $obj = $db-&amp;gt;fetch_object($resql);&lt;br /&gt;
                         if ($obj)&lt;br /&gt;
                         {&lt;br /&gt;
                                 // You can use here results&lt;br /&gt;
                                 print $obj-&amp;gt;field1;&lt;br /&gt;
                                 print $obj-&amp;gt;field2;&lt;br /&gt;
                         }&lt;br /&gt;
                         $i++;&lt;br /&gt;
                 }&lt;br /&gt;
         }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Definición de estilos ===&lt;br /&gt;
Para que el aspecto de la página guarde coherencia con el tema Dolibarr, es necesario utilizar los estilos CSS de Dolibarr.&lt;br /&gt;
&lt;br /&gt;
Por ejemplo:&lt;br /&gt;
&lt;br /&gt;
* class=&amp;quot;liste_titre&amp;quot;1 en las etiquetas tr y td para una línea de título de tabla. &lt;br /&gt;
* class=”pair” o class=”impair” en las etiquetas tr y td de las líneas de datos de la tabla.&lt;br /&gt;
* class=”flat” en todos los campos en los que se teclea (input, select, textarea...)&lt;br /&gt;
* class=”button” en los objetos de tipo input type=”submit”.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Utilizar el selector de fechas de Dolibarr ===&lt;br /&gt;
Si quiere, puede beneficiarse del selector de fechas en las pantallas Dolibarr. Para ello, utilice la siguiente línea:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $form=new Form($db);&lt;br /&gt;
 $form-&amp;gt;select_date(&#039;&#039;,&#039;mykey&#039;,0,0,0,&amp;quot;myform&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La cadena &amp;quot;mikey&amp;quot; identifica el campo fecha. Hace falta introducir un valor diferente en caso de que haya varios campos. La cadena &amp;quot;myform&amp;quot; es el nombre del campo &amp;quot;FORM&amp;quot; (en el formulario, name=&amp;quot;myform&amp;quot; de la página html). La visualización de un selector de fecha debe por tanto estar integrada en un formulario html.&lt;br /&gt;
&lt;br /&gt;
Para recuperar el valor, a la herencia de POST, el comando es:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $mydate = dol_mktime(12, 0 , 0, $_POST[&#039;mykeymonth&#039;], $_POST[&#039;mykeyday&#039;], $_POST[&#039;mykeyyear&#039;]);&lt;br /&gt;
 print strftime(&#039;%A %d %B %Y&#039;, $mydate);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Definir su página de configuración (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si su módulo ofrece varias opciones parametrizables.&lt;br /&gt;
&lt;br /&gt;
=== Crear su página de edición de configuración ===&lt;br /&gt;
Si su módulo ofrece varias opciones parametrizacles, es necesario crear una página PHP para editar las opciones (que serán guardadas en la [[Table llx_const|tabla &#039;&#039;&#039;llx_const&#039;&#039;&#039;]]). Cree una página PHP llamada &#039;&#039;&#039;mimodulo_setuppage.php&#039;&#039;&#039;, que registre las opciones posibles y las ponga al día. Es necesario tomar como ejemplo una página de &#039;&#039;&#039;/admin&#039;&#039;&#039; 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 &#039;&#039;&#039;/admin&#039;&#039;&#039;. 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 &#039;&#039;&#039;/admin&#039;&#039;&#039;).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $this-&amp;gt;config_page_url = array(&amp;quot;monmodule_setupapage.php&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Probar su página ===&lt;br /&gt;
Vaya a la página &#039;&#039;&#039;Configuración &amp;gt; módulo&#039;&#039;&#039;. 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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Definir sus entradas de menú (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si ha creado páginas PHP, es necesario que estas pantallas sean accesibles desde el menú Dolibarr.&lt;br /&gt;
&lt;br /&gt;
=== Definir sus entradas de menú ===&lt;br /&gt;
Para ello, hace falta definir en el archivo descriptor de menú de tabla this-&amp;gt;menu, que declara los menús.&lt;br /&gt;
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&lt;br /&gt;
&lt;br /&gt;
He aquí un ejemplo de declaración de entradas de menú en el fichero descriptor:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Main menu entries&lt;br /&gt;
$this-&amp;gt;menu = array();			// List of menus to add&lt;br /&gt;
$r=0;&lt;br /&gt;
&lt;br /&gt;
// Add here entries to declare new menus&lt;br /&gt;
// Example to declare the Top Menu entry:&lt;br /&gt;
$this-&amp;gt;menu[$r]=array(	&#039;fk_menu&#039;=&amp;gt;0,			// Put 0 if this is a top menu&lt;br /&gt;
			&#039;type&#039;=&amp;gt;&#039;top&#039;,			// This is a Top menu entry&lt;br /&gt;
			&#039;titre&#039;=&amp;gt;&#039;MyModule top menu&#039;,&lt;br /&gt;
			&#039;mainmenu&#039;=&amp;gt;&#039;mymodule&#039;,&lt;br /&gt;
			&#039;leftmenu&#039;=&amp;gt;&#039;mymodule&#039;,&lt;br /&gt;
			&#039;url&#039;=&amp;gt;&#039;/mymodule/pagetop.php&#039;,&lt;br /&gt;
			&#039;langs&#039;=&amp;gt;&#039;mylangfile&#039;,	// Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory.&lt;br /&gt;
			&#039;position&#039;=&amp;gt;100,&lt;br /&gt;
			&#039;enabled&#039;=&amp;gt;&#039;1&#039;,			// Define condition to show or hide menu entry. Use &#039;$conf-&amp;gt;mymodule-&amp;gt;enabled&#039; if entry must be visible if module is enabled.&lt;br /&gt;
			&#039;perms&#039;=&amp;gt;&#039;1&#039;,			// Use &#039;perms&#039;=&amp;gt;&#039;$user-&amp;gt;rights-&amp;gt;mymodule-&amp;gt;level1-&amp;gt;level2&#039; if you want your menu with a permission rules&lt;br /&gt;
			&#039;target&#039;=&amp;gt;&#039;&#039;,&lt;br /&gt;
			&#039;user&#039;=&amp;gt;2);				// 0=Menu for internal users, 1=external users, 2=both&lt;br /&gt;
$r++;&lt;br /&gt;
&lt;br /&gt;
// Example to declare a Left Menu entry:&lt;br /&gt;
$this-&amp;gt;menu[$r]=array(	&#039;fk_menu&#039;=&amp;gt;&#039;fk_mainmenu=xxx&#039;,		    // Use &#039;fk_mainmenu=xxx&#039; or &#039;fk_mainmenu=xxx,fk_leftmenu=yyy&#039; where xxx is mainmenucode and yyy is a leftmenucode of parent menu&lt;br /&gt;
			&#039;type&#039;=&amp;gt;&#039;left&#039;,			        // This is a Left menu entry&lt;br /&gt;
			&#039;titre&#039;=&amp;gt;&#039;MyModule left menu 1&#039;,&lt;br /&gt;
			&#039;mainmenu&#039;=&amp;gt;&#039;xxx&#039;,&lt;br /&gt;
                        &#039;leftmenu&#039;=&amp;gt;&#039;yyy&#039;,&lt;br /&gt;
			&#039;url&#039;=&amp;gt;&#039;/mymodule/pagelevel1.php&#039;,&lt;br /&gt;
			&#039;langs&#039;=&amp;gt;&#039;mylangfile&#039;,	// Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory.&lt;br /&gt;
			&#039;position&#039;=&amp;gt;100,&lt;br /&gt;
			&#039;enabled&#039;=&amp;gt;&#039;1&#039;,			// Define condition to show or hide menu entry. Use &#039;$conf-&amp;gt;mymodule-&amp;gt;enabled&#039; if entry must be visible if module is enabled.&lt;br /&gt;
			&#039;perms&#039;=&amp;gt;&#039;1&#039;,			// Use &#039;perms&#039;=&amp;gt;&#039;$user-&amp;gt;rights-&amp;gt;mymodule-&amp;gt;level1-&amp;gt;level2&#039; if you want your menu with a permission rules&lt;br /&gt;
			&#039;target&#039;=&amp;gt;&#039;&#039;,&lt;br /&gt;
			&#039;user&#039;=&amp;gt;2);				// 0=Menu for internal users,1=external users, 2=both&lt;br /&gt;
$r++;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para condicionar el acceso al menú segun los permisos, modificar la propiedad &#039;&#039;&#039;perms&#039;&#039;&#039; de la tabla. Ver el capítulo sobre permisos, un poco más abajo, para saber como realizar los permisos.&lt;br /&gt;
&lt;br /&gt;
=== Probar sus entradas de menú ===&lt;br /&gt;
Desactive y reactive su módulo bajo Dolibarr. Las entradas del menú deberían aparecer después de hacerlo (si la condición &#039;enabled&#039; está activada).&lt;br /&gt;
&lt;br /&gt;
== Definir sus propios permisos (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si quiere añadir nuevos permisos.&lt;br /&gt;
&lt;br /&gt;
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-&amp;gt;rights_class = &#039;facture&#039; para que diga:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $this-&amp;gt;rights_class = &#039;mimodulo&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A continuación, rellene la tabla $this-&amp;gt;rights con tantas entradas como permisos diferentes vaya a definir:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $this-&amp;gt;rights[$r][0] = 10001;&lt;br /&gt;
 $this-&amp;gt;rights[$r][1] = &#039;Texto por defecto de mi permiso&#039;;&lt;br /&gt;
 $this-&amp;gt;rights[$r][3] = 1;&lt;br /&gt;
 $this-&amp;gt;rights[$r][4] = &#039;accion&#039;;&lt;br /&gt;
 $this-&amp;gt;rights[$r][5] = &#039;subaccion&#039;;&lt;br /&gt;
 $r++;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En $this-&amp;gt;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ú &#039;&#039;&#039;Información del Sistema&#039;&#039;&#039; en una instalación de Dolibarr que esté funcionando. En $this-&amp;gt;rights[$r][3], introduzca 1 si este permiso se atribuye por defecto a los usuarios según son creados. En $this-&amp;gt;rights[$r][1] introduzca un texto por defecto -que será mostrado si no se encuentra traducción para su permiso en el archivo &#039;&#039;&#039;admin.lang&#039;&#039;&#039;). En $this-&amp;gt;rights[$r][4] y $this-&amp;gt;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:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 if ($user-&amp;gt;rights-&amp;gt;mimodulo-&amp;gt;accion-&amp;gt;subaccion) ...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Definir sus propios paneles (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si su módulo tiene uno o varios paneles.&lt;br /&gt;
&lt;br /&gt;
=== Defina sus paneles ===&lt;br /&gt;
Para ello, modifique las tablas $this-&amp;gt;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 &#039;&#039;&#039;htdocs/mimodulo/core/boxes&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Ejemplo:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;boxes[0][&#039;file&#039;]=&#039;mabox0.php@mimodulo&#039;&lt;br /&gt;
$this-&amp;gt;boxes[0][&#039;note&#039;]=&#039;Mi panel 0&#039;&lt;br /&gt;
 ...&lt;br /&gt;
$this-&amp;gt;boxes[n][&#039;file&#039;]=&#039;maboxn.php@mimodulo&#039;&lt;br /&gt;
$this-&amp;gt;boxes[n][&#039;note&#039;]=&#039;Mi panel n&#039;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A continuación cree los archivos &#039;&#039;&#039;htdocs/mimodulo/core/boxes/mabox0.php&#039;&#039;&#039;, &#039;&#039;&#039;htdocs/mimodulo/core/boxes/mabox1.php&#039;&#039;&#039;...  tomando como ejemplo los paneles existentes (en el directorio htdocs/core/boxes)&lt;br /&gt;
&lt;br /&gt;
=== Pruebe sus paneles en Dolibarr ===&lt;br /&gt;
Vaya al menú &#039;&#039;&#039;Inico – Configuración – Paneles&#039;&#039;&#039;. 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.&lt;br /&gt;
&lt;br /&gt;
== Definir sus propias exportaciones (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; 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)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Definir la exportación ===&lt;br /&gt;
Para ello, descomente y modifique las tablas $this-&amp;gt;export_xxx  de su archivo descriptor de módulo.&lt;br /&gt;
&lt;br /&gt;
=== Probar la exportación ===&lt;br /&gt;
Vaya al menú &amp;quot;Herramientas &amp;gt; Exportar&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Definir sus estilos CSS (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si en sus pantallas PHP utiliza clases de estilos distintas a las de los temas de Dolibarr (no recomendado).&lt;br /&gt;
&lt;br /&gt;
Esta funcionalidad todavía no es operativa en la versión 2.4., a pesar de estar ya descrita.&lt;br /&gt;
&lt;br /&gt;
=== Crear y declarar su hoja de estilos ===&lt;br /&gt;
Crear un archivo de estilos llamada &#039;&#039;&#039;mimodulo.css&#039;&#039;&#039; o &#039;&#039;&#039;mimodule.css.php&#039;&#039;&#039; y guardarla en el directorio &#039;&#039;&#039;&#039;&#039;mimodulo&#039;&#039;&#039;&#039;&#039; dentro de &#039;&#039;&#039;htdocs&#039;&#039;&#039;. Solo puede haber un archivo css propio a cada módulo.&lt;br /&gt;
Recordamos que es mejor usar los estilos ya existentes en Dolibarr (el archivo css usado por Dolibarr es el archivo &#039;&#039;&#039;themes/nomtheme/&#039;&#039;nombretema&#039;&#039;.css.php&#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
Una vez su hoja de estilos esté disponible, declárela en su archivo descriptor de módulo modificando la propiedad &#039;&#039;&#039;$this-&amp;gt;module_parts&#039;&#039;&#039;.&lt;br /&gt;
El valor a indicar debe ser la ruta URL relativa de su archivo css.&lt;br /&gt;
Por ejemplo&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;module_parts = array(&#039;css&#039; =&amp;gt; array(&#039;/mimodulo/css/mimodulo.css.php&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Probar su hoja de estilos ===&lt;br /&gt;
Desactivar y reactivar su módulo.&lt;br /&gt;
&lt;br /&gt;
Ir la página de inicio de Dolibarr. Ver el código de la página HTML.&lt;br /&gt;
&lt;br /&gt;
Debería ver en el encabezado HTML, una línea de declaración de su hoja de estilos.&lt;br /&gt;
&lt;br /&gt;
== Definir sus funciones Javascript (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuando&#039;&#039;&#039;: Si en sus pantallas en PHP utiliza funciones de Javascript no disponibles en estandard (archivo lib_head.js)&lt;br /&gt;
&lt;br /&gt;
Si en sus pantallas en PHP utiliza funciones javascript, es necesario asegurarse de que las funciones declaradas en un archivo javascript &#039;&#039;&#039;htdocs/mimodulo/js/monmodule.js&#039;&#039;&#039; sea cargado en la cabecera del head html.&lt;br /&gt;
&lt;br /&gt;
Para pedir a Dolibarr que gestione en la generación de la sección header la inclusión de uno de sus archivos javascript, es necesario proporcionar como parámetro a la función llxHeader(), al inicio de su página, la URL hacia el js a incluir.&lt;br /&gt;
&lt;br /&gt;
Ejemplo para la página /htdocs/mimodulo/mapage.php :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
require(&#039;../main.inc.php&#039;);&lt;br /&gt;
$morejs=array(&amp;quot;/mimomulo/js/monmodule.js&amp;quot;);&lt;br /&gt;
llxHeader(&#039;&#039;,&#039;Titulo&#039;,&#039;&#039;,&#039;&#039;,&#039;&#039;,&#039;&#039;,$morejs,&#039;&#039;,0,0); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ejecutar código sobre un evento Dolibarr (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; 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 &#039;&#039;&#039;disparador (triggers)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Véase también [[Interfaces Dolibarr hacia el exterior]] e [[Interfaces del Exterior hacia Dolibarr]]&lt;br /&gt;
&lt;br /&gt;
== Insertar su código usando los hooks de Dolibarr (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039;: Cuando desee cambiar o añadir otro tipo de código en un evento de negociado (véase lel capítulo anterior para esto).&lt;br /&gt;
&lt;br /&gt;
Véase la página [[El sistema Hooks]].&lt;br /&gt;
&lt;br /&gt;
== Añadir un módulo de numeración (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039;: Si quiere añadir una regla de numeración no cubierta por los módulos por defecto.&lt;br /&gt;
&lt;br /&gt;
Véase la página [[Crear un módulo de numeración]].&lt;br /&gt;
&lt;br /&gt;
== Añadir un nuevo módulo de documento (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039;: Si quiere añadir un nuevo modelo de documento.&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
== Añadir un tema (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039;: Si quiere un interface con colores personalizados.&lt;br /&gt;
&lt;br /&gt;
Véase la página [[Temas]].&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Algunas reglas de código =&lt;br /&gt;
Las reglas de código a seguir se definen en la [[Documentación Desarrolladores| Documentación para desarrolladores]], concretamente en la sección &amp;quot;Lenguaje&amp;quot; del capítulo de &amp;quot;Información General&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Utilización de MDA =&lt;br /&gt;
Un método para generar un módulo funcional desde UML se encuentra en curso de puesta a punto. Más información en la página [[UML2Dolibarr - Crear un módulo usando MDA]].&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Crear un paquete para liberar e instalar su módulo =&lt;br /&gt;
Este proceso debe ser usado para fabricar un paquete con el fin de enviarlo a la tienda oficial http://www.dolistore.com.&lt;br /&gt;
&lt;br /&gt;
También puede usarlo para distribuir fácilmente su módulo vía su propio método de distribución.&lt;br /&gt;
&lt;br /&gt;
* Vaya al directorio &#039;&#039;&#039;/build&#039;&#039;&#039; y copie el archivo &#039;&#039;&#039;makepack-dolibarrmodules.conf&#039;&#039;&#039; como &#039;&#039;&#039;makepack-mimodulo.conf&#039;&#039;&#039;. 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).&lt;br /&gt;
&lt;br /&gt;
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...)&lt;br /&gt;
* Lance el script vía Perl (necesita la versión 5.0. o superiores de Perl)&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 perl makepack-dolibarrmodule.pl&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El script le pide el nombre de su módulo, su versión mayor y menor. Se va a crear un fichero &#039;&#039;&#039;mimodulo.zip&#039;&#039;&#039;, que incluirá su módulo listo para ser liberado.&lt;br /&gt;
* La persona que reciba su módulo deberá ubicar el archivo en el directorio raíz de Dolibarr y ejecutar el comando:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 tar -xvf monmodule.zip&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 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 &amp;quot;Submit a product&amp;quot;).&lt;br /&gt;
** Si su módulo está correctamente realizado, será rápidamente validado.&lt;br /&gt;
** 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).&lt;/div&gt;</summary>
		<author><name>Nnicolashr</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Desarrollo_de_un_m%C3%B3dulo&amp;diff=35884</id>
		<title>Desarrollo de un módulo</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Desarrollo_de_un_m%C3%B3dulo&amp;diff=35884"/>
		<updated>2016-09-08T01:12:06Z</updated>

		<summary type="html">&lt;p&gt;Nnicolashr: /* Crear su descriptor */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Básico]]&lt;br /&gt;
{{TemplateDocDesarrollo}}&lt;br /&gt;
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:&lt;br /&gt;
* Añadir nuevas tablas a la base de datos.&lt;br /&gt;
* Añadir sus propias entradas en los menús.&lt;br /&gt;
* Añadir pantallas de edición/consulta de nuevas tablas.&lt;br /&gt;
* Añadir o eliminar pestañas en las páginas de vista/edición de objetos (factura, producto, pedido, evento, etc.)&lt;br /&gt;
* Añadir exportaciones predefinidas a la función “Exportar”.&lt;br /&gt;
* Añadir variables de substitución&lt;br /&gt;
* Añadir nuevas cajas a la página de inicio.&lt;br /&gt;
* Definir nuevos permisos.&lt;br /&gt;
* Activar código automático sobre una acción particular de Dolibarr.&lt;br /&gt;
* Insertar nuestro código mediante los hooks de Dolibarr&lt;br /&gt;
* Añadir un módulo de numeración&lt;br /&gt;
* Añadir un modelo de documento&lt;br /&gt;
* Añadir un nuevo tema &lt;br /&gt;
&lt;br /&gt;
etc. Todas estas operaciones sólo están disponibles a partir de la versión 3.2 de Dolibarr.&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Crear un módulo =&lt;br /&gt;
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&lt;br /&gt;
&lt;br /&gt;
== [[File:Art.png]] Crear un descriptor de Módulo (obligatorio) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039;: Obligatorio cada vez que se desarrolla una extensión, cualquiera que sea su finalidad.&lt;br /&gt;
&lt;br /&gt;
=== Crear su descriptor ===&lt;br /&gt;
La primera fase es la de crear un fichero descriptor del módulo. Para ello:&lt;br /&gt;
* Crear el directorio &#039;&#039;&#039;/htdocs/&#039;&#039;mimodulo&#039;&#039;/core/modules&#039;&#039;&#039;. Seguidamente ir al directorio &#039;&#039;&#039;dev/skeletons&#039;&#039;&#039; y copiar el archivo modMyModule.class.php en el directorio &#039;&#039;&#039;htdocs/&#039;&#039;mimodulo&#039;&#039;/core/modules&#039;&#039;&#039;.&lt;br /&gt;
A continuación, modificar el contenido del archivo, reemplazando:&lt;br /&gt;
* los &amp;quot;modMyModule&amp;quot; por un valor que corresponda a la finalidad de su módulo. Este valor debe siempre comenzar por mod. &lt;br /&gt;
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.&lt;br /&gt;
* $this-&amp;gt;numero = 100000 por un número de módulo que esté libre. Ver [[List of modules id|Listado de los id de módulos]]&lt;br /&gt;
* Modificar eventualmente otras variables definidas por los desarrolladores (ver el comentario en el código del esqueleto para ver su significado)&lt;br /&gt;
* Crear el directorio /htdocs/mimodulo/ &lt;br /&gt;
Ahora su fichero descriptor está configurado.&lt;br /&gt;
&lt;br /&gt;
=== Probar su descriptor ===&lt;br /&gt;
Ejecute Dolibarr y vaya a la página &amp;quot;Configuración &amp;gt; Módulo&amp;quot;. 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-&amp;gt;special el que determina en qué pestaña se encuentra su módulo.&lt;br /&gt;
&lt;br /&gt;
== [[File:Art.png]] Árbol de un nuevo módulo ==&lt;br /&gt;
Crear un directorio &#039;mimodulo&#039; que contendrá los archivos del módulo. Este directorio debe de estar en el directorio &#039;&#039;&#039;htdocs&#039;&#039;&#039; y contendrá los siguientes subdirectorios:&lt;br /&gt;
{{TemplateModuleTreeSimple}}&lt;br /&gt;
&lt;br /&gt;
== [[File:Art.png]] Crear sus tablas SQL y la clase PHP con los métodos de acceso (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si su módulo necesita gestionar sus propios datos.&lt;br /&gt;
&lt;br /&gt;
===Crear sus ficheros .sql===&lt;br /&gt;
Si su módulo de verdad requiere administrar datos que no existen en la base de datos en la versión estándar de Dolibarr, será necesario definir ciertas tablas SQL para registrar esos datos.&lt;br /&gt;
&lt;br /&gt;
Revisa que en el descriptor de archivo (mymodule/core/modules/mymodule.class.php) la línea&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;_load_tables(&#039;/mymodule/sql/&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
esté descomentada y correctamente configurada.&lt;br /&gt;
&lt;br /&gt;
Cree un subdirectorio sql en el directorio de su módulo (por ejemplo, htdocs/mimodulo/sql), con el fin de colocar los scripts sql que va a crear. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Regla a respetar:&#039;&#039; &lt;br /&gt;
* Agregue los archivos de orden de creación de sus tablas siguiendo el principio de un fichero &#039;&#039;&#039;llx_mitabla.sql&#039;&#039; por tabla, eventualmente acompañado del archivo &#039;&#039;&#039;llx_mitabla.key.sql&#039;&#039;&#039; (ver los archivos existentes en &#039;&#039;install/mysql/tables&#039;&#039;, para tomar ejemplo). &lt;br /&gt;
* En términos de orden de gestión de datos, todos deben estar en un archivo llamado &#039;&#039;&#039;data.sql&#039;&#039;&#039; situado en la misma carpeta &#039;&#039;&#039;/mimodulo/sql/&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Ejemplo de contenido de un fichero data.sql&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
 delete from llx_const where name=&#039;MYMODULE_IT_WORKS&#039; and entity=&#039;__ENTITY__&#039;;&lt;br /&gt;
 insert into llx_const (name, value, type, note, visible, entity) values (&#039;MYMODULE_IT_WORKS&#039;,&#039;1&#039;,&#039;chaine&#039;,&#039;A constant vor my module&#039;,1,&#039;__ENTITY__&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Las órdenes SQL de los archivos deben de ser operacionales para la base de datos &#039;&#039;&#039;mysql&#039;&#039;&#039;.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Probar su archivo .sql ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Generar la clase PHP de acceso (DAO) ===&lt;br /&gt;
Una vez que su/s tabla/s estén creadas en la base de datos, vaya al directorio &#039;&#039;&#039;dev/skeletons&#039;&#039;&#039;, copie el archivo &#039;&#039;&#039;build_class_from_table.php&#039;&#039;&#039; en la el directorio sql/ de su módulo module, y ejecute el script&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 php build_class_from_table.php nombretabla&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Nota: Si el comando no funciona, intente con php-cli en lugar de php.&lt;br /&gt;
&lt;br /&gt;
Esto genera un archivo &#039;&#039;&#039;out.nombretabla.class.php&#039;&#039;&#039; que contiene la clase de gestión de la tabla “nombretabla”. En esta clase se encuentran los métodos CRUD (Create/Read/Update/Delete) ya operativos para hacer un &#039;&#039;insert&#039;&#039;, un &#039;&#039;fetch&#039;&#039; (&#039;&#039;select&#039;&#039;), un &#039;&#039;update&#039;&#039;, y un &#039;&#039;delete&#039;&#039; de una línea de la tabla. Suprima justo el &amp;quot;out&amp;quot; del nombre del archivo y pógalo en un subdirectorio de &#039;&#039;&#039;htdocs&#039;&#039;&#039; propio en su módulo (Por ejemplo en &#039;&#039;&#039;htdocs/mimodulo&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Un archivo &#039;&#039;&#039;out.nombretabla_script.php&#039;&#039;&#039; se genera igualmente y contiene un ejemplo de código para utilizar la clase para cada uno de los cuatro métodos CRUD.&lt;br /&gt;
&lt;br /&gt;
== Visualización de pestañas (opcional) ==&lt;br /&gt;
&lt;br /&gt;
=== Añadir o eliminar pestañas en las fichas entidad ===&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039; : Para añadir su propia pestaña en las pestañas estándar de una ficha entidad (factura, pedido, presupuesto, miembro...)&lt;br /&gt;
&lt;br /&gt;
Para ello, vaya al archivo descriptor del módulo creado anteriormente y modifique la tabla $this-&amp;gt;tabs:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
	// Array to add new pages in new tabs or remove existing one&lt;br /&gt;
	$this-&amp;gt;tabs = array(&#039;objecttype:+tabname1:Title1:@mymodule:/mymodule/mynewtab1.php?id=__ID__&#039;,  // To add a new tab identified by code tabname1&lt;br /&gt;
                            &#039;objecttype:+tabname2:Title2:@mymodule:/mymodule/mynewtab2.php?id=__ID__&#039;,  // To add another new tab identified by code tabname2&lt;br /&gt;
                            &#039;objecttype:-tabname&#039;);                                                     // To remove an existing tab identified by code tabname&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La tabla debe contener una lista de cadena, cada cadena representa una nueva pestaña.&lt;br /&gt;
El formato de la cadena se compone de 4 partes separadas por &amp;quot;:&amp;quot;&lt;br /&gt;
* Parte 1: El código de la entidad (objecttype) en la que debe aparecer la pestaña siendo el valor de ella misma:&lt;br /&gt;
{{TemplateModuleTabs-es}}&lt;br /&gt;
* 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.&lt;br /&gt;
* 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&lt;br /&gt;
&lt;br /&gt;
* 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.&lt;br /&gt;
&lt;br /&gt;
Para alimentar el contenido de la pestaña con los datos de la base de datos, vea el capítulo siguiente.&lt;br /&gt;
&lt;br /&gt;
=== Añadir pestañas de una ficha entidad en su propia página ===&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039; : Para mostrar las pestañas estandard de ficha entidad (producto, tercero, etc.) en su propia pestaña de una entidad.&lt;br /&gt;
&lt;br /&gt;
Hay que hacer lo siguiente :&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Incluir los archivos que definen las funciones útiles dentro de sus archivos&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para cada ficha entidad, hay que incluir dos archivos con la instrucción&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;require_once($url_fichier) ;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aquí le mostramos la lista de estos archivos (DOL_DOCUMENT_ROOT correspond au dossier dolibarr/htdocs/) :&lt;br /&gt;
* Entidad tercero (thirdparty) :&lt;br /&gt;
** DOL_DOCUMENT_ROOT/societe.class.php&lt;br /&gt;
** DOL_DOCUMENT_ROOT/lib/company.lib.php&lt;br /&gt;
* Entidad producto (product) :&lt;br /&gt;
** DOL_DOCUMENT_ROOT/product.class.php&lt;br /&gt;
** DOL_DOCUMENT_ROOT/lib/product.lib.php&lt;br /&gt;
* Entidad factura (invoice) :&lt;br /&gt;
** DOL_DOCUMENT_ROOT/facture.class.php&lt;br /&gt;
** DOL_DOCUMENT_ROOT/lib/invoice.lib.php&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Crear y cargar el objeto a mostrar en su pestaña&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Crear el objeto de la clase deseada, y recuperar los datos del objeto a partir de la base de datos. Para ello deberá utilizar las funciones fetch() de la clase correspondiente, pasando el parámetro del indentificador del objeto que recupera desde la url (ej : /mononglet.php?id=1).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Ejemplo :&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$id=$_GET[&amp;quot;id&amp;quot;];&lt;br /&gt;
$product = new Product($db) ;&lt;br /&gt;
$result = $product-&amp;gt;fetch($id) ; //Tester $result pour vérifier que l&#039;accès à la base s&#039;est bien passé&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3. Recuperar la lista de pestañas correspondientes a la entidad seleccionada&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Usar la función XXX_prepare_head($obj), donde XXX es le nombre de la entidad, para crear una tabla que contiene las definiciones de las pestañas a mostrar. El parámetro a pasar es el objeto del que desea mostrar las pestañas.&lt;br /&gt;
&lt;br /&gt;
La tabla devuelta se compone de la siguiente manera :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$head        // Tableau des onglets&lt;br /&gt;
$head[$h]    // Élément décrivant un onglet. Il y aura autant de $h que d&#039;onglets à afficher&lt;br /&gt;
$head[$h][0] // Url de la page affichée quand on clique sur l&#039;onglet&lt;br /&gt;
$head[$h][1] // Titre de l&#039;ongLet&lt;br /&gt;
$head[$h][2] // Code de l&#039;onglet, à utiliser pour choisir quel onglet sera &#039;actif&#039; (voir paragraphe suivant)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Ejemplo :&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$head = product_prepare_head($product, $user) ; //le paramètre $user n&#039;est pas présent sur certaines fonctions&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4. Mostrar las pestañas en su pestaña&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Use la función dol_fiche_head() que muestra las pestañas contenidas en la tabla $head devuelta por XX_prepare_head().&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
dol_fiche_head($links, $active=&#039;0&#039;, $title=&#039;&#039;, $notab=0, $picto=&#039;&#039;)&lt;br /&gt;
$links  // Tableau des onglets, appelé $head plus haut.&lt;br /&gt;
$active // Onglet actif (mettre le nom de l&#039;onglet défini dans votre fichier de module, ou un nom contenu dans $head[$h][2]). Cet onglet sera mis en surbrillance&lt;br /&gt;
$title  // ?&lt;br /&gt;
$notab  // Mettre ce paramètre à 1 permet de ne pas afficher de zone bleue en dessous des onglets.&lt;br /&gt;
$picto  // Nom de l&#039;image à utiliser au début de la barre des onglet. Les choix suivant sont possibles :&lt;br /&gt;
//            product&lt;br /&gt;
//            service&lt;br /&gt;
//            company&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esta función muestra las pestañas deseadas y abre un elemento &#039;&#039;&amp;lt; div class=&amp;quot;&amp;quot; &amp;gt;&#039;&#039; 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 &#039;&#039;&amp;lt; /div &amp;gt;&#039;&#039; en el código PHP.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Nota&#039;&#039;:&lt;br /&gt;
Para más detalles, consulte la [http://www.dolibarr.fr/doxygen/ documentación Doxygen] o directamente el código de Dolibarr.&lt;br /&gt;
&lt;br /&gt;
== Crear sus páginas pantalla PHP (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si su módulo consiste en añadir funcionalidades que necesitan nuevas pantallas.&lt;br /&gt;
&lt;br /&gt;
=== Crear una página pantalla PHP ===&lt;br /&gt;
Debe crear a continuación pantallas PHP que se basen en los datos de sus tablas utilizando los esqueletos como ejemplo del directorio &#039;&#039;&#039;dev/skeletons&#039;&#039;&#039;. (Para el desarrollo de un script en línea de comandos, ver [[Desarrollo de scripts]]).&lt;br /&gt;
&lt;br /&gt;
Para crear una nueva página de usuario, cree un subdirectorio de &#039;&#039;&#039;htdocs&#039;&#039;&#039; (si es que no existe ya) propio en su módulo (En &#039;&#039;&#039;htdocs/mimodulo&#039;&#039;&#039;, por ejemplo), con el fin de ubicar en él las páginas que va a crear.&lt;br /&gt;
&lt;br /&gt;
Copie allí el archivo &#039;&#039;&#039;skeletons_page.php&#039;&#039;&#039;, que va a servir de punto de partida a su página. Modifique el archivo para que la ruta relativa de&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$res=0;&lt;br /&gt;
if (! $res &amp;amp;&amp;amp; file_exists(&amp;quot;../main.inc.php&amp;quot;)) $res=@include(&amp;quot;../main.inc.php&amp;quot;);			// to work if your module directory is into dolibarr root htdocs directory&lt;br /&gt;
if (! $res &amp;amp;&amp;amp; file_exists(&amp;quot;../../main.inc.php&amp;quot;)) $res=@include(&amp;quot;../../main.inc.php&amp;quot;);		// to work if your module directory is into a subdir of root htdocs directory&lt;br /&gt;
if (! $res) die(&amp;quot;Include of main fails&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
sea la correcta, en función de la profundidad del directorio en el que se encuentra el archivo (quitando o añadiendo &amp;quot;../&amp;quot;). Es en el &amp;quot;main&amp;quot; donde se carga el entorno técnico y las habilitaciones. Los objetos variables se posicionan ahora:&lt;br /&gt;
* $user – El objeto que contiene las características del usuario y sus derechos.&lt;br /&gt;
* $conf – El objeto que contiene la configuración de Dolibarr.&lt;br /&gt;
* $db – El objeto que contiene el gestor de conexión abierto a la base de datos.&lt;br /&gt;
* $langs – El objeto que contiene el idioma del usuario.&lt;br /&gt;
&lt;br /&gt;
* 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):&lt;br /&gt;
&#039;&#039;Exemple :&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
dol_include_once(&#039;/mimodulo/class/miclass.class.php&#039;, &#039;MiClass&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Las clases de llamadas Dolibarr utilice la siguiente sintaxis:&lt;br /&gt;
&#039;&#039;Exemple :&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
require_once DOL_DOCUMENT_ROOT.&#039;/core/class/doli.class.php&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Reemplazar partes de templates de pantalla (versión 3.3+) ===&lt;br /&gt;
Algunas partes de la pantalla de Dolibarr están aisladas en archivos de plantilla. Puede desarrollar un módulo para reemplazar una o más de estas plantillas con las suyas.&lt;br /&gt;
{{ToComplete}}&lt;br /&gt;
&lt;br /&gt;
=== Acceso a la base de datos ===&lt;br /&gt;
Si necesita realizar modificaciones en su tabla de la base de datos, utilice la clase generada más arriba.&lt;br /&gt;
&lt;br /&gt;
Si de todos modos quiere acceder a las tablas sin objeto PHP dedicado, esto es posible (por ejemplo para recuperar una lista de registros). En ese caso, piense en seguir estos ejemplos.&lt;br /&gt;
&lt;br /&gt;
Para un &#039;&#039;insert&#039;&#039;, &#039;&#039;update&#039;&#039; o &#039;&#039;delete&#039;&#039;:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $db-&amp;gt;begin();   // Debut transaction&lt;br /&gt;
 $db-&amp;gt;query(&amp;quot;Ma requete insert, update ou delete&amp;quot;);&lt;br /&gt;
 $db-&amp;gt;commit();       // Valide&lt;br /&gt;
 o $db-&amp;gt;rollback()  // Annule&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para una lectura:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $resql=$db-&amp;gt;query(&amp;quot;Ma requete select&amp;quot;);&lt;br /&gt;
 if ($resql)&lt;br /&gt;
 {&lt;br /&gt;
         $num = $db-&amp;gt;num_rows($resql);&lt;br /&gt;
         $i = 0;&lt;br /&gt;
         if ($num)&lt;br /&gt;
         {&lt;br /&gt;
                 while ($i &amp;lt; $num)&lt;br /&gt;
                 {&lt;br /&gt;
                         $obj = $db-&amp;gt;fetch_object($resql);&lt;br /&gt;
                         if ($obj)&lt;br /&gt;
                         {&lt;br /&gt;
                                 // You can use here results&lt;br /&gt;
                                 print $obj-&amp;gt;field1;&lt;br /&gt;
                                 print $obj-&amp;gt;field2;&lt;br /&gt;
                         }&lt;br /&gt;
                         $i++;&lt;br /&gt;
                 }&lt;br /&gt;
         }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Definición de estilos ===&lt;br /&gt;
Para que el aspecto de la página guarde coherencia con el tema Dolibarr, es necesario utilizar los estilos CSS de Dolibarr.&lt;br /&gt;
&lt;br /&gt;
Por ejemplo:&lt;br /&gt;
&lt;br /&gt;
* class=&amp;quot;liste_titre&amp;quot;1 en las etiquetas tr y td para una línea de título de tabla. &lt;br /&gt;
* class=”pair” o class=”impair” en las etiquetas tr y td de las líneas de datos de la tabla.&lt;br /&gt;
* class=”flat” en todos los campos en los que se teclea (input, select, textarea...)&lt;br /&gt;
* class=”button” en los objetos de tipo input type=”submit”.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Utilizar el selector de fechas de Dolibarr ===&lt;br /&gt;
Si quiere, puede beneficiarse del selector de fechas en las pantallas Dolibarr. Para ello, utilice la siguiente línea:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $form=new Form($db);&lt;br /&gt;
 $form-&amp;gt;select_date(&#039;&#039;,&#039;mykey&#039;,0,0,0,&amp;quot;myform&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La cadena &amp;quot;mikey&amp;quot; identifica el campo fecha. Hace falta introducir un valor diferente en caso de que haya varios campos. La cadena &amp;quot;myform&amp;quot; es el nombre del campo &amp;quot;FORM&amp;quot; (en el formulario, name=&amp;quot;myform&amp;quot; de la página html). La visualización de un selector de fecha debe por tanto estar integrada en un formulario html.&lt;br /&gt;
&lt;br /&gt;
Para recuperar el valor, a la herencia de POST, el comando es:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $mydate = dol_mktime(12, 0 , 0, $_POST[&#039;mykeymonth&#039;], $_POST[&#039;mykeyday&#039;], $_POST[&#039;mykeyyear&#039;]);&lt;br /&gt;
 print strftime(&#039;%A %d %B %Y&#039;, $mydate);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Definir su página de configuración (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si su módulo ofrece varias opciones parametrizables.&lt;br /&gt;
&lt;br /&gt;
=== Crear su página de edición de configuración ===&lt;br /&gt;
Si su módulo ofrece varias opciones parametrizacles, es necesario crear una página PHP para editar las opciones (que serán guardadas en la [[Table llx_const|tabla &#039;&#039;&#039;llx_const&#039;&#039;&#039;]]). Cree una página PHP llamada &#039;&#039;&#039;mimodulo_setuppage.php&#039;&#039;&#039;, que registre las opciones posibles y las ponga al día. Es necesario tomar como ejemplo una página de &#039;&#039;&#039;/admin&#039;&#039;&#039; 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 &#039;&#039;&#039;/admin&#039;&#039;&#039;. 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 &#039;&#039;&#039;/admin&#039;&#039;&#039;).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $this-&amp;gt;config_page_url = array(&amp;quot;monmodule_setupapage.php&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Probar su página ===&lt;br /&gt;
Vaya a la página &#039;&#039;&#039;Configuración &amp;gt; módulo&#039;&#039;&#039;. 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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Definir sus entradas de menú (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si ha creado páginas PHP, es necesario que estas pantallas sean accesibles desde el menú Dolibarr.&lt;br /&gt;
&lt;br /&gt;
=== Definir sus entradas de menú ===&lt;br /&gt;
Para ello, hace falta definir en el archivo descriptor de menú de tabla this-&amp;gt;menu, que declara los menús.&lt;br /&gt;
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&lt;br /&gt;
&lt;br /&gt;
He aquí un ejemplo de declaración de entradas de menú en el fichero descriptor:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Main menu entries&lt;br /&gt;
$this-&amp;gt;menu = array();			// List of menus to add&lt;br /&gt;
$r=0;&lt;br /&gt;
&lt;br /&gt;
// Add here entries to declare new menus&lt;br /&gt;
// Example to declare the Top Menu entry:&lt;br /&gt;
$this-&amp;gt;menu[$r]=array(	&#039;fk_menu&#039;=&amp;gt;0,			// Put 0 if this is a top menu&lt;br /&gt;
			&#039;type&#039;=&amp;gt;&#039;top&#039;,			// This is a Top menu entry&lt;br /&gt;
			&#039;titre&#039;=&amp;gt;&#039;MyModule top menu&#039;,&lt;br /&gt;
			&#039;mainmenu&#039;=&amp;gt;&#039;mymodule&#039;,&lt;br /&gt;
			&#039;leftmenu&#039;=&amp;gt;&#039;mymodule&#039;,&lt;br /&gt;
			&#039;url&#039;=&amp;gt;&#039;/mymodule/pagetop.php&#039;,&lt;br /&gt;
			&#039;langs&#039;=&amp;gt;&#039;mylangfile&#039;,	// Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory.&lt;br /&gt;
			&#039;position&#039;=&amp;gt;100,&lt;br /&gt;
			&#039;enabled&#039;=&amp;gt;&#039;1&#039;,			// Define condition to show or hide menu entry. Use &#039;$conf-&amp;gt;mymodule-&amp;gt;enabled&#039; if entry must be visible if module is enabled.&lt;br /&gt;
			&#039;perms&#039;=&amp;gt;&#039;1&#039;,			// Use &#039;perms&#039;=&amp;gt;&#039;$user-&amp;gt;rights-&amp;gt;mymodule-&amp;gt;level1-&amp;gt;level2&#039; if you want your menu with a permission rules&lt;br /&gt;
			&#039;target&#039;=&amp;gt;&#039;&#039;,&lt;br /&gt;
			&#039;user&#039;=&amp;gt;2);				// 0=Menu for internal users, 1=external users, 2=both&lt;br /&gt;
$r++;&lt;br /&gt;
&lt;br /&gt;
// Example to declare a Left Menu entry:&lt;br /&gt;
$this-&amp;gt;menu[$r]=array(	&#039;fk_menu&#039;=&amp;gt;&#039;fk_mainmenu=xxx&#039;,		    // Use &#039;fk_mainmenu=xxx&#039; or &#039;fk_mainmenu=xxx,fk_leftmenu=yyy&#039; where xxx is mainmenucode and yyy is a leftmenucode of parent menu&lt;br /&gt;
			&#039;type&#039;=&amp;gt;&#039;left&#039;,			        // This is a Left menu entry&lt;br /&gt;
			&#039;titre&#039;=&amp;gt;&#039;MyModule left menu 1&#039;,&lt;br /&gt;
			&#039;mainmenu&#039;=&amp;gt;&#039;xxx&#039;,&lt;br /&gt;
                        &#039;leftmenu&#039;=&amp;gt;&#039;yyy&#039;,&lt;br /&gt;
			&#039;url&#039;=&amp;gt;&#039;/mymodule/pagelevel1.php&#039;,&lt;br /&gt;
			&#039;langs&#039;=&amp;gt;&#039;mylangfile&#039;,	// Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory.&lt;br /&gt;
			&#039;position&#039;=&amp;gt;100,&lt;br /&gt;
			&#039;enabled&#039;=&amp;gt;&#039;1&#039;,			// Define condition to show or hide menu entry. Use &#039;$conf-&amp;gt;mymodule-&amp;gt;enabled&#039; if entry must be visible if module is enabled.&lt;br /&gt;
			&#039;perms&#039;=&amp;gt;&#039;1&#039;,			// Use &#039;perms&#039;=&amp;gt;&#039;$user-&amp;gt;rights-&amp;gt;mymodule-&amp;gt;level1-&amp;gt;level2&#039; if you want your menu with a permission rules&lt;br /&gt;
			&#039;target&#039;=&amp;gt;&#039;&#039;,&lt;br /&gt;
			&#039;user&#039;=&amp;gt;2);				// 0=Menu for internal users,1=external users, 2=both&lt;br /&gt;
$r++;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para condicionar el acceso al menú segun los permisos, modificar la propiedad &#039;&#039;&#039;perms&#039;&#039;&#039; de la tabla. Ver el capítulo sobre permisos, un poco más abajo, para saber como realizar los permisos.&lt;br /&gt;
&lt;br /&gt;
=== Probar sus entradas de menú ===&lt;br /&gt;
Desactive y reactive su módulo bajo Dolibarr. Las entradas del menú deberían aparecer después de hacerlo (si la condición &#039;enabled&#039; está activada).&lt;br /&gt;
&lt;br /&gt;
== Definir sus propios permisos (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si quiere añadir nuevos permisos.&lt;br /&gt;
&lt;br /&gt;
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-&amp;gt;rights_class = &#039;facture&#039; para que diga:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $this-&amp;gt;rights_class = &#039;mimodulo&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A continuación, rellene la tabla $this-&amp;gt;rights con tantas entradas como permisos diferentes vaya a definir:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $this-&amp;gt;rights[$r][0] = 10001;&lt;br /&gt;
 $this-&amp;gt;rights[$r][1] = &#039;Texto por defecto de mi permiso&#039;;&lt;br /&gt;
 $this-&amp;gt;rights[$r][3] = 1;&lt;br /&gt;
 $this-&amp;gt;rights[$r][4] = &#039;accion&#039;;&lt;br /&gt;
 $this-&amp;gt;rights[$r][5] = &#039;subaccion&#039;;&lt;br /&gt;
 $r++;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En $this-&amp;gt;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ú &#039;&#039;&#039;Información del Sistema&#039;&#039;&#039; en una instalación de Dolibarr que esté funcionando. En $this-&amp;gt;rights[$r][3], introduzca 1 si este permiso se atribuye por defecto a los usuarios según son creados. En $this-&amp;gt;rights[$r][1] introduzca un texto por defecto -que será mostrado si no se encuentra traducción para su permiso en el archivo &#039;&#039;&#039;admin.lang&#039;&#039;&#039;). En $this-&amp;gt;rights[$r][4] y $this-&amp;gt;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:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 if ($user-&amp;gt;rights-&amp;gt;mimodulo-&amp;gt;accion-&amp;gt;subaccion) ...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Definir sus propios paneles (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si su módulo tiene uno o varios paneles.&lt;br /&gt;
&lt;br /&gt;
=== Defina sus paneles ===&lt;br /&gt;
Para ello, modifique las tablas $this-&amp;gt;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 &#039;&#039;&#039;htdocs/mimodulo/core/boxes&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Ejemplo:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;boxes[0][&#039;file&#039;]=&#039;mabox0.php@mimodulo&#039;&lt;br /&gt;
$this-&amp;gt;boxes[0][&#039;note&#039;]=&#039;Mi panel 0&#039;&lt;br /&gt;
 ...&lt;br /&gt;
$this-&amp;gt;boxes[n][&#039;file&#039;]=&#039;maboxn.php@mimodulo&#039;&lt;br /&gt;
$this-&amp;gt;boxes[n][&#039;note&#039;]=&#039;Mi panel n&#039;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A continuación cree los archivos &#039;&#039;&#039;htdocs/mimodulo/core/boxes/mabox0.php&#039;&#039;&#039;, &#039;&#039;&#039;htdocs/mimodulo/core/boxes/mabox1.php&#039;&#039;&#039;...  tomando como ejemplo los paneles existentes (en el directorio htdocs/core/boxes)&lt;br /&gt;
&lt;br /&gt;
=== Pruebe sus paneles en Dolibarr ===&lt;br /&gt;
Vaya al menú &#039;&#039;&#039;Inico – Configuración – Paneles&#039;&#039;&#039;. 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.&lt;br /&gt;
&lt;br /&gt;
== Definir sus propias exportaciones (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; 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)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Definir la exportación ===&lt;br /&gt;
Para ello, descomente y modifique las tablas $this-&amp;gt;export_xxx  de su archivo descriptor de módulo.&lt;br /&gt;
&lt;br /&gt;
=== Probar la exportación ===&lt;br /&gt;
Vaya al menú &amp;quot;Herramientas &amp;gt; Exportar&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Definir sus estilos CSS (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si en sus pantallas PHP utiliza clases de estilos distintas a las de los temas de Dolibarr (no recomendado).&lt;br /&gt;
&lt;br /&gt;
Esta funcionalidad todavía no es operativa en la versión 2.4., a pesar de estar ya descrita.&lt;br /&gt;
&lt;br /&gt;
=== Crear y declarar su hoja de estilos ===&lt;br /&gt;
Crear un archivo de estilos llamada &#039;&#039;&#039;mimodulo.css&#039;&#039;&#039; o &#039;&#039;&#039;mimodule.css.php&#039;&#039;&#039; y guardarla en el directorio &#039;&#039;&#039;&#039;&#039;mimodulo&#039;&#039;&#039;&#039;&#039; dentro de &#039;&#039;&#039;htdocs&#039;&#039;&#039;. Solo puede haber un archivo css propio a cada módulo.&lt;br /&gt;
Recordamos que es mejor usar los estilos ya existentes en Dolibarr (el archivo css usado por Dolibarr es el archivo &#039;&#039;&#039;themes/nomtheme/&#039;&#039;nombretema&#039;&#039;.css.php&#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
Una vez su hoja de estilos esté disponible, declárela en su archivo descriptor de módulo modificando la propiedad &#039;&#039;&#039;$this-&amp;gt;module_parts&#039;&#039;&#039;.&lt;br /&gt;
El valor a indicar debe ser la ruta URL relativa de su archivo css.&lt;br /&gt;
Por ejemplo&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;module_parts = array(&#039;css&#039; =&amp;gt; array(&#039;/mimodulo/css/mimodulo.css.php&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Probar su hoja de estilos ===&lt;br /&gt;
Desactivar y reactivar su módulo.&lt;br /&gt;
&lt;br /&gt;
Ir la página de inicio de Dolibarr. Ver el código de la página HTML.&lt;br /&gt;
&lt;br /&gt;
Debería ver en el encabezado HTML, una línea de declaración de su hoja de estilos.&lt;br /&gt;
&lt;br /&gt;
== Definir sus funciones Javascript (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuando&#039;&#039;&#039;: Si en sus pantallas en PHP utiliza funciones de Javascript no disponibles en estandard (archivo lib_head.js)&lt;br /&gt;
&lt;br /&gt;
Si en sus pantallas en PHP utiliza funciones javascript, es necesario asegurarse de que las funciones declaradas en un archivo javascript &#039;&#039;&#039;htdocs/mimodulo/js/monmodule.js&#039;&#039;&#039; sea cargado en la cabecera del head html.&lt;br /&gt;
&lt;br /&gt;
Para pedir a Dolibarr que gestione en la generación de la sección header la inclusión de uno de sus archivos javascript, es necesario proporcionar como parámetro a la función llxHeader(), al inicio de su página, la URL hacia el js a incluir.&lt;br /&gt;
&lt;br /&gt;
Ejemplo para la página /htdocs/mimodulo/mapage.php :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
require(&#039;../main.inc.php&#039;);&lt;br /&gt;
$morejs=array(&amp;quot;/mimomulo/js/monmodule.js&amp;quot;);&lt;br /&gt;
llxHeader(&#039;&#039;,&#039;Titulo&#039;,&#039;&#039;,&#039;&#039;,&#039;&#039;,&#039;&#039;,$morejs,&#039;&#039;,0,0); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ejecutar código sobre un evento Dolibarr (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; 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 &#039;&#039;&#039;disparador (triggers)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Véase también [[Interfaces Dolibarr hacia el exterior]] e [[Interfaces del Exterior hacia Dolibarr]]&lt;br /&gt;
&lt;br /&gt;
== Insertar su código usando los hooks de Dolibarr (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039;: Cuando desee cambiar o añadir otro tipo de código en un evento de negociado (véase lel capítulo anterior para esto).&lt;br /&gt;
&lt;br /&gt;
Véase la página [[El sistema Hooks]].&lt;br /&gt;
&lt;br /&gt;
== Añadir un módulo de numeración (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039;: Si quiere añadir una regla de numeración no cubierta por los módulos por defecto.&lt;br /&gt;
&lt;br /&gt;
Véase la página [[Crear un módulo de numeración]].&lt;br /&gt;
&lt;br /&gt;
== Añadir un nuevo módulo de documento (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039;: Si quiere añadir un nuevo modelo de documento.&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
== Añadir un tema (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039;: Si quiere un interface con colores personalizados.&lt;br /&gt;
&lt;br /&gt;
Véase la página [[Temas]].&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Algunas reglas de código =&lt;br /&gt;
Las reglas de código a seguir se definen en la [[Documentación Desarrolladores| Documentación para desarrolladores]], concretamente en la sección &amp;quot;Lenguaje&amp;quot; del capítulo de &amp;quot;Información General&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Utilización de MDA =&lt;br /&gt;
Un método para generar un módulo funcional desde UML se encuentra en curso de puesta a punto. Más información en la página [[UML2Dolibarr - Crear un módulo usando MDA]].&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Crear un paquete para liberar e instalar su módulo =&lt;br /&gt;
Este proceso debe ser usado para fabricar un paquete con el fin de enviarlo a la tienda oficial http://www.dolistore.com.&lt;br /&gt;
&lt;br /&gt;
También puede usarlo para distribuir fácilmente su módulo vía su propio método de distribución.&lt;br /&gt;
&lt;br /&gt;
* Vaya al directorio &#039;&#039;&#039;/build&#039;&#039;&#039; y copie el archivo &#039;&#039;&#039;makepack-dolibarrmodules.conf&#039;&#039;&#039; como &#039;&#039;&#039;makepack-mimodulo.conf&#039;&#039;&#039;. 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).&lt;br /&gt;
&lt;br /&gt;
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...)&lt;br /&gt;
* Lance el script vía Perl (necesita la versión 5.0. o superiores de Perl)&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 perl makepack-dolibarrmodule.pl&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El script le pide el nombre de su módulo, su versión mayor y menor. Se va a crear un fichero &#039;&#039;&#039;mimodulo.zip&#039;&#039;&#039;, que incluirá su módulo listo para ser liberado.&lt;br /&gt;
* La persona que reciba su módulo deberá ubicar el archivo en el directorio raíz de Dolibarr y ejecutar el comando:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 tar -xvf monmodule.zip&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 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 &amp;quot;Submit a product&amp;quot;).&lt;br /&gt;
** Si su módulo está correctamente realizado, será rápidamente validado.&lt;br /&gt;
** 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).&lt;/div&gt;</summary>
		<author><name>Nnicolashr</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Desarrollo_de_un_m%C3%B3dulo&amp;diff=35883</id>
		<title>Desarrollo de un módulo</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Desarrollo_de_un_m%C3%B3dulo&amp;diff=35883"/>
		<updated>2016-09-08T00:57:08Z</updated>

		<summary type="html">&lt;p&gt;Nnicolashr: /* Añadir o eliminar pestañas en las fichas entidad */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Básico]]&lt;br /&gt;
{{TemplateDocDesarrollo}}&lt;br /&gt;
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:&lt;br /&gt;
* Añadir nuevas tablas a la base de datos.&lt;br /&gt;
* Añadir sus propias entradas en los menús.&lt;br /&gt;
* Añadir pantallas de edición/consulta de nuevas tablas.&lt;br /&gt;
* Añadir o eliminar pestañas en las páginas de vista/edición de objetos (factura, producto, pedido, evento, etc.)&lt;br /&gt;
* Añadir exportaciones predefinidas a la función “Exportar”.&lt;br /&gt;
* Añadir variables de substitución&lt;br /&gt;
* Añadir nuevas cajas a la página de inicio.&lt;br /&gt;
* Definir nuevos permisos.&lt;br /&gt;
* Activar código automático sobre una acción particular de Dolibarr.&lt;br /&gt;
* Insertar nuestro código mediante los hooks de Dolibarr&lt;br /&gt;
* Añadir un módulo de numeración&lt;br /&gt;
* Añadir un modelo de documento&lt;br /&gt;
* Añadir un nuevo tema &lt;br /&gt;
&lt;br /&gt;
etc. Todas estas operaciones sólo están disponibles a partir de la versión 3.2 de Dolibarr.&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Crear un módulo =&lt;br /&gt;
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&lt;br /&gt;
&lt;br /&gt;
== [[File:Art.png]] Crear un descriptor de Módulo (obligatorio) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039;: Obligatorio cada vez que se desarrolla una extensión, cualquiera que sea su finalidad.&lt;br /&gt;
&lt;br /&gt;
=== Crear su descriptor ===&lt;br /&gt;
La primera fase es la de crear un fichero descriptor del módulo. Para ello:&lt;br /&gt;
* Crear el directorio &#039;&#039;&#039;/htdocs/&#039;&#039;mimodulo&#039;&#039;/core/modules&#039;&#039;&#039;. Seguidamente ir al directorio &#039;&#039;&#039;dev/skeletons&#039;&#039;&#039; y copiar el archivo modMyModule.class.php en el directorio &#039;&#039;&#039;htdocs/&#039;&#039;monmodule&#039;&#039;/core/modules&#039;&#039;&#039;.&lt;br /&gt;
A continuación, modificar el contenido del archivo, reemplazando:&lt;br /&gt;
* los &amp;quot;modMyModule&amp;quot; por un valor que corresponda a la finalidad de su módulo. Este valor debe siempre comenzar por mod. &lt;br /&gt;
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.&lt;br /&gt;
* $this-&amp;gt;numero = 100000 por un número de módulo que esté libre. Ver [[List of modules id|Listado de los id de módulos]]&lt;br /&gt;
* Modificar eventualmente otras variables definidas por los desarrolladores (ver el comentario en el código del esqueleto para ver su significado)&lt;br /&gt;
* Crear el directorio /htdocs/mimodulo/ &lt;br /&gt;
Ahora su fichero descriptor está configurado.&lt;br /&gt;
&lt;br /&gt;
=== Probar su descriptor ===&lt;br /&gt;
Ejecute Dolibarr y vaya a la página &amp;quot;Configuración &amp;gt; Módulo&amp;quot;. 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-&amp;gt;special el que determina en qué pestaña se encuentra su módulo.&lt;br /&gt;
&lt;br /&gt;
== [[File:Art.png]] Árbol de un nuevo módulo ==&lt;br /&gt;
Crear un directorio &#039;mimodulo&#039; que contendrá los archivos del módulo. Este directorio debe de estar en el directorio &#039;&#039;&#039;htdocs&#039;&#039;&#039; y contendrá los siguientes subdirectorios:&lt;br /&gt;
{{TemplateModuleTreeSimple}}&lt;br /&gt;
&lt;br /&gt;
== [[File:Art.png]] Crear sus tablas SQL y la clase PHP con los métodos de acceso (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si su módulo necesita gestionar sus propios datos.&lt;br /&gt;
&lt;br /&gt;
===Crear sus ficheros .sql===&lt;br /&gt;
Si su módulo de verdad requiere administrar datos que no existen en la base de datos en la versión estándar de Dolibarr, será necesario definir ciertas tablas SQL para registrar esos datos.&lt;br /&gt;
&lt;br /&gt;
Revisa que en el descriptor de archivo (mymodule/core/modules/mymodule.class.php) la línea&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;_load_tables(&#039;/mymodule/sql/&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
esté descomentada y correctamente configurada.&lt;br /&gt;
&lt;br /&gt;
Cree un subdirectorio sql en el directorio de su módulo (por ejemplo, htdocs/mimodulo/sql), con el fin de colocar los scripts sql que va a crear. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Regla a respetar:&#039;&#039; &lt;br /&gt;
* Agregue los archivos de orden de creación de sus tablas siguiendo el principio de un fichero &#039;&#039;&#039;llx_mitabla.sql&#039;&#039; por tabla, eventualmente acompañado del archivo &#039;&#039;&#039;llx_mitabla.key.sql&#039;&#039;&#039; (ver los archivos existentes en &#039;&#039;install/mysql/tables&#039;&#039;, para tomar ejemplo). &lt;br /&gt;
* En términos de orden de gestión de datos, todos deben estar en un archivo llamado &#039;&#039;&#039;data.sql&#039;&#039;&#039; situado en la misma carpeta &#039;&#039;&#039;/mimodulo/sql/&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Ejemplo de contenido de un fichero data.sql&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
 delete from llx_const where name=&#039;MYMODULE_IT_WORKS&#039; and entity=&#039;__ENTITY__&#039;;&lt;br /&gt;
 insert into llx_const (name, value, type, note, visible, entity) values (&#039;MYMODULE_IT_WORKS&#039;,&#039;1&#039;,&#039;chaine&#039;,&#039;A constant vor my module&#039;,1,&#039;__ENTITY__&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Las órdenes SQL de los archivos deben de ser operacionales para la base de datos &#039;&#039;&#039;mysql&#039;&#039;&#039;.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Probar su archivo .sql ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Generar la clase PHP de acceso (DAO) ===&lt;br /&gt;
Una vez que su/s tabla/s estén creadas en la base de datos, vaya al directorio &#039;&#039;&#039;dev/skeletons&#039;&#039;&#039;, copie el archivo &#039;&#039;&#039;build_class_from_table.php&#039;&#039;&#039; en la el directorio sql/ de su módulo module, y ejecute el script&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 php build_class_from_table.php nombretabla&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Nota: Si el comando no funciona, intente con php-cli en lugar de php.&lt;br /&gt;
&lt;br /&gt;
Esto genera un archivo &#039;&#039;&#039;out.nombretabla.class.php&#039;&#039;&#039; que contiene la clase de gestión de la tabla “nombretabla”. En esta clase se encuentran los métodos CRUD (Create/Read/Update/Delete) ya operativos para hacer un &#039;&#039;insert&#039;&#039;, un &#039;&#039;fetch&#039;&#039; (&#039;&#039;select&#039;&#039;), un &#039;&#039;update&#039;&#039;, y un &#039;&#039;delete&#039;&#039; de una línea de la tabla. Suprima justo el &amp;quot;out&amp;quot; del nombre del archivo y pógalo en un subdirectorio de &#039;&#039;&#039;htdocs&#039;&#039;&#039; propio en su módulo (Por ejemplo en &#039;&#039;&#039;htdocs/mimodulo&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Un archivo &#039;&#039;&#039;out.nombretabla_script.php&#039;&#039;&#039; se genera igualmente y contiene un ejemplo de código para utilizar la clase para cada uno de los cuatro métodos CRUD.&lt;br /&gt;
&lt;br /&gt;
== Visualización de pestañas (opcional) ==&lt;br /&gt;
&lt;br /&gt;
=== Añadir o eliminar pestañas en las fichas entidad ===&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039; : Para añadir su propia pestaña en las pestañas estándar de una ficha entidad (factura, pedido, presupuesto, miembro...)&lt;br /&gt;
&lt;br /&gt;
Para ello, vaya al archivo descriptor del módulo creado anteriormente y modifique la tabla $this-&amp;gt;tabs:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
	// Array to add new pages in new tabs or remove existing one&lt;br /&gt;
	$this-&amp;gt;tabs = array(&#039;objecttype:+tabname1:Title1:@mymodule:/mymodule/mynewtab1.php?id=__ID__&#039;,  // To add a new tab identified by code tabname1&lt;br /&gt;
                            &#039;objecttype:+tabname2:Title2:@mymodule:/mymodule/mynewtab2.php?id=__ID__&#039;,  // To add another new tab identified by code tabname2&lt;br /&gt;
                            &#039;objecttype:-tabname&#039;);                                                     // To remove an existing tab identified by code tabname&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La tabla debe contener una lista de cadena, cada cadena representa una nueva pestaña.&lt;br /&gt;
El formato de la cadena se compone de 4 partes separadas por &amp;quot;:&amp;quot;&lt;br /&gt;
* Parte 1: El código de la entidad (objecttype) en la que debe aparecer la pestaña siendo el valor de ella misma:&lt;br /&gt;
{{TemplateModuleTabs-es}}&lt;br /&gt;
* 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.&lt;br /&gt;
* 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&lt;br /&gt;
&lt;br /&gt;
* 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.&lt;br /&gt;
&lt;br /&gt;
Para alimentar el contenido de la pestaña con los datos de la base de datos, vea el capítulo siguiente.&lt;br /&gt;
&lt;br /&gt;
=== Añadir pestañas de una ficha entidad en su propia página ===&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039; : Para mostrar las pestañas estandard de ficha entidad (producto, tercero, etc.) en su propia pestaña de una entidad.&lt;br /&gt;
&lt;br /&gt;
Hay que hacer lo siguiente :&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Incluir los archivos que definen las funciones útiles dentro de sus archivos&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para cada ficha entidad, hay que incluir dos archivos con la instrucción&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;require_once($url_fichier) ;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aquí le mostramos la lista de estos archivos (DOL_DOCUMENT_ROOT correspond au dossier dolibarr/htdocs/) :&lt;br /&gt;
* Entidad tercero (thirdparty) :&lt;br /&gt;
** DOL_DOCUMENT_ROOT/societe.class.php&lt;br /&gt;
** DOL_DOCUMENT_ROOT/lib/company.lib.php&lt;br /&gt;
* Entidad producto (product) :&lt;br /&gt;
** DOL_DOCUMENT_ROOT/product.class.php&lt;br /&gt;
** DOL_DOCUMENT_ROOT/lib/product.lib.php&lt;br /&gt;
* Entidad factura (invoice) :&lt;br /&gt;
** DOL_DOCUMENT_ROOT/facture.class.php&lt;br /&gt;
** DOL_DOCUMENT_ROOT/lib/invoice.lib.php&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Crear y cargar el objeto a mostrar en su pestaña&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Crear el objeto de la clase deseada, y recuperar los datos del objeto a partir de la base de datos. Para ello deberá utilizar las funciones fetch() de la clase correspondiente, pasando el parámetro del indentificador del objeto que recupera desde la url (ej : /mononglet.php?id=1).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Ejemplo :&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$id=$_GET[&amp;quot;id&amp;quot;];&lt;br /&gt;
$product = new Product($db) ;&lt;br /&gt;
$result = $product-&amp;gt;fetch($id) ; //Tester $result pour vérifier que l&#039;accès à la base s&#039;est bien passé&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3. Recuperar la lista de pestañas correspondientes a la entidad seleccionada&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Usar la función XXX_prepare_head($obj), donde XXX es le nombre de la entidad, para crear una tabla que contiene las definiciones de las pestañas a mostrar. El parámetro a pasar es el objeto del que desea mostrar las pestañas.&lt;br /&gt;
&lt;br /&gt;
La tabla devuelta se compone de la siguiente manera :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$head        // Tableau des onglets&lt;br /&gt;
$head[$h]    // Élément décrivant un onglet. Il y aura autant de $h que d&#039;onglets à afficher&lt;br /&gt;
$head[$h][0] // Url de la page affichée quand on clique sur l&#039;onglet&lt;br /&gt;
$head[$h][1] // Titre de l&#039;ongLet&lt;br /&gt;
$head[$h][2] // Code de l&#039;onglet, à utiliser pour choisir quel onglet sera &#039;actif&#039; (voir paragraphe suivant)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Ejemplo :&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$head = product_prepare_head($product, $user) ; //le paramètre $user n&#039;est pas présent sur certaines fonctions&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4. Mostrar las pestañas en su pestaña&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Use la función dol_fiche_head() que muestra las pestañas contenidas en la tabla $head devuelta por XX_prepare_head().&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
dol_fiche_head($links, $active=&#039;0&#039;, $title=&#039;&#039;, $notab=0, $picto=&#039;&#039;)&lt;br /&gt;
$links  // Tableau des onglets, appelé $head plus haut.&lt;br /&gt;
$active // Onglet actif (mettre le nom de l&#039;onglet défini dans votre fichier de module, ou un nom contenu dans $head[$h][2]). Cet onglet sera mis en surbrillance&lt;br /&gt;
$title  // ?&lt;br /&gt;
$notab  // Mettre ce paramètre à 1 permet de ne pas afficher de zone bleue en dessous des onglets.&lt;br /&gt;
$picto  // Nom de l&#039;image à utiliser au début de la barre des onglet. Les choix suivant sont possibles :&lt;br /&gt;
//            product&lt;br /&gt;
//            service&lt;br /&gt;
//            company&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esta función muestra las pestañas deseadas y abre un elemento &#039;&#039;&amp;lt; div class=&amp;quot;&amp;quot; &amp;gt;&#039;&#039; 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 &#039;&#039;&amp;lt; /div &amp;gt;&#039;&#039; en el código PHP.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Nota&#039;&#039;:&lt;br /&gt;
Para más detalles, consulte la [http://www.dolibarr.fr/doxygen/ documentación Doxygen] o directamente el código de Dolibarr.&lt;br /&gt;
&lt;br /&gt;
== Crear sus páginas pantalla PHP (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si su módulo consiste en añadir funcionalidades que necesitan nuevas pantallas.&lt;br /&gt;
&lt;br /&gt;
=== Crear una página pantalla PHP ===&lt;br /&gt;
Debe crear a continuación pantallas PHP que se basen en los datos de sus tablas utilizando los esqueletos como ejemplo del directorio &#039;&#039;&#039;dev/skeletons&#039;&#039;&#039;. (Para el desarrollo de un script en línea de comandos, ver [[Desarrollo de scripts]]).&lt;br /&gt;
&lt;br /&gt;
Para crear una nueva página de usuario, cree un subdirectorio de &#039;&#039;&#039;htdocs&#039;&#039;&#039; (si es que no existe ya) propio en su módulo (En &#039;&#039;&#039;htdocs/mimodulo&#039;&#039;&#039;, por ejemplo), con el fin de ubicar en él las páginas que va a crear.&lt;br /&gt;
&lt;br /&gt;
Copie allí el archivo &#039;&#039;&#039;skeletons_page.php&#039;&#039;&#039;, que va a servir de punto de partida a su página. Modifique el archivo para que la ruta relativa de&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$res=0;&lt;br /&gt;
if (! $res &amp;amp;&amp;amp; file_exists(&amp;quot;../main.inc.php&amp;quot;)) $res=@include(&amp;quot;../main.inc.php&amp;quot;);			// to work if your module directory is into dolibarr root htdocs directory&lt;br /&gt;
if (! $res &amp;amp;&amp;amp; file_exists(&amp;quot;../../main.inc.php&amp;quot;)) $res=@include(&amp;quot;../../main.inc.php&amp;quot;);		// to work if your module directory is into a subdir of root htdocs directory&lt;br /&gt;
if (! $res) die(&amp;quot;Include of main fails&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
sea la correcta, en función de la profundidad del directorio en el que se encuentra el archivo (quitando o añadiendo &amp;quot;../&amp;quot;). Es en el &amp;quot;main&amp;quot; donde se carga el entorno técnico y las habilitaciones. Los objetos variables se posicionan ahora:&lt;br /&gt;
* $user – El objeto que contiene las características del usuario y sus derechos.&lt;br /&gt;
* $conf – El objeto que contiene la configuración de Dolibarr.&lt;br /&gt;
* $db – El objeto que contiene el gestor de conexión abierto a la base de datos.&lt;br /&gt;
* $langs – El objeto que contiene el idioma del usuario.&lt;br /&gt;
&lt;br /&gt;
* 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):&lt;br /&gt;
&#039;&#039;Exemple :&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
dol_include_once(&#039;/mimodulo/class/miclass.class.php&#039;, &#039;MiClass&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Las clases de llamadas Dolibarr utilice la siguiente sintaxis:&lt;br /&gt;
&#039;&#039;Exemple :&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
require_once DOL_DOCUMENT_ROOT.&#039;/core/class/doli.class.php&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Reemplazar partes de templates de pantalla (versión 3.3+) ===&lt;br /&gt;
Algunas partes de la pantalla de Dolibarr están aisladas en archivos de plantilla. Puede desarrollar un módulo para reemplazar una o más de estas plantillas con las suyas.&lt;br /&gt;
{{ToComplete}}&lt;br /&gt;
&lt;br /&gt;
=== Acceso a la base de datos ===&lt;br /&gt;
Si necesita realizar modificaciones en su tabla de la base de datos, utilice la clase generada más arriba.&lt;br /&gt;
&lt;br /&gt;
Si de todos modos quiere acceder a las tablas sin objeto PHP dedicado, esto es posible (por ejemplo para recuperar una lista de registros). En ese caso, piense en seguir estos ejemplos.&lt;br /&gt;
&lt;br /&gt;
Para un &#039;&#039;insert&#039;&#039;, &#039;&#039;update&#039;&#039; o &#039;&#039;delete&#039;&#039;:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $db-&amp;gt;begin();   // Debut transaction&lt;br /&gt;
 $db-&amp;gt;query(&amp;quot;Ma requete insert, update ou delete&amp;quot;);&lt;br /&gt;
 $db-&amp;gt;commit();       // Valide&lt;br /&gt;
 o $db-&amp;gt;rollback()  // Annule&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para una lectura:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $resql=$db-&amp;gt;query(&amp;quot;Ma requete select&amp;quot;);&lt;br /&gt;
 if ($resql)&lt;br /&gt;
 {&lt;br /&gt;
         $num = $db-&amp;gt;num_rows($resql);&lt;br /&gt;
         $i = 0;&lt;br /&gt;
         if ($num)&lt;br /&gt;
         {&lt;br /&gt;
                 while ($i &amp;lt; $num)&lt;br /&gt;
                 {&lt;br /&gt;
                         $obj = $db-&amp;gt;fetch_object($resql);&lt;br /&gt;
                         if ($obj)&lt;br /&gt;
                         {&lt;br /&gt;
                                 // You can use here results&lt;br /&gt;
                                 print $obj-&amp;gt;field1;&lt;br /&gt;
                                 print $obj-&amp;gt;field2;&lt;br /&gt;
                         }&lt;br /&gt;
                         $i++;&lt;br /&gt;
                 }&lt;br /&gt;
         }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Definición de estilos ===&lt;br /&gt;
Para que el aspecto de la página guarde coherencia con el tema Dolibarr, es necesario utilizar los estilos CSS de Dolibarr.&lt;br /&gt;
&lt;br /&gt;
Por ejemplo:&lt;br /&gt;
&lt;br /&gt;
* class=&amp;quot;liste_titre&amp;quot;1 en las etiquetas tr y td para una línea de título de tabla. &lt;br /&gt;
* class=”pair” o class=”impair” en las etiquetas tr y td de las líneas de datos de la tabla.&lt;br /&gt;
* class=”flat” en todos los campos en los que se teclea (input, select, textarea...)&lt;br /&gt;
* class=”button” en los objetos de tipo input type=”submit”.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Utilizar el selector de fechas de Dolibarr ===&lt;br /&gt;
Si quiere, puede beneficiarse del selector de fechas en las pantallas Dolibarr. Para ello, utilice la siguiente línea:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $form=new Form($db);&lt;br /&gt;
 $form-&amp;gt;select_date(&#039;&#039;,&#039;mykey&#039;,0,0,0,&amp;quot;myform&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La cadena &amp;quot;mikey&amp;quot; identifica el campo fecha. Hace falta introducir un valor diferente en caso de que haya varios campos. La cadena &amp;quot;myform&amp;quot; es el nombre del campo &amp;quot;FORM&amp;quot; (en el formulario, name=&amp;quot;myform&amp;quot; de la página html). La visualización de un selector de fecha debe por tanto estar integrada en un formulario html.&lt;br /&gt;
&lt;br /&gt;
Para recuperar el valor, a la herencia de POST, el comando es:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $mydate = dol_mktime(12, 0 , 0, $_POST[&#039;mykeymonth&#039;], $_POST[&#039;mykeyday&#039;], $_POST[&#039;mykeyyear&#039;]);&lt;br /&gt;
 print strftime(&#039;%A %d %B %Y&#039;, $mydate);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Definir su página de configuración (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si su módulo ofrece varias opciones parametrizables.&lt;br /&gt;
&lt;br /&gt;
=== Crear su página de edición de configuración ===&lt;br /&gt;
Si su módulo ofrece varias opciones parametrizacles, es necesario crear una página PHP para editar las opciones (que serán guardadas en la [[Table llx_const|tabla &#039;&#039;&#039;llx_const&#039;&#039;&#039;]]). Cree una página PHP llamada &#039;&#039;&#039;mimodulo_setuppage.php&#039;&#039;&#039;, que registre las opciones posibles y las ponga al día. Es necesario tomar como ejemplo una página de &#039;&#039;&#039;/admin&#039;&#039;&#039; 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 &#039;&#039;&#039;/admin&#039;&#039;&#039;. 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 &#039;&#039;&#039;/admin&#039;&#039;&#039;).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $this-&amp;gt;config_page_url = array(&amp;quot;monmodule_setupapage.php&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Probar su página ===&lt;br /&gt;
Vaya a la página &#039;&#039;&#039;Configuración &amp;gt; módulo&#039;&#039;&#039;. 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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Definir sus entradas de menú (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si ha creado páginas PHP, es necesario que estas pantallas sean accesibles desde el menú Dolibarr.&lt;br /&gt;
&lt;br /&gt;
=== Definir sus entradas de menú ===&lt;br /&gt;
Para ello, hace falta definir en el archivo descriptor de menú de tabla this-&amp;gt;menu, que declara los menús.&lt;br /&gt;
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&lt;br /&gt;
&lt;br /&gt;
He aquí un ejemplo de declaración de entradas de menú en el fichero descriptor:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Main menu entries&lt;br /&gt;
$this-&amp;gt;menu = array();			// List of menus to add&lt;br /&gt;
$r=0;&lt;br /&gt;
&lt;br /&gt;
// Add here entries to declare new menus&lt;br /&gt;
// Example to declare the Top Menu entry:&lt;br /&gt;
$this-&amp;gt;menu[$r]=array(	&#039;fk_menu&#039;=&amp;gt;0,			// Put 0 if this is a top menu&lt;br /&gt;
			&#039;type&#039;=&amp;gt;&#039;top&#039;,			// This is a Top menu entry&lt;br /&gt;
			&#039;titre&#039;=&amp;gt;&#039;MyModule top menu&#039;,&lt;br /&gt;
			&#039;mainmenu&#039;=&amp;gt;&#039;mymodule&#039;,&lt;br /&gt;
			&#039;leftmenu&#039;=&amp;gt;&#039;mymodule&#039;,&lt;br /&gt;
			&#039;url&#039;=&amp;gt;&#039;/mymodule/pagetop.php&#039;,&lt;br /&gt;
			&#039;langs&#039;=&amp;gt;&#039;mylangfile&#039;,	// Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory.&lt;br /&gt;
			&#039;position&#039;=&amp;gt;100,&lt;br /&gt;
			&#039;enabled&#039;=&amp;gt;&#039;1&#039;,			// Define condition to show or hide menu entry. Use &#039;$conf-&amp;gt;mymodule-&amp;gt;enabled&#039; if entry must be visible if module is enabled.&lt;br /&gt;
			&#039;perms&#039;=&amp;gt;&#039;1&#039;,			// Use &#039;perms&#039;=&amp;gt;&#039;$user-&amp;gt;rights-&amp;gt;mymodule-&amp;gt;level1-&amp;gt;level2&#039; if you want your menu with a permission rules&lt;br /&gt;
			&#039;target&#039;=&amp;gt;&#039;&#039;,&lt;br /&gt;
			&#039;user&#039;=&amp;gt;2);				// 0=Menu for internal users, 1=external users, 2=both&lt;br /&gt;
$r++;&lt;br /&gt;
&lt;br /&gt;
// Example to declare a Left Menu entry:&lt;br /&gt;
$this-&amp;gt;menu[$r]=array(	&#039;fk_menu&#039;=&amp;gt;&#039;fk_mainmenu=xxx&#039;,		    // Use &#039;fk_mainmenu=xxx&#039; or &#039;fk_mainmenu=xxx,fk_leftmenu=yyy&#039; where xxx is mainmenucode and yyy is a leftmenucode of parent menu&lt;br /&gt;
			&#039;type&#039;=&amp;gt;&#039;left&#039;,			        // This is a Left menu entry&lt;br /&gt;
			&#039;titre&#039;=&amp;gt;&#039;MyModule left menu 1&#039;,&lt;br /&gt;
			&#039;mainmenu&#039;=&amp;gt;&#039;xxx&#039;,&lt;br /&gt;
                        &#039;leftmenu&#039;=&amp;gt;&#039;yyy&#039;,&lt;br /&gt;
			&#039;url&#039;=&amp;gt;&#039;/mymodule/pagelevel1.php&#039;,&lt;br /&gt;
			&#039;langs&#039;=&amp;gt;&#039;mylangfile&#039;,	// Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory.&lt;br /&gt;
			&#039;position&#039;=&amp;gt;100,&lt;br /&gt;
			&#039;enabled&#039;=&amp;gt;&#039;1&#039;,			// Define condition to show or hide menu entry. Use &#039;$conf-&amp;gt;mymodule-&amp;gt;enabled&#039; if entry must be visible if module is enabled.&lt;br /&gt;
			&#039;perms&#039;=&amp;gt;&#039;1&#039;,			// Use &#039;perms&#039;=&amp;gt;&#039;$user-&amp;gt;rights-&amp;gt;mymodule-&amp;gt;level1-&amp;gt;level2&#039; if you want your menu with a permission rules&lt;br /&gt;
			&#039;target&#039;=&amp;gt;&#039;&#039;,&lt;br /&gt;
			&#039;user&#039;=&amp;gt;2);				// 0=Menu for internal users,1=external users, 2=both&lt;br /&gt;
$r++;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para condicionar el acceso al menú segun los permisos, modificar la propiedad &#039;&#039;&#039;perms&#039;&#039;&#039; de la tabla. Ver el capítulo sobre permisos, un poco más abajo, para saber como realizar los permisos.&lt;br /&gt;
&lt;br /&gt;
=== Probar sus entradas de menú ===&lt;br /&gt;
Desactive y reactive su módulo bajo Dolibarr. Las entradas del menú deberían aparecer después de hacerlo (si la condición &#039;enabled&#039; está activada).&lt;br /&gt;
&lt;br /&gt;
== Definir sus propios permisos (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si quiere añadir nuevos permisos.&lt;br /&gt;
&lt;br /&gt;
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-&amp;gt;rights_class = &#039;facture&#039; para que diga:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $this-&amp;gt;rights_class = &#039;mimodulo&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A continuación, rellene la tabla $this-&amp;gt;rights con tantas entradas como permisos diferentes vaya a definir:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $this-&amp;gt;rights[$r][0] = 10001;&lt;br /&gt;
 $this-&amp;gt;rights[$r][1] = &#039;Texto por defecto de mi permiso&#039;;&lt;br /&gt;
 $this-&amp;gt;rights[$r][3] = 1;&lt;br /&gt;
 $this-&amp;gt;rights[$r][4] = &#039;accion&#039;;&lt;br /&gt;
 $this-&amp;gt;rights[$r][5] = &#039;subaccion&#039;;&lt;br /&gt;
 $r++;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En $this-&amp;gt;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ú &#039;&#039;&#039;Información del Sistema&#039;&#039;&#039; en una instalación de Dolibarr que esté funcionando. En $this-&amp;gt;rights[$r][3], introduzca 1 si este permiso se atribuye por defecto a los usuarios según son creados. En $this-&amp;gt;rights[$r][1] introduzca un texto por defecto -que será mostrado si no se encuentra traducción para su permiso en el archivo &#039;&#039;&#039;admin.lang&#039;&#039;&#039;). En $this-&amp;gt;rights[$r][4] y $this-&amp;gt;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:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 if ($user-&amp;gt;rights-&amp;gt;mimodulo-&amp;gt;accion-&amp;gt;subaccion) ...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Definir sus propios paneles (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si su módulo tiene uno o varios paneles.&lt;br /&gt;
&lt;br /&gt;
=== Defina sus paneles ===&lt;br /&gt;
Para ello, modifique las tablas $this-&amp;gt;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 &#039;&#039;&#039;htdocs/mimodulo/core/boxes&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Ejemplo:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;boxes[0][&#039;file&#039;]=&#039;mabox0.php@mimodulo&#039;&lt;br /&gt;
$this-&amp;gt;boxes[0][&#039;note&#039;]=&#039;Mi panel 0&#039;&lt;br /&gt;
 ...&lt;br /&gt;
$this-&amp;gt;boxes[n][&#039;file&#039;]=&#039;maboxn.php@mimodulo&#039;&lt;br /&gt;
$this-&amp;gt;boxes[n][&#039;note&#039;]=&#039;Mi panel n&#039;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A continuación cree los archivos &#039;&#039;&#039;htdocs/mimodulo/core/boxes/mabox0.php&#039;&#039;&#039;, &#039;&#039;&#039;htdocs/mimodulo/core/boxes/mabox1.php&#039;&#039;&#039;...  tomando como ejemplo los paneles existentes (en el directorio htdocs/core/boxes)&lt;br /&gt;
&lt;br /&gt;
=== Pruebe sus paneles en Dolibarr ===&lt;br /&gt;
Vaya al menú &#039;&#039;&#039;Inico – Configuración – Paneles&#039;&#039;&#039;. 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.&lt;br /&gt;
&lt;br /&gt;
== Definir sus propias exportaciones (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; 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)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Definir la exportación ===&lt;br /&gt;
Para ello, descomente y modifique las tablas $this-&amp;gt;export_xxx  de su archivo descriptor de módulo.&lt;br /&gt;
&lt;br /&gt;
=== Probar la exportación ===&lt;br /&gt;
Vaya al menú &amp;quot;Herramientas &amp;gt; Exportar&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Definir sus estilos CSS (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si en sus pantallas PHP utiliza clases de estilos distintas a las de los temas de Dolibarr (no recomendado).&lt;br /&gt;
&lt;br /&gt;
Esta funcionalidad todavía no es operativa en la versión 2.4., a pesar de estar ya descrita.&lt;br /&gt;
&lt;br /&gt;
=== Crear y declarar su hoja de estilos ===&lt;br /&gt;
Crear un archivo de estilos llamada &#039;&#039;&#039;mimodulo.css&#039;&#039;&#039; o &#039;&#039;&#039;mimodule.css.php&#039;&#039;&#039; y guardarla en el directorio &#039;&#039;&#039;&#039;&#039;mimodulo&#039;&#039;&#039;&#039;&#039; dentro de &#039;&#039;&#039;htdocs&#039;&#039;&#039;. Solo puede haber un archivo css propio a cada módulo.&lt;br /&gt;
Recordamos que es mejor usar los estilos ya existentes en Dolibarr (el archivo css usado por Dolibarr es el archivo &#039;&#039;&#039;themes/nomtheme/&#039;&#039;nombretema&#039;&#039;.css.php&#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
Una vez su hoja de estilos esté disponible, declárela en su archivo descriptor de módulo modificando la propiedad &#039;&#039;&#039;$this-&amp;gt;module_parts&#039;&#039;&#039;.&lt;br /&gt;
El valor a indicar debe ser la ruta URL relativa de su archivo css.&lt;br /&gt;
Por ejemplo&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;module_parts = array(&#039;css&#039; =&amp;gt; array(&#039;/mimodulo/css/mimodulo.css.php&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Probar su hoja de estilos ===&lt;br /&gt;
Desactivar y reactivar su módulo.&lt;br /&gt;
&lt;br /&gt;
Ir la página de inicio de Dolibarr. Ver el código de la página HTML.&lt;br /&gt;
&lt;br /&gt;
Debería ver en el encabezado HTML, una línea de declaración de su hoja de estilos.&lt;br /&gt;
&lt;br /&gt;
== Definir sus funciones Javascript (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuando&#039;&#039;&#039;: Si en sus pantallas en PHP utiliza funciones de Javascript no disponibles en estandard (archivo lib_head.js)&lt;br /&gt;
&lt;br /&gt;
Si en sus pantallas en PHP utiliza funciones javascript, es necesario asegurarse de que las funciones declaradas en un archivo javascript &#039;&#039;&#039;htdocs/mimodulo/js/monmodule.js&#039;&#039;&#039; sea cargado en la cabecera del head html.&lt;br /&gt;
&lt;br /&gt;
Para pedir a Dolibarr que gestione en la generación de la sección header la inclusión de uno de sus archivos javascript, es necesario proporcionar como parámetro a la función llxHeader(), al inicio de su página, la URL hacia el js a incluir.&lt;br /&gt;
&lt;br /&gt;
Ejemplo para la página /htdocs/mimodulo/mapage.php :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
require(&#039;../main.inc.php&#039;);&lt;br /&gt;
$morejs=array(&amp;quot;/mimomulo/js/monmodule.js&amp;quot;);&lt;br /&gt;
llxHeader(&#039;&#039;,&#039;Titulo&#039;,&#039;&#039;,&#039;&#039;,&#039;&#039;,&#039;&#039;,$morejs,&#039;&#039;,0,0); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ejecutar código sobre un evento Dolibarr (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; 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 &#039;&#039;&#039;disparador (triggers)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Véase también [[Interfaces Dolibarr hacia el exterior]] e [[Interfaces del Exterior hacia Dolibarr]]&lt;br /&gt;
&lt;br /&gt;
== Insertar su código usando los hooks de Dolibarr (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039;: Cuando desee cambiar o añadir otro tipo de código en un evento de negociado (véase lel capítulo anterior para esto).&lt;br /&gt;
&lt;br /&gt;
Véase la página [[El sistema Hooks]].&lt;br /&gt;
&lt;br /&gt;
== Añadir un módulo de numeración (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039;: Si quiere añadir una regla de numeración no cubierta por los módulos por defecto.&lt;br /&gt;
&lt;br /&gt;
Véase la página [[Crear un módulo de numeración]].&lt;br /&gt;
&lt;br /&gt;
== Añadir un nuevo módulo de documento (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039;: Si quiere añadir un nuevo modelo de documento.&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
== Añadir un tema (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039;: Si quiere un interface con colores personalizados.&lt;br /&gt;
&lt;br /&gt;
Véase la página [[Temas]].&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Algunas reglas de código =&lt;br /&gt;
Las reglas de código a seguir se definen en la [[Documentación Desarrolladores| Documentación para desarrolladores]], concretamente en la sección &amp;quot;Lenguaje&amp;quot; del capítulo de &amp;quot;Información General&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Utilización de MDA =&lt;br /&gt;
Un método para generar un módulo funcional desde UML se encuentra en curso de puesta a punto. Más información en la página [[UML2Dolibarr - Crear un módulo usando MDA]].&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Crear un paquete para liberar e instalar su módulo =&lt;br /&gt;
Este proceso debe ser usado para fabricar un paquete con el fin de enviarlo a la tienda oficial http://www.dolistore.com.&lt;br /&gt;
&lt;br /&gt;
También puede usarlo para distribuir fácilmente su módulo vía su propio método de distribución.&lt;br /&gt;
&lt;br /&gt;
* Vaya al directorio &#039;&#039;&#039;/build&#039;&#039;&#039; y copie el archivo &#039;&#039;&#039;makepack-dolibarrmodules.conf&#039;&#039;&#039; como &#039;&#039;&#039;makepack-mimodulo.conf&#039;&#039;&#039;. 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).&lt;br /&gt;
&lt;br /&gt;
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...)&lt;br /&gt;
* Lance el script vía Perl (necesita la versión 5.0. o superiores de Perl)&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 perl makepack-dolibarrmodule.pl&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El script le pide el nombre de su módulo, su versión mayor y menor. Se va a crear un fichero &#039;&#039;&#039;mimodulo.zip&#039;&#039;&#039;, que incluirá su módulo listo para ser liberado.&lt;br /&gt;
* La persona que reciba su módulo deberá ubicar el archivo en el directorio raíz de Dolibarr y ejecutar el comando:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 tar -xvf monmodule.zip&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 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 &amp;quot;Submit a product&amp;quot;).&lt;br /&gt;
** Si su módulo está correctamente realizado, será rápidamente validado.&lt;br /&gt;
** 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).&lt;/div&gt;</summary>
		<author><name>Nnicolashr</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Desarrollo_de_un_m%C3%B3dulo&amp;diff=35882</id>
		<title>Desarrollo de un módulo</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Desarrollo_de_un_m%C3%B3dulo&amp;diff=35882"/>
		<updated>2016-09-08T00:48:35Z</updated>

		<summary type="html">&lt;p&gt;Nnicolashr: /* Visualización de pestañas pestañas (opcional) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Básico]]&lt;br /&gt;
{{TemplateDocDesarrollo}}&lt;br /&gt;
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:&lt;br /&gt;
* Añadir nuevas tablas a la base de datos.&lt;br /&gt;
* Añadir sus propias entradas en los menús.&lt;br /&gt;
* Añadir pantallas de edición/consulta de nuevas tablas.&lt;br /&gt;
* Añadir o eliminar pestañas en las páginas de vista/edición de objetos (factura, producto, pedido, evento, etc.)&lt;br /&gt;
* Añadir exportaciones predefinidas a la función “Exportar”.&lt;br /&gt;
* Añadir variables de substitución&lt;br /&gt;
* Añadir nuevas cajas a la página de inicio.&lt;br /&gt;
* Definir nuevos permisos.&lt;br /&gt;
* Activar código automático sobre una acción particular de Dolibarr.&lt;br /&gt;
* Insertar nuestro código mediante los hooks de Dolibarr&lt;br /&gt;
* Añadir un módulo de numeración&lt;br /&gt;
* Añadir un modelo de documento&lt;br /&gt;
* Añadir un nuevo tema &lt;br /&gt;
&lt;br /&gt;
etc. Todas estas operaciones sólo están disponibles a partir de la versión 3.2 de Dolibarr.&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Crear un módulo =&lt;br /&gt;
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&lt;br /&gt;
&lt;br /&gt;
== [[File:Art.png]] Crear un descriptor de Módulo (obligatorio) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039;: Obligatorio cada vez que se desarrolla una extensión, cualquiera que sea su finalidad.&lt;br /&gt;
&lt;br /&gt;
=== Crear su descriptor ===&lt;br /&gt;
La primera fase es la de crear un fichero descriptor del módulo. Para ello:&lt;br /&gt;
* Crear el directorio &#039;&#039;&#039;/htdocs/&#039;&#039;mimodulo&#039;&#039;/core/modules&#039;&#039;&#039;. Seguidamente ir al directorio &#039;&#039;&#039;dev/skeletons&#039;&#039;&#039; y copiar el archivo modMyModule.class.php en el directorio &#039;&#039;&#039;htdocs/&#039;&#039;monmodule&#039;&#039;/core/modules&#039;&#039;&#039;.&lt;br /&gt;
A continuación, modificar el contenido del archivo, reemplazando:&lt;br /&gt;
* los &amp;quot;modMyModule&amp;quot; por un valor que corresponda a la finalidad de su módulo. Este valor debe siempre comenzar por mod. &lt;br /&gt;
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.&lt;br /&gt;
* $this-&amp;gt;numero = 100000 por un número de módulo que esté libre. Ver [[List of modules id|Listado de los id de módulos]]&lt;br /&gt;
* Modificar eventualmente otras variables definidas por los desarrolladores (ver el comentario en el código del esqueleto para ver su significado)&lt;br /&gt;
* Crear el directorio /htdocs/mimodulo/ &lt;br /&gt;
Ahora su fichero descriptor está configurado.&lt;br /&gt;
&lt;br /&gt;
=== Probar su descriptor ===&lt;br /&gt;
Ejecute Dolibarr y vaya a la página &amp;quot;Configuración &amp;gt; Módulo&amp;quot;. 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-&amp;gt;special el que determina en qué pestaña se encuentra su módulo.&lt;br /&gt;
&lt;br /&gt;
== [[File:Art.png]] Árbol de un nuevo módulo ==&lt;br /&gt;
Crear un directorio &#039;mimodulo&#039; que contendrá los archivos del módulo. Este directorio debe de estar en el directorio &#039;&#039;&#039;htdocs&#039;&#039;&#039; y contendrá los siguientes subdirectorios:&lt;br /&gt;
{{TemplateModuleTreeSimple}}&lt;br /&gt;
&lt;br /&gt;
== [[File:Art.png]] Crear sus tablas SQL y la clase PHP con los métodos de acceso (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si su módulo necesita gestionar sus propios datos.&lt;br /&gt;
&lt;br /&gt;
===Crear sus ficheros .sql===&lt;br /&gt;
Si su módulo de verdad requiere administrar datos que no existen en la base de datos en la versión estándar de Dolibarr, será necesario definir ciertas tablas SQL para registrar esos datos.&lt;br /&gt;
&lt;br /&gt;
Revisa que en el descriptor de archivo (mymodule/core/modules/mymodule.class.php) la línea&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;_load_tables(&#039;/mymodule/sql/&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
esté descomentada y correctamente configurada.&lt;br /&gt;
&lt;br /&gt;
Cree un subdirectorio sql en el directorio de su módulo (por ejemplo, htdocs/mimodulo/sql), con el fin de colocar los scripts sql que va a crear. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Regla a respetar:&#039;&#039; &lt;br /&gt;
* Agregue los archivos de orden de creación de sus tablas siguiendo el principio de un fichero &#039;&#039;&#039;llx_mitabla.sql&#039;&#039; por tabla, eventualmente acompañado del archivo &#039;&#039;&#039;llx_mitabla.key.sql&#039;&#039;&#039; (ver los archivos existentes en &#039;&#039;install/mysql/tables&#039;&#039;, para tomar ejemplo). &lt;br /&gt;
* En términos de orden de gestión de datos, todos deben estar en un archivo llamado &#039;&#039;&#039;data.sql&#039;&#039;&#039; situado en la misma carpeta &#039;&#039;&#039;/mimodulo/sql/&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Ejemplo de contenido de un fichero data.sql&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
 delete from llx_const where name=&#039;MYMODULE_IT_WORKS&#039; and entity=&#039;__ENTITY__&#039;;&lt;br /&gt;
 insert into llx_const (name, value, type, note, visible, entity) values (&#039;MYMODULE_IT_WORKS&#039;,&#039;1&#039;,&#039;chaine&#039;,&#039;A constant vor my module&#039;,1,&#039;__ENTITY__&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Las órdenes SQL de los archivos deben de ser operacionales para la base de datos &#039;&#039;&#039;mysql&#039;&#039;&#039;.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Probar su archivo .sql ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Generar la clase PHP de acceso (DAO) ===&lt;br /&gt;
Una vez que su/s tabla/s estén creadas en la base de datos, vaya al directorio &#039;&#039;&#039;dev/skeletons&#039;&#039;&#039;, copie el archivo &#039;&#039;&#039;build_class_from_table.php&#039;&#039;&#039; en la el directorio sql/ de su módulo module, y ejecute el script&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 php build_class_from_table.php nombretabla&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Nota: Si el comando no funciona, intente con php-cli en lugar de php.&lt;br /&gt;
&lt;br /&gt;
Esto genera un archivo &#039;&#039;&#039;out.nombretabla.class.php&#039;&#039;&#039; que contiene la clase de gestión de la tabla “nombretabla”. En esta clase se encuentran los métodos CRUD (Create/Read/Update/Delete) ya operativos para hacer un &#039;&#039;insert&#039;&#039;, un &#039;&#039;fetch&#039;&#039; (&#039;&#039;select&#039;&#039;), un &#039;&#039;update&#039;&#039;, y un &#039;&#039;delete&#039;&#039; de una línea de la tabla. Suprima justo el &amp;quot;out&amp;quot; del nombre del archivo y pógalo en un subdirectorio de &#039;&#039;&#039;htdocs&#039;&#039;&#039; propio en su módulo (Por ejemplo en &#039;&#039;&#039;htdocs/mimodulo&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Un archivo &#039;&#039;&#039;out.nombretabla_script.php&#039;&#039;&#039; se genera igualmente y contiene un ejemplo de código para utilizar la clase para cada uno de los cuatro métodos CRUD.&lt;br /&gt;
&lt;br /&gt;
== Visualización de pestañas (opcional) ==&lt;br /&gt;
&lt;br /&gt;
=== Añadir o eliminar pestañas en las fichas entidad ===&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039; : Para añadir su propia pestaña en las pestañas estandard de una ficha entidad (factura, pedido, presupuesto, miembro...)&lt;br /&gt;
&lt;br /&gt;
Para ello, vaya al archivo descriptor del módulo creado anteriormente y modifique la tabla $this-&amp;gt;tabs:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
	// Array to add new pages in new tabs or remove existing one&lt;br /&gt;
	$this-&amp;gt;tabs = array(&#039;objecttype:+tabname1:Title1:@mymodule:/mymodule/mynewtab1.php?id=__ID__&#039;,  // To add a new tab identified by code tabname1&lt;br /&gt;
                            &#039;objecttype:+tabname2:Title2:@mymodule:/mymodule/mynewtab2.php?id=__ID__&#039;,  // To add another new tab identified by code tabname2&lt;br /&gt;
                            &#039;objecttype:-tabname&#039;);                                                     // To remove an existing tab identified by code tabname&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La tabla debe contener una lista de cadena, cada cadena representa una nueva pestaña.&lt;br /&gt;
El formato de la cadena se compone de 4 partes separadas por &amp;quot;:&amp;quot;&lt;br /&gt;
* Parte 1: El código de la entidad (objecttype) en la que debe aparecer la pestaña siendo el valor de ella misma:&lt;br /&gt;
{{TemplateModuleTabs-es}}&lt;br /&gt;
* 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.&lt;br /&gt;
* 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&lt;br /&gt;
&lt;br /&gt;
* 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.&lt;br /&gt;
&lt;br /&gt;
Para alimentar el contenido de la pestaña con los datos de la base de datos, vea el capítulo siguiente.&lt;br /&gt;
&lt;br /&gt;
=== Añadir pestañas de una ficha entidad en su propia página ===&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039; : Para mostrar las pestañas estandard de ficha entidad (producto, tercero, etc.) en su propia pestaña de una entidad.&lt;br /&gt;
&lt;br /&gt;
Hay que hacer lo siguiente :&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Incluir los archivos que definen las funciones útiles dentro de sus archivos&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para cada ficha entidad, hay que incluir dos archivos con la instrucción&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;require_once($url_fichier) ;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aquí le mostramos la lista de estos archivos (DOL_DOCUMENT_ROOT correspond au dossier dolibarr/htdocs/) :&lt;br /&gt;
* Entidad tercero (thirdparty) :&lt;br /&gt;
** DOL_DOCUMENT_ROOT/societe.class.php&lt;br /&gt;
** DOL_DOCUMENT_ROOT/lib/company.lib.php&lt;br /&gt;
* Entidad producto (product) :&lt;br /&gt;
** DOL_DOCUMENT_ROOT/product.class.php&lt;br /&gt;
** DOL_DOCUMENT_ROOT/lib/product.lib.php&lt;br /&gt;
* Entidad factura (invoice) :&lt;br /&gt;
** DOL_DOCUMENT_ROOT/facture.class.php&lt;br /&gt;
** DOL_DOCUMENT_ROOT/lib/invoice.lib.php&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Crear y cargar el objeto a mostrar en su pestaña&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Crear el objeto de la clase deseada, y recuperar los datos del objeto a partir de la base de datos. Para ello deberá utilizar las funciones fetch() de la clase correspondiente, pasando el parámetro del indentificador del objeto que recupera desde la url (ej : /mononglet.php?id=1).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Ejemplo :&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$id=$_GET[&amp;quot;id&amp;quot;];&lt;br /&gt;
$product = new Product($db) ;&lt;br /&gt;
$result = $product-&amp;gt;fetch($id) ; //Tester $result pour vérifier que l&#039;accès à la base s&#039;est bien passé&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3. Recuperar la lista de pestañas correspondientes a la entidad seleccionada&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Usar la función XXX_prepare_head($obj), donde XXX es le nombre de la entidad, para crear una tabla que contiene las definiciones de las pestañas a mostrar. El parámetro a pasar es el objeto del que desea mostrar las pestañas.&lt;br /&gt;
&lt;br /&gt;
La tabla devuelta se compone de la siguiente manera :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$head        // Tableau des onglets&lt;br /&gt;
$head[$h]    // Élément décrivant un onglet. Il y aura autant de $h que d&#039;onglets à afficher&lt;br /&gt;
$head[$h][0] // Url de la page affichée quand on clique sur l&#039;onglet&lt;br /&gt;
$head[$h][1] // Titre de l&#039;ongLet&lt;br /&gt;
$head[$h][2] // Code de l&#039;onglet, à utiliser pour choisir quel onglet sera &#039;actif&#039; (voir paragraphe suivant)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Ejemplo :&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$head = product_prepare_head($product, $user) ; //le paramètre $user n&#039;est pas présent sur certaines fonctions&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4. Mostrar las pestañas en su pestaña&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Use la función dol_fiche_head() que muestra las pestañas contenidas en la tabla $head devuelta por XX_prepare_head().&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
dol_fiche_head($links, $active=&#039;0&#039;, $title=&#039;&#039;, $notab=0, $picto=&#039;&#039;)&lt;br /&gt;
$links  // Tableau des onglets, appelé $head plus haut.&lt;br /&gt;
$active // Onglet actif (mettre le nom de l&#039;onglet défini dans votre fichier de module, ou un nom contenu dans $head[$h][2]). Cet onglet sera mis en surbrillance&lt;br /&gt;
$title  // ?&lt;br /&gt;
$notab  // Mettre ce paramètre à 1 permet de ne pas afficher de zone bleue en dessous des onglets.&lt;br /&gt;
$picto  // Nom de l&#039;image à utiliser au début de la barre des onglet. Les choix suivant sont possibles :&lt;br /&gt;
//            product&lt;br /&gt;
//            service&lt;br /&gt;
//            company&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esta función muestra las pestañas deseadas y abre un elemento &#039;&#039;&amp;lt; div class=&amp;quot;&amp;quot; &amp;gt;&#039;&#039; 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 &#039;&#039;&amp;lt; /div &amp;gt;&#039;&#039; en el código PHP.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Nota&#039;&#039;:&lt;br /&gt;
Para más detalles, consulte la [http://www.dolibarr.fr/doxygen/ documentación Doxygen] o directamente el código de Dolibarr.&lt;br /&gt;
&lt;br /&gt;
== Crear sus páginas pantalla PHP (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si su módulo consiste en añadir funcionalidades que necesitan nuevas pantallas.&lt;br /&gt;
&lt;br /&gt;
=== Crear una página pantalla PHP ===&lt;br /&gt;
Debe crear a continuación pantallas PHP que se basen en los datos de sus tablas utilizando los esqueletos como ejemplo del directorio &#039;&#039;&#039;dev/skeletons&#039;&#039;&#039;. (Para el desarrollo de un script en línea de comandos, ver [[Desarrollo de scripts]]).&lt;br /&gt;
&lt;br /&gt;
Para crear una nueva página de usuario, cree un subdirectorio de &#039;&#039;&#039;htdocs&#039;&#039;&#039; (si es que no existe ya) propio en su módulo (En &#039;&#039;&#039;htdocs/mimodulo&#039;&#039;&#039;, por ejemplo), con el fin de ubicar en él las páginas que va a crear.&lt;br /&gt;
&lt;br /&gt;
Copie allí el archivo &#039;&#039;&#039;skeletons_page.php&#039;&#039;&#039;, que va a servir de punto de partida a su página. Modifique el archivo para que la ruta relativa de&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$res=0;&lt;br /&gt;
if (! $res &amp;amp;&amp;amp; file_exists(&amp;quot;../main.inc.php&amp;quot;)) $res=@include(&amp;quot;../main.inc.php&amp;quot;);			// to work if your module directory is into dolibarr root htdocs directory&lt;br /&gt;
if (! $res &amp;amp;&amp;amp; file_exists(&amp;quot;../../main.inc.php&amp;quot;)) $res=@include(&amp;quot;../../main.inc.php&amp;quot;);		// to work if your module directory is into a subdir of root htdocs directory&lt;br /&gt;
if (! $res) die(&amp;quot;Include of main fails&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
sea la correcta, en función de la profundidad del directorio en el que se encuentra el archivo (quitando o añadiendo &amp;quot;../&amp;quot;). Es en el &amp;quot;main&amp;quot; donde se carga el entorno técnico y las habilitaciones. Los objetos variables se posicionan ahora:&lt;br /&gt;
* $user – El objeto que contiene las características del usuario y sus derechos.&lt;br /&gt;
* $conf – El objeto que contiene la configuración de Dolibarr.&lt;br /&gt;
* $db – El objeto que contiene el gestor de conexión abierto a la base de datos.&lt;br /&gt;
* $langs – El objeto que contiene el idioma del usuario.&lt;br /&gt;
&lt;br /&gt;
* 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):&lt;br /&gt;
&#039;&#039;Exemple :&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
dol_include_once(&#039;/mimodulo/class/miclass.class.php&#039;, &#039;MiClass&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Las clases de llamadas Dolibarr utilice la siguiente sintaxis:&lt;br /&gt;
&#039;&#039;Exemple :&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
require_once DOL_DOCUMENT_ROOT.&#039;/core/class/doli.class.php&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Reemplazar partes de templates de pantalla (versión 3.3+) ===&lt;br /&gt;
Algunas partes de la pantalla de Dolibarr están aisladas en archivos de plantilla. Puede desarrollar un módulo para reemplazar una o más de estas plantillas con las suyas.&lt;br /&gt;
{{ToComplete}}&lt;br /&gt;
&lt;br /&gt;
=== Acceso a la base de datos ===&lt;br /&gt;
Si necesita realizar modificaciones en su tabla de la base de datos, utilice la clase generada más arriba.&lt;br /&gt;
&lt;br /&gt;
Si de todos modos quiere acceder a las tablas sin objeto PHP dedicado, esto es posible (por ejemplo para recuperar una lista de registros). En ese caso, piense en seguir estos ejemplos.&lt;br /&gt;
&lt;br /&gt;
Para un &#039;&#039;insert&#039;&#039;, &#039;&#039;update&#039;&#039; o &#039;&#039;delete&#039;&#039;:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $db-&amp;gt;begin();   // Debut transaction&lt;br /&gt;
 $db-&amp;gt;query(&amp;quot;Ma requete insert, update ou delete&amp;quot;);&lt;br /&gt;
 $db-&amp;gt;commit();       // Valide&lt;br /&gt;
 o $db-&amp;gt;rollback()  // Annule&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para una lectura:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $resql=$db-&amp;gt;query(&amp;quot;Ma requete select&amp;quot;);&lt;br /&gt;
 if ($resql)&lt;br /&gt;
 {&lt;br /&gt;
         $num = $db-&amp;gt;num_rows($resql);&lt;br /&gt;
         $i = 0;&lt;br /&gt;
         if ($num)&lt;br /&gt;
         {&lt;br /&gt;
                 while ($i &amp;lt; $num)&lt;br /&gt;
                 {&lt;br /&gt;
                         $obj = $db-&amp;gt;fetch_object($resql);&lt;br /&gt;
                         if ($obj)&lt;br /&gt;
                         {&lt;br /&gt;
                                 // You can use here results&lt;br /&gt;
                                 print $obj-&amp;gt;field1;&lt;br /&gt;
                                 print $obj-&amp;gt;field2;&lt;br /&gt;
                         }&lt;br /&gt;
                         $i++;&lt;br /&gt;
                 }&lt;br /&gt;
         }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Definición de estilos ===&lt;br /&gt;
Para que el aspecto de la página guarde coherencia con el tema Dolibarr, es necesario utilizar los estilos CSS de Dolibarr.&lt;br /&gt;
&lt;br /&gt;
Por ejemplo:&lt;br /&gt;
&lt;br /&gt;
* class=&amp;quot;liste_titre&amp;quot;1 en las etiquetas tr y td para una línea de título de tabla. &lt;br /&gt;
* class=”pair” o class=”impair” en las etiquetas tr y td de las líneas de datos de la tabla.&lt;br /&gt;
* class=”flat” en todos los campos en los que se teclea (input, select, textarea...)&lt;br /&gt;
* class=”button” en los objetos de tipo input type=”submit”.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Utilizar el selector de fechas de Dolibarr ===&lt;br /&gt;
Si quiere, puede beneficiarse del selector de fechas en las pantallas Dolibarr. Para ello, utilice la siguiente línea:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $form=new Form($db);&lt;br /&gt;
 $form-&amp;gt;select_date(&#039;&#039;,&#039;mykey&#039;,0,0,0,&amp;quot;myform&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La cadena &amp;quot;mikey&amp;quot; identifica el campo fecha. Hace falta introducir un valor diferente en caso de que haya varios campos. La cadena &amp;quot;myform&amp;quot; es el nombre del campo &amp;quot;FORM&amp;quot; (en el formulario, name=&amp;quot;myform&amp;quot; de la página html). La visualización de un selector de fecha debe por tanto estar integrada en un formulario html.&lt;br /&gt;
&lt;br /&gt;
Para recuperar el valor, a la herencia de POST, el comando es:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $mydate = dol_mktime(12, 0 , 0, $_POST[&#039;mykeymonth&#039;], $_POST[&#039;mykeyday&#039;], $_POST[&#039;mykeyyear&#039;]);&lt;br /&gt;
 print strftime(&#039;%A %d %B %Y&#039;, $mydate);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Definir su página de configuración (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si su módulo ofrece varias opciones parametrizables.&lt;br /&gt;
&lt;br /&gt;
=== Crear su página de edición de configuración ===&lt;br /&gt;
Si su módulo ofrece varias opciones parametrizacles, es necesario crear una página PHP para editar las opciones (que serán guardadas en la [[Table llx_const|tabla &#039;&#039;&#039;llx_const&#039;&#039;&#039;]]). Cree una página PHP llamada &#039;&#039;&#039;mimodulo_setuppage.php&#039;&#039;&#039;, que registre las opciones posibles y las ponga al día. Es necesario tomar como ejemplo una página de &#039;&#039;&#039;/admin&#039;&#039;&#039; 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 &#039;&#039;&#039;/admin&#039;&#039;&#039;. 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 &#039;&#039;&#039;/admin&#039;&#039;&#039;).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $this-&amp;gt;config_page_url = array(&amp;quot;monmodule_setupapage.php&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Probar su página ===&lt;br /&gt;
Vaya a la página &#039;&#039;&#039;Configuración &amp;gt; módulo&#039;&#039;&#039;. 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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Definir sus entradas de menú (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si ha creado páginas PHP, es necesario que estas pantallas sean accesibles desde el menú Dolibarr.&lt;br /&gt;
&lt;br /&gt;
=== Definir sus entradas de menú ===&lt;br /&gt;
Para ello, hace falta definir en el archivo descriptor de menú de tabla this-&amp;gt;menu, que declara los menús.&lt;br /&gt;
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&lt;br /&gt;
&lt;br /&gt;
He aquí un ejemplo de declaración de entradas de menú en el fichero descriptor:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Main menu entries&lt;br /&gt;
$this-&amp;gt;menu = array();			// List of menus to add&lt;br /&gt;
$r=0;&lt;br /&gt;
&lt;br /&gt;
// Add here entries to declare new menus&lt;br /&gt;
// Example to declare the Top Menu entry:&lt;br /&gt;
$this-&amp;gt;menu[$r]=array(	&#039;fk_menu&#039;=&amp;gt;0,			// Put 0 if this is a top menu&lt;br /&gt;
			&#039;type&#039;=&amp;gt;&#039;top&#039;,			// This is a Top menu entry&lt;br /&gt;
			&#039;titre&#039;=&amp;gt;&#039;MyModule top menu&#039;,&lt;br /&gt;
			&#039;mainmenu&#039;=&amp;gt;&#039;mymodule&#039;,&lt;br /&gt;
			&#039;leftmenu&#039;=&amp;gt;&#039;mymodule&#039;,&lt;br /&gt;
			&#039;url&#039;=&amp;gt;&#039;/mymodule/pagetop.php&#039;,&lt;br /&gt;
			&#039;langs&#039;=&amp;gt;&#039;mylangfile&#039;,	// Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory.&lt;br /&gt;
			&#039;position&#039;=&amp;gt;100,&lt;br /&gt;
			&#039;enabled&#039;=&amp;gt;&#039;1&#039;,			// Define condition to show or hide menu entry. Use &#039;$conf-&amp;gt;mymodule-&amp;gt;enabled&#039; if entry must be visible if module is enabled.&lt;br /&gt;
			&#039;perms&#039;=&amp;gt;&#039;1&#039;,			// Use &#039;perms&#039;=&amp;gt;&#039;$user-&amp;gt;rights-&amp;gt;mymodule-&amp;gt;level1-&amp;gt;level2&#039; if you want your menu with a permission rules&lt;br /&gt;
			&#039;target&#039;=&amp;gt;&#039;&#039;,&lt;br /&gt;
			&#039;user&#039;=&amp;gt;2);				// 0=Menu for internal users, 1=external users, 2=both&lt;br /&gt;
$r++;&lt;br /&gt;
&lt;br /&gt;
// Example to declare a Left Menu entry:&lt;br /&gt;
$this-&amp;gt;menu[$r]=array(	&#039;fk_menu&#039;=&amp;gt;&#039;fk_mainmenu=xxx&#039;,		    // Use &#039;fk_mainmenu=xxx&#039; or &#039;fk_mainmenu=xxx,fk_leftmenu=yyy&#039; where xxx is mainmenucode and yyy is a leftmenucode of parent menu&lt;br /&gt;
			&#039;type&#039;=&amp;gt;&#039;left&#039;,			        // This is a Left menu entry&lt;br /&gt;
			&#039;titre&#039;=&amp;gt;&#039;MyModule left menu 1&#039;,&lt;br /&gt;
			&#039;mainmenu&#039;=&amp;gt;&#039;xxx&#039;,&lt;br /&gt;
                        &#039;leftmenu&#039;=&amp;gt;&#039;yyy&#039;,&lt;br /&gt;
			&#039;url&#039;=&amp;gt;&#039;/mymodule/pagelevel1.php&#039;,&lt;br /&gt;
			&#039;langs&#039;=&amp;gt;&#039;mylangfile&#039;,	// Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory.&lt;br /&gt;
			&#039;position&#039;=&amp;gt;100,&lt;br /&gt;
			&#039;enabled&#039;=&amp;gt;&#039;1&#039;,			// Define condition to show or hide menu entry. Use &#039;$conf-&amp;gt;mymodule-&amp;gt;enabled&#039; if entry must be visible if module is enabled.&lt;br /&gt;
			&#039;perms&#039;=&amp;gt;&#039;1&#039;,			// Use &#039;perms&#039;=&amp;gt;&#039;$user-&amp;gt;rights-&amp;gt;mymodule-&amp;gt;level1-&amp;gt;level2&#039; if you want your menu with a permission rules&lt;br /&gt;
			&#039;target&#039;=&amp;gt;&#039;&#039;,&lt;br /&gt;
			&#039;user&#039;=&amp;gt;2);				// 0=Menu for internal users,1=external users, 2=both&lt;br /&gt;
$r++;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para condicionar el acceso al menú segun los permisos, modificar la propiedad &#039;&#039;&#039;perms&#039;&#039;&#039; de la tabla. Ver el capítulo sobre permisos, un poco más abajo, para saber como realizar los permisos.&lt;br /&gt;
&lt;br /&gt;
=== Probar sus entradas de menú ===&lt;br /&gt;
Desactive y reactive su módulo bajo Dolibarr. Las entradas del menú deberían aparecer después de hacerlo (si la condición &#039;enabled&#039; está activada).&lt;br /&gt;
&lt;br /&gt;
== Definir sus propios permisos (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si quiere añadir nuevos permisos.&lt;br /&gt;
&lt;br /&gt;
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-&amp;gt;rights_class = &#039;facture&#039; para que diga:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $this-&amp;gt;rights_class = &#039;mimodulo&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A continuación, rellene la tabla $this-&amp;gt;rights con tantas entradas como permisos diferentes vaya a definir:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $this-&amp;gt;rights[$r][0] = 10001;&lt;br /&gt;
 $this-&amp;gt;rights[$r][1] = &#039;Texto por defecto de mi permiso&#039;;&lt;br /&gt;
 $this-&amp;gt;rights[$r][3] = 1;&lt;br /&gt;
 $this-&amp;gt;rights[$r][4] = &#039;accion&#039;;&lt;br /&gt;
 $this-&amp;gt;rights[$r][5] = &#039;subaccion&#039;;&lt;br /&gt;
 $r++;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En $this-&amp;gt;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ú &#039;&#039;&#039;Información del Sistema&#039;&#039;&#039; en una instalación de Dolibarr que esté funcionando. En $this-&amp;gt;rights[$r][3], introduzca 1 si este permiso se atribuye por defecto a los usuarios según son creados. En $this-&amp;gt;rights[$r][1] introduzca un texto por defecto -que será mostrado si no se encuentra traducción para su permiso en el archivo &#039;&#039;&#039;admin.lang&#039;&#039;&#039;). En $this-&amp;gt;rights[$r][4] y $this-&amp;gt;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:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 if ($user-&amp;gt;rights-&amp;gt;mimodulo-&amp;gt;accion-&amp;gt;subaccion) ...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Definir sus propios paneles (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si su módulo tiene uno o varios paneles.&lt;br /&gt;
&lt;br /&gt;
=== Defina sus paneles ===&lt;br /&gt;
Para ello, modifique las tablas $this-&amp;gt;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 &#039;&#039;&#039;htdocs/mimodulo/core/boxes&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Ejemplo:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;boxes[0][&#039;file&#039;]=&#039;mabox0.php@mimodulo&#039;&lt;br /&gt;
$this-&amp;gt;boxes[0][&#039;note&#039;]=&#039;Mi panel 0&#039;&lt;br /&gt;
 ...&lt;br /&gt;
$this-&amp;gt;boxes[n][&#039;file&#039;]=&#039;maboxn.php@mimodulo&#039;&lt;br /&gt;
$this-&amp;gt;boxes[n][&#039;note&#039;]=&#039;Mi panel n&#039;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A continuación cree los archivos &#039;&#039;&#039;htdocs/mimodulo/core/boxes/mabox0.php&#039;&#039;&#039;, &#039;&#039;&#039;htdocs/mimodulo/core/boxes/mabox1.php&#039;&#039;&#039;...  tomando como ejemplo los paneles existentes (en el directorio htdocs/core/boxes)&lt;br /&gt;
&lt;br /&gt;
=== Pruebe sus paneles en Dolibarr ===&lt;br /&gt;
Vaya al menú &#039;&#039;&#039;Inico – Configuración – Paneles&#039;&#039;&#039;. 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.&lt;br /&gt;
&lt;br /&gt;
== Definir sus propias exportaciones (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; 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)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Definir la exportación ===&lt;br /&gt;
Para ello, descomente y modifique las tablas $this-&amp;gt;export_xxx  de su archivo descriptor de módulo.&lt;br /&gt;
&lt;br /&gt;
=== Probar la exportación ===&lt;br /&gt;
Vaya al menú &amp;quot;Herramientas &amp;gt; Exportar&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Definir sus estilos CSS (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si en sus pantallas PHP utiliza clases de estilos distintas a las de los temas de Dolibarr (no recomendado).&lt;br /&gt;
&lt;br /&gt;
Esta funcionalidad todavía no es operativa en la versión 2.4., a pesar de estar ya descrita.&lt;br /&gt;
&lt;br /&gt;
=== Crear y declarar su hoja de estilos ===&lt;br /&gt;
Crear un archivo de estilos llamada &#039;&#039;&#039;mimodulo.css&#039;&#039;&#039; o &#039;&#039;&#039;mimodule.css.php&#039;&#039;&#039; y guardarla en el directorio &#039;&#039;&#039;&#039;&#039;mimodulo&#039;&#039;&#039;&#039;&#039; dentro de &#039;&#039;&#039;htdocs&#039;&#039;&#039;. Solo puede haber un archivo css propio a cada módulo.&lt;br /&gt;
Recordamos que es mejor usar los estilos ya existentes en Dolibarr (el archivo css usado por Dolibarr es el archivo &#039;&#039;&#039;themes/nomtheme/&#039;&#039;nombretema&#039;&#039;.css.php&#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
Una vez su hoja de estilos esté disponible, declárela en su archivo descriptor de módulo modificando la propiedad &#039;&#039;&#039;$this-&amp;gt;module_parts&#039;&#039;&#039;.&lt;br /&gt;
El valor a indicar debe ser la ruta URL relativa de su archivo css.&lt;br /&gt;
Por ejemplo&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;module_parts = array(&#039;css&#039; =&amp;gt; array(&#039;/mimodulo/css/mimodulo.css.php&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Probar su hoja de estilos ===&lt;br /&gt;
Desactivar y reactivar su módulo.&lt;br /&gt;
&lt;br /&gt;
Ir la página de inicio de Dolibarr. Ver el código de la página HTML.&lt;br /&gt;
&lt;br /&gt;
Debería ver en el encabezado HTML, una línea de declaración de su hoja de estilos.&lt;br /&gt;
&lt;br /&gt;
== Definir sus funciones Javascript (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuando&#039;&#039;&#039;: Si en sus pantallas en PHP utiliza funciones de Javascript no disponibles en estandard (archivo lib_head.js)&lt;br /&gt;
&lt;br /&gt;
Si en sus pantallas en PHP utiliza funciones javascript, es necesario asegurarse de que las funciones declaradas en un archivo javascript &#039;&#039;&#039;htdocs/mimodulo/js/monmodule.js&#039;&#039;&#039; sea cargado en la cabecera del head html.&lt;br /&gt;
&lt;br /&gt;
Para pedir a Dolibarr que gestione en la generación de la sección header la inclusión de uno de sus archivos javascript, es necesario proporcionar como parámetro a la función llxHeader(), al inicio de su página, la URL hacia el js a incluir.&lt;br /&gt;
&lt;br /&gt;
Ejemplo para la página /htdocs/mimodulo/mapage.php :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
require(&#039;../main.inc.php&#039;);&lt;br /&gt;
$morejs=array(&amp;quot;/mimomulo/js/monmodule.js&amp;quot;);&lt;br /&gt;
llxHeader(&#039;&#039;,&#039;Titulo&#039;,&#039;&#039;,&#039;&#039;,&#039;&#039;,&#039;&#039;,$morejs,&#039;&#039;,0,0); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ejecutar código sobre un evento Dolibarr (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; 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 &#039;&#039;&#039;disparador (triggers)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Véase también [[Interfaces Dolibarr hacia el exterior]] e [[Interfaces del Exterior hacia Dolibarr]]&lt;br /&gt;
&lt;br /&gt;
== Insertar su código usando los hooks de Dolibarr (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039;: Cuando desee cambiar o añadir otro tipo de código en un evento de negociado (véase lel capítulo anterior para esto).&lt;br /&gt;
&lt;br /&gt;
Véase la página [[El sistema Hooks]].&lt;br /&gt;
&lt;br /&gt;
== Añadir un módulo de numeración (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039;: Si quiere añadir una regla de numeración no cubierta por los módulos por defecto.&lt;br /&gt;
&lt;br /&gt;
Véase la página [[Crear un módulo de numeración]].&lt;br /&gt;
&lt;br /&gt;
== Añadir un nuevo módulo de documento (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039;: Si quiere añadir un nuevo modelo de documento.&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
== Añadir un tema (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039;: Si quiere un interface con colores personalizados.&lt;br /&gt;
&lt;br /&gt;
Véase la página [[Temas]].&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Algunas reglas de código =&lt;br /&gt;
Las reglas de código a seguir se definen en la [[Documentación Desarrolladores| Documentación para desarrolladores]], concretamente en la sección &amp;quot;Lenguaje&amp;quot; del capítulo de &amp;quot;Información General&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Utilización de MDA =&lt;br /&gt;
Un método para generar un módulo funcional desde UML se encuentra en curso de puesta a punto. Más información en la página [[UML2Dolibarr - Crear un módulo usando MDA]].&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Crear un paquete para liberar e instalar su módulo =&lt;br /&gt;
Este proceso debe ser usado para fabricar un paquete con el fin de enviarlo a la tienda oficial http://www.dolistore.com.&lt;br /&gt;
&lt;br /&gt;
También puede usarlo para distribuir fácilmente su módulo vía su propio método de distribución.&lt;br /&gt;
&lt;br /&gt;
* Vaya al directorio &#039;&#039;&#039;/build&#039;&#039;&#039; y copie el archivo &#039;&#039;&#039;makepack-dolibarrmodules.conf&#039;&#039;&#039; como &#039;&#039;&#039;makepack-mimodulo.conf&#039;&#039;&#039;. 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).&lt;br /&gt;
&lt;br /&gt;
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...)&lt;br /&gt;
* Lance el script vía Perl (necesita la versión 5.0. o superiores de Perl)&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 perl makepack-dolibarrmodule.pl&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El script le pide el nombre de su módulo, su versión mayor y menor. Se va a crear un fichero &#039;&#039;&#039;mimodulo.zip&#039;&#039;&#039;, que incluirá su módulo listo para ser liberado.&lt;br /&gt;
* La persona que reciba su módulo deberá ubicar el archivo en el directorio raíz de Dolibarr y ejecutar el comando:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 tar -xvf monmodule.zip&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 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 &amp;quot;Submit a product&amp;quot;).&lt;br /&gt;
** Si su módulo está correctamente realizado, será rápidamente validado.&lt;br /&gt;
** 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).&lt;/div&gt;</summary>
		<author><name>Nnicolashr</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Desarrollo_de_un_m%C3%B3dulo&amp;diff=35881</id>
		<title>Desarrollo de un módulo</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Desarrollo_de_un_m%C3%B3dulo&amp;diff=35881"/>
		<updated>2016-09-08T00:37:19Z</updated>

		<summary type="html">&lt;p&gt;Nnicolashr: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Básico]]&lt;br /&gt;
{{TemplateDocDesarrollo}}&lt;br /&gt;
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:&lt;br /&gt;
* Añadir nuevas tablas a la base de datos.&lt;br /&gt;
* Añadir sus propias entradas en los menús.&lt;br /&gt;
* Añadir pantallas de edición/consulta de nuevas tablas.&lt;br /&gt;
* Añadir o eliminar pestañas en las páginas de vista/edición de objetos (factura, producto, pedido, evento, etc.)&lt;br /&gt;
* Añadir exportaciones predefinidas a la función “Exportar”.&lt;br /&gt;
* Añadir variables de substitución&lt;br /&gt;
* Añadir nuevas cajas a la página de inicio.&lt;br /&gt;
* Definir nuevos permisos.&lt;br /&gt;
* Activar código automático sobre una acción particular de Dolibarr.&lt;br /&gt;
* Insertar nuestro código mediante los hooks de Dolibarr&lt;br /&gt;
* Añadir un módulo de numeración&lt;br /&gt;
* Añadir un modelo de documento&lt;br /&gt;
* Añadir un nuevo tema &lt;br /&gt;
&lt;br /&gt;
etc. Todas estas operaciones sólo están disponibles a partir de la versión 3.2 de Dolibarr.&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Crear un módulo =&lt;br /&gt;
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&lt;br /&gt;
&lt;br /&gt;
== [[File:Art.png]] Crear un descriptor de Módulo (obligatorio) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039;: Obligatorio cada vez que se desarrolla una extensión, cualquiera que sea su finalidad.&lt;br /&gt;
&lt;br /&gt;
=== Crear su descriptor ===&lt;br /&gt;
La primera fase es la de crear un fichero descriptor del módulo. Para ello:&lt;br /&gt;
* Crear el directorio &#039;&#039;&#039;/htdocs/&#039;&#039;mimodulo&#039;&#039;/core/modules&#039;&#039;&#039;. Seguidamente ir al directorio &#039;&#039;&#039;dev/skeletons&#039;&#039;&#039; y copiar el archivo modMyModule.class.php en el directorio &#039;&#039;&#039;htdocs/&#039;&#039;monmodule&#039;&#039;/core/modules&#039;&#039;&#039;.&lt;br /&gt;
A continuación, modificar el contenido del archivo, reemplazando:&lt;br /&gt;
* los &amp;quot;modMyModule&amp;quot; por un valor que corresponda a la finalidad de su módulo. Este valor debe siempre comenzar por mod. &lt;br /&gt;
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.&lt;br /&gt;
* $this-&amp;gt;numero = 100000 por un número de módulo que esté libre. Ver [[List of modules id|Listado de los id de módulos]]&lt;br /&gt;
* Modificar eventualmente otras variables definidas por los desarrolladores (ver el comentario en el código del esqueleto para ver su significado)&lt;br /&gt;
* Crear el directorio /htdocs/mimodulo/ &lt;br /&gt;
Ahora su fichero descriptor está configurado.&lt;br /&gt;
&lt;br /&gt;
=== Probar su descriptor ===&lt;br /&gt;
Ejecute Dolibarr y vaya a la página &amp;quot;Configuración &amp;gt; Módulo&amp;quot;. 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-&amp;gt;special el que determina en qué pestaña se encuentra su módulo.&lt;br /&gt;
&lt;br /&gt;
== [[File:Art.png]] Árbol de un nuevo módulo ==&lt;br /&gt;
Crear un directorio &#039;mimodulo&#039; que contendrá los archivos del módulo. Este directorio debe de estar en el directorio &#039;&#039;&#039;htdocs&#039;&#039;&#039; y contendrá los siguientes subdirectorios:&lt;br /&gt;
{{TemplateModuleTreeSimple}}&lt;br /&gt;
&lt;br /&gt;
== [[File:Art.png]] Crear sus tablas SQL y la clase PHP con los métodos de acceso (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si su módulo necesita gestionar sus propios datos.&lt;br /&gt;
&lt;br /&gt;
===Crear sus ficheros .sql===&lt;br /&gt;
Si su módulo de verdad requiere administrar datos que no existen en la base de datos en la versión estándar de Dolibarr, será necesario definir ciertas tablas SQL para registrar esos datos.&lt;br /&gt;
&lt;br /&gt;
Revisa que en el descriptor de archivo (mymodule/core/modules/mymodule.class.php) la línea&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;_load_tables(&#039;/mymodule/sql/&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
esté descomentada y correctamente configurada.&lt;br /&gt;
&lt;br /&gt;
Cree un subdirectorio sql en el directorio de su módulo (por ejemplo, htdocs/mimodulo/sql), con el fin de colocar los scripts sql que va a crear. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Regla a respetar:&#039;&#039; &lt;br /&gt;
* Agregue los archivos de orden de creación de sus tablas siguiendo el principio de un fichero &#039;&#039;&#039;llx_mitabla.sql&#039;&#039; por tabla, eventualmente acompañado del archivo &#039;&#039;&#039;llx_mitabla.key.sql&#039;&#039;&#039; (ver los archivos existentes en &#039;&#039;install/mysql/tables&#039;&#039;, para tomar ejemplo). &lt;br /&gt;
* En términos de orden de gestión de datos, todos deben estar en un archivo llamado &#039;&#039;&#039;data.sql&#039;&#039;&#039; situado en la misma carpeta &#039;&#039;&#039;/mimodulo/sql/&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Ejemplo de contenido de un fichero data.sql&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
 delete from llx_const where name=&#039;MYMODULE_IT_WORKS&#039; and entity=&#039;__ENTITY__&#039;;&lt;br /&gt;
 insert into llx_const (name, value, type, note, visible, entity) values (&#039;MYMODULE_IT_WORKS&#039;,&#039;1&#039;,&#039;chaine&#039;,&#039;A constant vor my module&#039;,1,&#039;__ENTITY__&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Las órdenes SQL de los archivos deben de ser operacionales para la base de datos &#039;&#039;&#039;mysql&#039;&#039;&#039;.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Probar su archivo .sql ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Generar la clase PHP de acceso (DAO) ===&lt;br /&gt;
Una vez que su/s tabla/s estén creadas en la base de datos, vaya al directorio &#039;&#039;&#039;dev/skeletons&#039;&#039;&#039;, copie el archivo &#039;&#039;&#039;build_class_from_table.php&#039;&#039;&#039; en la el directorio sql/ de su módulo module, y ejecute el script&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 php build_class_from_table.php nombretabla&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Nota: Si el comando no funciona, intente con php-cli en lugar de php.&lt;br /&gt;
&lt;br /&gt;
Esto genera un archivo &#039;&#039;&#039;out.nombretabla.class.php&#039;&#039;&#039; que contiene la clase de gestión de la tabla “nombretabla”. En esta clase se encuentran los métodos CRUD (Create/Read/Update/Delete) ya operativos para hacer un &#039;&#039;insert&#039;&#039;, un &#039;&#039;fetch&#039;&#039; (&#039;&#039;select&#039;&#039;), un &#039;&#039;update&#039;&#039;, y un &#039;&#039;delete&#039;&#039; de una línea de la tabla. Suprima justo el &amp;quot;out&amp;quot; del nombre del archivo y pógalo en un subdirectorio de &#039;&#039;&#039;htdocs&#039;&#039;&#039; propio en su módulo (Por ejemplo en &#039;&#039;&#039;htdocs/mimodulo&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Un archivo &#039;&#039;&#039;out.nombretabla_script.php&#039;&#039;&#039; se genera igualmente y contiene un ejemplo de código para utilizar la clase para cada uno de los cuatro métodos CRUD.&lt;br /&gt;
&lt;br /&gt;
== Visualización de pestañas pestañas (opcional) ==&lt;br /&gt;
&lt;br /&gt;
=== Añadir o eliminar pestañas en las fichas entidad ===&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039; : Para añadir su propia pestaña en las pestañas estandard de una ficha entidad (factura, pedido, presupuesto, miembro...)&lt;br /&gt;
&lt;br /&gt;
Para ello, vaya al archivo descriptor del módulo creado anteriormente y modifique la tabla $this-&amp;gt;tabs:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
	// Array to add new pages in new tabs or remove existing one&lt;br /&gt;
	$this-&amp;gt;tabs = array(&#039;objecttype:+tabname1:Title1:@mymodule:/mymodule/mynewtab1.php?id=__ID__&#039;,  // To add a new tab identified by code tabname1&lt;br /&gt;
                            &#039;objecttype:+tabname2:Title2:@mymodule:/mymodule/mynewtab2.php?id=__ID__&#039;,  // To add another new tab identified by code tabname2&lt;br /&gt;
                            &#039;objecttype:-tabname&#039;);                                                     // To remove an existing tab identified by code tabname&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La tabla debe contener una lista de cadena, cada cadena representa una nueva pestaña.&lt;br /&gt;
El formato de la cadena se compone de 4 partes separadas por &amp;quot;:&amp;quot;&lt;br /&gt;
* Parte 1: El código de la entidad (objecttype) en la que debe aparecer la pestaña siendo el valor de ella misma:&lt;br /&gt;
{{TemplateModuleTabs-es}}&lt;br /&gt;
* 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.&lt;br /&gt;
* 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&lt;br /&gt;
&lt;br /&gt;
* 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.&lt;br /&gt;
&lt;br /&gt;
Para alimentar el contenido de la pestaña con los datos de la base de datos, vea el capítulo siguiente.&lt;br /&gt;
&lt;br /&gt;
=== Añadir pestañas de una ficha entidad en su propia página ===&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039; : Para mostrar las pestañas estandard de ficha entidad (producto, tercero, etc.) en su propia pestaña de una entidad.&lt;br /&gt;
&lt;br /&gt;
Hay que hacer lo siguiente :&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Incluir los archivos que definen las funciones útiles dentro de sus archivos&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para cada ficha entidad, hay que incluir dos archivos con la instrucción&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;require_once($url_fichier) ;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aquí le mostramos la lista de estos archivos (DOL_DOCUMENT_ROOT correspond au dossier dolibarr/htdocs/) :&lt;br /&gt;
* Entidad tercero (thirdparty) :&lt;br /&gt;
** DOL_DOCUMENT_ROOT/societe.class.php&lt;br /&gt;
** DOL_DOCUMENT_ROOT/lib/company.lib.php&lt;br /&gt;
* Entidad producto (product) :&lt;br /&gt;
** DOL_DOCUMENT_ROOT/product.class.php&lt;br /&gt;
** DOL_DOCUMENT_ROOT/lib/product.lib.php&lt;br /&gt;
* Entidad factura (invoice) :&lt;br /&gt;
** DOL_DOCUMENT_ROOT/facture.class.php&lt;br /&gt;
** DOL_DOCUMENT_ROOT/lib/invoice.lib.php&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Crear y cargar el objeto a mostrar en su pestaña&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Crear el objeto de la clase deseada, y recuperar los datos del objeto a partir de la base de datos. Para ello deberá utilizar las funciones fetch() de la clase correspondiente, pasando el parámetro del indentificador del objeto que recupera desde la url (ej : /mononglet.php?id=1).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Ejemplo :&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$id=$_GET[&amp;quot;id&amp;quot;];&lt;br /&gt;
$product = new Product($db) ;&lt;br /&gt;
$result = $product-&amp;gt;fetch($id) ; //Tester $result pour vérifier que l&#039;accès à la base s&#039;est bien passé&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3. Recuperar la lista de pestañas correspondientes a la entidad seleccionada&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Usar la función XXX_prepare_head($obj), donde XXX es le nombre de la entidad, para crear una tabla que contiene las definiciones de las pestañas a mostrar. El parámetro a pasar es el objeto del que desea mostrar las pestañas.&lt;br /&gt;
&lt;br /&gt;
La tabla devuelta se compone de la siguiente manera :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$head        // Tableau des onglets&lt;br /&gt;
$head[$h]    // Élément décrivant un onglet. Il y aura autant de $h que d&#039;onglets à afficher&lt;br /&gt;
$head[$h][0] // Url de la page affichée quand on clique sur l&#039;onglet&lt;br /&gt;
$head[$h][1] // Titre de l&#039;ongLet&lt;br /&gt;
$head[$h][2] // Code de l&#039;onglet, à utiliser pour choisir quel onglet sera &#039;actif&#039; (voir paragraphe suivant)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Ejemplo :&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$head = product_prepare_head($product, $user) ; //le paramètre $user n&#039;est pas présent sur certaines fonctions&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4. Mostrar las pestañas en su pestaña&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Use la función dol_fiche_head() que muestra las pestañas contenidas en la tabla $head devuelta por XX_prepare_head().&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
dol_fiche_head($links, $active=&#039;0&#039;, $title=&#039;&#039;, $notab=0, $picto=&#039;&#039;)&lt;br /&gt;
$links  // Tableau des onglets, appelé $head plus haut.&lt;br /&gt;
$active // Onglet actif (mettre le nom de l&#039;onglet défini dans votre fichier de module, ou un nom contenu dans $head[$h][2]). Cet onglet sera mis en surbrillance&lt;br /&gt;
$title  // ?&lt;br /&gt;
$notab  // Mettre ce paramètre à 1 permet de ne pas afficher de zone bleue en dessous des onglets.&lt;br /&gt;
$picto  // Nom de l&#039;image à utiliser au début de la barre des onglet. Les choix suivant sont possibles :&lt;br /&gt;
//            product&lt;br /&gt;
//            service&lt;br /&gt;
//            company&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esta función muestra las pestañas deseadas y abre un elemento &#039;&#039;&amp;lt; div class=&amp;quot;&amp;quot; &amp;gt;&#039;&#039; 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 &#039;&#039;&amp;lt; /div &amp;gt;&#039;&#039; en el código PHP.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Nota&#039;&#039;:&lt;br /&gt;
Para más detalles, consulte la [http://www.dolibarr.fr/doxygen/ documentación Doxygen] o directamente el código de Dolibarr.&lt;br /&gt;
&lt;br /&gt;
== Crear sus páginas pantalla PHP (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si su módulo consiste en añadir funcionalidades que necesitan nuevas pantallas.&lt;br /&gt;
&lt;br /&gt;
=== Crear una página pantalla PHP ===&lt;br /&gt;
Debe crear a continuación pantallas PHP que se basen en los datos de sus tablas utilizando los esqueletos como ejemplo del directorio &#039;&#039;&#039;dev/skeletons&#039;&#039;&#039;. (Para el desarrollo de un script en línea de comandos, ver [[Desarrollo de scripts]]).&lt;br /&gt;
&lt;br /&gt;
Para crear una nueva página de usuario, cree un subdirectorio de &#039;&#039;&#039;htdocs&#039;&#039;&#039; (si es que no existe ya) propio en su módulo (En &#039;&#039;&#039;htdocs/mimodulo&#039;&#039;&#039;, por ejemplo), con el fin de ubicar en él las páginas que va a crear.&lt;br /&gt;
&lt;br /&gt;
Copie allí el archivo &#039;&#039;&#039;skeletons_page.php&#039;&#039;&#039;, que va a servir de punto de partida a su página. Modifique el archivo para que la ruta relativa de&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$res=0;&lt;br /&gt;
if (! $res &amp;amp;&amp;amp; file_exists(&amp;quot;../main.inc.php&amp;quot;)) $res=@include(&amp;quot;../main.inc.php&amp;quot;);			// to work if your module directory is into dolibarr root htdocs directory&lt;br /&gt;
if (! $res &amp;amp;&amp;amp; file_exists(&amp;quot;../../main.inc.php&amp;quot;)) $res=@include(&amp;quot;../../main.inc.php&amp;quot;);		// to work if your module directory is into a subdir of root htdocs directory&lt;br /&gt;
if (! $res) die(&amp;quot;Include of main fails&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
sea la correcta, en función de la profundidad del directorio en el que se encuentra el archivo (quitando o añadiendo &amp;quot;../&amp;quot;). Es en el &amp;quot;main&amp;quot; donde se carga el entorno técnico y las habilitaciones. Los objetos variables se posicionan ahora:&lt;br /&gt;
* $user – El objeto que contiene las características del usuario y sus derechos.&lt;br /&gt;
* $conf – El objeto que contiene la configuración de Dolibarr.&lt;br /&gt;
* $db – El objeto que contiene el gestor de conexión abierto a la base de datos.&lt;br /&gt;
* $langs – El objeto que contiene el idioma del usuario.&lt;br /&gt;
&lt;br /&gt;
* 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):&lt;br /&gt;
&#039;&#039;Exemple :&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
dol_include_once(&#039;/mimodulo/class/miclass.class.php&#039;, &#039;MiClass&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Las clases de llamadas Dolibarr utilice la siguiente sintaxis:&lt;br /&gt;
&#039;&#039;Exemple :&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
require_once DOL_DOCUMENT_ROOT.&#039;/core/class/doli.class.php&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Reemplazar partes de templates de pantalla (versión 3.3+) ===&lt;br /&gt;
Algunas partes de la pantalla de Dolibarr están aisladas en archivos de plantilla. Puede desarrollar un módulo para reemplazar una o más de estas plantillas con las suyas.&lt;br /&gt;
{{ToComplete}}&lt;br /&gt;
&lt;br /&gt;
=== Acceso a la base de datos ===&lt;br /&gt;
Si necesita realizar modificaciones en su tabla de la base de datos, utilice la clase generada más arriba.&lt;br /&gt;
&lt;br /&gt;
Si de todos modos quiere acceder a las tablas sin objeto PHP dedicado, esto es posible (por ejemplo para recuperar una lista de registros). En ese caso, piense en seguir estos ejemplos.&lt;br /&gt;
&lt;br /&gt;
Para un &#039;&#039;insert&#039;&#039;, &#039;&#039;update&#039;&#039; o &#039;&#039;delete&#039;&#039;:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $db-&amp;gt;begin();   // Debut transaction&lt;br /&gt;
 $db-&amp;gt;query(&amp;quot;Ma requete insert, update ou delete&amp;quot;);&lt;br /&gt;
 $db-&amp;gt;commit();       // Valide&lt;br /&gt;
 o $db-&amp;gt;rollback()  // Annule&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para una lectura:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $resql=$db-&amp;gt;query(&amp;quot;Ma requete select&amp;quot;);&lt;br /&gt;
 if ($resql)&lt;br /&gt;
 {&lt;br /&gt;
         $num = $db-&amp;gt;num_rows($resql);&lt;br /&gt;
         $i = 0;&lt;br /&gt;
         if ($num)&lt;br /&gt;
         {&lt;br /&gt;
                 while ($i &amp;lt; $num)&lt;br /&gt;
                 {&lt;br /&gt;
                         $obj = $db-&amp;gt;fetch_object($resql);&lt;br /&gt;
                         if ($obj)&lt;br /&gt;
                         {&lt;br /&gt;
                                 // You can use here results&lt;br /&gt;
                                 print $obj-&amp;gt;field1;&lt;br /&gt;
                                 print $obj-&amp;gt;field2;&lt;br /&gt;
                         }&lt;br /&gt;
                         $i++;&lt;br /&gt;
                 }&lt;br /&gt;
         }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Definición de estilos ===&lt;br /&gt;
Para que el aspecto de la página guarde coherencia con el tema Dolibarr, es necesario utilizar los estilos CSS de Dolibarr.&lt;br /&gt;
&lt;br /&gt;
Por ejemplo:&lt;br /&gt;
&lt;br /&gt;
* class=&amp;quot;liste_titre&amp;quot;1 en las etiquetas tr y td para una línea de título de tabla. &lt;br /&gt;
* class=”pair” o class=”impair” en las etiquetas tr y td de las líneas de datos de la tabla.&lt;br /&gt;
* class=”flat” en todos los campos en los que se teclea (input, select, textarea...)&lt;br /&gt;
* class=”button” en los objetos de tipo input type=”submit”.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Utilizar el selector de fechas de Dolibarr ===&lt;br /&gt;
Si quiere, puede beneficiarse del selector de fechas en las pantallas Dolibarr. Para ello, utilice la siguiente línea:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $form=new Form($db);&lt;br /&gt;
 $form-&amp;gt;select_date(&#039;&#039;,&#039;mykey&#039;,0,0,0,&amp;quot;myform&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La cadena &amp;quot;mikey&amp;quot; identifica el campo fecha. Hace falta introducir un valor diferente en caso de que haya varios campos. La cadena &amp;quot;myform&amp;quot; es el nombre del campo &amp;quot;FORM&amp;quot; (en el formulario, name=&amp;quot;myform&amp;quot; de la página html). La visualización de un selector de fecha debe por tanto estar integrada en un formulario html.&lt;br /&gt;
&lt;br /&gt;
Para recuperar el valor, a la herencia de POST, el comando es:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $mydate = dol_mktime(12, 0 , 0, $_POST[&#039;mykeymonth&#039;], $_POST[&#039;mykeyday&#039;], $_POST[&#039;mykeyyear&#039;]);&lt;br /&gt;
 print strftime(&#039;%A %d %B %Y&#039;, $mydate);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Definir su página de configuración (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si su módulo ofrece varias opciones parametrizables.&lt;br /&gt;
&lt;br /&gt;
=== Crear su página de edición de configuración ===&lt;br /&gt;
Si su módulo ofrece varias opciones parametrizacles, es necesario crear una página PHP para editar las opciones (que serán guardadas en la [[Table llx_const|tabla &#039;&#039;&#039;llx_const&#039;&#039;&#039;]]). Cree una página PHP llamada &#039;&#039;&#039;mimodulo_setuppage.php&#039;&#039;&#039;, que registre las opciones posibles y las ponga al día. Es necesario tomar como ejemplo una página de &#039;&#039;&#039;/admin&#039;&#039;&#039; 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 &#039;&#039;&#039;/admin&#039;&#039;&#039;. 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 &#039;&#039;&#039;/admin&#039;&#039;&#039;).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $this-&amp;gt;config_page_url = array(&amp;quot;monmodule_setupapage.php&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Probar su página ===&lt;br /&gt;
Vaya a la página &#039;&#039;&#039;Configuración &amp;gt; módulo&#039;&#039;&#039;. 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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Definir sus entradas de menú (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si ha creado páginas PHP, es necesario que estas pantallas sean accesibles desde el menú Dolibarr.&lt;br /&gt;
&lt;br /&gt;
=== Definir sus entradas de menú ===&lt;br /&gt;
Para ello, hace falta definir en el archivo descriptor de menú de tabla this-&amp;gt;menu, que declara los menús.&lt;br /&gt;
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&lt;br /&gt;
&lt;br /&gt;
He aquí un ejemplo de declaración de entradas de menú en el fichero descriptor:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Main menu entries&lt;br /&gt;
$this-&amp;gt;menu = array();			// List of menus to add&lt;br /&gt;
$r=0;&lt;br /&gt;
&lt;br /&gt;
// Add here entries to declare new menus&lt;br /&gt;
// Example to declare the Top Menu entry:&lt;br /&gt;
$this-&amp;gt;menu[$r]=array(	&#039;fk_menu&#039;=&amp;gt;0,			// Put 0 if this is a top menu&lt;br /&gt;
			&#039;type&#039;=&amp;gt;&#039;top&#039;,			// This is a Top menu entry&lt;br /&gt;
			&#039;titre&#039;=&amp;gt;&#039;MyModule top menu&#039;,&lt;br /&gt;
			&#039;mainmenu&#039;=&amp;gt;&#039;mymodule&#039;,&lt;br /&gt;
			&#039;leftmenu&#039;=&amp;gt;&#039;mymodule&#039;,&lt;br /&gt;
			&#039;url&#039;=&amp;gt;&#039;/mymodule/pagetop.php&#039;,&lt;br /&gt;
			&#039;langs&#039;=&amp;gt;&#039;mylangfile&#039;,	// Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory.&lt;br /&gt;
			&#039;position&#039;=&amp;gt;100,&lt;br /&gt;
			&#039;enabled&#039;=&amp;gt;&#039;1&#039;,			// Define condition to show or hide menu entry. Use &#039;$conf-&amp;gt;mymodule-&amp;gt;enabled&#039; if entry must be visible if module is enabled.&lt;br /&gt;
			&#039;perms&#039;=&amp;gt;&#039;1&#039;,			// Use &#039;perms&#039;=&amp;gt;&#039;$user-&amp;gt;rights-&amp;gt;mymodule-&amp;gt;level1-&amp;gt;level2&#039; if you want your menu with a permission rules&lt;br /&gt;
			&#039;target&#039;=&amp;gt;&#039;&#039;,&lt;br /&gt;
			&#039;user&#039;=&amp;gt;2);				// 0=Menu for internal users, 1=external users, 2=both&lt;br /&gt;
$r++;&lt;br /&gt;
&lt;br /&gt;
// Example to declare a Left Menu entry:&lt;br /&gt;
$this-&amp;gt;menu[$r]=array(	&#039;fk_menu&#039;=&amp;gt;&#039;fk_mainmenu=xxx&#039;,		    // Use &#039;fk_mainmenu=xxx&#039; or &#039;fk_mainmenu=xxx,fk_leftmenu=yyy&#039; where xxx is mainmenucode and yyy is a leftmenucode of parent menu&lt;br /&gt;
			&#039;type&#039;=&amp;gt;&#039;left&#039;,			        // This is a Left menu entry&lt;br /&gt;
			&#039;titre&#039;=&amp;gt;&#039;MyModule left menu 1&#039;,&lt;br /&gt;
			&#039;mainmenu&#039;=&amp;gt;&#039;xxx&#039;,&lt;br /&gt;
                        &#039;leftmenu&#039;=&amp;gt;&#039;yyy&#039;,&lt;br /&gt;
			&#039;url&#039;=&amp;gt;&#039;/mymodule/pagelevel1.php&#039;,&lt;br /&gt;
			&#039;langs&#039;=&amp;gt;&#039;mylangfile&#039;,	// Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory.&lt;br /&gt;
			&#039;position&#039;=&amp;gt;100,&lt;br /&gt;
			&#039;enabled&#039;=&amp;gt;&#039;1&#039;,			// Define condition to show or hide menu entry. Use &#039;$conf-&amp;gt;mymodule-&amp;gt;enabled&#039; if entry must be visible if module is enabled.&lt;br /&gt;
			&#039;perms&#039;=&amp;gt;&#039;1&#039;,			// Use &#039;perms&#039;=&amp;gt;&#039;$user-&amp;gt;rights-&amp;gt;mymodule-&amp;gt;level1-&amp;gt;level2&#039; if you want your menu with a permission rules&lt;br /&gt;
			&#039;target&#039;=&amp;gt;&#039;&#039;,&lt;br /&gt;
			&#039;user&#039;=&amp;gt;2);				// 0=Menu for internal users,1=external users, 2=both&lt;br /&gt;
$r++;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para condicionar el acceso al menú segun los permisos, modificar la propiedad &#039;&#039;&#039;perms&#039;&#039;&#039; de la tabla. Ver el capítulo sobre permisos, un poco más abajo, para saber como realizar los permisos.&lt;br /&gt;
&lt;br /&gt;
=== Probar sus entradas de menú ===&lt;br /&gt;
Desactive y reactive su módulo bajo Dolibarr. Las entradas del menú deberían aparecer después de hacerlo (si la condición &#039;enabled&#039; está activada).&lt;br /&gt;
&lt;br /&gt;
== Definir sus propios permisos (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si quiere añadir nuevos permisos.&lt;br /&gt;
&lt;br /&gt;
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-&amp;gt;rights_class = &#039;facture&#039; para que diga:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $this-&amp;gt;rights_class = &#039;mimodulo&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A continuación, rellene la tabla $this-&amp;gt;rights con tantas entradas como permisos diferentes vaya a definir:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $this-&amp;gt;rights[$r][0] = 10001;&lt;br /&gt;
 $this-&amp;gt;rights[$r][1] = &#039;Texto por defecto de mi permiso&#039;;&lt;br /&gt;
 $this-&amp;gt;rights[$r][3] = 1;&lt;br /&gt;
 $this-&amp;gt;rights[$r][4] = &#039;accion&#039;;&lt;br /&gt;
 $this-&amp;gt;rights[$r][5] = &#039;subaccion&#039;;&lt;br /&gt;
 $r++;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En $this-&amp;gt;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ú &#039;&#039;&#039;Información del Sistema&#039;&#039;&#039; en una instalación de Dolibarr que esté funcionando. En $this-&amp;gt;rights[$r][3], introduzca 1 si este permiso se atribuye por defecto a los usuarios según son creados. En $this-&amp;gt;rights[$r][1] introduzca un texto por defecto -que será mostrado si no se encuentra traducción para su permiso en el archivo &#039;&#039;&#039;admin.lang&#039;&#039;&#039;). En $this-&amp;gt;rights[$r][4] y $this-&amp;gt;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:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 if ($user-&amp;gt;rights-&amp;gt;mimodulo-&amp;gt;accion-&amp;gt;subaccion) ...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Definir sus propios paneles (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si su módulo tiene uno o varios paneles.&lt;br /&gt;
&lt;br /&gt;
=== Defina sus paneles ===&lt;br /&gt;
Para ello, modifique las tablas $this-&amp;gt;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 &#039;&#039;&#039;htdocs/mimodulo/core/boxes&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Ejemplo:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;boxes[0][&#039;file&#039;]=&#039;mabox0.php@mimodulo&#039;&lt;br /&gt;
$this-&amp;gt;boxes[0][&#039;note&#039;]=&#039;Mi panel 0&#039;&lt;br /&gt;
 ...&lt;br /&gt;
$this-&amp;gt;boxes[n][&#039;file&#039;]=&#039;maboxn.php@mimodulo&#039;&lt;br /&gt;
$this-&amp;gt;boxes[n][&#039;note&#039;]=&#039;Mi panel n&#039;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A continuación cree los archivos &#039;&#039;&#039;htdocs/mimodulo/core/boxes/mabox0.php&#039;&#039;&#039;, &#039;&#039;&#039;htdocs/mimodulo/core/boxes/mabox1.php&#039;&#039;&#039;...  tomando como ejemplo los paneles existentes (en el directorio htdocs/core/boxes)&lt;br /&gt;
&lt;br /&gt;
=== Pruebe sus paneles en Dolibarr ===&lt;br /&gt;
Vaya al menú &#039;&#039;&#039;Inico – Configuración – Paneles&#039;&#039;&#039;. 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.&lt;br /&gt;
&lt;br /&gt;
== Definir sus propias exportaciones (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; 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)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Definir la exportación ===&lt;br /&gt;
Para ello, descomente y modifique las tablas $this-&amp;gt;export_xxx  de su archivo descriptor de módulo.&lt;br /&gt;
&lt;br /&gt;
=== Probar la exportación ===&lt;br /&gt;
Vaya al menú &amp;quot;Herramientas &amp;gt; Exportar&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Definir sus estilos CSS (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; Si en sus pantallas PHP utiliza clases de estilos distintas a las de los temas de Dolibarr (no recomendado).&lt;br /&gt;
&lt;br /&gt;
Esta funcionalidad todavía no es operativa en la versión 2.4., a pesar de estar ya descrita.&lt;br /&gt;
&lt;br /&gt;
=== Crear y declarar su hoja de estilos ===&lt;br /&gt;
Crear un archivo de estilos llamada &#039;&#039;&#039;mimodulo.css&#039;&#039;&#039; o &#039;&#039;&#039;mimodule.css.php&#039;&#039;&#039; y guardarla en el directorio &#039;&#039;&#039;&#039;&#039;mimodulo&#039;&#039;&#039;&#039;&#039; dentro de &#039;&#039;&#039;htdocs&#039;&#039;&#039;. Solo puede haber un archivo css propio a cada módulo.&lt;br /&gt;
Recordamos que es mejor usar los estilos ya existentes en Dolibarr (el archivo css usado por Dolibarr es el archivo &#039;&#039;&#039;themes/nomtheme/&#039;&#039;nombretema&#039;&#039;.css.php&#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
Una vez su hoja de estilos esté disponible, declárela en su archivo descriptor de módulo modificando la propiedad &#039;&#039;&#039;$this-&amp;gt;module_parts&#039;&#039;&#039;.&lt;br /&gt;
El valor a indicar debe ser la ruta URL relativa de su archivo css.&lt;br /&gt;
Por ejemplo&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;module_parts = array(&#039;css&#039; =&amp;gt; array(&#039;/mimodulo/css/mimodulo.css.php&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Probar su hoja de estilos ===&lt;br /&gt;
Desactivar y reactivar su módulo.&lt;br /&gt;
&lt;br /&gt;
Ir la página de inicio de Dolibarr. Ver el código de la página HTML.&lt;br /&gt;
&lt;br /&gt;
Debería ver en el encabezado HTML, una línea de declaración de su hoja de estilos.&lt;br /&gt;
&lt;br /&gt;
== Definir sus funciones Javascript (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuando&#039;&#039;&#039;: Si en sus pantallas en PHP utiliza funciones de Javascript no disponibles en estandard (archivo lib_head.js)&lt;br /&gt;
&lt;br /&gt;
Si en sus pantallas en PHP utiliza funciones javascript, es necesario asegurarse de que las funciones declaradas en un archivo javascript &#039;&#039;&#039;htdocs/mimodulo/js/monmodule.js&#039;&#039;&#039; sea cargado en la cabecera del head html.&lt;br /&gt;
&lt;br /&gt;
Para pedir a Dolibarr que gestione en la generación de la sección header la inclusión de uno de sus archivos javascript, es necesario proporcionar como parámetro a la función llxHeader(), al inicio de su página, la URL hacia el js a incluir.&lt;br /&gt;
&lt;br /&gt;
Ejemplo para la página /htdocs/mimodulo/mapage.php :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
require(&#039;../main.inc.php&#039;);&lt;br /&gt;
$morejs=array(&amp;quot;/mimomulo/js/monmodule.js&amp;quot;);&lt;br /&gt;
llxHeader(&#039;&#039;,&#039;Titulo&#039;,&#039;&#039;,&#039;&#039;,&#039;&#039;,&#039;&#039;,$morejs,&#039;&#039;,0,0); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ejecutar código sobre un evento Dolibarr (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo:&#039;&#039;&#039; 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 &#039;&#039;&#039;disparador (triggers)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Véase también [[Interfaces Dolibarr hacia el exterior]] e [[Interfaces del Exterior hacia Dolibarr]]&lt;br /&gt;
&lt;br /&gt;
== Insertar su código usando los hooks de Dolibarr (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039;: Cuando desee cambiar o añadir otro tipo de código en un evento de negociado (véase lel capítulo anterior para esto).&lt;br /&gt;
&lt;br /&gt;
Véase la página [[El sistema Hooks]].&lt;br /&gt;
&lt;br /&gt;
== Añadir un módulo de numeración (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039;: Si quiere añadir una regla de numeración no cubierta por los módulos por defecto.&lt;br /&gt;
&lt;br /&gt;
Véase la página [[Crear un módulo de numeración]].&lt;br /&gt;
&lt;br /&gt;
== Añadir un nuevo módulo de documento (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039;: Si quiere añadir un nuevo modelo de documento.&lt;br /&gt;
&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
== Añadir un tema (opcional) ==&lt;br /&gt;
&#039;&#039;&#039;Cuándo&#039;&#039;&#039;: Si quiere un interface con colores personalizados.&lt;br /&gt;
&lt;br /&gt;
Véase la página [[Temas]].&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Algunas reglas de código =&lt;br /&gt;
Las reglas de código a seguir se definen en la [[Documentación Desarrolladores| Documentación para desarrolladores]], concretamente en la sección &amp;quot;Lenguaje&amp;quot; del capítulo de &amp;quot;Información General&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Utilización de MDA =&lt;br /&gt;
Un método para generar un módulo funcional desde UML se encuentra en curso de puesta a punto. Más información en la página [[UML2Dolibarr - Crear un módulo usando MDA]].&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Crear un paquete para liberar e instalar su módulo =&lt;br /&gt;
Este proceso debe ser usado para fabricar un paquete con el fin de enviarlo a la tienda oficial http://www.dolistore.com.&lt;br /&gt;
&lt;br /&gt;
También puede usarlo para distribuir fácilmente su módulo vía su propio método de distribución.&lt;br /&gt;
&lt;br /&gt;
* Vaya al directorio &#039;&#039;&#039;/build&#039;&#039;&#039; y copie el archivo &#039;&#039;&#039;makepack-dolibarrmodules.conf&#039;&#039;&#039; como &#039;&#039;&#039;makepack-mimodulo.conf&#039;&#039;&#039;. 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).&lt;br /&gt;
&lt;br /&gt;
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...)&lt;br /&gt;
* Lance el script vía Perl (necesita la versión 5.0. o superiores de Perl)&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 perl makepack-dolibarrmodule.pl&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El script le pide el nombre de su módulo, su versión mayor y menor. Se va a crear un fichero &#039;&#039;&#039;mimodulo.zip&#039;&#039;&#039;, que incluirá su módulo listo para ser liberado.&lt;br /&gt;
* La persona que reciba su módulo deberá ubicar el archivo en el directorio raíz de Dolibarr y ejecutar el comando:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 tar -xvf monmodule.zip&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 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 &amp;quot;Submit a product&amp;quot;).&lt;br /&gt;
** Si su módulo está correctamente realizado, será rápidamente validado.&lt;br /&gt;
** 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).&lt;/div&gt;</summary>
		<author><name>Nnicolashr</name></author>
	</entry>
</feed>