<?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=ShengGang</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=ShengGang"/>
	<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php/Special:Contributions/ShengGang"/>
	<updated>2026-11-13T01:49:06Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.17</generator>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=%E4%B8%9A%E5%8A%A1%E5%AF%B9%E8%B1%A1&amp;diff=58884</id>
		<title>业务对象</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=%E4%B8%9A%E5%8A%A1%E5%AF%B9%E8%B1%A1&amp;diff=58884"/>
		<updated>2023-11-29T06:16:25Z</updated>

		<summary type="html">&lt;p&gt;ShengGang: /* 业务对象之间的链接 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- BEGIN interlang links --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Do NOT edit this section&lt;br /&gt;
     Links below are automatically managed by PolyglotBot&lt;br /&gt;
     You can edit links on the English source page : Business_Objects --&amp;gt;&lt;br /&gt;
[[en:Business_Objects]]&lt;br /&gt;
[[fr:Objets_métiers]]&lt;br /&gt;
[[es:Objetos_de_negociado]]&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Template开发文档}}&lt;br /&gt;
&lt;br /&gt;
=业务对象（简称‘对象’）=&lt;br /&gt;
所有业务对象都由从 CommonObject 类（在core/class/commonobject.class.php文件中定义）继承的PHP类定义。&lt;br /&gt;
&lt;br /&gt;
要查找与您感兴趣的业务对象对应的类，请浏览Dolibarr的文件树，查找文件 &#039;&#039;&#039;*/class/*.class.php&#039;&#039;&#039;，因为所有类都位于与对象相关的目录的 class 子目录中。例如：&lt;br /&gt;
&lt;br /&gt;
*对于合作方 htdocs/societe/class/societe.class.php&lt;br /&gt;
*对于客户发票 htdocs/compta/facture/class/facture.class.php&lt;br /&gt;
*对于供应商发票 htdocs/fourn/class/fournisseur.facture.class.php&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
每个业务类都有4种CRUD方法，用于执行数据库读取或更新：&lt;br /&gt;
&lt;br /&gt;
*创建（C表示创建）：create()&lt;br /&gt;
*读取（R表示读取）：fetch()&lt;br /&gt;
*更改（U代表更新）：update()&lt;br /&gt;
*删除（D代表删除）：delete()&lt;br /&gt;
&lt;br /&gt;
请参阅下面的示例...&lt;br /&gt;
&lt;br /&gt;
=全部对象=&lt;br /&gt;
&lt;br /&gt;
[https://doxygen.dolibarr.org/inherits.html 类的继承]&lt;br /&gt;
&lt;br /&gt;
*Societe&lt;br /&gt;
*Product&lt;br /&gt;
*Account&lt;br /&gt;
*AccountingAccount&lt;br /&gt;
&lt;br /&gt;
=业务对象之间的链接=&lt;br /&gt;
一些业务对象相互关联。这是在 Dolibarr 中通过 [[Table llx_element_element|表llx_element_element]] 完成的。但是，您不必读取此表来检索链接到另一个表的对象。下面的代码部分显示了如何执行此操作：&lt;br /&gt;
&lt;br /&gt;
如果是 Dolibarr 3.1及更高版本&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// get invoices from an already loaded order:&lt;br /&gt;
// 从已加载的订单中获取发票：&lt;br /&gt;
$result = $order-&amp;gt;fetchObjectLinked($order-&amp;gt;id, &#039;commande&#039;, null, &#039;facture&#039;);&lt;br /&gt;
if ($result &amp;lt;= 0) {&lt;br /&gt;
    // handle error&lt;br /&gt;
}&lt;br /&gt;
// important notice : the newly populated arrays are associative. Keys are llx_element_element row ids.&lt;br /&gt;
// 重要提示：新填充的数组是关联的。主键是llx_element_element的row ids。&lt;br /&gt;
&lt;br /&gt;
// now if we expect only one linked invoice:&lt;br /&gt;
// 现在，如果我们预计只有一个相关联的发票：&lt;br /&gt;
&lt;br /&gt;
// WRONG way to get it ($invoice_id will be NULL): &lt;br /&gt;
// 错误的获取方式（$invoice_id将为NULL）：&lt;br /&gt;
$invoice_id = $order-&amp;gt;linkedObjectsIds[&#039;facture&#039;][0]&lt;br /&gt;
&lt;br /&gt;
// CORRECT way ($invoice_id will hold the ID):&lt;br /&gt;
// 正确的方式（$invoice_id将保存id）：&lt;br /&gt;
$invoice_id = array_values($order-&amp;gt;linkedObjectsIds[&#039;facture&#039;])[0]&lt;br /&gt;
&lt;br /&gt;
// Better (if there are more than one linked invoices) :&lt;br /&gt;
// 更好的方式（如果有多个相关联的发票）：&lt;br /&gt;
foreach ($order-&amp;gt;linkedObjectsIds[&#039;facture&#039;] as $element_element_id =&amp;gt; $facture_id) {&lt;br /&gt;
    // process it(处理它)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果是 Dolibarr 3.1 之前的版本&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// This load the array linked_object with objects that link to this one&lt;br /&gt;
$object-&amp;gt;load_object_linked($object-&amp;gt;id, $object-&amp;gt;element);&lt;br /&gt;
// To load array linked_object with objects that are linked by this one&lt;br /&gt;
$object-&amp;gt;load_object_linked($object-&amp;gt;id, $object-&amp;gt;element);&lt;br /&gt;
&lt;br /&gt;
// Then choose id with objects type you need&lt;br /&gt;
$org_order_array = $object-&amp;gt;linked_object[&amp;quot;commande&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
// Now use them&lt;br /&gt;
$thelinkedobjectid = $org_order_array[0];&lt;br /&gt;
// new order instance&lt;br /&gt;
$thelinkedobject = new Commande($object-&amp;gt;db);&lt;br /&gt;
// load the object&lt;br /&gt;
$thelinkedobject-&amp;gt;fetch($thelinkedobjectid);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// 将数组链接到与本对象相联系的的对象上。&lt;br /&gt;
$object-&amp;gt;load_object_linked($object-&amp;gt;id, $object-&amp;gt;element);&lt;br /&gt;
&lt;br /&gt;
// 然后根据需要的对象类型选择ID&lt;br /&gt;
$org_order_array = $object-&amp;gt;linked_object[&amp;quot;commande&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
// 使用&lt;br /&gt;
$thelinkedobjectid = $org_order_array[0];&lt;br /&gt;
// 新订单实例&lt;br /&gt;
$thelinkedobject = new Commande($object-&amp;gt;db);&lt;br /&gt;
// 加载对象&lt;br /&gt;
$thelinkedobject-&amp;gt;fetch($thelinkedobjectid);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=示例=&lt;br /&gt;
&lt;br /&gt;
==创建合作方的示例==&lt;br /&gt;
以下是创建合作方（例如客户公司）的示例：&lt;br /&gt;
&lt;br /&gt;
如果您正在创建一个新脚本或外部脚本，则有必要在其代码的开头执行以下操作：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
include(&#039;/pathofdolibarrhtdocs/master.inc.php&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将初始化 Dolibarr 环境对象（$conf、$db、$lang和$user对象）。如果希望在跟踪中将操作（创建、更新）与特定用户关联，则必须在 include master.inc.php 之后执行：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$user-&amp;gt;fetch(0,&#039;loginuser&#039;);//loginuser 用户进行的该操作&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在我们可以编写业务代码了。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// We declare the class we want to use&lt;br /&gt;
include_once(&#039;/pathofdolibarrhtdocs/societe/class/societe.class.php&#039;);&lt;br /&gt;
&lt;br /&gt;
// We create an instance of object to manipulate&lt;br /&gt;
$mycompany = new Societe($db);&lt;br /&gt;
&lt;br /&gt;
// We set properties on object&lt;br /&gt;
$mycompany-&amp;gt;nom=&#039;Big Brother&#039;;&lt;br /&gt;
$mycompany-&amp;gt;client=1;&lt;br /&gt;
&lt;br /&gt;
// If we want that creation is tagged as done by a particular user &#039;loginuser&#039;,&lt;br /&gt;
// you must uncomment this line to load all characteristics of this user.&lt;br /&gt;
// If we keep the comment, Dolibarr will use null into fields that should store the create or update user.&lt;br /&gt;
// $user-&amp;gt;fetch(&#039;loginuser&#039;);&lt;br /&gt;
&lt;br /&gt;
// We call method to create&lt;br /&gt;
$id=$mycompany-&amp;gt;create($user);&lt;br /&gt;
&lt;br /&gt;
// This is to read/load an already created object&lt;br /&gt;
$mycompany-&amp;gt;fetch($id);&lt;br /&gt;
&lt;br /&gt;
// To update object&lt;br /&gt;
$mycompany-&amp;gt;nom=&#039;Big Brother 2&#039;;&lt;br /&gt;
$mycompany-&amp;gt;update($user);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;注：以上代码，可以编写在card.php文件中。响应操作按键的动作。&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==其他示例==&lt;br /&gt;
&lt;br /&gt;
您可以在 Dolibarr 快照的 &#039;&#039;&#039;dev/samples&#039;&#039;&#039; 目录中找到 Dolibarr 对象操作（创建、读取、修改、删除）的更多示例。&lt;/div&gt;</summary>
		<author><name>ShengGang</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=%E6%A8%A1%E5%9D%97%E5%BC%80%E5%8F%91&amp;diff=58772</id>
		<title>模块开发</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=%E6%A8%A1%E5%9D%97%E5%BC%80%E5%8F%91&amp;diff=58772"/>
		<updated>2023-11-20T03:39:15Z</updated>

		<summary type="html">&lt;p&gt;ShengGang: /* 创建原始PHP屏幕页面 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- BEGIN interlang links --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Do NOT edit this section&lt;br /&gt;
     Links below are automatically managed by PolyglotBot&lt;br /&gt;
     You can edit links on the English source page : Module_development --&amp;gt;&lt;br /&gt;
[[en:Module_development]]&lt;br /&gt;
[[fr:Développement_module]]&lt;br /&gt;
[[es:Desarrollo_de_un_módulo]]&lt;br /&gt;
[[de:Modul_Entwicklung]]&lt;br /&gt;
[[ja:モジュール_開発]]&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Core]]&lt;br /&gt;
[[Category:开发]]&lt;br /&gt;
{{Template用户手册}}&lt;br /&gt;
{{Template开发文档}}&lt;br /&gt;
{{TemplateMainPageZh}}&lt;br /&gt;
&lt;br /&gt;
要创建新模块，需要执行以下几个步骤。本教程旨在向您介绍每一个步骤，以便添加一个模块来扩展Dolibarr的功能，例如添加以下一个或多个功能：&lt;br /&gt;
&lt;br /&gt;
*在数据库中添加新表&lt;br /&gt;
*在菜单中添加您自己的菜单项&lt;br /&gt;
*添加对象和屏幕以输入/查看新表&lt;br /&gt;
*在视图页上添加或删除选项卡/编辑对象（发票、产品、订单、事件等）&lt;br /&gt;
*为内部导出工具添加预定义的导出&lt;br /&gt;
*向主页添加新信息框/widget小组件&lt;br /&gt;
*添加新的替换变量&lt;br /&gt;
*定义新权限&lt;br /&gt;
*自动触发指定 Dolibarr 操作的代码&lt;br /&gt;
*将自定义代码插入 Dolibarr 的钩子位置&lt;br /&gt;
*为所创建的对象的引用添加编号模块（为数据自动编码的模块）&lt;br /&gt;
*添加PDF文档模板&lt;br /&gt;
*添加一个新主题/皮肤&lt;br /&gt;
&lt;br /&gt;
等等...&lt;br /&gt;
&lt;br /&gt;
以下章节介绍了如何以简单的方式手动完成所有这些操作。对于有经验的开发人员来说，使用MDA生成的方法也不错，详见最后一章。&lt;br /&gt;
&lt;br /&gt;
=使用模块生成器构建模块=&lt;br /&gt;
从Dolibarr 9.0开始，您可以使用&amp;quot;模块生成器&amp;quot;（Module Builder）创建模块的主要文件。要激活它 ：&lt;br /&gt;
&lt;br /&gt;
*设置参数 MAIN_FEATURES_LEVEL 的值为 2 ( 设置 / 其他 )（或者修改llx_const表中该项的记录的value值为2）&lt;br /&gt;
&lt;br /&gt;
[[File:企业微信截图 20180725114721.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*在 &#039;&#039;&#039;主页 - 设置 - 设置-模块/应用 多模块工具&#039;&#039;&#039; 中激活“模块生成器”（ModuleBuilder）&lt;br /&gt;
&lt;br /&gt;
[[File:激活modulebuilder.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*点击屏幕右上角菜单栏中出现的&#039;Bug&#039;图标&lt;br /&gt;
&lt;br /&gt;
[[File:Buglogo.png]]&lt;br /&gt;
&lt;br /&gt;
*运行的ModuleBuilder界面如下：&lt;br /&gt;
&lt;br /&gt;
[[File:Modulebuilder.png|800px]]&lt;br /&gt;
&lt;br /&gt;
=外部模块模板示例=&lt;br /&gt;
一个Dolibarr外部模块的模板/框架：[https://github.com/Dolibarr/dolibarr/tree/develop/htdocs/modulebuilder/template Github Dolibarr模块]&lt;br /&gt;
&lt;br /&gt;
=创建模块=&lt;br /&gt;
以下章节描述了创建Dolibarr模块所需的操作。无论模块的用途如何，第一章描述的操作都是必须要完成的，后续章节描述的操作是否要做将取决于模块的需求。 &lt;br /&gt;
&lt;br /&gt;
==创建模块描述符（必做）==&lt;br /&gt;
&#039;&#039;&#039;何时&#039;&#039;&#039;：无论其用途如何，开发扩展模块时都是强制性的。&#039;&#039;&#039;从Dolibarr 9.0开始，您可以使用“模块生成器”创建模块的描述符&#039;&#039;&#039;。该工具仍处于开发和完善阶段，但其已经可以使用。&lt;br /&gt;
&lt;br /&gt;
===使用模块生成器创建描述符===&lt;br /&gt;
&lt;br /&gt;
*通过单击&amp;quot;Bug&amp;quot;图标启动模块生成器&lt;br /&gt;
&lt;br /&gt;
[[File:Mod_builder_3.png|400px]]&lt;br /&gt;
&lt;br /&gt;
*在下图“模块名称”处输入不含空格的模块名称（模块名称不得包含下划线 ：_），然后单击&amp;quot;创建&amp;quot;按钮。&lt;br /&gt;
&lt;br /&gt;
[[file:模块名.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*已初始化具有第一个文件的模块。然后，您可以更改模块描述符的参数：&lt;br /&gt;
&lt;br /&gt;
[[File:Mod_builder_5.png|400px]]&lt;br /&gt;
&lt;br /&gt;
===备选方案：手动创建描述符（不使用模块生成器）===&lt;br /&gt;
第一步是创建模块描述文件（描述符）。为此：&lt;br /&gt;
&lt;br /&gt;
*创建目录 &#039;&#039;&#039;htdocs/custom/&#039;&#039;mymodule&#039;&#039;/core/modules&#039;&#039;&#039; 。&lt;br /&gt;
*进入目录 &#039;&#039;&#039;htdocs/modulebuilder/template/core/modules&#039;&#039;&#039; 将文件 modMyModule.class.php 复制到目录 &#039;&#039;&#039;htdocs/custom/&#039;&#039;mymodule&#039;&#039;/core/modules&#039;&#039;&#039; 中。&lt;br /&gt;
*重命名mod&#039;&#039;&#039;MyModule&#039;&#039;&#039;.class.php文件，只需修改&#039;&#039;&#039;MyModule&#039;&#039;&#039;部分即可（文件必须以mod开头）&lt;br /&gt;
&lt;br /&gt;
然后，编辑此文件的内容：&lt;br /&gt;
&lt;br /&gt;
*将所有&#039;&#039;modMyModule&#039;&#039;替换为与模块用途相对应的值。此值必须始终以“&#039;&#039;&#039;mod&#039;&#039;&#039;”开头，并且仅包含&#039;&#039;&#039;字母字符&#039;&#039;&#039;。&lt;br /&gt;
*通过 $this-&amp;gt;numero = &#039;&#039;100000&#039;&#039; 设置模块ID。为避免冲突，您可以参考以下页面查找已分配的ID：[[List of modules id|模块ID清]]&amp;lt;nowiki/&amp;gt;[[List of modules id|单]] 。&lt;br /&gt;
*可能还需要修改构造函数中定义的其他变量（有关其含义，请参阅[[主模块代码框架|类文件代码]]中的注释）。&lt;br /&gt;
&lt;br /&gt;
模块的描述文件（描述符）已准备就绪。请参阅下一步“测试描述符”以激活您的新模块。&lt;br /&gt;
&lt;br /&gt;
===测试描述符===&lt;br /&gt;
&lt;br /&gt;
启动Dolibarr并进入 &#039;&#039;&#039;主页-&amp;gt;设置-&amp;gt;模块/应用&#039;&#039;&#039; 页面，您应该会看到一个新行，其中包含新模块以及是否激活它的选项（浏览每个模块类别的所有选项卡，直到找到它）。&lt;br /&gt;
&lt;br /&gt;
$this-&amp;gt;special 的值决定了模块位于哪个类别选项卡中。&lt;br /&gt;
&lt;br /&gt;
注意：如果在模块描述符中设置了属性 version ，则应在 &#039;&#039;&#039;模块/应用&#039;&#039;&#039; 页面看到包含新模块的新行以及是否激活它的选项。如果将属性 version 设置为“develop”或“experiental”，若要查看模块，必须先进入页面 &#039;&#039;&#039;“主页-&amp;gt;设置-&amp;gt;其他设置&#039;&#039;&#039;”，并将参数 MAIN_FEATURES_LEVEL 设置为 1 以查看“实验性”(experimental)模块，或设置为 2 以查看“开发”(development)模块。&lt;br /&gt;
&lt;br /&gt;
===模块的名称===&lt;br /&gt;
&lt;br /&gt;
模块名称不得包含下划线或下划线：_&lt;br /&gt;
==新模块的树视图（必需）==&lt;br /&gt;
&lt;br /&gt;
以下是组织模块文件时要遵循的树结构（如果使用ModuleBuilder生成文件，则自动采用此树结构）。&lt;br /&gt;
&lt;br /&gt;
注：zip 文件也必须符合此规则，只有第二行是强制性的。&lt;br /&gt;
&lt;br /&gt;
{{Template模块目录树}}&lt;br /&gt;
&lt;br /&gt;
一个好的Dolibarr扩展模块的模板/框架：[https://github.com/Dolibarr/dolibarr/tree/develop/htdocs/modulebuilder/template GitHub Dolibarr Module Modèle]&lt;br /&gt;
&lt;br /&gt;
==创建数据表和 PHP DAO 类 (可选)==&lt;br /&gt;
&#039;&#039;&#039;何时：&#039;&#039;&#039;如果您的模块需要管理自己的数据&lt;br /&gt;
&lt;br /&gt;
===创建 .sql 文件===&lt;br /&gt;
如果您的模块要处理在Dolibarr标准版中不存在的数据，则需要自定义数据库表来存储这些数据。&lt;br /&gt;
&lt;br /&gt;
在模块的目录中创建&#039;&#039;&#039;sql&#039;&#039;&#039;子目录（&#039;&#039;&#039;mymodule/sql&#039;&#039;&#039;），用于放置要创建的sql脚本（使用ModuleBuilder，在&amp;quot;对象&amp;quot;选项卡中创建新对象后，将自动执行此步骤）。&lt;br /&gt;
&lt;br /&gt;
接下来，检查模块描述符文件，在 &#039;&#039;&#039;init&#039;&#039;&#039; 函数中是否包括行：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight 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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
并且未被注释掉。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;应遵循的规则&#039;&#039;：&lt;br /&gt;
&lt;br /&gt;
*根据每个表1个文件的原则添加表的创建命令文件，命名为 &#039;&#039;&#039;llx_mytable.sql&#039;&#039;&#039;（用于表），可能还附带 &#039;&#039;&#039;llx_mytable.key.sql&#039;&#039;&#039; 文件（用于索引或外键）。示例请参阅 &#039;&#039;&#039;install/mysql/tables&#039;&#039;&#039; 中的现有文件。&lt;br /&gt;
*SQL字段的推荐类型和名称在 [[https://wiki.dolibarr.org/index.php/Langages_et_normes#R.C3.A8gles_de_codage_SQL]] 页中定义。&lt;br /&gt;
*管理数据：对于添加/操作数据的命令，它们都必须位于同一目录 &#039;&#039;&#039;/mymodule/sql/&#039;&#039;&#039; 中名为 &#039;&#039;&#039;data.sql&#039;&#039;&#039; 的文件中。&lt;br /&gt;
*不要使用双引号（如 &amp;quot;string&amp;quot;），因为双引号（&amp;quot;）在 PostGreSQL 中有特殊的含义&lt;br /&gt;
&lt;br /&gt;
data.sql文件内容示例：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight 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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
文件中的SQL语句必须对 &#039;&#039;&#039;mysql&#039;&#039;&#039; 数据库有效。请注意：不需要维护其他数据库类型的文件。它们由数据库驱动程序动态读取和转换。&lt;br /&gt;
&lt;br /&gt;
===测试 .sql 文件===&lt;br /&gt;
&lt;br /&gt;
文件准备就绪后，您可以返回Dolibarr的模块管理页面，禁用模块，删除数据库表（如果它们已经存在），然后重新激活模块。正常情况下，应该可以通过激活模块来重新创建表。否则，请手动检查脚本，或查看Dolibarr日志。&lt;br /&gt;
&lt;br /&gt;
===生成 PHP DAO 表访问类===&lt;br /&gt;
创建对象时，ModuleBuilder会自动生成对象的PHP DAO类文件。&lt;br /&gt;
&lt;br /&gt;
如果不使用模块生成器，您将在模块框架文件&#039;&#039;&#039;htdocs/modulebuilder/templates/class/myobject.class.php&#039;&#039;&#039; 中找到示例。&lt;br /&gt;
&lt;br /&gt;
在这个类中，已经有可调用的 CRUD（Create/Read/Update/Delete）方法来执行表行数据的插入、获取（select）、更新和删除。修改此文件以使用正确的模块名和表名，并将该文件放在模块的 &#039;&#039;&#039;class&#039;&#039;&#039; 子目录中。若使用 &#039;&#039;&#039;ModuleBuilder&#039;&#039;&#039; 只需点击几下鼠标即可完成此操作。&lt;br /&gt;
&lt;br /&gt;
====使用ModuleBuilder生成PHP DAO类文件====&lt;br /&gt;
&lt;br /&gt;
*使用ModuleBuilder生成PHP DAO类文件，简单至在下图中选择&#039;对象&#039;选项卡，输入&#039;对象名&#039;，然后点击创建，即可生成相关一切文档。&lt;br /&gt;
&lt;br /&gt;
[[File:新对象.png|800px]]&lt;br /&gt;
&lt;br /&gt;
参见[[ModuleBuilder用户手册]]&lt;br /&gt;
==选项卡显示(可选)==&lt;br /&gt;
&lt;br /&gt;
===添加或删除对象表单上的选项卡===&lt;br /&gt;
&#039;&#039;&#039;何时：&#039;&#039;&#039;在标准对象（发票、订单、报价单、会员…）的表单中添加您自己的选项卡&lt;br /&gt;
&lt;br /&gt;
要执行此操作，请打开之前创建的模块描述符文件并编辑 $this-&amp;gt;tabs 数组：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
	// 用于在新tabs中添加新页面或删除现有页面的数组&lt;br /&gt;
	$this-&amp;gt;tabs = array(&#039;objecttype:+tabname1:Title1:mylangfile@mymodule:$user-&amp;gt;rights-&amp;gt;mymodule-&amp;gt;read:/mymodule/mypagetab1.php?id=__ID__&#039;    // 增加一个由code tabname1标识的新tab&lt;br /&gt;
                            &#039;objecttype:+tabname2:Title2:mylangfile@mymodule:$user-&amp;gt;rights-&amp;gt;mymodule-&amp;gt;read:/mymodule/mypagetab2.php?id=__ID__&#039;,   // 增加一个由code tabname2标识的新tab&lt;br /&gt;
                            &#039;objecttype:-tabname&#039;);                                                     // 删除一个由code tabname标识的现有选项卡&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
该表应包含字符串列表，每个字符串表示一个新选项卡。字符串格式由6个部分组成，由“：”分隔&lt;br /&gt;
&lt;br /&gt;
*第1部分：选项卡的元素类型（objecttype），只能是下列值之一：&lt;br /&gt;
{{TemplateModuleTabs-zh}}&lt;br /&gt;
&lt;br /&gt;
*第2部分：用于标识要添加（以+开头）或删除（以-开头）的选项卡的codeName&lt;br /&gt;
*第3部分：选项卡的标题。这可以是硬编码的字符串，或者是更好的，lang文件中的翻译代码。&lt;br /&gt;
*第4部分：文件“*.lang”的名称（不带.lang扩展名），此文件内有翻译代码和要显示的语言字符串之间的对应关系。如果这个文件名后面跟@mymodule，则Dolibarr将在模块自己的 lang 目录中查找翻译文件，即htdocs/mymodule/langs/code_CODE/mymodule.lang，否则Dolibarr将查找翻译文件htdocs/langs/code_CODE/mylangfile.lang。&lt;br /&gt;
*第5部分：判断选项卡是否可见的条件。设置为“1”，会使其始终可见。&lt;br /&gt;
*第6部分：单击选项卡时要显示的页面的URL。字符串“__ID__”将自动替换为相关元素的ID。&lt;br /&gt;
&lt;br /&gt;
要使声明生效，必须禁用并重新激活该模块。&lt;br /&gt;
&lt;br /&gt;
要使用来自数据库的数据填充选项卡的内容，请参阅下一章。&lt;br /&gt;
&lt;br /&gt;
为了获取现有选项卡的名称“tabname”，您必须检查文件“core/lib/module.lib.php”的函数“product_prepare_head”中使用的名称，该文件对应于“$head[$h][2]”部分。&lt;br /&gt;
&lt;br /&gt;
===将对象的标准选项卡添加到其自己的表单页面===&lt;br /&gt;
&#039;&#039;&#039;何时：&#039;&#039;&#039;在您自己的表单中添加标准对象（产品、合作方…）的选项卡&lt;br /&gt;
&lt;br /&gt;
必须遵循以下步骤：&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. 在代码中包含定义相关函数的文件&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
对于每种对象选项卡，都有两个文件需要使用下列语句：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;require_once($url_fichier) ;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下是要包含的文件示例（DOL_DOCUMENT_ROOT 对应于 dolibarr/htdocs/ 文件夹）：&lt;br /&gt;
&lt;br /&gt;
*合作方(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;
*产品(product) :&lt;br /&gt;
**DOL_DOCUMENT_ROOT/product/class/product.class.php&lt;br /&gt;
**DOL_DOCUMENT_ROOT/core/lib/product.lib.php&lt;br /&gt;
*发票 (invoice) :&lt;br /&gt;
**DOL_DOCUMENT_ROOT/compta/facture/class/facture.class.php&lt;br /&gt;
**DOL_DOCUMENT_ROOT/core/lib/invoice.lib.php&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. 创建并加载要在自己的表单中显示的标准对象&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
创建所需类的对象，并从数据库中获取对象数据。为此，您必须使用相应类的fetch()函数，并将从URL（/mytab.php?id=1）获取的对象id作为参数传递。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;例如：&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$id=GETPOST(&#039;id&#039;,&#039;int&#039;);&lt;br /&gt;
$ref=GETPOST(&#039;ref&#039;,&#039;alpha&#039;);&lt;br /&gt;
$product = new Product($db) ;&lt;br /&gt;
$result = $product-&amp;gt;fetch($id,$ref) ; // Test $result to check the database read is ok&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3. 检索与所选实体对应的选项卡列表&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
使用函数XXX_prepare_head($obj)（其中XXX是实体名称）创建一个包含要显示的选项卡定义的数组。要传递的参数是要显示选项卡的对象。&lt;br /&gt;
&lt;br /&gt;
返回的数组由以下内容组成：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$head        // tabs的数组&lt;br /&gt;
$head[$h]    // Element to describe one tab.&lt;br /&gt;
$head[$h][0] // Url of page to show when you click on tab&lt;br /&gt;
$head[$h][1] // Title of tab&lt;br /&gt;
$head[$h][2] // Code name to identify the tab&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;示例：&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$head = product_prepare_head($product, $user) ; // 参数 $user 是要显示选项卡的对象，这就是&amp;quot;产品&amp;quot;对象为&amp;quot;user&amp;quot;对象准备的所有可用的选项卡的数组。&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
某些函数上不存在$user参数&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4. 在您的页面上显示选项卡&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
使用dol_fiche_head()函数，该函数显示由 XX_prepare_head() 返回的 $head 数组中包含的选项卡。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight 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  // tabs的数组，上面称为$head&lt;br /&gt;
//$active // 活动选项卡（输入模块文件中定义的选项卡名称，或$head[$h][2]中包含的名称）。此选项卡将突出显示&lt;br /&gt;
//$title  // 要显示的标题（显示在无法单击的特殊选项卡中）&lt;br /&gt;
//$notab&lt;br /&gt;
//$picto  // 要显示到标题中的图片的名称。可能的值为：&lt;br /&gt;
//            product&lt;br /&gt;
//            service&lt;br /&gt;
//            company&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
此函数将显示所需的选项卡，并打开一个html元素&#039;&#039;&amp;lt; div class=&amp;quot;&amp;quot; &amp;gt;&#039;&#039;，该元素对应于选项卡下方的显示区域（如果参数 $notab=0）。要关闭显示区域，只需在PHP代码中使用关闭元素&amp;lt;nowiki&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/nowiki&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
注：相关的更多细节，请参阅 [http://www.dolibarr.fr/doxygen/ Doxygen文档] 或直接参考 Dolibarr 代码。&lt;br /&gt;
&lt;br /&gt;
==创建PHP屏幕页面（可选）==&lt;br /&gt;
&#039;&#039;&#039;何时&#039;&#039;&#039;：如果新模块的目的是添加一个需要新屏幕页面的功能。&lt;br /&gt;
&lt;br /&gt;
===创建原始PHP屏幕页面===&lt;br /&gt;
随后，您可以使用 &#039;&#039;&#039;modulebuilder&#039;&#039;&#039; 目录中提供的示例模板（&#039;&#039;&#039;myobject_page.php&#039;&#039;&#039;）创建基于表数据的PHP页面（有关命令行脚本的开发，请参阅 [[脚本开发]] ）。同样，如果您使用的是 ModuleBuilder，则在初始化对象时会自动创建页面实例（清单、创建页面、Notes选项卡等）。&lt;br /&gt;
&lt;br /&gt;
要创建新的用户屏幕页面，请创建特定于模块的 &#039;&#039;&#039;htdocs&#039;&#039;&#039; 子目录（如果尚未创建）（如 &#039;&#039;&#039;htdocs/mymodule&#039;&#039;&#039; ），以便在其中放置要创建的页面。&lt;br /&gt;
&lt;br /&gt;
从复制文件 &#039;&#039;&#039;myobject_page.php&#039;&#039;&#039; 作为开始。编辑该文件，以便能正确找到并加载 main.inc.php 文件：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
// 加载Dolibarr环境&lt;br /&gt;
$res=0;&lt;br /&gt;
// 尝试include在CONTEXT_DOCUMENT_ROOT（不总是定义的）中定义的已知web根目录中的main.inc.php&lt;br /&gt;
if (! $res &amp;amp;&amp;amp; ! empty($_SERVER[&amp;quot;CONTEXT_DOCUMENT_ROOT&amp;quot;])) $res=@include($_SERVER[&amp;quot;CONTEXT_DOCUMENT_ROOT&amp;quot;].&amp;quot;/main.inc.php&amp;quot;);&lt;br /&gt;
// 尝试include由SCRIPT_FILENAME计算的web根检测到web根的main.inc.php&lt;br /&gt;
$tmp=empty($_SERVER[&#039;SCRIPT_FILENAME&#039;])?&#039;&#039;:$_SERVER[&#039;SCRIPT_FILENAME&#039;];$tmp2=realpath(__FILE__); $i=strlen($tmp)-1; $j=strlen($tmp2)-1;&lt;br /&gt;
while($i &amp;gt; 0 &amp;amp;&amp;amp; $j &amp;gt; 0 &amp;amp;&amp;amp; isset($tmp[$i]) &amp;amp;&amp;amp; isset($tmp2[$j]) &amp;amp;&amp;amp; $tmp[$i]==$tmp2[$j]) { $i--; $j--; }&lt;br /&gt;
if (! $res &amp;amp;&amp;amp; $i &amp;gt; 0 &amp;amp;&amp;amp; file_exists(substr($tmp, 0, ($i+1)).&amp;quot;/main.inc.php&amp;quot;)) $res=@include(substr($tmp, 0, ($i+1)).&amp;quot;/main.inc.php&amp;quot;);&lt;br /&gt;
if (! $res &amp;amp;&amp;amp; $i &amp;gt; 0 &amp;amp;&amp;amp; file_exists(dirname(substr($tmp, 0, ($i+1))).&amp;quot;/main.inc.php&amp;quot;)) $res=@include(dirname(substr($tmp, 0, ($i+1))).&amp;quot;/main.inc.php&amp;quot;);&lt;br /&gt;
// 尝试include使用相对路径的main.inc.php&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;);&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;);&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;);&lt;br /&gt;
if (! $res) die(&amp;quot;Include of main fails&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如您所见，其多次尝试加载 main.inc.php（或 master.inc.php）文件。目标是在尽可能多的场景下取得成功。最少为2行：一行用于尝试将 master/main.inc.php 文件加载到 dolibarr 的根目录中，另一行用于尝试加载该文件，以支持模块部署在“custom”目录中的场景。但你可能不得不处理更多的场景。上面提供的示例应该能够在几乎所有场景/配置下加载 main/master.inc.php 文件。&lt;br /&gt;
&lt;br /&gt;
在3.2之后，为所有版本的Dolibarr开发的扩展模块可以放置在不同的文件夹中，而不仅仅是“htdocs”，如“htdocs/custom”，为了不必修改模块的源代码，我们要做几个包含，所以这个规则必须被所有模块使用。&lt;br /&gt;
&lt;br /&gt;
请注意，您可以根据文件相对于模块目录树的深度添加更多的“../”。&lt;br /&gt;
&lt;br /&gt;
main.inc.php文件加载了技术环境变量和权限。然后设置以下对象变量：&lt;br /&gt;
&lt;br /&gt;
*$user    包含用户属性 + 权限的对象&lt;br /&gt;
*$conf    包含 Dolibarr 设置的对象&lt;br /&gt;
*$db       包含数据库连接句柄的对象&lt;br /&gt;
*$langs   包含用户语言的对象&lt;br /&gt;
&lt;br /&gt;
然后输入代码以显示页面。&lt;br /&gt;
&lt;br /&gt;
*在不知道从何处调用文件的情况下，使用Dolibarr函数dol_include_once()（而不是直接使用include_once）包含专用于模块的类或库&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;例如：&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
dol_include_once(&#039;/mymodule/class/myclass.class.php&#039;, &#039;MyClass&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*另一方面，Dolibarr提供的标准类将使用 require-once 直接调用，语法如下：&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;例如：&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight 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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
原因是，尽管dol_include_once很方便，却因它会扫描每个备用路径目录以找到文件，所以它的性能也很差，因为它会在每次调用时生成访问和磁盘搜索（实际上，PHP集成了已读文件的缓存，但未集成“未找到”文件的缓存）。由于给定的文件只可能存在于一个树中，所以总会有一个无此文件的备用树，这会产生对硬盘的不必要访问，从而影响性能。与Dolibarr的内部文件一样，我们总是知道确切的路径，应该首选带有该直接路径的 require_once）。&lt;br /&gt;
&lt;br /&gt;
===在已存在的表单上增加新字段===&lt;br /&gt;
您可能希望提供一个模块，将更多字段添加到某些元素的表单（录入和展示）中。&lt;br /&gt;
&lt;br /&gt;
一个繁琐（但不太糟糕）的解决方案可能是替换用于创建元素的所有页面（这意味着禁用“新建元素”菜单项并添加您的菜单项，并禁用显示元素的选项卡，以替换选项卡，该选项卡是您自己的完整页面（从原始页面复制/粘贴），使其与原始页面相同，但被修改为添加字段并将添加的数据存储到您自己的表中）。如果此解决方案适合您，请前往菜单 [[#Define your entries in menu (optional)]] 和 [[#The tab management (optional)]]（本解决方案更强大，因为您可以在页面中改变你想要改变的一切）。&lt;br /&gt;
&lt;br /&gt;
我们将在这里描述另一种解决方案，该解决方案仅适用于在现有字段的末尾“添加字段”，下面以元素“category”作为示例，但您可以将本教程转换为发票、报价单...&lt;br /&gt;
&lt;br /&gt;
*首先，添加一个由您的模块拥有的表，以存储新字段的值。此表将有一个名为“rowid”的列（将包含与元素表的字段rowid相同的值+每一个要添加的新字段。然后为这个新表创建一个具有CRUD（Create/Read/Update/Delete）方法的类。对于这两项任务，请返回前一章[[#创建数据表和表的PHP类文件 (可选)]]。&lt;br /&gt;
*其次，在模块中添加一个钩子，以将新字段添加到表单中。有关使用钩子的通用文档，请参阅[[Hooks_system#Implement_the_Hook]]章节。&lt;br /&gt;
&lt;br /&gt;
如果遵循本教程，则必须执行以下操作才能将字段添加到 category 表单中：&lt;br /&gt;
{{ToComplete}}&lt;br /&gt;
&lt;br /&gt;
===用钩子添加/替换部分字段===&lt;br /&gt;
请参阅  [[钩子系统#实现钩子]] 章节，了解如何使用Dolibarr现有的钩子在Dolibarr钩子位置添加/替换代码。&lt;br /&gt;
&lt;br /&gt;
===访问数据库===&lt;br /&gt;
如果您需要对自己添加的表进行基本变更，请使用之前生成的类，其中包含用于此目的的方法。&lt;br /&gt;
&lt;br /&gt;
但是，如果您希望在没有专用PHP对象的情况下访问表，这仍然是可能的（例如，检索记录列表）。在这种情况下，请考虑以下示例：&lt;br /&gt;
&lt;br /&gt;
对于插入、更新或删除：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$db-&amp;gt;begin();   // Start transaction&lt;br /&gt;
$db-&amp;gt;query(&amp;quot;My SQL request insert, update or delete&amp;quot;);&lt;br /&gt;
$db-&amp;gt;commit();       // Validate transaction&lt;br /&gt;
or $db-&amp;gt;rollback()  // Cancel transaction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
对于读取:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$resql=$db-&amp;gt;query(&amp;quot;My select request&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===定义页面样式===&lt;br /&gt;
为了使页面的外观与 Dolibarr 主题保持一致，必须使用 Dolibarr CSS 样式。&lt;br /&gt;
&lt;br /&gt;
例如：&lt;br /&gt;
&lt;br /&gt;
*在表格标题行的&#039;&#039;tr&#039;&#039;和&#039;&#039;td&#039;&#039;标签上使用 class=&amp;quot;&#039;&#039;&#039;liste_titre&#039;&#039;&#039;&amp;quot;&lt;br /&gt;
*在表格数据行的&#039;&#039;tr&#039;&#039;和&#039;&#039;td&#039;&#039;标签上使用 class=&amp;quot;&#039;&#039;&#039;pair&#039;&#039;&#039;&amp;quot; 或 class=&amp;quot;&#039;&#039;&#039;impair&#039;&#039;&#039;&amp;quot;&lt;br /&gt;
*在所有输入域（&#039;&#039;input, select, textarea&#039;&#039;...）上使用 class=&amp;quot;&#039;&#039;&#039;flat&#039;&#039;&#039;&amp;quot;&lt;br /&gt;
*在所有 &#039;&#039;type=&amp;quot;submit&amp;quot;&#039;&#039; 的 &#039;&#039;input&#039;&#039; 对象上使用 class=&amp;quot;&#039;&#039;&#039;button&#039;&#039;&#039;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===使用 Dolibarr 日期选择器===&lt;br /&gt;
如果您愿意，您可以使用 Dolibarr 屏幕页面中的日期选择器（带日历弹出窗口）。为此，请使用以下行：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight 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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
字符串&amp;lt;syntaxhighlight 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;/syntaxhighlight&amp;gt;标识表单中的日期选择器。如果在同一页面中使用多个日期选择器，则必须设置不同的值。&lt;br /&gt;
&lt;br /&gt;
字符串myform是FORM区域的名称（在HTML页面的form name=“myform”中）。因此，日期选择器的显示必须集成到FORM Html区域中。&lt;br /&gt;
&lt;br /&gt;
要在POST结束时检索值，命令为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight 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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===覆盖模板文件 (tpl)===&lt;br /&gt;
如果您想覆盖模块上的tpl文件，则需要在 module_parts 上声明它：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
&#039;tpl&#039; =&amp;gt; 1,&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后您可以在 &#039;&#039;&#039;mymodule/core/tpl&#039;&#039;&#039; 上放置任何tpl文件。&lt;br /&gt;
&lt;br /&gt;
一旦模块被激活，tpl就会被覆盖。&lt;br /&gt;
&lt;br /&gt;
==设置配置页面 (可选)==&lt;br /&gt;
&#039;&#039;&#039;何时&#039;&#039;&#039;：如果您的模块提供多个可配置选项。&lt;br /&gt;
&lt;br /&gt;
===创建配置编辑页面===&lt;br /&gt;
如果您的模块提供了多个可配置选项，则需要创建一个PHP页面来编辑这些选项（存储在 [[Table llx_const|表 &#039;&#039;&#039;llx_const&#039;&#039;&#039;]] 中）。&lt;br /&gt;
&lt;br /&gt;
创建一个名为 &#039;&#039;&#039;mymodule_setuppage.php&#039;&#039;&#039; 的PHP页面，显示可能的选项并更新它们。&lt;br /&gt;
&lt;br /&gt;
有必要以 &#039;&#039;&#039;/admin&#039;&#039;&#039; 中的一个页面为例，展示读取或保存选项的方法。将此配置页面也放在&#039;&#039;&#039;/admin&#039;&#039;&#039;目录中。&lt;br /&gt;
&lt;br /&gt;
===修改模块的描述符文件===&lt;br /&gt;
然后，在模块描述符文件中，修改变量 &#039;&#039;&#039;config_page_url&#039;&#039;&#039; 以指定该PHP页面的名称。&lt;br /&gt;
&lt;br /&gt;
如果页面在目录 &#039;&#039;&#039;admin/&#039;&#039;&#039; 中），则：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;config_page_url = array(&amp;quot;mymodule_setuppage.php&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果页面在目录 &#039;&#039;&#039;mymodule/admin/&#039;&#039;&#039; 中，则：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;config_page_url = array(&amp;quot;mymodule_setuppage.php@mymodule&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===测试您的页面===&lt;br /&gt;
前往“主页-&amp;gt;设置-&amp;gt;模块/应用”页面，您应该会看到一个齿轮图标，允许您访问配置页面，并且您应该能够修改这些选项并将其保存到数据库中。&lt;br /&gt;
&lt;br /&gt;
==设置菜单项 (可选)==&lt;br /&gt;
&#039;&#039;&#039;何时&#039;&#039;&#039; ：如果您创建了PHP页面，则必须从Dolibarr菜单访问这些屏幕页面。&lt;br /&gt;
&lt;br /&gt;
===设置菜单项===&lt;br /&gt;
为此，您需要在模块描述符文件中定义数组 this-&amp;gt;menu，该数组用于声明菜单。&lt;br /&gt;
&lt;br /&gt;
此数组包含模块激活后将显示在菜单中的所有条目。&lt;br /&gt;
&lt;br /&gt;
模块描述符文件的示例文件 &#039;&#039;&#039;modMyModule.class.php&#039;&#039;&#039; 中有一个声明顶部菜单及其相关的左侧菜单项的示例。&lt;br /&gt;
&lt;br /&gt;
以下是描述符文件中菜单项声明的示例：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight 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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
若要根据权限限制对菜单的访问，请更改数组的 &#039;&#039;&#039;perms&#039;&#039;&#039; 属性。有关如何添加权限的更多信息，请参阅后面有关权限的章节。&lt;br /&gt;
&lt;br /&gt;
===测试您的菜单项===&lt;br /&gt;
在Dolibarr中禁用并重新激活您的模块，然后应该会出现菜单项（如果 “enabled”为真）。&lt;br /&gt;
&lt;br /&gt;
==设置您自己的权限 (可选)==&lt;br /&gt;
&#039;&#039;&#039;何时&#039;&#039;&#039;： 如果要添加新权限。&lt;br /&gt;
&lt;br /&gt;
模块将其管理的权限定义，放在第一步中创建的模块描述符文件中完成。更改行：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;rights_class = &#039;mymodule&#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
录入正确的 myModule 值。&lt;br /&gt;
&lt;br /&gt;
然后在 $this-&amp;gt;rights 数组中填充与要管理的不同权限一样多的条目。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight 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;Label by default of permission&#039;;&lt;br /&gt;
$this-&amp;gt;rights[$r][3] = 1;&lt;br /&gt;
$this-&amp;gt;rights[$r][4] = &#039;action&#039;;&lt;br /&gt;
$this-&amp;gt;rights[$r][5] = &#039;subaction&#039;;&lt;br /&gt;
$r++;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在$this-&amp;gt;rights[$r][0]中，输入尚未使用的权限ID（请参阅&#039;&#039;&#039;系统信息&#039;&#039;&#039;菜单，在运行Dolibarr的设备上查看已在使用的ID）。&lt;br /&gt;
&lt;br /&gt;
在$this-&amp;gt;rights[$r][1]中，输入默认标签（如果在 &#039;&#039;&#039;admin.lang&#039;&#039;&#039; 文件中找不到您权限标签的翻译字符串，则显示该标签。翻译键值为 “Permission10001=我的超级权限的描述”）。&lt;br /&gt;
&lt;br /&gt;
在$this&amp;gt;rights[$r][2]中，输入权限类型。有三种类型的权限，“r”表示读取、列出清单或导出权限，“w”表示写入或更新权限，“d”表示删除权限。&lt;br /&gt;
&lt;br /&gt;
在$this-&amp;gt;rights[$r][3]中，如果任何一个新创建的用户都会被默认自动分配此权限，则输入1。&lt;br /&gt;
&lt;br /&gt;
在$this-&amp;gt;rights[$r][4]和$this-&amp;gt;rights[$r][5]中，输入不带空格的操作和子操作字符串。然后，您可以通过以下命令在PHP代码中测试用户是否具有正确的权限：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
if ($user-&amp;gt;rights-&amp;gt;mymodule-&amp;gt;action-&amp;gt;subaction) ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==设置您自己的消息框/widget小组件 (可选)==&lt;br /&gt;
&#039;&#039;&#039;何时&#039;&#039;&#039;：如果您的模块附带提供在主页上展示的一个或多个消息框。&lt;br /&gt;
&lt;br /&gt;
===设置您的消息框===&lt;br /&gt;
为此，请修改模块描述符文件中的数组 $this-&amp;gt;boxes。&lt;br /&gt;
&lt;br /&gt;
首先为即将在 &#039;&#039;&#039;htdocs/mymodule/core/boxes&#039;&#039;&#039; 目录中创建的每个box文件添加2行。&lt;br /&gt;
&lt;br /&gt;
例如：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;boxes[0][&#039;file&#039;]=&#039;mybox0.php@mymodule&#039;&lt;br /&gt;
$this-&amp;gt;boxes[0][&#039;note&#039;]=&#039;My box 0&#039;&lt;br /&gt;
 ...&lt;br /&gt;
$this-&amp;gt;boxes[n][&#039;file&#039;]=&#039;myboxn.php@mymodule&#039;&lt;br /&gt;
$this-&amp;gt;boxes[n][&#039;note&#039;]=&#039;My box n&#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其次，创建文件&#039;&#039;&#039;htdocs/mymodule/core/boxes/mybox0.php&#039;&#039;&#039;、&#039;&#039;&#039;htdocs/mymodule/core/boxes/mybox1.php&#039;&#039;&#039;…，以现有的消息框（在 &#039;&#039;&#039;htdocs/core/boxes&#039;&#039;&#039; 目录中）为示例。&lt;br /&gt;
&lt;br /&gt;
===测试您的消息框是否被 Dolibarr 检测到===&lt;br /&gt;
停用并重新激活模块。&lt;br /&gt;
&lt;br /&gt;
前往菜单  &#039;&#039;&#039;主页 - 设置 - widget小组件&#039;&#039;&#039; 。&lt;br /&gt;
&lt;br /&gt;
您的消息框必须显示在可激活消息框的清单中。激活它们，然后前往&#039;&#039;&#039;主页&#039;&#039;&#039;并检查它们是否正确显示。&lt;br /&gt;
&lt;br /&gt;
==定义您自己的导出 (可选)==&lt;br /&gt;
&#039;&#039;&#039;何时&#039;&#039;&#039;：如果您的模块附带提供预定义的数据导出（针对自己的表或来自另一个Dolibarr模块的现有表）。&lt;br /&gt;
&lt;br /&gt;
===定义导出===&lt;br /&gt;
为此，请取消注释并修改模块描述符文件中的 $this-&amp;gt;export_xxx 数组。&lt;br /&gt;
&lt;br /&gt;
===测试您的导出===&lt;br /&gt;
前往菜单 &#039;&#039;&#039;工具-&amp;gt;导出助手&#039;&#039;&#039; 。您的导出应显示在可用的预定义导出清单中（如果您的模块已激活）。选择它，您将看到在上一步时在表中定义的可能字段。选择几个字段并尝试生成导出文件。&lt;br /&gt;
&lt;br /&gt;
==设置CSS样式 (可选)==&lt;br /&gt;
&#039;&#039;&#039;何时&#039;&#039;&#039;：在PHP屏幕页面中，您使用的样式类不是Dolibarr主题的样式类（不推荐）。&lt;br /&gt;
&lt;br /&gt;
===创建并声明您的样式表===&lt;br /&gt;
创建一个名为 &#039;&#039;&#039;mymodule.css&#039;&#039;&#039; 或 &#039;&#039;&#039;mymodule.css.php&#039;&#039;&#039; 的CSS样式文件，并将其放在 &#039;&#039;&#039;htdocs/mymodule&#039;&#039;&#039; 目录中。每个模块只能有一个CSS文件。&lt;br /&gt;
&lt;br /&gt;
请记住，最好使用已有的Dolibarr样式（Dolibarr使用的CSS文件是&#039;&#039;&#039;themes/mytheme/&#039;&#039;themename&#039;&#039;.css.php&#039;&#039;&#039;）。仅当您必须处理不存在的样式时，才创建特定于模块的CSS文件。&lt;br /&gt;
&lt;br /&gt;
样式表准备就绪后，通过更改 &#039;&#039;&#039;$this-&amp;gt;modules_parts&#039;&#039;&#039; 属性在模块描述符文件中声明样式表。&lt;br /&gt;
&lt;br /&gt;
此处要输入的值必须是 CSS 文件 URL 的相对路径。&lt;br /&gt;
&lt;br /&gt;
例如：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;module_parts = array(&#039;css&#039; =&amp;gt; array(&#039;/mymodule/css/mymodule.css.php&#039;));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===测试您的样式表===&lt;br /&gt;
停用并重新激活模块。&lt;br /&gt;
&lt;br /&gt;
前往Dolibarr的主页。查看页面的HTML源代码。&lt;br /&gt;
&lt;br /&gt;
您应该在HTML标头中看到有一行是声明您的样式表。&lt;br /&gt;
&lt;br /&gt;
==定义Javascript函数 (可选)==&lt;br /&gt;
&#039;&#039;&#039;何时&#039;&#039;&#039;：当您在PHP屏幕页面中使用的 javascript 函数不是Dolibarr的标准js函数（在lib_head.js中）。&lt;br /&gt;
&lt;br /&gt;
如果在PHP屏幕页面上使用 javascript 函数，则必须将在 javascript 文件 &#039;&#039;&#039;htdocs/mymodule/js/mymodule.js&#039;&#039;&#039; 中声明的函数加载到HTML头中。&lt;br /&gt;
&lt;br /&gt;
若要求Dolibarr（负责生成 header 部分）包含一个 javascript 文件，必须在页面开头调用的llxHeader()函数的参数中提供包含要包含的JS URL的参数。&lt;br /&gt;
&lt;br /&gt;
页面 /htdocs/mymodule/mypage.php 的示例：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$morejs=array(&amp;quot;/mymodule/js/mymodule.js&amp;quot;);&lt;br /&gt;
llxHeader(&#039;&#039;,&#039;Titre&#039;,&#039;&#039;,&#039;&#039;,&#039;&#039;,&#039;&#039;,$morejs,&#039;&#039;,0,0); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==在Dolibarr事件上触发代码 (可选)==&lt;br /&gt;
&#039;&#039;&#039;何时&#039;&#039;&#039;：希望在Dolibarr标准操作后触发执行特定操作时（例如：当在Dolibarr中创建发票时，我想更新模块中的表），您需要创建一个 &#039;&#039;&#039;triggers&#039;&#039;&#039; 文件。&lt;br /&gt;
&lt;br /&gt;
另请参阅 [[Interfaces_Dolibarr_toward_foreign_systems|Dolibarr到外部系统的接口]] 和 [[Interfaces_from_foreign_systems_toward_Dolibarr|外部系统到Dolibarr的接口]]&lt;br /&gt;
&lt;br /&gt;
==在Dolibarr的hooks处插入代码 (可选)==&lt;br /&gt;
&#039;&#039;&#039;何时&#039;&#039;&#039;：当您想更改或添加业务事件以外的代码时（请参阅上一章）。&lt;br /&gt;
&lt;br /&gt;
请参阅页面 [[Hooks_system|Hooks系统]].&lt;br /&gt;
==添加编号模块（可选）==&lt;br /&gt;
&#039;&#039;&#039;何时&#039;&#039;&#039;：当您想添加默认模块未涵盖的编号规则时。&lt;br /&gt;
&lt;br /&gt;
请参阅页面 [[Create numbering module|创建编号模块]] 。&lt;br /&gt;
&lt;br /&gt;
==添加新文档模板 (可选)==&lt;br /&gt;
&#039;&#039;&#039;何时&#039;&#039;&#039;：需要添加新文档模板时。如想要个性化自己生成的 PDF 或 ODT 文档。&lt;br /&gt;
&lt;br /&gt;
注意：要添加此功能，您无需创建模块描述符文件。&lt;br /&gt;
&lt;br /&gt;
有关如何从模板生成文档的详情，请参阅页面 [[Create_a_PDF_document_template|创建PDF文档模板]] 或 [[Create_an_ODT_document_template|创建ODT文档模板]] 。&lt;br /&gt;
&lt;br /&gt;
==添加主题 (可选)==&lt;br /&gt;
&#039;&#039;&#039;何时&#039;&#039;&#039;：当您想要根据您的情况定制界面（颜色/字体/图形）时。&lt;br /&gt;
&lt;br /&gt;
注意：要添加此功能，您无需创建模块描述符。&lt;br /&gt;
&lt;br /&gt;
请参阅页面 [[Skins|主题]] 。&lt;br /&gt;
&lt;br /&gt;
==修改开发模块作者名==&lt;br /&gt;
&lt;br /&gt;
在myModule.class.php中查找editor_name&lt;br /&gt;
&lt;br /&gt;
修改以下变量的值以修改作者名称&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;editor_name = &#039;Roger@QQ:12464313&#039;;&lt;br /&gt;
$this-&amp;gt;editor_url = &#039;https://www.ivnun.cn&#039;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=面向开发人员的一些编码规则和函数=&lt;br /&gt;
要遵循的编码规则请参阅 [[语言和开发规则|开发语言和编码规范（PHP, SQL, HTML）]] 。&lt;br /&gt;
&lt;br /&gt;
要调用 Dolibarr 供开发人员使用的预定义函数，请参阅  [[开发文档]]  的“内部函数”一节。&lt;br /&gt;
&lt;br /&gt;
=创建一个安装包来分发和安装您的模块=&lt;br /&gt;
必须使用此步骤来制作安装包，以便将其提交到市场 http://www.dolistore.com。&lt;br /&gt;
&lt;br /&gt;
但您也可以使用它通过自己的分发网络轻松分发模块。&lt;br /&gt;
&lt;br /&gt;
*进入 &#039;&#039;&#039;/build&#039;&#039;&#039; 目录并将文件 &#039;&#039;&#039;makepack-dolibarrmodules.conf&#039;&#039;&#039; 复制到 &#039;&#039;&#039;makepack-mymodule.conf&#039;&#039;&#039;。请注意，稳定版本包中可能不提供此目录。如果是这种情况，可以在 Dolibarr 网站的“开发版本”部分供下载的快照中检索（在这种情况下，请获取整个 build 目录，这是一个独立于版本的目录）。&lt;br /&gt;
&lt;br /&gt;
在此文件中输入为模块创建的新文件的名称清单（模块描述符、新表的SQL文件、PHP页面、图像等）。&lt;br /&gt;
&lt;br /&gt;
*通过 Perl 运行脚本（需要Perl 5.0或更高版本）：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
perl makepack-dolibarrmodule.pl&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
该脚本将询问模块的名称、主要版本和次要版本。然后将生成一个 &#039;&#039;&#039;mymodule.zip &#039;&#039;&#039;文件，其中包含准备部署的模块。&lt;br /&gt;
&lt;br /&gt;
*接收您的模块的人员必须将该文件放在其 Dolibarr 的安装根目录中，并执行以下命令：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tar -xvf mymodule.zip&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*如果您希望您的模块惠及所有人，您可以在插件市场 {{LinkToPluginDownload}} 上提交它（zip文件）（您必须先创建一个帐户并登录，以使用“提交模块/产品”链接）。&lt;br /&gt;
**如果您的模块制作正确，文件将很快通过验证。&lt;br /&gt;
**如果质量足够好、许可证允许、并且模块的功能被证明是普遍感兴趣的，则可以将代码添加到 Dolibarr 的源代码中（除非您不希望这样做）。&lt;br /&gt;
&lt;br /&gt;
=Dolistore上外部模块的归档和验证=&lt;br /&gt;
&lt;br /&gt;
请参阅 [[Module_Dolistore_Validation_Rules|验证规则]]&lt;/div&gt;</summary>
		<author><name>ShengGang</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=%E6%A8%A1%E5%9D%97%E5%BC%80%E5%8F%91&amp;diff=58768</id>
		<title>模块开发</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=%E6%A8%A1%E5%9D%97%E5%BC%80%E5%8F%91&amp;diff=58768"/>
		<updated>2023-11-20T03:00:17Z</updated>

		<summary type="html">&lt;p&gt;ShengGang: /* 将对象的标准选项卡添加到其自己的表单页面 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- BEGIN interlang links --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Do NOT edit this section&lt;br /&gt;
     Links below are automatically managed by PolyglotBot&lt;br /&gt;
     You can edit links on the English source page : Module_development --&amp;gt;&lt;br /&gt;
[[en:Module_development]]&lt;br /&gt;
[[fr:Développement_module]]&lt;br /&gt;
[[es:Desarrollo_de_un_módulo]]&lt;br /&gt;
[[de:Modul_Entwicklung]]&lt;br /&gt;
[[ja:モジュール_開発]]&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Core]]&lt;br /&gt;
[[Category:开发]]&lt;br /&gt;
{{Template用户手册}}&lt;br /&gt;
{{Template开发文档}}&lt;br /&gt;
{{TemplateMainPageZh}}&lt;br /&gt;
&lt;br /&gt;
要创建新模块，需要执行以下几个步骤。本教程旨在向您介绍每一个步骤，以便添加一个模块来扩展Dolibarr的功能，例如添加以下一个或多个功能：&lt;br /&gt;
&lt;br /&gt;
*在数据库中添加新表&lt;br /&gt;
*在菜单中添加您自己的菜单项&lt;br /&gt;
*添加对象和屏幕以输入/查看新表&lt;br /&gt;
*在视图页上添加或删除选项卡/编辑对象（发票、产品、订单、事件等）&lt;br /&gt;
*为内部导出工具添加预定义的导出&lt;br /&gt;
*向主页添加新信息框/widget小组件&lt;br /&gt;
*添加新的替换变量&lt;br /&gt;
*定义新权限&lt;br /&gt;
*自动触发指定 Dolibarr 操作的代码&lt;br /&gt;
*将自定义代码插入 Dolibarr 的钩子位置&lt;br /&gt;
*为所创建的对象的引用添加编号模块（为数据自动编码的模块）&lt;br /&gt;
*添加PDF文档模板&lt;br /&gt;
*添加一个新主题/皮肤&lt;br /&gt;
&lt;br /&gt;
等等...&lt;br /&gt;
&lt;br /&gt;
以下章节介绍了如何以简单的方式手动完成所有这些操作。对于有经验的开发人员来说，使用MDA生成的方法也不错，详见最后一章。&lt;br /&gt;
&lt;br /&gt;
=使用模块生成器构建模块=&lt;br /&gt;
从Dolibarr 9.0开始，您可以使用&amp;quot;模块生成器&amp;quot;（Module Builder）创建模块的主要文件。要激活它 ：&lt;br /&gt;
&lt;br /&gt;
*设置参数 MAIN_FEATURES_LEVEL 的值为 2 ( 设置 / 其他 )（或者修改llx_const表中该项的记录的value值为2）&lt;br /&gt;
&lt;br /&gt;
[[File:企业微信截图 20180725114721.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*在 &#039;&#039;&#039;主页 - 设置 - 设置-模块/应用 多模块工具&#039;&#039;&#039; 中激活“模块生成器”（ModuleBuilder）&lt;br /&gt;
&lt;br /&gt;
[[File:激活modulebuilder.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*点击屏幕右上角菜单栏中出现的&#039;Bug&#039;图标&lt;br /&gt;
&lt;br /&gt;
[[File:Buglogo.png]]&lt;br /&gt;
&lt;br /&gt;
*运行的ModuleBuilder界面如下：&lt;br /&gt;
&lt;br /&gt;
[[File:Modulebuilder.png|800px]]&lt;br /&gt;
&lt;br /&gt;
=外部模块模板示例=&lt;br /&gt;
一个Dolibarr外部模块的模板/框架：[https://github.com/Dolibarr/dolibarr/tree/develop/htdocs/modulebuilder/template Github Dolibarr模块]&lt;br /&gt;
&lt;br /&gt;
=创建模块=&lt;br /&gt;
以下章节描述了创建Dolibarr模块所需的操作。无论模块的用途如何，第一章描述的操作都是必须要完成的，后续章节描述的操作是否要做将取决于模块的需求。 &lt;br /&gt;
&lt;br /&gt;
==创建模块描述符（必做）==&lt;br /&gt;
&#039;&#039;&#039;何时&#039;&#039;&#039;：无论其用途如何，开发扩展模块时都是强制性的。&#039;&#039;&#039;从Dolibarr 9.0开始，您可以使用“模块生成器”创建模块的描述符&#039;&#039;&#039;。该工具仍处于开发和完善阶段，但其已经可以使用。&lt;br /&gt;
&lt;br /&gt;
===使用模块生成器创建描述符===&lt;br /&gt;
&lt;br /&gt;
*通过单击&amp;quot;Bug&amp;quot;图标启动模块生成器&lt;br /&gt;
&lt;br /&gt;
[[File:Mod_builder_3.png|400px]]&lt;br /&gt;
&lt;br /&gt;
*在下图“模块名称”处输入不含空格的模块名称（模块名称不得包含下划线 ：_），然后单击&amp;quot;创建&amp;quot;按钮。&lt;br /&gt;
&lt;br /&gt;
[[file:模块名.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*已初始化具有第一个文件的模块。然后，您可以更改模块描述符的参数：&lt;br /&gt;
&lt;br /&gt;
[[File:Mod_builder_5.png|400px]]&lt;br /&gt;
&lt;br /&gt;
===备选方案：手动创建描述符（不使用模块生成器）===&lt;br /&gt;
第一步是创建模块描述文件（描述符）。为此：&lt;br /&gt;
&lt;br /&gt;
*创建目录 &#039;&#039;&#039;htdocs/custom/&#039;&#039;mymodule&#039;&#039;/core/modules&#039;&#039;&#039; 。&lt;br /&gt;
*进入目录 &#039;&#039;&#039;htdocs/modulebuilder/template/core/modules&#039;&#039;&#039; 将文件 modMyModule.class.php 复制到目录 &#039;&#039;&#039;htdocs/custom/&#039;&#039;mymodule&#039;&#039;/core/modules&#039;&#039;&#039; 中。&lt;br /&gt;
*重命名mod&#039;&#039;&#039;MyModule&#039;&#039;&#039;.class.php文件，只需修改&#039;&#039;&#039;MyModule&#039;&#039;&#039;部分即可（文件必须以mod开头）&lt;br /&gt;
&lt;br /&gt;
然后，编辑此文件的内容：&lt;br /&gt;
&lt;br /&gt;
*将所有&#039;&#039;modMyModule&#039;&#039;替换为与模块用途相对应的值。此值必须始终以“&#039;&#039;&#039;mod&#039;&#039;&#039;”开头，并且仅包含&#039;&#039;&#039;字母字符&#039;&#039;&#039;。&lt;br /&gt;
*通过 $this-&amp;gt;numero = &#039;&#039;100000&#039;&#039; 设置模块ID。为避免冲突，您可以参考以下页面查找已分配的ID：[[List of modules id|模块ID清]]&amp;lt;nowiki/&amp;gt;[[List of modules id|单]] 。&lt;br /&gt;
*可能还需要修改构造函数中定义的其他变量（有关其含义，请参阅[[主模块代码框架|类文件代码]]中的注释）。&lt;br /&gt;
&lt;br /&gt;
模块的描述文件（描述符）已准备就绪。请参阅下一步“测试描述符”以激活您的新模块。&lt;br /&gt;
&lt;br /&gt;
===测试描述符===&lt;br /&gt;
&lt;br /&gt;
启动Dolibarr并进入 &#039;&#039;&#039;主页-&amp;gt;设置-&amp;gt;模块/应用&#039;&#039;&#039; 页面，您应该会看到一个新行，其中包含新模块以及是否激活它的选项（浏览每个模块类别的所有选项卡，直到找到它）。&lt;br /&gt;
&lt;br /&gt;
$this-&amp;gt;special 的值决定了模块位于哪个类别选项卡中。&lt;br /&gt;
&lt;br /&gt;
注意：如果在模块描述符中设置了属性 version ，则应在 &#039;&#039;&#039;模块/应用&#039;&#039;&#039; 页面看到包含新模块的新行以及是否激活它的选项。如果将属性 version 设置为“develop”或“experiental”，若要查看模块，必须先进入页面 &#039;&#039;&#039;“主页-&amp;gt;设置-&amp;gt;其他设置&#039;&#039;&#039;”，并将参数 MAIN_FEATURES_LEVEL 设置为 1 以查看“实验性”(experimental)模块，或设置为 2 以查看“开发”(development)模块。&lt;br /&gt;
&lt;br /&gt;
===模块的名称===&lt;br /&gt;
&lt;br /&gt;
模块名称不得包含下划线或下划线：_&lt;br /&gt;
==新模块的树视图（必需）==&lt;br /&gt;
&lt;br /&gt;
以下是组织模块文件时要遵循的树结构（如果使用ModuleBuilder生成文件，则自动采用此树结构）。&lt;br /&gt;
&lt;br /&gt;
注：zip 文件也必须符合此规则，只有第二行是强制性的。&lt;br /&gt;
&lt;br /&gt;
{{Template模块目录树}}&lt;br /&gt;
&lt;br /&gt;
一个好的Dolibarr扩展模块的模板/框架：[https://github.com/Dolibarr/dolibarr/tree/develop/htdocs/modulebuilder/template GitHub Dolibarr Module Modèle]&lt;br /&gt;
&lt;br /&gt;
==创建数据表和 PHP DAO 类 (可选)==&lt;br /&gt;
&#039;&#039;&#039;何时：&#039;&#039;&#039;如果您的模块需要管理自己的数据&lt;br /&gt;
&lt;br /&gt;
===创建 .sql 文件===&lt;br /&gt;
如果您的模块要处理在Dolibarr标准版中不存在的数据，则需要自定义数据库表来存储这些数据。&lt;br /&gt;
&lt;br /&gt;
在模块的目录中创建&#039;&#039;&#039;sql&#039;&#039;&#039;子目录（&#039;&#039;&#039;mymodule/sql&#039;&#039;&#039;），用于放置要创建的sql脚本（使用ModuleBuilder，在&amp;quot;对象&amp;quot;选项卡中创建新对象后，将自动执行此步骤）。&lt;br /&gt;
&lt;br /&gt;
接下来，检查模块描述符文件，在 &#039;&#039;&#039;init&#039;&#039;&#039; 函数中是否包括行：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight 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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
并且未被注释掉。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;应遵循的规则&#039;&#039;：&lt;br /&gt;
&lt;br /&gt;
*根据每个表1个文件的原则添加表的创建命令文件，命名为 &#039;&#039;&#039;llx_mytable.sql&#039;&#039;&#039;（用于表），可能还附带 &#039;&#039;&#039;llx_mytable.key.sql&#039;&#039;&#039; 文件（用于索引或外键）。示例请参阅 &#039;&#039;&#039;install/mysql/tables&#039;&#039;&#039; 中的现有文件。&lt;br /&gt;
*SQL字段的推荐类型和名称在 [[https://wiki.dolibarr.org/index.php/Langages_et_normes#R.C3.A8gles_de_codage_SQL]] 页中定义。&lt;br /&gt;
*管理数据：对于添加/操作数据的命令，它们都必须位于同一目录 &#039;&#039;&#039;/mymodule/sql/&#039;&#039;&#039; 中名为 &#039;&#039;&#039;data.sql&#039;&#039;&#039; 的文件中。&lt;br /&gt;
*不要使用双引号（如 &amp;quot;string&amp;quot;），因为双引号（&amp;quot;）在 PostGreSQL 中有特殊的含义&lt;br /&gt;
&lt;br /&gt;
data.sql文件内容示例：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight 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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
文件中的SQL语句必须对 &#039;&#039;&#039;mysql&#039;&#039;&#039; 数据库有效。请注意：不需要维护其他数据库类型的文件。它们由数据库驱动程序动态读取和转换。&lt;br /&gt;
&lt;br /&gt;
===测试 .sql 文件===&lt;br /&gt;
&lt;br /&gt;
文件准备就绪后，您可以返回Dolibarr的模块管理页面，禁用模块，删除数据库表（如果它们已经存在），然后重新激活模块。正常情况下，应该可以通过激活模块来重新创建表。否则，请手动检查脚本，或查看Dolibarr日志。&lt;br /&gt;
&lt;br /&gt;
===生成 PHP DAO 表访问类===&lt;br /&gt;
创建对象时，ModuleBuilder会自动生成对象的PHP DAO类文件。&lt;br /&gt;
&lt;br /&gt;
如果不使用模块生成器，您将在模块框架文件&#039;&#039;&#039;htdocs/modulebuilder/templates/class/myobject.class.php&#039;&#039;&#039; 中找到示例。&lt;br /&gt;
&lt;br /&gt;
在这个类中，已经有可调用的 CRUD（Create/Read/Update/Delete）方法来执行表行数据的插入、获取（select）、更新和删除。修改此文件以使用正确的模块名和表名，并将该文件放在模块的 &#039;&#039;&#039;class&#039;&#039;&#039; 子目录中。若使用 &#039;&#039;&#039;ModuleBuilder&#039;&#039;&#039; 只需点击几下鼠标即可完成此操作。&lt;br /&gt;
&lt;br /&gt;
====使用ModuleBuilder生成PHP DAO类文件====&lt;br /&gt;
&lt;br /&gt;
*使用ModuleBuilder生成PHP DAO类文件，简单至在下图中选择&#039;对象&#039;选项卡，输入&#039;对象名&#039;，然后点击创建，即可生成相关一切文档。&lt;br /&gt;
&lt;br /&gt;
[[File:新对象.png|800px]]&lt;br /&gt;
&lt;br /&gt;
参见[[ModuleBuilder用户手册]]&lt;br /&gt;
==选项卡显示(可选)==&lt;br /&gt;
&lt;br /&gt;
===添加或删除对象表单上的选项卡===&lt;br /&gt;
&#039;&#039;&#039;何时：&#039;&#039;&#039;在标准对象（发票、订单、报价单、会员…）的表单中添加您自己的选项卡&lt;br /&gt;
&lt;br /&gt;
要执行此操作，请打开之前创建的模块描述符文件并编辑 $this-&amp;gt;tabs 数组：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
	// 用于在新tabs中添加新页面或删除现有页面的数组&lt;br /&gt;
	$this-&amp;gt;tabs = array(&#039;objecttype:+tabname1:Title1:mylangfile@mymodule:$user-&amp;gt;rights-&amp;gt;mymodule-&amp;gt;read:/mymodule/mypagetab1.php?id=__ID__&#039;    // 增加一个由code tabname1标识的新tab&lt;br /&gt;
                            &#039;objecttype:+tabname2:Title2:mylangfile@mymodule:$user-&amp;gt;rights-&amp;gt;mymodule-&amp;gt;read:/mymodule/mypagetab2.php?id=__ID__&#039;,   // 增加一个由code tabname2标识的新tab&lt;br /&gt;
                            &#039;objecttype:-tabname&#039;);                                                     // 删除一个由code tabname标识的现有选项卡&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
该表应包含字符串列表，每个字符串表示一个新选项卡。字符串格式由6个部分组成，由“：”分隔&lt;br /&gt;
&lt;br /&gt;
*第1部分：选项卡的元素类型（objecttype），只能是下列值之一：&lt;br /&gt;
{{TemplateModuleTabs-zh}}&lt;br /&gt;
&lt;br /&gt;
*第2部分：用于标识要添加（以+开头）或删除（以-开头）的选项卡的codeName&lt;br /&gt;
*第3部分：选项卡的标题。这可以是硬编码的字符串，或者是更好的，lang文件中的翻译代码。&lt;br /&gt;
*第4部分：文件“*.lang”的名称（不带.lang扩展名），此文件内有翻译代码和要显示的语言字符串之间的对应关系。如果这个文件名后面跟@mymodule，则Dolibarr将在模块自己的 lang 目录中查找翻译文件，即htdocs/mymodule/langs/code_CODE/mymodule.lang，否则Dolibarr将查找翻译文件htdocs/langs/code_CODE/mylangfile.lang。&lt;br /&gt;
*第5部分：判断选项卡是否可见的条件。设置为“1”，会使其始终可见。&lt;br /&gt;
*第6部分：单击选项卡时要显示的页面的URL。字符串“__ID__”将自动替换为相关元素的ID。&lt;br /&gt;
&lt;br /&gt;
要使声明生效，必须禁用并重新激活该模块。&lt;br /&gt;
&lt;br /&gt;
要使用来自数据库的数据填充选项卡的内容，请参阅下一章。&lt;br /&gt;
&lt;br /&gt;
为了获取现有选项卡的名称“tabname”，您必须检查文件“core/lib/module.lib.php”的函数“product_prepare_head”中使用的名称，该文件对应于“$head[$h][2]”部分。&lt;br /&gt;
&lt;br /&gt;
===将对象的标准选项卡添加到其自己的表单页面===&lt;br /&gt;
&#039;&#039;&#039;何时：&#039;&#039;&#039;在您自己的表单中添加标准对象（产品、合作方…）的选项卡&lt;br /&gt;
&lt;br /&gt;
必须遵循以下步骤：&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. 在代码中包含定义相关函数的文件&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
对于每种对象选项卡，都有两个文件需要使用下列语句：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;require_once($url_fichier) ;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下是要包含的文件示例（DOL_DOCUMENT_ROOT 对应于 dolibarr/htdocs/ 文件夹）：&lt;br /&gt;
&lt;br /&gt;
*合作方(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;
*产品(product) :&lt;br /&gt;
**DOL_DOCUMENT_ROOT/product/class/product.class.php&lt;br /&gt;
**DOL_DOCUMENT_ROOT/core/lib/product.lib.php&lt;br /&gt;
*发票 (invoice) :&lt;br /&gt;
**DOL_DOCUMENT_ROOT/compta/facture/class/facture.class.php&lt;br /&gt;
**DOL_DOCUMENT_ROOT/core/lib/invoice.lib.php&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. 创建并加载要在自己的表单中显示的标准对象&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
创建所需类的对象，并从数据库中获取对象数据。为此，您必须使用相应类的fetch()函数，并将从URL（/mytab.php?id=1）获取的对象id作为参数传递。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;例如：&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$id=GETPOST(&#039;id&#039;,&#039;int&#039;);&lt;br /&gt;
$ref=GETPOST(&#039;ref&#039;,&#039;alpha&#039;);&lt;br /&gt;
$product = new Product($db) ;&lt;br /&gt;
$result = $product-&amp;gt;fetch($id,$ref) ; // Test $result to check the database read is ok&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3. 检索与所选实体对应的选项卡列表&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
使用函数XXX_prepare_head($obj)（其中XXX是实体名称）创建一个包含要显示的选项卡定义的数组。要传递的参数是要显示选项卡的对象。&lt;br /&gt;
&lt;br /&gt;
返回的数组由以下内容组成：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$head        // tabs的数组&lt;br /&gt;
$head[$h]    // Element to describe one tab.&lt;br /&gt;
$head[$h][0] // Url of page to show when you click on tab&lt;br /&gt;
$head[$h][1] // Title of tab&lt;br /&gt;
$head[$h][2] // Code name to identify the tab&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;示例：&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$head = product_prepare_head($product, $user) ; // 参数 $user 是要显示选项卡的对象，这就是&amp;quot;产品&amp;quot;对象为&amp;quot;user&amp;quot;对象准备的所有可用的选项卡的数组。&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
某些函数上不存在$user参数&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4. 在您的页面上显示选项卡&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
使用dol_fiche_head()函数，该函数显示由 XX_prepare_head() 返回的 $head 数组中包含的选项卡。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight 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  // tabs的数组，上面称为$head&lt;br /&gt;
//$active // 活动选项卡（输入模块文件中定义的选项卡名称，或$head[$h][2]中包含的名称）。此选项卡将突出显示&lt;br /&gt;
//$title  // 要显示的标题（显示在无法单击的特殊选项卡中）&lt;br /&gt;
//$notab&lt;br /&gt;
//$picto  // 要显示到标题中的图片的名称。可能的值为：&lt;br /&gt;
//            product&lt;br /&gt;
//            service&lt;br /&gt;
//            company&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
此函数将显示所需的选项卡，并打开一个html元素&#039;&#039;&amp;lt; div class=&amp;quot;&amp;quot; &amp;gt;&#039;&#039;，该元素对应于选项卡下方的显示区域（如果参数 $notab=0）。要关闭显示区域，只需在PHP代码中使用关闭元素&amp;lt;nowiki&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/nowiki&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
注：相关的更多细节，请参阅 [http://www.dolibarr.fr/doxygen/ Doxygen文档] 或直接参考 Dolibarr 代码。&lt;br /&gt;
&lt;br /&gt;
==创建PHP屏幕页面（可选）==&lt;br /&gt;
&#039;&#039;&#039;何时&#039;&#039;&#039;：如果新模块的目的是添加一个需要新屏幕页面的功能。&lt;br /&gt;
&lt;br /&gt;
===创建原始PHP屏幕页面===&lt;br /&gt;
随后，您可以使用 &#039;&#039;&#039;modulebuilder&#039;&#039;&#039; 目录中提供的示例模板（&#039;&#039;&#039;myobject_page.php&#039;&#039;&#039;）创建基于表数据的PHP页面（有关命令行脚本的开发，请参阅 [[脚本开发]] ）。同样，如果您使用的是 ModuleBuilder，则在初始化对象时会自动创建页面实例（清单、创建页面、Notes选项卡等）。&lt;br /&gt;
&lt;br /&gt;
要创建新的用户屏幕页面，请创建特定于模块的 &#039;&#039;&#039;htdocs&#039;&#039;&#039; 子目录（如果尚未创建）（如 &#039;&#039;&#039;htdocs/mymodule&#039;&#039;&#039; ），以便在其中放置要创建的页面。&lt;br /&gt;
&lt;br /&gt;
从复制文件 &#039;&#039;&#039;myobject_page.php&#039;&#039;&#039; 作为开始。编辑该文件，以便能正确找到并加载 main.inc.php 文件：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
// Load Dolibarr environment&lt;br /&gt;
$res=0;&lt;br /&gt;
// Try main.inc.php into web root known defined into CONTEXT_DOCUMENT_ROOT (not always defined)&lt;br /&gt;
if (! $res &amp;amp;&amp;amp; ! empty($_SERVER[&amp;quot;CONTEXT_DOCUMENT_ROOT&amp;quot;])) $res=@include($_SERVER[&amp;quot;CONTEXT_DOCUMENT_ROOT&amp;quot;].&amp;quot;/main.inc.php&amp;quot;);&lt;br /&gt;
// Try main.inc.php into web root detected using web root caluclated from SCRIPT_FILENAME&lt;br /&gt;
$tmp=empty($_SERVER[&#039;SCRIPT_FILENAME&#039;])?&#039;&#039;:$_SERVER[&#039;SCRIPT_FILENAME&#039;];$tmp2=realpath(__FILE__); $i=strlen($tmp)-1; $j=strlen($tmp2)-1;&lt;br /&gt;
while($i &amp;gt; 0 &amp;amp;&amp;amp; $j &amp;gt; 0 &amp;amp;&amp;amp; isset($tmp[$i]) &amp;amp;&amp;amp; isset($tmp2[$j]) &amp;amp;&amp;amp; $tmp[$i]==$tmp2[$j]) { $i--; $j--; }&lt;br /&gt;
if (! $res &amp;amp;&amp;amp; $i &amp;gt; 0 &amp;amp;&amp;amp; file_exists(substr($tmp, 0, ($i+1)).&amp;quot;/main.inc.php&amp;quot;)) $res=@include(substr($tmp, 0, ($i+1)).&amp;quot;/main.inc.php&amp;quot;);&lt;br /&gt;
if (! $res &amp;amp;&amp;amp; $i &amp;gt; 0 &amp;amp;&amp;amp; file_exists(dirname(substr($tmp, 0, ($i+1))).&amp;quot;/main.inc.php&amp;quot;)) $res=@include(dirname(substr($tmp, 0, ($i+1))).&amp;quot;/main.inc.php&amp;quot;);&lt;br /&gt;
// Try main.inc.php using relative path&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;);&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;);&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;);&lt;br /&gt;
if (! $res) die(&amp;quot;Include of main fails&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如您所见，其多次尝试加载 main.inc.php（或 master.inc.php）文件。目标是在尽可能多的场景下取得成功。最少为2行：一行用于尝试将 master/main.inc.php 文件加载到 dolibarr 的根目录中，另一行用于尝试加载该文件，以支持模块部署在“custom”目录中的场景。但你可能不得不处理更多的场景。上面提供的示例应该能够在几乎所有场景/配置下加载 main/master.inc.php 文件。&lt;br /&gt;
&lt;br /&gt;
在3.2之后，为所有版本的Dolibarr开发的扩展模块可以放置在不同的文件夹中，而不仅仅是“htdocs”，如“htdocs/custom”，为了不必修改模块的源代码，我们要做几个包含，所以这个规则必须被所有模块使用。&lt;br /&gt;
&lt;br /&gt;
请注意，您可以根据文件相对于模块目录树的深度添加更多的“../”。&lt;br /&gt;
&lt;br /&gt;
main.inc.php文件加载了技术环境变量和权限。然后设置以下对象变量：&lt;br /&gt;
&lt;br /&gt;
*$user    包含用户属性 + 权限的对象&lt;br /&gt;
*$conf    包含 Dolibarr 设置的对象&lt;br /&gt;
*$db       包含数据库连接句柄的对象&lt;br /&gt;
*$langs   包含用户语言的对象&lt;br /&gt;
&lt;br /&gt;
然后输入代码以显示页面。&lt;br /&gt;
&lt;br /&gt;
*在不知道从何处调用文件的情况下，使用Dolibarr函数dol_include_once()（而不是直接使用include_once）包含专用于模块的类或库&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;例如：&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
dol_include_once(&#039;/mymodule/class/myclass.class.php&#039;, &#039;MyClass&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*另一方面，Dolibarr提供的标准类将使用 require-once 直接调用，语法如下：&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;例如：&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight 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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
原因是，尽管dol_include_once很方便，却因它会扫描每个备用路径目录以找到文件，所以它的性能也很差，因为它会在每次调用时生成访问和磁盘搜索（实际上，PHP集成了已读文件的缓存，但未集成“未找到”文件的缓存）。由于给定的文件只可能存在于一个树中，所以总会有一个无此文件的备用树，这会产生对硬盘的不必要访问，从而影响性能。与Dolibarr的内部文件一样，我们总是知道确切的路径，应该首选带有该直接路径的 require_once）。&lt;br /&gt;
&lt;br /&gt;
===在已存在的表单上增加新字段===&lt;br /&gt;
您可能希望提供一个模块，将更多字段添加到某些元素的表单（录入和展示）中。&lt;br /&gt;
&lt;br /&gt;
一个繁琐（但不太糟糕）的解决方案可能是替换用于创建元素的所有页面（这意味着禁用“新建元素”菜单项并添加您的菜单项，并禁用显示元素的选项卡，以替换选项卡，该选项卡是您自己的完整页面（从原始页面复制/粘贴），使其与原始页面相同，但被修改为添加字段并将添加的数据存储到您自己的表中）。如果此解决方案适合您，请前往菜单 [[#Define your entries in menu (optional)]] 和 [[#The tab management (optional)]]（本解决方案更强大，因为您可以在页面中改变你想要改变的一切）。&lt;br /&gt;
&lt;br /&gt;
我们将在这里描述另一种解决方案，该解决方案仅适用于在现有字段的末尾“添加字段”，下面以元素“category”作为示例，但您可以将本教程转换为发票、报价单...&lt;br /&gt;
&lt;br /&gt;
*首先，添加一个由您的模块拥有的表，以存储新字段的值。此表将有一个名为“rowid”的列（将包含与元素表的字段rowid相同的值+每一个要添加的新字段。然后为这个新表创建一个具有CRUD（Create/Read/Update/Delete）方法的类。对于这两项任务，请返回前一章[[#创建数据表和表的PHP类文件 (可选)]]。&lt;br /&gt;
*其次，在模块中添加一个钩子，以将新字段添加到表单中。有关使用钩子的通用文档，请参阅[[Hooks_system#Implement_the_Hook]]章节。&lt;br /&gt;
&lt;br /&gt;
如果遵循本教程，则必须执行以下操作才能将字段添加到 category 表单中：&lt;br /&gt;
{{ToComplete}}&lt;br /&gt;
&lt;br /&gt;
===用钩子添加/替换部分字段===&lt;br /&gt;
请参阅  [[钩子系统#实现钩子]] 章节，了解如何使用Dolibarr现有的钩子在Dolibarr钩子位置添加/替换代码。&lt;br /&gt;
&lt;br /&gt;
===访问数据库===&lt;br /&gt;
如果您需要对自己添加的表进行基本变更，请使用之前生成的类，其中包含用于此目的的方法。&lt;br /&gt;
&lt;br /&gt;
但是，如果您希望在没有专用PHP对象的情况下访问表，这仍然是可能的（例如，检索记录列表）。在这种情况下，请考虑以下示例：&lt;br /&gt;
&lt;br /&gt;
对于插入、更新或删除：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$db-&amp;gt;begin();   // Start transaction&lt;br /&gt;
$db-&amp;gt;query(&amp;quot;My SQL request insert, update or delete&amp;quot;);&lt;br /&gt;
$db-&amp;gt;commit();       // Validate transaction&lt;br /&gt;
or $db-&amp;gt;rollback()  // Cancel transaction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
对于读取:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$resql=$db-&amp;gt;query(&amp;quot;My select request&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===定义页面样式===&lt;br /&gt;
为了使页面的外观与 Dolibarr 主题保持一致，必须使用 Dolibarr CSS 样式。&lt;br /&gt;
&lt;br /&gt;
例如：&lt;br /&gt;
&lt;br /&gt;
*在表格标题行的&#039;&#039;tr&#039;&#039;和&#039;&#039;td&#039;&#039;标签上使用 class=&amp;quot;&#039;&#039;&#039;liste_titre&#039;&#039;&#039;&amp;quot;&lt;br /&gt;
*在表格数据行的&#039;&#039;tr&#039;&#039;和&#039;&#039;td&#039;&#039;标签上使用 class=&amp;quot;&#039;&#039;&#039;pair&#039;&#039;&#039;&amp;quot; 或 class=&amp;quot;&#039;&#039;&#039;impair&#039;&#039;&#039;&amp;quot;&lt;br /&gt;
*在所有输入域（&#039;&#039;input, select, textarea&#039;&#039;...）上使用 class=&amp;quot;&#039;&#039;&#039;flat&#039;&#039;&#039;&amp;quot;&lt;br /&gt;
*在所有 &#039;&#039;type=&amp;quot;submit&amp;quot;&#039;&#039; 的 &#039;&#039;input&#039;&#039; 对象上使用 class=&amp;quot;&#039;&#039;&#039;button&#039;&#039;&#039;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===使用 Dolibarr 日期选择器===&lt;br /&gt;
如果您愿意，您可以使用 Dolibarr 屏幕页面中的日期选择器（带日历弹出窗口）。为此，请使用以下行：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight 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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
字符串&amp;lt;syntaxhighlight 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;/syntaxhighlight&amp;gt;标识表单中的日期选择器。如果在同一页面中使用多个日期选择器，则必须设置不同的值。&lt;br /&gt;
&lt;br /&gt;
字符串myform是FORM区域的名称（在HTML页面的form name=“myform”中）。因此，日期选择器的显示必须集成到FORM Html区域中。&lt;br /&gt;
&lt;br /&gt;
要在POST结束时检索值，命令为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight 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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===覆盖模板文件 (tpl)===&lt;br /&gt;
如果您想覆盖模块上的tpl文件，则需要在 module_parts 上声明它：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
&#039;tpl&#039; =&amp;gt; 1,&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后您可以在 &#039;&#039;&#039;mymodule/core/tpl&#039;&#039;&#039; 上放置任何tpl文件。&lt;br /&gt;
&lt;br /&gt;
一旦模块被激活，tpl就会被覆盖。&lt;br /&gt;
&lt;br /&gt;
==设置配置页面 (可选)==&lt;br /&gt;
&#039;&#039;&#039;何时&#039;&#039;&#039;：如果您的模块提供多个可配置选项。&lt;br /&gt;
&lt;br /&gt;
===创建配置编辑页面===&lt;br /&gt;
如果您的模块提供了多个可配置选项，则需要创建一个PHP页面来编辑这些选项（存储在 [[Table llx_const|表 &#039;&#039;&#039;llx_const&#039;&#039;&#039;]] 中）。&lt;br /&gt;
&lt;br /&gt;
创建一个名为 &#039;&#039;&#039;mymodule_setuppage.php&#039;&#039;&#039; 的PHP页面，显示可能的选项并更新它们。&lt;br /&gt;
&lt;br /&gt;
有必要以 &#039;&#039;&#039;/admin&#039;&#039;&#039; 中的一个页面为例，展示读取或保存选项的方法。将此配置页面也放在&#039;&#039;&#039;/admin&#039;&#039;&#039;目录中。&lt;br /&gt;
&lt;br /&gt;
===修改模块的描述符文件===&lt;br /&gt;
然后，在模块描述符文件中，修改变量 &#039;&#039;&#039;config_page_url&#039;&#039;&#039; 以指定该PHP页面的名称。&lt;br /&gt;
&lt;br /&gt;
如果页面在目录 &#039;&#039;&#039;admin/&#039;&#039;&#039; 中），则：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;config_page_url = array(&amp;quot;mymodule_setuppage.php&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果页面在目录 &#039;&#039;&#039;mymodule/admin/&#039;&#039;&#039; 中，则：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;config_page_url = array(&amp;quot;mymodule_setuppage.php@mymodule&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===测试您的页面===&lt;br /&gt;
前往“主页-&amp;gt;设置-&amp;gt;模块/应用”页面，您应该会看到一个齿轮图标，允许您访问配置页面，并且您应该能够修改这些选项并将其保存到数据库中。&lt;br /&gt;
&lt;br /&gt;
==设置菜单项 (可选)==&lt;br /&gt;
&#039;&#039;&#039;何时&#039;&#039;&#039; ：如果您创建了PHP页面，则必须从Dolibarr菜单访问这些屏幕页面。&lt;br /&gt;
&lt;br /&gt;
===设置菜单项===&lt;br /&gt;
为此，您需要在模块描述符文件中定义数组 this-&amp;gt;menu，该数组用于声明菜单。&lt;br /&gt;
&lt;br /&gt;
此数组包含模块激活后将显示在菜单中的所有条目。&lt;br /&gt;
&lt;br /&gt;
模块描述符文件的示例文件 &#039;&#039;&#039;modMyModule.class.php&#039;&#039;&#039; 中有一个声明顶部菜单及其相关的左侧菜单项的示例。&lt;br /&gt;
&lt;br /&gt;
以下是描述符文件中菜单项声明的示例：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight 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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
若要根据权限限制对菜单的访问，请更改数组的 &#039;&#039;&#039;perms&#039;&#039;&#039; 属性。有关如何添加权限的更多信息，请参阅后面有关权限的章节。&lt;br /&gt;
&lt;br /&gt;
===测试您的菜单项===&lt;br /&gt;
在Dolibarr中禁用并重新激活您的模块，然后应该会出现菜单项（如果 “enabled”为真）。&lt;br /&gt;
&lt;br /&gt;
==设置您自己的权限 (可选)==&lt;br /&gt;
&#039;&#039;&#039;何时&#039;&#039;&#039;： 如果要添加新权限。&lt;br /&gt;
&lt;br /&gt;
模块将其管理的权限定义，放在第一步中创建的模块描述符文件中完成。更改行：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;rights_class = &#039;mymodule&#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
录入正确的 myModule 值。&lt;br /&gt;
&lt;br /&gt;
然后在 $this-&amp;gt;rights 数组中填充与要管理的不同权限一样多的条目。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight 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;Label by default of permission&#039;;&lt;br /&gt;
$this-&amp;gt;rights[$r][3] = 1;&lt;br /&gt;
$this-&amp;gt;rights[$r][4] = &#039;action&#039;;&lt;br /&gt;
$this-&amp;gt;rights[$r][5] = &#039;subaction&#039;;&lt;br /&gt;
$r++;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在$this-&amp;gt;rights[$r][0]中，输入尚未使用的权限ID（请参阅&#039;&#039;&#039;系统信息&#039;&#039;&#039;菜单，在运行Dolibarr的设备上查看已在使用的ID）。&lt;br /&gt;
&lt;br /&gt;
在$this-&amp;gt;rights[$r][1]中，输入默认标签（如果在 &#039;&#039;&#039;admin.lang&#039;&#039;&#039; 文件中找不到您权限标签的翻译字符串，则显示该标签。翻译键值为 “Permission10001=我的超级权限的描述”）。&lt;br /&gt;
&lt;br /&gt;
在$this&amp;gt;rights[$r][2]中，输入权限类型。有三种类型的权限，“r”表示读取、列出清单或导出权限，“w”表示写入或更新权限，“d”表示删除权限。&lt;br /&gt;
&lt;br /&gt;
在$this-&amp;gt;rights[$r][3]中，如果任何一个新创建的用户都会被默认自动分配此权限，则输入1。&lt;br /&gt;
&lt;br /&gt;
在$this-&amp;gt;rights[$r][4]和$this-&amp;gt;rights[$r][5]中，输入不带空格的操作和子操作字符串。然后，您可以通过以下命令在PHP代码中测试用户是否具有正确的权限：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
if ($user-&amp;gt;rights-&amp;gt;mymodule-&amp;gt;action-&amp;gt;subaction) ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==设置您自己的消息框/widget小组件 (可选)==&lt;br /&gt;
&#039;&#039;&#039;何时&#039;&#039;&#039;：如果您的模块附带提供在主页上展示的一个或多个消息框。&lt;br /&gt;
&lt;br /&gt;
===设置您的消息框===&lt;br /&gt;
为此，请修改模块描述符文件中的数组 $this-&amp;gt;boxes。&lt;br /&gt;
&lt;br /&gt;
首先为即将在 &#039;&#039;&#039;htdocs/mymodule/core/boxes&#039;&#039;&#039; 目录中创建的每个box文件添加2行。&lt;br /&gt;
&lt;br /&gt;
例如：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;boxes[0][&#039;file&#039;]=&#039;mybox0.php@mymodule&#039;&lt;br /&gt;
$this-&amp;gt;boxes[0][&#039;note&#039;]=&#039;My box 0&#039;&lt;br /&gt;
 ...&lt;br /&gt;
$this-&amp;gt;boxes[n][&#039;file&#039;]=&#039;myboxn.php@mymodule&#039;&lt;br /&gt;
$this-&amp;gt;boxes[n][&#039;note&#039;]=&#039;My box n&#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其次，创建文件&#039;&#039;&#039;htdocs/mymodule/core/boxes/mybox0.php&#039;&#039;&#039;、&#039;&#039;&#039;htdocs/mymodule/core/boxes/mybox1.php&#039;&#039;&#039;…，以现有的消息框（在 &#039;&#039;&#039;htdocs/core/boxes&#039;&#039;&#039; 目录中）为示例。&lt;br /&gt;
&lt;br /&gt;
===测试您的消息框是否被 Dolibarr 检测到===&lt;br /&gt;
停用并重新激活模块。&lt;br /&gt;
&lt;br /&gt;
前往菜单  &#039;&#039;&#039;主页 - 设置 - widget小组件&#039;&#039;&#039; 。&lt;br /&gt;
&lt;br /&gt;
您的消息框必须显示在可激活消息框的清单中。激活它们，然后前往&#039;&#039;&#039;主页&#039;&#039;&#039;并检查它们是否正确显示。&lt;br /&gt;
&lt;br /&gt;
==定义您自己的导出 (可选)==&lt;br /&gt;
&#039;&#039;&#039;何时&#039;&#039;&#039;：如果您的模块附带提供预定义的数据导出（针对自己的表或来自另一个Dolibarr模块的现有表）。&lt;br /&gt;
&lt;br /&gt;
===定义导出===&lt;br /&gt;
为此，请取消注释并修改模块描述符文件中的 $this-&amp;gt;export_xxx 数组。&lt;br /&gt;
&lt;br /&gt;
===测试您的导出===&lt;br /&gt;
前往菜单 &#039;&#039;&#039;工具-&amp;gt;导出助手&#039;&#039;&#039; 。您的导出应显示在可用的预定义导出清单中（如果您的模块已激活）。选择它，您将看到在上一步时在表中定义的可能字段。选择几个字段并尝试生成导出文件。&lt;br /&gt;
&lt;br /&gt;
==设置CSS样式 (可选)==&lt;br /&gt;
&#039;&#039;&#039;何时&#039;&#039;&#039;：在PHP屏幕页面中，您使用的样式类不是Dolibarr主题的样式类（不推荐）。&lt;br /&gt;
&lt;br /&gt;
===创建并声明您的样式表===&lt;br /&gt;
创建一个名为 &#039;&#039;&#039;mymodule.css&#039;&#039;&#039; 或 &#039;&#039;&#039;mymodule.css.php&#039;&#039;&#039; 的CSS样式文件，并将其放在 &#039;&#039;&#039;htdocs/mymodule&#039;&#039;&#039; 目录中。每个模块只能有一个CSS文件。&lt;br /&gt;
&lt;br /&gt;
请记住，最好使用已有的Dolibarr样式（Dolibarr使用的CSS文件是&#039;&#039;&#039;themes/mytheme/&#039;&#039;themename&#039;&#039;.css.php&#039;&#039;&#039;）。仅当您必须处理不存在的样式时，才创建特定于模块的CSS文件。&lt;br /&gt;
&lt;br /&gt;
样式表准备就绪后，通过更改 &#039;&#039;&#039;$this-&amp;gt;modules_parts&#039;&#039;&#039; 属性在模块描述符文件中声明样式表。&lt;br /&gt;
&lt;br /&gt;
此处要输入的值必须是 CSS 文件 URL 的相对路径。&lt;br /&gt;
&lt;br /&gt;
例如：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;module_parts = array(&#039;css&#039; =&amp;gt; array(&#039;/mymodule/css/mymodule.css.php&#039;));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===测试您的样式表===&lt;br /&gt;
停用并重新激活模块。&lt;br /&gt;
&lt;br /&gt;
前往Dolibarr的主页。查看页面的HTML源代码。&lt;br /&gt;
&lt;br /&gt;
您应该在HTML标头中看到有一行是声明您的样式表。&lt;br /&gt;
&lt;br /&gt;
==定义Javascript函数 (可选)==&lt;br /&gt;
&#039;&#039;&#039;何时&#039;&#039;&#039;：当您在PHP屏幕页面中使用的 javascript 函数不是Dolibarr的标准js函数（在lib_head.js中）。&lt;br /&gt;
&lt;br /&gt;
如果在PHP屏幕页面上使用 javascript 函数，则必须将在 javascript 文件 &#039;&#039;&#039;htdocs/mymodule/js/mymodule.js&#039;&#039;&#039; 中声明的函数加载到HTML头中。&lt;br /&gt;
&lt;br /&gt;
若要求Dolibarr（负责生成 header 部分）包含一个 javascript 文件，必须在页面开头调用的llxHeader()函数的参数中提供包含要包含的JS URL的参数。&lt;br /&gt;
&lt;br /&gt;
页面 /htdocs/mymodule/mypage.php 的示例：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$morejs=array(&amp;quot;/mymodule/js/mymodule.js&amp;quot;);&lt;br /&gt;
llxHeader(&#039;&#039;,&#039;Titre&#039;,&#039;&#039;,&#039;&#039;,&#039;&#039;,&#039;&#039;,$morejs,&#039;&#039;,0,0); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==在Dolibarr事件上触发代码 (可选)==&lt;br /&gt;
&#039;&#039;&#039;何时&#039;&#039;&#039;：希望在Dolibarr标准操作后触发执行特定操作时（例如：当在Dolibarr中创建发票时，我想更新模块中的表），您需要创建一个 &#039;&#039;&#039;triggers&#039;&#039;&#039; 文件。&lt;br /&gt;
&lt;br /&gt;
另请参阅 [[Interfaces_Dolibarr_toward_foreign_systems|Dolibarr到外部系统的接口]] 和 [[Interfaces_from_foreign_systems_toward_Dolibarr|外部系统到Dolibarr的接口]]&lt;br /&gt;
&lt;br /&gt;
==在Dolibarr的hooks处插入代码 (可选)==&lt;br /&gt;
&#039;&#039;&#039;何时&#039;&#039;&#039;：当您想更改或添加业务事件以外的代码时（请参阅上一章）。&lt;br /&gt;
&lt;br /&gt;
请参阅页面 [[Hooks_system|Hooks系统]].&lt;br /&gt;
==添加编号模块（可选）==&lt;br /&gt;
&#039;&#039;&#039;何时&#039;&#039;&#039;：当您想添加默认模块未涵盖的编号规则时。&lt;br /&gt;
&lt;br /&gt;
请参阅页面 [[Create numbering module|创建编号模块]] 。&lt;br /&gt;
&lt;br /&gt;
==添加新文档模板 (可选)==&lt;br /&gt;
&#039;&#039;&#039;何时&#039;&#039;&#039;：需要添加新文档模板时。如想要个性化自己生成的 PDF 或 ODT 文档。&lt;br /&gt;
&lt;br /&gt;
注意：要添加此功能，您无需创建模块描述符文件。&lt;br /&gt;
&lt;br /&gt;
有关如何从模板生成文档的详情，请参阅页面 [[Create_a_PDF_document_template|创建PDF文档模板]] 或 [[Create_an_ODT_document_template|创建ODT文档模板]] 。&lt;br /&gt;
&lt;br /&gt;
==添加主题 (可选)==&lt;br /&gt;
&#039;&#039;&#039;何时&#039;&#039;&#039;：当您想要根据您的情况定制界面（颜色/字体/图形）时。&lt;br /&gt;
&lt;br /&gt;
注意：要添加此功能，您无需创建模块描述符。&lt;br /&gt;
&lt;br /&gt;
请参阅页面 [[Skins|主题]] 。&lt;br /&gt;
&lt;br /&gt;
==修改开发模块作者名==&lt;br /&gt;
&lt;br /&gt;
在myModule.class.php中查找editor_name&lt;br /&gt;
&lt;br /&gt;
修改以下变量的值以修改作者名称&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;editor_name = &#039;Roger@QQ:12464313&#039;;&lt;br /&gt;
$this-&amp;gt;editor_url = &#039;https://www.ivnun.cn&#039;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=面向开发人员的一些编码规则和函数=&lt;br /&gt;
要遵循的编码规则请参阅 [[语言和开发规则|开发语言和编码规范（PHP, SQL, HTML）]] 。&lt;br /&gt;
&lt;br /&gt;
要调用 Dolibarr 供开发人员使用的预定义函数，请参阅  [[开发文档]]  的“内部函数”一节。&lt;br /&gt;
&lt;br /&gt;
=创建一个安装包来分发和安装您的模块=&lt;br /&gt;
必须使用此步骤来制作安装包，以便将其提交到市场 http://www.dolistore.com。&lt;br /&gt;
&lt;br /&gt;
但您也可以使用它通过自己的分发网络轻松分发模块。&lt;br /&gt;
&lt;br /&gt;
*进入 &#039;&#039;&#039;/build&#039;&#039;&#039; 目录并将文件 &#039;&#039;&#039;makepack-dolibarrmodules.conf&#039;&#039;&#039; 复制到 &#039;&#039;&#039;makepack-mymodule.conf&#039;&#039;&#039;。请注意，稳定版本包中可能不提供此目录。如果是这种情况，可以在 Dolibarr 网站的“开发版本”部分供下载的快照中检索（在这种情况下，请获取整个 build 目录，这是一个独立于版本的目录）。&lt;br /&gt;
&lt;br /&gt;
在此文件中输入为模块创建的新文件的名称清单（模块描述符、新表的SQL文件、PHP页面、图像等）。&lt;br /&gt;
&lt;br /&gt;
*通过 Perl 运行脚本（需要Perl 5.0或更高版本）：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
perl makepack-dolibarrmodule.pl&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
该脚本将询问模块的名称、主要版本和次要版本。然后将生成一个 &#039;&#039;&#039;mymodule.zip &#039;&#039;&#039;文件，其中包含准备部署的模块。&lt;br /&gt;
&lt;br /&gt;
*接收您的模块的人员必须将该文件放在其 Dolibarr 的安装根目录中，并执行以下命令：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tar -xvf mymodule.zip&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*如果您希望您的模块惠及所有人，您可以在插件市场 {{LinkToPluginDownload}} 上提交它（zip文件）（您必须先创建一个帐户并登录，以使用“提交模块/产品”链接）。&lt;br /&gt;
**如果您的模块制作正确，文件将很快通过验证。&lt;br /&gt;
**如果质量足够好、许可证允许、并且模块的功能被证明是普遍感兴趣的，则可以将代码添加到 Dolibarr 的源代码中（除非您不希望这样做）。&lt;br /&gt;
&lt;br /&gt;
=Dolistore上外部模块的归档和验证=&lt;br /&gt;
&lt;br /&gt;
请参阅 [[Module_Dolistore_Validation_Rules|验证规则]]&lt;/div&gt;</summary>
		<author><name>ShengGang</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=%E6%A8%A1%E5%9D%97%E5%BC%80%E5%8F%91&amp;diff=58767</id>
		<title>模块开发</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=%E6%A8%A1%E5%9D%97%E5%BC%80%E5%8F%91&amp;diff=58767"/>
		<updated>2023-11-20T02:56:41Z</updated>

		<summary type="html">&lt;p&gt;ShengGang: /* 添加或删除对象表单上的选项卡 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- BEGIN interlang links --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Do NOT edit this section&lt;br /&gt;
     Links below are automatically managed by PolyglotBot&lt;br /&gt;
     You can edit links on the English source page : Module_development --&amp;gt;&lt;br /&gt;
[[en:Module_development]]&lt;br /&gt;
[[fr:Développement_module]]&lt;br /&gt;
[[es:Desarrollo_de_un_módulo]]&lt;br /&gt;
[[de:Modul_Entwicklung]]&lt;br /&gt;
[[ja:モジュール_開発]]&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Core]]&lt;br /&gt;
[[Category:开发]]&lt;br /&gt;
{{Template用户手册}}&lt;br /&gt;
{{Template开发文档}}&lt;br /&gt;
{{TemplateMainPageZh}}&lt;br /&gt;
&lt;br /&gt;
要创建新模块，需要执行以下几个步骤。本教程旨在向您介绍每一个步骤，以便添加一个模块来扩展Dolibarr的功能，例如添加以下一个或多个功能：&lt;br /&gt;
&lt;br /&gt;
*在数据库中添加新表&lt;br /&gt;
*在菜单中添加您自己的菜单项&lt;br /&gt;
*添加对象和屏幕以输入/查看新表&lt;br /&gt;
*在视图页上添加或删除选项卡/编辑对象（发票、产品、订单、事件等）&lt;br /&gt;
*为内部导出工具添加预定义的导出&lt;br /&gt;
*向主页添加新信息框/widget小组件&lt;br /&gt;
*添加新的替换变量&lt;br /&gt;
*定义新权限&lt;br /&gt;
*自动触发指定 Dolibarr 操作的代码&lt;br /&gt;
*将自定义代码插入 Dolibarr 的钩子位置&lt;br /&gt;
*为所创建的对象的引用添加编号模块（为数据自动编码的模块）&lt;br /&gt;
*添加PDF文档模板&lt;br /&gt;
*添加一个新主题/皮肤&lt;br /&gt;
&lt;br /&gt;
等等...&lt;br /&gt;
&lt;br /&gt;
以下章节介绍了如何以简单的方式手动完成所有这些操作。对于有经验的开发人员来说，使用MDA生成的方法也不错，详见最后一章。&lt;br /&gt;
&lt;br /&gt;
=使用模块生成器构建模块=&lt;br /&gt;
从Dolibarr 9.0开始，您可以使用&amp;quot;模块生成器&amp;quot;（Module Builder）创建模块的主要文件。要激活它 ：&lt;br /&gt;
&lt;br /&gt;
*设置参数 MAIN_FEATURES_LEVEL 的值为 2 ( 设置 / 其他 )（或者修改llx_const表中该项的记录的value值为2）&lt;br /&gt;
&lt;br /&gt;
[[File:企业微信截图 20180725114721.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*在 &#039;&#039;&#039;主页 - 设置 - 设置-模块/应用 多模块工具&#039;&#039;&#039; 中激活“模块生成器”（ModuleBuilder）&lt;br /&gt;
&lt;br /&gt;
[[File:激活modulebuilder.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*点击屏幕右上角菜单栏中出现的&#039;Bug&#039;图标&lt;br /&gt;
&lt;br /&gt;
[[File:Buglogo.png]]&lt;br /&gt;
&lt;br /&gt;
*运行的ModuleBuilder界面如下：&lt;br /&gt;
&lt;br /&gt;
[[File:Modulebuilder.png|800px]]&lt;br /&gt;
&lt;br /&gt;
=外部模块模板示例=&lt;br /&gt;
一个Dolibarr外部模块的模板/框架：[https://github.com/Dolibarr/dolibarr/tree/develop/htdocs/modulebuilder/template Github Dolibarr模块]&lt;br /&gt;
&lt;br /&gt;
=创建模块=&lt;br /&gt;
以下章节描述了创建Dolibarr模块所需的操作。无论模块的用途如何，第一章描述的操作都是必须要完成的，后续章节描述的操作是否要做将取决于模块的需求。 &lt;br /&gt;
&lt;br /&gt;
==创建模块描述符（必做）==&lt;br /&gt;
&#039;&#039;&#039;何时&#039;&#039;&#039;：无论其用途如何，开发扩展模块时都是强制性的。&#039;&#039;&#039;从Dolibarr 9.0开始，您可以使用“模块生成器”创建模块的描述符&#039;&#039;&#039;。该工具仍处于开发和完善阶段，但其已经可以使用。&lt;br /&gt;
&lt;br /&gt;
===使用模块生成器创建描述符===&lt;br /&gt;
&lt;br /&gt;
*通过单击&amp;quot;Bug&amp;quot;图标启动模块生成器&lt;br /&gt;
&lt;br /&gt;
[[File:Mod_builder_3.png|400px]]&lt;br /&gt;
&lt;br /&gt;
*在下图“模块名称”处输入不含空格的模块名称（模块名称不得包含下划线 ：_），然后单击&amp;quot;创建&amp;quot;按钮。&lt;br /&gt;
&lt;br /&gt;
[[file:模块名.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*已初始化具有第一个文件的模块。然后，您可以更改模块描述符的参数：&lt;br /&gt;
&lt;br /&gt;
[[File:Mod_builder_5.png|400px]]&lt;br /&gt;
&lt;br /&gt;
===备选方案：手动创建描述符（不使用模块生成器）===&lt;br /&gt;
第一步是创建模块描述文件（描述符）。为此：&lt;br /&gt;
&lt;br /&gt;
*创建目录 &#039;&#039;&#039;htdocs/custom/&#039;&#039;mymodule&#039;&#039;/core/modules&#039;&#039;&#039; 。&lt;br /&gt;
*进入目录 &#039;&#039;&#039;htdocs/modulebuilder/template/core/modules&#039;&#039;&#039; 将文件 modMyModule.class.php 复制到目录 &#039;&#039;&#039;htdocs/custom/&#039;&#039;mymodule&#039;&#039;/core/modules&#039;&#039;&#039; 中。&lt;br /&gt;
*重命名mod&#039;&#039;&#039;MyModule&#039;&#039;&#039;.class.php文件，只需修改&#039;&#039;&#039;MyModule&#039;&#039;&#039;部分即可（文件必须以mod开头）&lt;br /&gt;
&lt;br /&gt;
然后，编辑此文件的内容：&lt;br /&gt;
&lt;br /&gt;
*将所有&#039;&#039;modMyModule&#039;&#039;替换为与模块用途相对应的值。此值必须始终以“&#039;&#039;&#039;mod&#039;&#039;&#039;”开头，并且仅包含&#039;&#039;&#039;字母字符&#039;&#039;&#039;。&lt;br /&gt;
*通过 $this-&amp;gt;numero = &#039;&#039;100000&#039;&#039; 设置模块ID。为避免冲突，您可以参考以下页面查找已分配的ID：[[List of modules id|模块ID清]]&amp;lt;nowiki/&amp;gt;[[List of modules id|单]] 。&lt;br /&gt;
*可能还需要修改构造函数中定义的其他变量（有关其含义，请参阅[[主模块代码框架|类文件代码]]中的注释）。&lt;br /&gt;
&lt;br /&gt;
模块的描述文件（描述符）已准备就绪。请参阅下一步“测试描述符”以激活您的新模块。&lt;br /&gt;
&lt;br /&gt;
===测试描述符===&lt;br /&gt;
&lt;br /&gt;
启动Dolibarr并进入 &#039;&#039;&#039;主页-&amp;gt;设置-&amp;gt;模块/应用&#039;&#039;&#039; 页面，您应该会看到一个新行，其中包含新模块以及是否激活它的选项（浏览每个模块类别的所有选项卡，直到找到它）。&lt;br /&gt;
&lt;br /&gt;
$this-&amp;gt;special 的值决定了模块位于哪个类别选项卡中。&lt;br /&gt;
&lt;br /&gt;
注意：如果在模块描述符中设置了属性 version ，则应在 &#039;&#039;&#039;模块/应用&#039;&#039;&#039; 页面看到包含新模块的新行以及是否激活它的选项。如果将属性 version 设置为“develop”或“experiental”，若要查看模块，必须先进入页面 &#039;&#039;&#039;“主页-&amp;gt;设置-&amp;gt;其他设置&#039;&#039;&#039;”，并将参数 MAIN_FEATURES_LEVEL 设置为 1 以查看“实验性”(experimental)模块，或设置为 2 以查看“开发”(development)模块。&lt;br /&gt;
&lt;br /&gt;
===模块的名称===&lt;br /&gt;
&lt;br /&gt;
模块名称不得包含下划线或下划线：_&lt;br /&gt;
==新模块的树视图（必需）==&lt;br /&gt;
&lt;br /&gt;
以下是组织模块文件时要遵循的树结构（如果使用ModuleBuilder生成文件，则自动采用此树结构）。&lt;br /&gt;
&lt;br /&gt;
注：zip 文件也必须符合此规则，只有第二行是强制性的。&lt;br /&gt;
&lt;br /&gt;
{{Template模块目录树}}&lt;br /&gt;
&lt;br /&gt;
一个好的Dolibarr扩展模块的模板/框架：[https://github.com/Dolibarr/dolibarr/tree/develop/htdocs/modulebuilder/template GitHub Dolibarr Module Modèle]&lt;br /&gt;
&lt;br /&gt;
==创建数据表和 PHP DAO 类 (可选)==&lt;br /&gt;
&#039;&#039;&#039;何时：&#039;&#039;&#039;如果您的模块需要管理自己的数据&lt;br /&gt;
&lt;br /&gt;
===创建 .sql 文件===&lt;br /&gt;
如果您的模块要处理在Dolibarr标准版中不存在的数据，则需要自定义数据库表来存储这些数据。&lt;br /&gt;
&lt;br /&gt;
在模块的目录中创建&#039;&#039;&#039;sql&#039;&#039;&#039;子目录（&#039;&#039;&#039;mymodule/sql&#039;&#039;&#039;），用于放置要创建的sql脚本（使用ModuleBuilder，在&amp;quot;对象&amp;quot;选项卡中创建新对象后，将自动执行此步骤）。&lt;br /&gt;
&lt;br /&gt;
接下来，检查模块描述符文件，在 &#039;&#039;&#039;init&#039;&#039;&#039; 函数中是否包括行：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight 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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
并且未被注释掉。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;应遵循的规则&#039;&#039;：&lt;br /&gt;
&lt;br /&gt;
*根据每个表1个文件的原则添加表的创建命令文件，命名为 &#039;&#039;&#039;llx_mytable.sql&#039;&#039;&#039;（用于表），可能还附带 &#039;&#039;&#039;llx_mytable.key.sql&#039;&#039;&#039; 文件（用于索引或外键）。示例请参阅 &#039;&#039;&#039;install/mysql/tables&#039;&#039;&#039; 中的现有文件。&lt;br /&gt;
*SQL字段的推荐类型和名称在 [[https://wiki.dolibarr.org/index.php/Langages_et_normes#R.C3.A8gles_de_codage_SQL]] 页中定义。&lt;br /&gt;
*管理数据：对于添加/操作数据的命令，它们都必须位于同一目录 &#039;&#039;&#039;/mymodule/sql/&#039;&#039;&#039; 中名为 &#039;&#039;&#039;data.sql&#039;&#039;&#039; 的文件中。&lt;br /&gt;
*不要使用双引号（如 &amp;quot;string&amp;quot;），因为双引号（&amp;quot;）在 PostGreSQL 中有特殊的含义&lt;br /&gt;
&lt;br /&gt;
data.sql文件内容示例：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight 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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
文件中的SQL语句必须对 &#039;&#039;&#039;mysql&#039;&#039;&#039; 数据库有效。请注意：不需要维护其他数据库类型的文件。它们由数据库驱动程序动态读取和转换。&lt;br /&gt;
&lt;br /&gt;
===测试 .sql 文件===&lt;br /&gt;
&lt;br /&gt;
文件准备就绪后，您可以返回Dolibarr的模块管理页面，禁用模块，删除数据库表（如果它们已经存在），然后重新激活模块。正常情况下，应该可以通过激活模块来重新创建表。否则，请手动检查脚本，或查看Dolibarr日志。&lt;br /&gt;
&lt;br /&gt;
===生成 PHP DAO 表访问类===&lt;br /&gt;
创建对象时，ModuleBuilder会自动生成对象的PHP DAO类文件。&lt;br /&gt;
&lt;br /&gt;
如果不使用模块生成器，您将在模块框架文件&#039;&#039;&#039;htdocs/modulebuilder/templates/class/myobject.class.php&#039;&#039;&#039; 中找到示例。&lt;br /&gt;
&lt;br /&gt;
在这个类中，已经有可调用的 CRUD（Create/Read/Update/Delete）方法来执行表行数据的插入、获取（select）、更新和删除。修改此文件以使用正确的模块名和表名，并将该文件放在模块的 &#039;&#039;&#039;class&#039;&#039;&#039; 子目录中。若使用 &#039;&#039;&#039;ModuleBuilder&#039;&#039;&#039; 只需点击几下鼠标即可完成此操作。&lt;br /&gt;
&lt;br /&gt;
====使用ModuleBuilder生成PHP DAO类文件====&lt;br /&gt;
&lt;br /&gt;
*使用ModuleBuilder生成PHP DAO类文件，简单至在下图中选择&#039;对象&#039;选项卡，输入&#039;对象名&#039;，然后点击创建，即可生成相关一切文档。&lt;br /&gt;
&lt;br /&gt;
[[File:新对象.png|800px]]&lt;br /&gt;
&lt;br /&gt;
参见[[ModuleBuilder用户手册]]&lt;br /&gt;
==选项卡显示(可选)==&lt;br /&gt;
&lt;br /&gt;
===添加或删除对象表单上的选项卡===&lt;br /&gt;
&#039;&#039;&#039;何时：&#039;&#039;&#039;在标准对象（发票、订单、报价单、会员…）的表单中添加您自己的选项卡&lt;br /&gt;
&lt;br /&gt;
要执行此操作，请打开之前创建的模块描述符文件并编辑 $this-&amp;gt;tabs 数组：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
	// 用于在新tabs中添加新页面或删除现有页面的数组&lt;br /&gt;
	$this-&amp;gt;tabs = array(&#039;objecttype:+tabname1:Title1:mylangfile@mymodule:$user-&amp;gt;rights-&amp;gt;mymodule-&amp;gt;read:/mymodule/mypagetab1.php?id=__ID__&#039;    // 增加一个由code tabname1标识的新tab&lt;br /&gt;
                            &#039;objecttype:+tabname2:Title2:mylangfile@mymodule:$user-&amp;gt;rights-&amp;gt;mymodule-&amp;gt;read:/mymodule/mypagetab2.php?id=__ID__&#039;,   // 增加一个由code tabname2标识的新tab&lt;br /&gt;
                            &#039;objecttype:-tabname&#039;);                                                     // 删除一个由code tabname标识的现有选项卡&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
该表应包含字符串列表，每个字符串表示一个新选项卡。字符串格式由6个部分组成，由“：”分隔&lt;br /&gt;
&lt;br /&gt;
*第1部分：选项卡的元素类型（objecttype），只能是下列值之一：&lt;br /&gt;
{{TemplateModuleTabs-zh}}&lt;br /&gt;
&lt;br /&gt;
*第2部分：用于标识要添加（以+开头）或删除（以-开头）的选项卡的codeName&lt;br /&gt;
*第3部分：选项卡的标题。这可以是硬编码的字符串，或者是更好的，lang文件中的翻译代码。&lt;br /&gt;
*第4部分：文件“*.lang”的名称（不带.lang扩展名），此文件内有翻译代码和要显示的语言字符串之间的对应关系。如果这个文件名后面跟@mymodule，则Dolibarr将在模块自己的 lang 目录中查找翻译文件，即htdocs/mymodule/langs/code_CODE/mymodule.lang，否则Dolibarr将查找翻译文件htdocs/langs/code_CODE/mylangfile.lang。&lt;br /&gt;
*第5部分：判断选项卡是否可见的条件。设置为“1”，会使其始终可见。&lt;br /&gt;
*第6部分：单击选项卡时要显示的页面的URL。字符串“__ID__”将自动替换为相关元素的ID。&lt;br /&gt;
&lt;br /&gt;
要使声明生效，必须禁用并重新激活该模块。&lt;br /&gt;
&lt;br /&gt;
要使用来自数据库的数据填充选项卡的内容，请参阅下一章。&lt;br /&gt;
&lt;br /&gt;
为了获取现有选项卡的名称“tabname”，您必须检查文件“core/lib/module.lib.php”的函数“product_prepare_head”中使用的名称，该文件对应于“$head[$h][2]”部分。&lt;br /&gt;
&lt;br /&gt;
===将对象的标准选项卡添加到其自己的表单页面===&lt;br /&gt;
&#039;&#039;&#039;何时：&#039;&#039;&#039;在您自己的表单中添加标准对象（产品、合作方…）的选项卡&lt;br /&gt;
&lt;br /&gt;
必须遵循以下步骤：&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. 在代码中包含定义相关函数的文件&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
对于每种对象选项卡，都有两个文件需要使用下列语句：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;require_once($url_fichier) ;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下是要包含的文件示例（DOL_DOCUMENT_ROOT 对应于 dolibarr/htdocs/ 文件夹）：&lt;br /&gt;
&lt;br /&gt;
*合作方(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;
*产品(product) :&lt;br /&gt;
**DOL_DOCUMENT_ROOT/product/class/product.class.php&lt;br /&gt;
**DOL_DOCUMENT_ROOT/core/lib/product.lib.php&lt;br /&gt;
*发票 (invoice) :&lt;br /&gt;
**DOL_DOCUMENT_ROOT/compta/facture/class/facture.class.php&lt;br /&gt;
**DOL_DOCUMENT_ROOT/core/lib/invoice.lib.php&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. 创建并加载要在自己的表单中显示的标准对象&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
创建所需类的对象，并从数据库中获取对象数据。为此，您必须使用相应类的fetch()函数，并将从URL（/mytab.php?id=1）获取的对象id作为参数传递。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;例如：&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$id=GETPOST(&#039;id&#039;,&#039;int&#039;);&lt;br /&gt;
$ref=GETPOST(&#039;ref&#039;,&#039;alpha&#039;);&lt;br /&gt;
$product = new Product($db) ;&lt;br /&gt;
$result = $product-&amp;gt;fetch($id,$ref) ; // Test $result to check the database read is ok&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3. 检索与所选实体对应的选项卡列表&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
使用函数XXX_prepare_head($obj)（其中XXX是实体名称）创建一个包含要显示的选项卡定义的数组。要传递的参数是要显示选项卡的对象。&lt;br /&gt;
&lt;br /&gt;
返回的数组由以下内容组成：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$head        // tabs的数组&lt;br /&gt;
$head[$h]    // Element to describe one tab.&lt;br /&gt;
$head[$h][0] // Url of page to show when you click on tab&lt;br /&gt;
$head[$h][1] // Title of tab&lt;br /&gt;
$head[$h][2] // Code name to identify the tab&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;示例：&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$head = product_prepare_head($product, $user) ; // 参数 $user 是要显示选项卡的对象，这就是&amp;quot;产品&amp;quot;对象为&amp;quot;user&amp;quot;对象准备的所有可用的选项卡的数组。&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
某些函数上不存在$user参数&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4. 在您的页面上显示选项卡&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
使用dol_fiche_head()函数，该函数显示由 XX_prepare_head() 返回的 $head 数组中包含的选项卡。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight 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  // Title to show (shown into a special tab that you can&#039;t click)&lt;br /&gt;
//$notab&lt;br /&gt;
//$picto  // Name of image to show into title. Possible values are:&lt;br /&gt;
//            product&lt;br /&gt;
//            service&lt;br /&gt;
//            company&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
此函数将显示所需的选项卡，并打开一个html元素&#039;&#039;&amp;lt; div class=&amp;quot;&amp;quot; &amp;gt;&#039;&#039;，该元素对应于选项卡下方的显示区域（如果参数 $notab=0）。要关闭显示区域，只需在PHP代码中使用关闭元素&amp;lt;nowiki&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/nowiki&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
注：相关的更多细节，请参阅 [http://www.dolibarr.fr/doxygen/ Doxygen文档] 或直接参考 Dolibarr 代码。&lt;br /&gt;
&lt;br /&gt;
==创建PHP屏幕页面（可选）==&lt;br /&gt;
&#039;&#039;&#039;何时&#039;&#039;&#039;：如果新模块的目的是添加一个需要新屏幕页面的功能。&lt;br /&gt;
&lt;br /&gt;
===创建原始PHP屏幕页面===&lt;br /&gt;
随后，您可以使用 &#039;&#039;&#039;modulebuilder&#039;&#039;&#039; 目录中提供的示例模板（&#039;&#039;&#039;myobject_page.php&#039;&#039;&#039;）创建基于表数据的PHP页面（有关命令行脚本的开发，请参阅 [[脚本开发]] ）。同样，如果您使用的是 ModuleBuilder，则在初始化对象时会自动创建页面实例（清单、创建页面、Notes选项卡等）。&lt;br /&gt;
&lt;br /&gt;
要创建新的用户屏幕页面，请创建特定于模块的 &#039;&#039;&#039;htdocs&#039;&#039;&#039; 子目录（如果尚未创建）（如 &#039;&#039;&#039;htdocs/mymodule&#039;&#039;&#039; ），以便在其中放置要创建的页面。&lt;br /&gt;
&lt;br /&gt;
从复制文件 &#039;&#039;&#039;myobject_page.php&#039;&#039;&#039; 作为开始。编辑该文件，以便能正确找到并加载 main.inc.php 文件：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
// Load Dolibarr environment&lt;br /&gt;
$res=0;&lt;br /&gt;
// Try main.inc.php into web root known defined into CONTEXT_DOCUMENT_ROOT (not always defined)&lt;br /&gt;
if (! $res &amp;amp;&amp;amp; ! empty($_SERVER[&amp;quot;CONTEXT_DOCUMENT_ROOT&amp;quot;])) $res=@include($_SERVER[&amp;quot;CONTEXT_DOCUMENT_ROOT&amp;quot;].&amp;quot;/main.inc.php&amp;quot;);&lt;br /&gt;
// Try main.inc.php into web root detected using web root caluclated from SCRIPT_FILENAME&lt;br /&gt;
$tmp=empty($_SERVER[&#039;SCRIPT_FILENAME&#039;])?&#039;&#039;:$_SERVER[&#039;SCRIPT_FILENAME&#039;];$tmp2=realpath(__FILE__); $i=strlen($tmp)-1; $j=strlen($tmp2)-1;&lt;br /&gt;
while($i &amp;gt; 0 &amp;amp;&amp;amp; $j &amp;gt; 0 &amp;amp;&amp;amp; isset($tmp[$i]) &amp;amp;&amp;amp; isset($tmp2[$j]) &amp;amp;&amp;amp; $tmp[$i]==$tmp2[$j]) { $i--; $j--; }&lt;br /&gt;
if (! $res &amp;amp;&amp;amp; $i &amp;gt; 0 &amp;amp;&amp;amp; file_exists(substr($tmp, 0, ($i+1)).&amp;quot;/main.inc.php&amp;quot;)) $res=@include(substr($tmp, 0, ($i+1)).&amp;quot;/main.inc.php&amp;quot;);&lt;br /&gt;
if (! $res &amp;amp;&amp;amp; $i &amp;gt; 0 &amp;amp;&amp;amp; file_exists(dirname(substr($tmp, 0, ($i+1))).&amp;quot;/main.inc.php&amp;quot;)) $res=@include(dirname(substr($tmp, 0, ($i+1))).&amp;quot;/main.inc.php&amp;quot;);&lt;br /&gt;
// Try main.inc.php using relative path&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;);&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;);&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;);&lt;br /&gt;
if (! $res) die(&amp;quot;Include of main fails&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如您所见，其多次尝试加载 main.inc.php（或 master.inc.php）文件。目标是在尽可能多的场景下取得成功。最少为2行：一行用于尝试将 master/main.inc.php 文件加载到 dolibarr 的根目录中，另一行用于尝试加载该文件，以支持模块部署在“custom”目录中的场景。但你可能不得不处理更多的场景。上面提供的示例应该能够在几乎所有场景/配置下加载 main/master.inc.php 文件。&lt;br /&gt;
&lt;br /&gt;
在3.2之后，为所有版本的Dolibarr开发的扩展模块可以放置在不同的文件夹中，而不仅仅是“htdocs”，如“htdocs/custom”，为了不必修改模块的源代码，我们要做几个包含，所以这个规则必须被所有模块使用。&lt;br /&gt;
&lt;br /&gt;
请注意，您可以根据文件相对于模块目录树的深度添加更多的“../”。&lt;br /&gt;
&lt;br /&gt;
main.inc.php文件加载了技术环境变量和权限。然后设置以下对象变量：&lt;br /&gt;
&lt;br /&gt;
*$user    包含用户属性 + 权限的对象&lt;br /&gt;
*$conf    包含 Dolibarr 设置的对象&lt;br /&gt;
*$db       包含数据库连接句柄的对象&lt;br /&gt;
*$langs   包含用户语言的对象&lt;br /&gt;
&lt;br /&gt;
然后输入代码以显示页面。&lt;br /&gt;
&lt;br /&gt;
*在不知道从何处调用文件的情况下，使用Dolibarr函数dol_include_once()（而不是直接使用include_once）包含专用于模块的类或库&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;例如：&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
dol_include_once(&#039;/mymodule/class/myclass.class.php&#039;, &#039;MyClass&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*另一方面，Dolibarr提供的标准类将使用 require-once 直接调用，语法如下：&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;例如：&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight 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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
原因是，尽管dol_include_once很方便，却因它会扫描每个备用路径目录以找到文件，所以它的性能也很差，因为它会在每次调用时生成访问和磁盘搜索（实际上，PHP集成了已读文件的缓存，但未集成“未找到”文件的缓存）。由于给定的文件只可能存在于一个树中，所以总会有一个无此文件的备用树，这会产生对硬盘的不必要访问，从而影响性能。与Dolibarr的内部文件一样，我们总是知道确切的路径，应该首选带有该直接路径的 require_once）。&lt;br /&gt;
&lt;br /&gt;
===在已存在的表单上增加新字段===&lt;br /&gt;
您可能希望提供一个模块，将更多字段添加到某些元素的表单（录入和展示）中。&lt;br /&gt;
&lt;br /&gt;
一个繁琐（但不太糟糕）的解决方案可能是替换用于创建元素的所有页面（这意味着禁用“新建元素”菜单项并添加您的菜单项，并禁用显示元素的选项卡，以替换选项卡，该选项卡是您自己的完整页面（从原始页面复制/粘贴），使其与原始页面相同，但被修改为添加字段并将添加的数据存储到您自己的表中）。如果此解决方案适合您，请前往菜单 [[#Define your entries in menu (optional)]] 和 [[#The tab management (optional)]]（本解决方案更强大，因为您可以在页面中改变你想要改变的一切）。&lt;br /&gt;
&lt;br /&gt;
我们将在这里描述另一种解决方案，该解决方案仅适用于在现有字段的末尾“添加字段”，下面以元素“category”作为示例，但您可以将本教程转换为发票、报价单...&lt;br /&gt;
&lt;br /&gt;
*首先，添加一个由您的模块拥有的表，以存储新字段的值。此表将有一个名为“rowid”的列（将包含与元素表的字段rowid相同的值+每一个要添加的新字段。然后为这个新表创建一个具有CRUD（Create/Read/Update/Delete）方法的类。对于这两项任务，请返回前一章[[#创建数据表和表的PHP类文件 (可选)]]。&lt;br /&gt;
*其次，在模块中添加一个钩子，以将新字段添加到表单中。有关使用钩子的通用文档，请参阅[[Hooks_system#Implement_the_Hook]]章节。&lt;br /&gt;
&lt;br /&gt;
如果遵循本教程，则必须执行以下操作才能将字段添加到 category 表单中：&lt;br /&gt;
{{ToComplete}}&lt;br /&gt;
&lt;br /&gt;
===用钩子添加/替换部分字段===&lt;br /&gt;
请参阅  [[钩子系统#实现钩子]] 章节，了解如何使用Dolibarr现有的钩子在Dolibarr钩子位置添加/替换代码。&lt;br /&gt;
&lt;br /&gt;
===访问数据库===&lt;br /&gt;
如果您需要对自己添加的表进行基本变更，请使用之前生成的类，其中包含用于此目的的方法。&lt;br /&gt;
&lt;br /&gt;
但是，如果您希望在没有专用PHP对象的情况下访问表，这仍然是可能的（例如，检索记录列表）。在这种情况下，请考虑以下示例：&lt;br /&gt;
&lt;br /&gt;
对于插入、更新或删除：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$db-&amp;gt;begin();   // Start transaction&lt;br /&gt;
$db-&amp;gt;query(&amp;quot;My SQL request insert, update or delete&amp;quot;);&lt;br /&gt;
$db-&amp;gt;commit();       // Validate transaction&lt;br /&gt;
or $db-&amp;gt;rollback()  // Cancel transaction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
对于读取:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$resql=$db-&amp;gt;query(&amp;quot;My select request&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===定义页面样式===&lt;br /&gt;
为了使页面的外观与 Dolibarr 主题保持一致，必须使用 Dolibarr CSS 样式。&lt;br /&gt;
&lt;br /&gt;
例如：&lt;br /&gt;
&lt;br /&gt;
*在表格标题行的&#039;&#039;tr&#039;&#039;和&#039;&#039;td&#039;&#039;标签上使用 class=&amp;quot;&#039;&#039;&#039;liste_titre&#039;&#039;&#039;&amp;quot;&lt;br /&gt;
*在表格数据行的&#039;&#039;tr&#039;&#039;和&#039;&#039;td&#039;&#039;标签上使用 class=&amp;quot;&#039;&#039;&#039;pair&#039;&#039;&#039;&amp;quot; 或 class=&amp;quot;&#039;&#039;&#039;impair&#039;&#039;&#039;&amp;quot;&lt;br /&gt;
*在所有输入域（&#039;&#039;input, select, textarea&#039;&#039;...）上使用 class=&amp;quot;&#039;&#039;&#039;flat&#039;&#039;&#039;&amp;quot;&lt;br /&gt;
*在所有 &#039;&#039;type=&amp;quot;submit&amp;quot;&#039;&#039; 的 &#039;&#039;input&#039;&#039; 对象上使用 class=&amp;quot;&#039;&#039;&#039;button&#039;&#039;&#039;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===使用 Dolibarr 日期选择器===&lt;br /&gt;
如果您愿意，您可以使用 Dolibarr 屏幕页面中的日期选择器（带日历弹出窗口）。为此，请使用以下行：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight 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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
字符串&amp;lt;syntaxhighlight 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;/syntaxhighlight&amp;gt;标识表单中的日期选择器。如果在同一页面中使用多个日期选择器，则必须设置不同的值。&lt;br /&gt;
&lt;br /&gt;
字符串myform是FORM区域的名称（在HTML页面的form name=“myform”中）。因此，日期选择器的显示必须集成到FORM Html区域中。&lt;br /&gt;
&lt;br /&gt;
要在POST结束时检索值，命令为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight 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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===覆盖模板文件 (tpl)===&lt;br /&gt;
如果您想覆盖模块上的tpl文件，则需要在 module_parts 上声明它：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
&#039;tpl&#039; =&amp;gt; 1,&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后您可以在 &#039;&#039;&#039;mymodule/core/tpl&#039;&#039;&#039; 上放置任何tpl文件。&lt;br /&gt;
&lt;br /&gt;
一旦模块被激活，tpl就会被覆盖。&lt;br /&gt;
&lt;br /&gt;
==设置配置页面 (可选)==&lt;br /&gt;
&#039;&#039;&#039;何时&#039;&#039;&#039;：如果您的模块提供多个可配置选项。&lt;br /&gt;
&lt;br /&gt;
===创建配置编辑页面===&lt;br /&gt;
如果您的模块提供了多个可配置选项，则需要创建一个PHP页面来编辑这些选项（存储在 [[Table llx_const|表 &#039;&#039;&#039;llx_const&#039;&#039;&#039;]] 中）。&lt;br /&gt;
&lt;br /&gt;
创建一个名为 &#039;&#039;&#039;mymodule_setuppage.php&#039;&#039;&#039; 的PHP页面，显示可能的选项并更新它们。&lt;br /&gt;
&lt;br /&gt;
有必要以 &#039;&#039;&#039;/admin&#039;&#039;&#039; 中的一个页面为例，展示读取或保存选项的方法。将此配置页面也放在&#039;&#039;&#039;/admin&#039;&#039;&#039;目录中。&lt;br /&gt;
&lt;br /&gt;
===修改模块的描述符文件===&lt;br /&gt;
然后，在模块描述符文件中，修改变量 &#039;&#039;&#039;config_page_url&#039;&#039;&#039; 以指定该PHP页面的名称。&lt;br /&gt;
&lt;br /&gt;
如果页面在目录 &#039;&#039;&#039;admin/&#039;&#039;&#039; 中），则：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;config_page_url = array(&amp;quot;mymodule_setuppage.php&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果页面在目录 &#039;&#039;&#039;mymodule/admin/&#039;&#039;&#039; 中，则：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;config_page_url = array(&amp;quot;mymodule_setuppage.php@mymodule&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===测试您的页面===&lt;br /&gt;
前往“主页-&amp;gt;设置-&amp;gt;模块/应用”页面，您应该会看到一个齿轮图标，允许您访问配置页面，并且您应该能够修改这些选项并将其保存到数据库中。&lt;br /&gt;
&lt;br /&gt;
==设置菜单项 (可选)==&lt;br /&gt;
&#039;&#039;&#039;何时&#039;&#039;&#039; ：如果您创建了PHP页面，则必须从Dolibarr菜单访问这些屏幕页面。&lt;br /&gt;
&lt;br /&gt;
===设置菜单项===&lt;br /&gt;
为此，您需要在模块描述符文件中定义数组 this-&amp;gt;menu，该数组用于声明菜单。&lt;br /&gt;
&lt;br /&gt;
此数组包含模块激活后将显示在菜单中的所有条目。&lt;br /&gt;
&lt;br /&gt;
模块描述符文件的示例文件 &#039;&#039;&#039;modMyModule.class.php&#039;&#039;&#039; 中有一个声明顶部菜单及其相关的左侧菜单项的示例。&lt;br /&gt;
&lt;br /&gt;
以下是描述符文件中菜单项声明的示例：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight 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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
若要根据权限限制对菜单的访问，请更改数组的 &#039;&#039;&#039;perms&#039;&#039;&#039; 属性。有关如何添加权限的更多信息，请参阅后面有关权限的章节。&lt;br /&gt;
&lt;br /&gt;
===测试您的菜单项===&lt;br /&gt;
在Dolibarr中禁用并重新激活您的模块，然后应该会出现菜单项（如果 “enabled”为真）。&lt;br /&gt;
&lt;br /&gt;
==设置您自己的权限 (可选)==&lt;br /&gt;
&#039;&#039;&#039;何时&#039;&#039;&#039;： 如果要添加新权限。&lt;br /&gt;
&lt;br /&gt;
模块将其管理的权限定义，放在第一步中创建的模块描述符文件中完成。更改行：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;rights_class = &#039;mymodule&#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
录入正确的 myModule 值。&lt;br /&gt;
&lt;br /&gt;
然后在 $this-&amp;gt;rights 数组中填充与要管理的不同权限一样多的条目。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight 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;Label by default of permission&#039;;&lt;br /&gt;
$this-&amp;gt;rights[$r][3] = 1;&lt;br /&gt;
$this-&amp;gt;rights[$r][4] = &#039;action&#039;;&lt;br /&gt;
$this-&amp;gt;rights[$r][5] = &#039;subaction&#039;;&lt;br /&gt;
$r++;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在$this-&amp;gt;rights[$r][0]中，输入尚未使用的权限ID（请参阅&#039;&#039;&#039;系统信息&#039;&#039;&#039;菜单，在运行Dolibarr的设备上查看已在使用的ID）。&lt;br /&gt;
&lt;br /&gt;
在$this-&amp;gt;rights[$r][1]中，输入默认标签（如果在 &#039;&#039;&#039;admin.lang&#039;&#039;&#039; 文件中找不到您权限标签的翻译字符串，则显示该标签。翻译键值为 “Permission10001=我的超级权限的描述”）。&lt;br /&gt;
&lt;br /&gt;
在$this&amp;gt;rights[$r][2]中，输入权限类型。有三种类型的权限，“r”表示读取、列出清单或导出权限，“w”表示写入或更新权限，“d”表示删除权限。&lt;br /&gt;
&lt;br /&gt;
在$this-&amp;gt;rights[$r][3]中，如果任何一个新创建的用户都会被默认自动分配此权限，则输入1。&lt;br /&gt;
&lt;br /&gt;
在$this-&amp;gt;rights[$r][4]和$this-&amp;gt;rights[$r][5]中，输入不带空格的操作和子操作字符串。然后，您可以通过以下命令在PHP代码中测试用户是否具有正确的权限：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
if ($user-&amp;gt;rights-&amp;gt;mymodule-&amp;gt;action-&amp;gt;subaction) ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==设置您自己的消息框/widget小组件 (可选)==&lt;br /&gt;
&#039;&#039;&#039;何时&#039;&#039;&#039;：如果您的模块附带提供在主页上展示的一个或多个消息框。&lt;br /&gt;
&lt;br /&gt;
===设置您的消息框===&lt;br /&gt;
为此，请修改模块描述符文件中的数组 $this-&amp;gt;boxes。&lt;br /&gt;
&lt;br /&gt;
首先为即将在 &#039;&#039;&#039;htdocs/mymodule/core/boxes&#039;&#039;&#039; 目录中创建的每个box文件添加2行。&lt;br /&gt;
&lt;br /&gt;
例如：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;boxes[0][&#039;file&#039;]=&#039;mybox0.php@mymodule&#039;&lt;br /&gt;
$this-&amp;gt;boxes[0][&#039;note&#039;]=&#039;My box 0&#039;&lt;br /&gt;
 ...&lt;br /&gt;
$this-&amp;gt;boxes[n][&#039;file&#039;]=&#039;myboxn.php@mymodule&#039;&lt;br /&gt;
$this-&amp;gt;boxes[n][&#039;note&#039;]=&#039;My box n&#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其次，创建文件&#039;&#039;&#039;htdocs/mymodule/core/boxes/mybox0.php&#039;&#039;&#039;、&#039;&#039;&#039;htdocs/mymodule/core/boxes/mybox1.php&#039;&#039;&#039;…，以现有的消息框（在 &#039;&#039;&#039;htdocs/core/boxes&#039;&#039;&#039; 目录中）为示例。&lt;br /&gt;
&lt;br /&gt;
===测试您的消息框是否被 Dolibarr 检测到===&lt;br /&gt;
停用并重新激活模块。&lt;br /&gt;
&lt;br /&gt;
前往菜单  &#039;&#039;&#039;主页 - 设置 - widget小组件&#039;&#039;&#039; 。&lt;br /&gt;
&lt;br /&gt;
您的消息框必须显示在可激活消息框的清单中。激活它们，然后前往&#039;&#039;&#039;主页&#039;&#039;&#039;并检查它们是否正确显示。&lt;br /&gt;
&lt;br /&gt;
==定义您自己的导出 (可选)==&lt;br /&gt;
&#039;&#039;&#039;何时&#039;&#039;&#039;：如果您的模块附带提供预定义的数据导出（针对自己的表或来自另一个Dolibarr模块的现有表）。&lt;br /&gt;
&lt;br /&gt;
===定义导出===&lt;br /&gt;
为此，请取消注释并修改模块描述符文件中的 $this-&amp;gt;export_xxx 数组。&lt;br /&gt;
&lt;br /&gt;
===测试您的导出===&lt;br /&gt;
前往菜单 &#039;&#039;&#039;工具-&amp;gt;导出助手&#039;&#039;&#039; 。您的导出应显示在可用的预定义导出清单中（如果您的模块已激活）。选择它，您将看到在上一步时在表中定义的可能字段。选择几个字段并尝试生成导出文件。&lt;br /&gt;
&lt;br /&gt;
==设置CSS样式 (可选)==&lt;br /&gt;
&#039;&#039;&#039;何时&#039;&#039;&#039;：在PHP屏幕页面中，您使用的样式类不是Dolibarr主题的样式类（不推荐）。&lt;br /&gt;
&lt;br /&gt;
===创建并声明您的样式表===&lt;br /&gt;
创建一个名为 &#039;&#039;&#039;mymodule.css&#039;&#039;&#039; 或 &#039;&#039;&#039;mymodule.css.php&#039;&#039;&#039; 的CSS样式文件，并将其放在 &#039;&#039;&#039;htdocs/mymodule&#039;&#039;&#039; 目录中。每个模块只能有一个CSS文件。&lt;br /&gt;
&lt;br /&gt;
请记住，最好使用已有的Dolibarr样式（Dolibarr使用的CSS文件是&#039;&#039;&#039;themes/mytheme/&#039;&#039;themename&#039;&#039;.css.php&#039;&#039;&#039;）。仅当您必须处理不存在的样式时，才创建特定于模块的CSS文件。&lt;br /&gt;
&lt;br /&gt;
样式表准备就绪后，通过更改 &#039;&#039;&#039;$this-&amp;gt;modules_parts&#039;&#039;&#039; 属性在模块描述符文件中声明样式表。&lt;br /&gt;
&lt;br /&gt;
此处要输入的值必须是 CSS 文件 URL 的相对路径。&lt;br /&gt;
&lt;br /&gt;
例如：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;module_parts = array(&#039;css&#039; =&amp;gt; array(&#039;/mymodule/css/mymodule.css.php&#039;));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===测试您的样式表===&lt;br /&gt;
停用并重新激活模块。&lt;br /&gt;
&lt;br /&gt;
前往Dolibarr的主页。查看页面的HTML源代码。&lt;br /&gt;
&lt;br /&gt;
您应该在HTML标头中看到有一行是声明您的样式表。&lt;br /&gt;
&lt;br /&gt;
==定义Javascript函数 (可选)==&lt;br /&gt;
&#039;&#039;&#039;何时&#039;&#039;&#039;：当您在PHP屏幕页面中使用的 javascript 函数不是Dolibarr的标准js函数（在lib_head.js中）。&lt;br /&gt;
&lt;br /&gt;
如果在PHP屏幕页面上使用 javascript 函数，则必须将在 javascript 文件 &#039;&#039;&#039;htdocs/mymodule/js/mymodule.js&#039;&#039;&#039; 中声明的函数加载到HTML头中。&lt;br /&gt;
&lt;br /&gt;
若要求Dolibarr（负责生成 header 部分）包含一个 javascript 文件，必须在页面开头调用的llxHeader()函数的参数中提供包含要包含的JS URL的参数。&lt;br /&gt;
&lt;br /&gt;
页面 /htdocs/mymodule/mypage.php 的示例：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$morejs=array(&amp;quot;/mymodule/js/mymodule.js&amp;quot;);&lt;br /&gt;
llxHeader(&#039;&#039;,&#039;Titre&#039;,&#039;&#039;,&#039;&#039;,&#039;&#039;,&#039;&#039;,$morejs,&#039;&#039;,0,0); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==在Dolibarr事件上触发代码 (可选)==&lt;br /&gt;
&#039;&#039;&#039;何时&#039;&#039;&#039;：希望在Dolibarr标准操作后触发执行特定操作时（例如：当在Dolibarr中创建发票时，我想更新模块中的表），您需要创建一个 &#039;&#039;&#039;triggers&#039;&#039;&#039; 文件。&lt;br /&gt;
&lt;br /&gt;
另请参阅 [[Interfaces_Dolibarr_toward_foreign_systems|Dolibarr到外部系统的接口]] 和 [[Interfaces_from_foreign_systems_toward_Dolibarr|外部系统到Dolibarr的接口]]&lt;br /&gt;
&lt;br /&gt;
==在Dolibarr的hooks处插入代码 (可选)==&lt;br /&gt;
&#039;&#039;&#039;何时&#039;&#039;&#039;：当您想更改或添加业务事件以外的代码时（请参阅上一章）。&lt;br /&gt;
&lt;br /&gt;
请参阅页面 [[Hooks_system|Hooks系统]].&lt;br /&gt;
==添加编号模块（可选）==&lt;br /&gt;
&#039;&#039;&#039;何时&#039;&#039;&#039;：当您想添加默认模块未涵盖的编号规则时。&lt;br /&gt;
&lt;br /&gt;
请参阅页面 [[Create numbering module|创建编号模块]] 。&lt;br /&gt;
&lt;br /&gt;
==添加新文档模板 (可选)==&lt;br /&gt;
&#039;&#039;&#039;何时&#039;&#039;&#039;：需要添加新文档模板时。如想要个性化自己生成的 PDF 或 ODT 文档。&lt;br /&gt;
&lt;br /&gt;
注意：要添加此功能，您无需创建模块描述符文件。&lt;br /&gt;
&lt;br /&gt;
有关如何从模板生成文档的详情，请参阅页面 [[Create_a_PDF_document_template|创建PDF文档模板]] 或 [[Create_an_ODT_document_template|创建ODT文档模板]] 。&lt;br /&gt;
&lt;br /&gt;
==添加主题 (可选)==&lt;br /&gt;
&#039;&#039;&#039;何时&#039;&#039;&#039;：当您想要根据您的情况定制界面（颜色/字体/图形）时。&lt;br /&gt;
&lt;br /&gt;
注意：要添加此功能，您无需创建模块描述符。&lt;br /&gt;
&lt;br /&gt;
请参阅页面 [[Skins|主题]] 。&lt;br /&gt;
&lt;br /&gt;
==修改开发模块作者名==&lt;br /&gt;
&lt;br /&gt;
在myModule.class.php中查找editor_name&lt;br /&gt;
&lt;br /&gt;
修改以下变量的值以修改作者名称&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;editor_name = &#039;Roger@QQ:12464313&#039;;&lt;br /&gt;
$this-&amp;gt;editor_url = &#039;https://www.ivnun.cn&#039;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=面向开发人员的一些编码规则和函数=&lt;br /&gt;
要遵循的编码规则请参阅 [[语言和开发规则|开发语言和编码规范（PHP, SQL, HTML）]] 。&lt;br /&gt;
&lt;br /&gt;
要调用 Dolibarr 供开发人员使用的预定义函数，请参阅  [[开发文档]]  的“内部函数”一节。&lt;br /&gt;
&lt;br /&gt;
=创建一个安装包来分发和安装您的模块=&lt;br /&gt;
必须使用此步骤来制作安装包，以便将其提交到市场 http://www.dolistore.com。&lt;br /&gt;
&lt;br /&gt;
但您也可以使用它通过自己的分发网络轻松分发模块。&lt;br /&gt;
&lt;br /&gt;
*进入 &#039;&#039;&#039;/build&#039;&#039;&#039; 目录并将文件 &#039;&#039;&#039;makepack-dolibarrmodules.conf&#039;&#039;&#039; 复制到 &#039;&#039;&#039;makepack-mymodule.conf&#039;&#039;&#039;。请注意，稳定版本包中可能不提供此目录。如果是这种情况，可以在 Dolibarr 网站的“开发版本”部分供下载的快照中检索（在这种情况下，请获取整个 build 目录，这是一个独立于版本的目录）。&lt;br /&gt;
&lt;br /&gt;
在此文件中输入为模块创建的新文件的名称清单（模块描述符、新表的SQL文件、PHP页面、图像等）。&lt;br /&gt;
&lt;br /&gt;
*通过 Perl 运行脚本（需要Perl 5.0或更高版本）：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
perl makepack-dolibarrmodule.pl&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
该脚本将询问模块的名称、主要版本和次要版本。然后将生成一个 &#039;&#039;&#039;mymodule.zip &#039;&#039;&#039;文件，其中包含准备部署的模块。&lt;br /&gt;
&lt;br /&gt;
*接收您的模块的人员必须将该文件放在其 Dolibarr 的安装根目录中，并执行以下命令：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tar -xvf mymodule.zip&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*如果您希望您的模块惠及所有人，您可以在插件市场 {{LinkToPluginDownload}} 上提交它（zip文件）（您必须先创建一个帐户并登录，以使用“提交模块/产品”链接）。&lt;br /&gt;
**如果您的模块制作正确，文件将很快通过验证。&lt;br /&gt;
**如果质量足够好、许可证允许、并且模块的功能被证明是普遍感兴趣的，则可以将代码添加到 Dolibarr 的源代码中（除非您不希望这样做）。&lt;br /&gt;
&lt;br /&gt;
=Dolistore上外部模块的归档和验证=&lt;br /&gt;
&lt;br /&gt;
请参阅 [[Module_Dolistore_Validation_Rules|验证规则]]&lt;/div&gt;</summary>
		<author><name>ShengGang</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=%E6%A8%A1%E5%9D%97%E5%BC%80%E5%8F%91&amp;diff=58766</id>
		<title>模块开发</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=%E6%A8%A1%E5%9D%97%E5%BC%80%E5%8F%91&amp;diff=58766"/>
		<updated>2023-11-20T02:49:57Z</updated>

		<summary type="html">&lt;p&gt;ShengGang: /* 将对象的标准选项卡添加到其自己的表单页面 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- BEGIN interlang links --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Do NOT edit this section&lt;br /&gt;
     Links below are automatically managed by PolyglotBot&lt;br /&gt;
     You can edit links on the English source page : Module_development --&amp;gt;&lt;br /&gt;
[[en:Module_development]]&lt;br /&gt;
[[fr:Développement_module]]&lt;br /&gt;
[[es:Desarrollo_de_un_módulo]]&lt;br /&gt;
[[de:Modul_Entwicklung]]&lt;br /&gt;
[[ja:モジュール_開発]]&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Core]]&lt;br /&gt;
[[Category:开发]]&lt;br /&gt;
{{Template用户手册}}&lt;br /&gt;
{{Template开发文档}}&lt;br /&gt;
{{TemplateMainPageZh}}&lt;br /&gt;
&lt;br /&gt;
要创建新模块，需要执行以下几个步骤。本教程旨在向您介绍每一个步骤，以便添加一个模块来扩展Dolibarr的功能，例如添加以下一个或多个功能：&lt;br /&gt;
&lt;br /&gt;
*在数据库中添加新表&lt;br /&gt;
*在菜单中添加您自己的菜单项&lt;br /&gt;
*添加对象和屏幕以输入/查看新表&lt;br /&gt;
*在视图页上添加或删除选项卡/编辑对象（发票、产品、订单、事件等）&lt;br /&gt;
*为内部导出工具添加预定义的导出&lt;br /&gt;
*向主页添加新信息框/widget小组件&lt;br /&gt;
*添加新的替换变量&lt;br /&gt;
*定义新权限&lt;br /&gt;
*自动触发指定 Dolibarr 操作的代码&lt;br /&gt;
*将自定义代码插入 Dolibarr 的钩子位置&lt;br /&gt;
*为所创建的对象的引用添加编号模块（为数据自动编码的模块）&lt;br /&gt;
*添加PDF文档模板&lt;br /&gt;
*添加一个新主题/皮肤&lt;br /&gt;
&lt;br /&gt;
等等...&lt;br /&gt;
&lt;br /&gt;
以下章节介绍了如何以简单的方式手动完成所有这些操作。对于有经验的开发人员来说，使用MDA生成的方法也不错，详见最后一章。&lt;br /&gt;
&lt;br /&gt;
=使用模块生成器构建模块=&lt;br /&gt;
从Dolibarr 9.0开始，您可以使用&amp;quot;模块生成器&amp;quot;（Module Builder）创建模块的主要文件。要激活它 ：&lt;br /&gt;
&lt;br /&gt;
*设置参数 MAIN_FEATURES_LEVEL 的值为 2 ( 设置 / 其他 )（或者修改llx_const表中该项的记录的value值为2）&lt;br /&gt;
&lt;br /&gt;
[[File:企业微信截图 20180725114721.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*在 &#039;&#039;&#039;主页 - 设置 - 设置-模块/应用 多模块工具&#039;&#039;&#039; 中激活“模块生成器”（ModuleBuilder）&lt;br /&gt;
&lt;br /&gt;
[[File:激活modulebuilder.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*点击屏幕右上角菜单栏中出现的&#039;Bug&#039;图标&lt;br /&gt;
&lt;br /&gt;
[[File:Buglogo.png]]&lt;br /&gt;
&lt;br /&gt;
*运行的ModuleBuilder界面如下：&lt;br /&gt;
&lt;br /&gt;
[[File:Modulebuilder.png|800px]]&lt;br /&gt;
&lt;br /&gt;
=外部模块模板示例=&lt;br /&gt;
一个Dolibarr外部模块的模板/框架：[https://github.com/Dolibarr/dolibarr/tree/develop/htdocs/modulebuilder/template Github Dolibarr模块]&lt;br /&gt;
&lt;br /&gt;
=创建模块=&lt;br /&gt;
以下章节描述了创建Dolibarr模块所需的操作。无论模块的用途如何，第一章描述的操作都是必须要完成的，后续章节描述的操作是否要做将取决于模块的需求。 &lt;br /&gt;
&lt;br /&gt;
==创建模块描述符（必做）==&lt;br /&gt;
&#039;&#039;&#039;何时&#039;&#039;&#039;：无论其用途如何，开发扩展模块时都是强制性的。&#039;&#039;&#039;从Dolibarr 9.0开始，您可以使用“模块生成器”创建模块的描述符&#039;&#039;&#039;。该工具仍处于开发和完善阶段，但其已经可以使用。&lt;br /&gt;
&lt;br /&gt;
===使用模块生成器创建描述符===&lt;br /&gt;
&lt;br /&gt;
*通过单击&amp;quot;Bug&amp;quot;图标启动模块生成器&lt;br /&gt;
&lt;br /&gt;
[[File:Mod_builder_3.png|400px]]&lt;br /&gt;
&lt;br /&gt;
*在下图“模块名称”处输入不含空格的模块名称（模块名称不得包含下划线 ：_），然后单击&amp;quot;创建&amp;quot;按钮。&lt;br /&gt;
&lt;br /&gt;
[[file:模块名.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*已初始化具有第一个文件的模块。然后，您可以更改模块描述符的参数：&lt;br /&gt;
&lt;br /&gt;
[[File:Mod_builder_5.png|400px]]&lt;br /&gt;
&lt;br /&gt;
===备选方案：手动创建描述符（不使用模块生成器）===&lt;br /&gt;
第一步是创建模块描述文件（描述符）。为此：&lt;br /&gt;
&lt;br /&gt;
*创建目录 &#039;&#039;&#039;htdocs/custom/&#039;&#039;mymodule&#039;&#039;/core/modules&#039;&#039;&#039; 。&lt;br /&gt;
*进入目录 &#039;&#039;&#039;htdocs/modulebuilder/template/core/modules&#039;&#039;&#039; 将文件 modMyModule.class.php 复制到目录 &#039;&#039;&#039;htdocs/custom/&#039;&#039;mymodule&#039;&#039;/core/modules&#039;&#039;&#039; 中。&lt;br /&gt;
*重命名mod&#039;&#039;&#039;MyModule&#039;&#039;&#039;.class.php文件，只需修改&#039;&#039;&#039;MyModule&#039;&#039;&#039;部分即可（文件必须以mod开头）&lt;br /&gt;
&lt;br /&gt;
然后，编辑此文件的内容：&lt;br /&gt;
&lt;br /&gt;
*将所有&#039;&#039;modMyModule&#039;&#039;替换为与模块用途相对应的值。此值必须始终以“&#039;&#039;&#039;mod&#039;&#039;&#039;”开头，并且仅包含&#039;&#039;&#039;字母字符&#039;&#039;&#039;。&lt;br /&gt;
*通过 $this-&amp;gt;numero = &#039;&#039;100000&#039;&#039; 设置模块ID。为避免冲突，您可以参考以下页面查找已分配的ID：[[List of modules id|模块ID清]]&amp;lt;nowiki/&amp;gt;[[List of modules id|单]] 。&lt;br /&gt;
*可能还需要修改构造函数中定义的其他变量（有关其含义，请参阅[[主模块代码框架|类文件代码]]中的注释）。&lt;br /&gt;
&lt;br /&gt;
模块的描述文件（描述符）已准备就绪。请参阅下一步“测试描述符”以激活您的新模块。&lt;br /&gt;
&lt;br /&gt;
===测试描述符===&lt;br /&gt;
&lt;br /&gt;
启动Dolibarr并进入 &#039;&#039;&#039;主页-&amp;gt;设置-&amp;gt;模块/应用&#039;&#039;&#039; 页面，您应该会看到一个新行，其中包含新模块以及是否激活它的选项（浏览每个模块类别的所有选项卡，直到找到它）。&lt;br /&gt;
&lt;br /&gt;
$this-&amp;gt;special 的值决定了模块位于哪个类别选项卡中。&lt;br /&gt;
&lt;br /&gt;
注意：如果在模块描述符中设置了属性 version ，则应在 &#039;&#039;&#039;模块/应用&#039;&#039;&#039; 页面看到包含新模块的新行以及是否激活它的选项。如果将属性 version 设置为“develop”或“experiental”，若要查看模块，必须先进入页面 &#039;&#039;&#039;“主页-&amp;gt;设置-&amp;gt;其他设置&#039;&#039;&#039;”，并将参数 MAIN_FEATURES_LEVEL 设置为 1 以查看“实验性”(experimental)模块，或设置为 2 以查看“开发”(development)模块。&lt;br /&gt;
&lt;br /&gt;
===模块的名称===&lt;br /&gt;
&lt;br /&gt;
模块名称不得包含下划线或下划线：_&lt;br /&gt;
==新模块的树视图（必需）==&lt;br /&gt;
&lt;br /&gt;
以下是组织模块文件时要遵循的树结构（如果使用ModuleBuilder生成文件，则自动采用此树结构）。&lt;br /&gt;
&lt;br /&gt;
注：zip 文件也必须符合此规则，只有第二行是强制性的。&lt;br /&gt;
&lt;br /&gt;
{{Template模块目录树}}&lt;br /&gt;
&lt;br /&gt;
一个好的Dolibarr扩展模块的模板/框架：[https://github.com/Dolibarr/dolibarr/tree/develop/htdocs/modulebuilder/template GitHub Dolibarr Module Modèle]&lt;br /&gt;
&lt;br /&gt;
==创建数据表和 PHP DAO 类 (可选)==&lt;br /&gt;
&#039;&#039;&#039;何时：&#039;&#039;&#039;如果您的模块需要管理自己的数据&lt;br /&gt;
&lt;br /&gt;
===创建 .sql 文件===&lt;br /&gt;
如果您的模块要处理在Dolibarr标准版中不存在的数据，则需要自定义数据库表来存储这些数据。&lt;br /&gt;
&lt;br /&gt;
在模块的目录中创建&#039;&#039;&#039;sql&#039;&#039;&#039;子目录（&#039;&#039;&#039;mymodule/sql&#039;&#039;&#039;），用于放置要创建的sql脚本（使用ModuleBuilder，在&amp;quot;对象&amp;quot;选项卡中创建新对象后，将自动执行此步骤）。&lt;br /&gt;
&lt;br /&gt;
接下来，检查模块描述符文件，在 &#039;&#039;&#039;init&#039;&#039;&#039; 函数中是否包括行：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight 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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
并且未被注释掉。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;应遵循的规则&#039;&#039;：&lt;br /&gt;
&lt;br /&gt;
*根据每个表1个文件的原则添加表的创建命令文件，命名为 &#039;&#039;&#039;llx_mytable.sql&#039;&#039;&#039;（用于表），可能还附带 &#039;&#039;&#039;llx_mytable.key.sql&#039;&#039;&#039; 文件（用于索引或外键）。示例请参阅 &#039;&#039;&#039;install/mysql/tables&#039;&#039;&#039; 中的现有文件。&lt;br /&gt;
*SQL字段的推荐类型和名称在 [[https://wiki.dolibarr.org/index.php/Langages_et_normes#R.C3.A8gles_de_codage_SQL]] 页中定义。&lt;br /&gt;
*管理数据：对于添加/操作数据的命令，它们都必须位于同一目录 &#039;&#039;&#039;/mymodule/sql/&#039;&#039;&#039; 中名为 &#039;&#039;&#039;data.sql&#039;&#039;&#039; 的文件中。&lt;br /&gt;
*不要使用双引号（如 &amp;quot;string&amp;quot;），因为双引号（&amp;quot;）在 PostGreSQL 中有特殊的含义&lt;br /&gt;
&lt;br /&gt;
data.sql文件内容示例：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight 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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
文件中的SQL语句必须对 &#039;&#039;&#039;mysql&#039;&#039;&#039; 数据库有效。请注意：不需要维护其他数据库类型的文件。它们由数据库驱动程序动态读取和转换。&lt;br /&gt;
&lt;br /&gt;
===测试 .sql 文件===&lt;br /&gt;
&lt;br /&gt;
文件准备就绪后，您可以返回Dolibarr的模块管理页面，禁用模块，删除数据库表（如果它们已经存在），然后重新激活模块。正常情况下，应该可以通过激活模块来重新创建表。否则，请手动检查脚本，或查看Dolibarr日志。&lt;br /&gt;
&lt;br /&gt;
===生成 PHP DAO 表访问类===&lt;br /&gt;
创建对象时，ModuleBuilder会自动生成对象的PHP DAO类文件。&lt;br /&gt;
&lt;br /&gt;
如果不使用模块生成器，您将在模块框架文件&#039;&#039;&#039;htdocs/modulebuilder/templates/class/myobject.class.php&#039;&#039;&#039; 中找到示例。&lt;br /&gt;
&lt;br /&gt;
在这个类中，已经有可调用的 CRUD（Create/Read/Update/Delete）方法来执行表行数据的插入、获取（select）、更新和删除。修改此文件以使用正确的模块名和表名，并将该文件放在模块的 &#039;&#039;&#039;class&#039;&#039;&#039; 子目录中。若使用 &#039;&#039;&#039;ModuleBuilder&#039;&#039;&#039; 只需点击几下鼠标即可完成此操作。&lt;br /&gt;
&lt;br /&gt;
====使用ModuleBuilder生成PHP DAO类文件====&lt;br /&gt;
&lt;br /&gt;
*使用ModuleBuilder生成PHP DAO类文件，简单至在下图中选择&#039;对象&#039;选项卡，输入&#039;对象名&#039;，然后点击创建，即可生成相关一切文档。&lt;br /&gt;
&lt;br /&gt;
[[File:新对象.png|800px]]&lt;br /&gt;
&lt;br /&gt;
参见[[ModuleBuilder用户手册]]&lt;br /&gt;
==选项卡显示(可选)==&lt;br /&gt;
&lt;br /&gt;
===添加或删除对象表单上的选项卡===&lt;br /&gt;
&#039;&#039;&#039;何时：&#039;&#039;&#039;在标准对象（发票、订单、报价单、会员…）的表单中添加您自己的选项卡&lt;br /&gt;
&lt;br /&gt;
要执行此操作，请打开之前创建的模块描述符文件并编辑 $this-&amp;gt;tabs 数组：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight 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:mylangfile@mymodule:$user-&amp;gt;rights-&amp;gt;mymodule-&amp;gt;read:/mymodule/mypagetab1.php?id=__ID__&#039;    // To add a new tab identified by code tabname1&lt;br /&gt;
                            &#039;objecttype:+tabname2:Title2:mylangfile@mymodule:$user-&amp;gt;rights-&amp;gt;mymodule-&amp;gt;read:/mymodule/mypagetab2.php?id=__ID__&#039;,   // To add a 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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
该表应包含字符串列表，每个字符串表示一个新选项卡。字符串格式由6个部分组成，由“：”分隔&lt;br /&gt;
&lt;br /&gt;
*第1部分：选项卡的元素类型（objecttype），只能是下列值之一：&lt;br /&gt;
{{TemplateModuleTabs-zh}}&lt;br /&gt;
&lt;br /&gt;
*第2部分：用于标识要添加（以+开头）或删除（以-开头）的选项卡的codeName&lt;br /&gt;
*第3部分：选项卡的标题。这可以是硬编码的字符串，或者是更好的，lang文件中的翻译代码。&lt;br /&gt;
*第4部分：文件“*.lang”的名称（不带.lang扩展名），此文件内有翻译代码和要显示的语言字符串之间的对应关系。如果这个文件名后面跟@mymodule，则Dolibarr将在模块自己的 lang 目录中查找翻译文件，即htdocs/mymodule/langs/code_CODE/mymodule.lang，否则Dolibarr将查找翻译文件htdocs/langs/code_CODE/mylangfile.lang。&lt;br /&gt;
*第5部分：判断选项卡是否可见的条件。设置为“1”，会使其始终可见。&lt;br /&gt;
*第6部分：单击选项卡时要显示的页面的URL。字符串“__ID__”将自动替换为相关元素的ID。&lt;br /&gt;
&lt;br /&gt;
要使声明生效，必须禁用并重新激活该模块。&lt;br /&gt;
&lt;br /&gt;
要使用来自数据库的数据填充选项卡的内容，请参阅下一章。&lt;br /&gt;
&lt;br /&gt;
为了获取现有选项卡的名称“tabname”，您必须检查文件“core/lib/module.lib.php”的函数“product_prepare_head”中使用的名称，该文件对应于“$head[$h][2]”部分。&lt;br /&gt;
&lt;br /&gt;
===将对象的标准选项卡添加到其自己的表单页面===&lt;br /&gt;
&#039;&#039;&#039;何时：&#039;&#039;&#039;在您自己的表单中添加标准对象（产品、合作方…）的选项卡&lt;br /&gt;
&lt;br /&gt;
必须遵循以下步骤：&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. 在代码中包含定义相关函数的文件&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
对于每种对象选项卡，都有两个文件需要使用下列语句：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;require_once($url_fichier) ;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下是要包含的文件示例（DOL_DOCUMENT_ROOT 对应于 dolibarr/htdocs/ 文件夹）：&lt;br /&gt;
&lt;br /&gt;
*合作方(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;
*产品(product) :&lt;br /&gt;
**DOL_DOCUMENT_ROOT/product/class/product.class.php&lt;br /&gt;
**DOL_DOCUMENT_ROOT/core/lib/product.lib.php&lt;br /&gt;
*发票 (invoice) :&lt;br /&gt;
**DOL_DOCUMENT_ROOT/compta/facture/class/facture.class.php&lt;br /&gt;
**DOL_DOCUMENT_ROOT/core/lib/invoice.lib.php&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. 创建并加载要在自己的表单中显示的标准对象&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
创建所需类的对象，并从数据库中获取对象数据。为此，您必须使用相应类的fetch()函数，并将从URL（/mytab.php?id=1）获取的对象id作为参数传递。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;例如：&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$id=GETPOST(&#039;id&#039;,&#039;int&#039;);&lt;br /&gt;
$ref=GETPOST(&#039;ref&#039;,&#039;alpha&#039;);&lt;br /&gt;
$product = new Product($db) ;&lt;br /&gt;
$result = $product-&amp;gt;fetch($id,$ref) ; // Test $result to check the database read is ok&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3. 检索与所选实体对应的选项卡列表&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
使用函数XXX_prepare_head($obj)（其中XXX是实体名称）创建一个包含要显示的选项卡定义的数组。要传递的参数是要显示选项卡的对象。&lt;br /&gt;
&lt;br /&gt;
返回的数组由以下内容组成：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$head        // tabs的数组&lt;br /&gt;
$head[$h]    // Element to describe one tab.&lt;br /&gt;
$head[$h][0] // Url of page to show when you click on tab&lt;br /&gt;
$head[$h][1] // Title of tab&lt;br /&gt;
$head[$h][2] // Code name to identify the tab&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;示例：&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$head = product_prepare_head($product, $user) ; // 参数 $user 是要显示选项卡的对象，这就是&amp;quot;产品&amp;quot;对象为&amp;quot;user&amp;quot;对象准备的所有可用的选项卡的数组。&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
某些函数上不存在$user参数&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4. 在您的页面上显示选项卡&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
使用dol_fiche_head()函数，该函数显示由 XX_prepare_head() 返回的 $head 数组中包含的选项卡。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight 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  // Title to show (shown into a special tab that you can&#039;t click)&lt;br /&gt;
//$notab&lt;br /&gt;
//$picto  // Name of image to show into title. Possible values are:&lt;br /&gt;
//            product&lt;br /&gt;
//            service&lt;br /&gt;
//            company&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
此函数将显示所需的选项卡，并打开一个html元素&#039;&#039;&amp;lt; div class=&amp;quot;&amp;quot; &amp;gt;&#039;&#039;，该元素对应于选项卡下方的显示区域（如果参数 $notab=0）。要关闭显示区域，只需在PHP代码中使用关闭元素&amp;lt;nowiki&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/nowiki&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
注：相关的更多细节，请参阅 [http://www.dolibarr.fr/doxygen/ Doxygen文档] 或直接参考 Dolibarr 代码。&lt;br /&gt;
&lt;br /&gt;
==创建PHP屏幕页面（可选）==&lt;br /&gt;
&#039;&#039;&#039;何时&#039;&#039;&#039;：如果新模块的目的是添加一个需要新屏幕页面的功能。&lt;br /&gt;
&lt;br /&gt;
===创建原始PHP屏幕页面===&lt;br /&gt;
随后，您可以使用 &#039;&#039;&#039;modulebuilder&#039;&#039;&#039; 目录中提供的示例模板（&#039;&#039;&#039;myobject_page.php&#039;&#039;&#039;）创建基于表数据的PHP页面（有关命令行脚本的开发，请参阅 [[脚本开发]] ）。同样，如果您使用的是 ModuleBuilder，则在初始化对象时会自动创建页面实例（清单、创建页面、Notes选项卡等）。&lt;br /&gt;
&lt;br /&gt;
要创建新的用户屏幕页面，请创建特定于模块的 &#039;&#039;&#039;htdocs&#039;&#039;&#039; 子目录（如果尚未创建）（如 &#039;&#039;&#039;htdocs/mymodule&#039;&#039;&#039; ），以便在其中放置要创建的页面。&lt;br /&gt;
&lt;br /&gt;
从复制文件 &#039;&#039;&#039;myobject_page.php&#039;&#039;&#039; 作为开始。编辑该文件，以便能正确找到并加载 main.inc.php 文件：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
// Load Dolibarr environment&lt;br /&gt;
$res=0;&lt;br /&gt;
// Try main.inc.php into web root known defined into CONTEXT_DOCUMENT_ROOT (not always defined)&lt;br /&gt;
if (! $res &amp;amp;&amp;amp; ! empty($_SERVER[&amp;quot;CONTEXT_DOCUMENT_ROOT&amp;quot;])) $res=@include($_SERVER[&amp;quot;CONTEXT_DOCUMENT_ROOT&amp;quot;].&amp;quot;/main.inc.php&amp;quot;);&lt;br /&gt;
// Try main.inc.php into web root detected using web root caluclated from SCRIPT_FILENAME&lt;br /&gt;
$tmp=empty($_SERVER[&#039;SCRIPT_FILENAME&#039;])?&#039;&#039;:$_SERVER[&#039;SCRIPT_FILENAME&#039;];$tmp2=realpath(__FILE__); $i=strlen($tmp)-1; $j=strlen($tmp2)-1;&lt;br /&gt;
while($i &amp;gt; 0 &amp;amp;&amp;amp; $j &amp;gt; 0 &amp;amp;&amp;amp; isset($tmp[$i]) &amp;amp;&amp;amp; isset($tmp2[$j]) &amp;amp;&amp;amp; $tmp[$i]==$tmp2[$j]) { $i--; $j--; }&lt;br /&gt;
if (! $res &amp;amp;&amp;amp; $i &amp;gt; 0 &amp;amp;&amp;amp; file_exists(substr($tmp, 0, ($i+1)).&amp;quot;/main.inc.php&amp;quot;)) $res=@include(substr($tmp, 0, ($i+1)).&amp;quot;/main.inc.php&amp;quot;);&lt;br /&gt;
if (! $res &amp;amp;&amp;amp; $i &amp;gt; 0 &amp;amp;&amp;amp; file_exists(dirname(substr($tmp, 0, ($i+1))).&amp;quot;/main.inc.php&amp;quot;)) $res=@include(dirname(substr($tmp, 0, ($i+1))).&amp;quot;/main.inc.php&amp;quot;);&lt;br /&gt;
// Try main.inc.php using relative path&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;);&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;);&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;);&lt;br /&gt;
if (! $res) die(&amp;quot;Include of main fails&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如您所见，其多次尝试加载 main.inc.php（或 master.inc.php）文件。目标是在尽可能多的场景下取得成功。最少为2行：一行用于尝试将 master/main.inc.php 文件加载到 dolibarr 的根目录中，另一行用于尝试加载该文件，以支持模块部署在“custom”目录中的场景。但你可能不得不处理更多的场景。上面提供的示例应该能够在几乎所有场景/配置下加载 main/master.inc.php 文件。&lt;br /&gt;
&lt;br /&gt;
在3.2之后，为所有版本的Dolibarr开发的扩展模块可以放置在不同的文件夹中，而不仅仅是“htdocs”，如“htdocs/custom”，为了不必修改模块的源代码，我们要做几个包含，所以这个规则必须被所有模块使用。&lt;br /&gt;
&lt;br /&gt;
请注意，您可以根据文件相对于模块目录树的深度添加更多的“../”。&lt;br /&gt;
&lt;br /&gt;
main.inc.php文件加载了技术环境变量和权限。然后设置以下对象变量：&lt;br /&gt;
&lt;br /&gt;
*$user    包含用户属性 + 权限的对象&lt;br /&gt;
*$conf    包含 Dolibarr 设置的对象&lt;br /&gt;
*$db       包含数据库连接句柄的对象&lt;br /&gt;
*$langs   包含用户语言的对象&lt;br /&gt;
&lt;br /&gt;
然后输入代码以显示页面。&lt;br /&gt;
&lt;br /&gt;
*在不知道从何处调用文件的情况下，使用Dolibarr函数dol_include_once()（而不是直接使用include_once）包含专用于模块的类或库&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;例如：&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
dol_include_once(&#039;/mymodule/class/myclass.class.php&#039;, &#039;MyClass&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*另一方面，Dolibarr提供的标准类将使用 require-once 直接调用，语法如下：&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;例如：&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight 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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
原因是，尽管dol_include_once很方便，却因它会扫描每个备用路径目录以找到文件，所以它的性能也很差，因为它会在每次调用时生成访问和磁盘搜索（实际上，PHP集成了已读文件的缓存，但未集成“未找到”文件的缓存）。由于给定的文件只可能存在于一个树中，所以总会有一个无此文件的备用树，这会产生对硬盘的不必要访问，从而影响性能。与Dolibarr的内部文件一样，我们总是知道确切的路径，应该首选带有该直接路径的 require_once）。&lt;br /&gt;
&lt;br /&gt;
===在已存在的表单上增加新字段===&lt;br /&gt;
您可能希望提供一个模块，将更多字段添加到某些元素的表单（录入和展示）中。&lt;br /&gt;
&lt;br /&gt;
一个繁琐（但不太糟糕）的解决方案可能是替换用于创建元素的所有页面（这意味着禁用“新建元素”菜单项并添加您的菜单项，并禁用显示元素的选项卡，以替换选项卡，该选项卡是您自己的完整页面（从原始页面复制/粘贴），使其与原始页面相同，但被修改为添加字段并将添加的数据存储到您自己的表中）。如果此解决方案适合您，请前往菜单 [[#Define your entries in menu (optional)]] 和 [[#The tab management (optional)]]（本解决方案更强大，因为您可以在页面中改变你想要改变的一切）。&lt;br /&gt;
&lt;br /&gt;
我们将在这里描述另一种解决方案，该解决方案仅适用于在现有字段的末尾“添加字段”，下面以元素“category”作为示例，但您可以将本教程转换为发票、报价单...&lt;br /&gt;
&lt;br /&gt;
*首先，添加一个由您的模块拥有的表，以存储新字段的值。此表将有一个名为“rowid”的列（将包含与元素表的字段rowid相同的值+每一个要添加的新字段。然后为这个新表创建一个具有CRUD（Create/Read/Update/Delete）方法的类。对于这两项任务，请返回前一章[[#创建数据表和表的PHP类文件 (可选)]]。&lt;br /&gt;
*其次，在模块中添加一个钩子，以将新字段添加到表单中。有关使用钩子的通用文档，请参阅[[Hooks_system#Implement_the_Hook]]章节。&lt;br /&gt;
&lt;br /&gt;
如果遵循本教程，则必须执行以下操作才能将字段添加到 category 表单中：&lt;br /&gt;
{{ToComplete}}&lt;br /&gt;
&lt;br /&gt;
===用钩子添加/替换部分字段===&lt;br /&gt;
请参阅  [[钩子系统#实现钩子]] 章节，了解如何使用Dolibarr现有的钩子在Dolibarr钩子位置添加/替换代码。&lt;br /&gt;
&lt;br /&gt;
===访问数据库===&lt;br /&gt;
如果您需要对自己添加的表进行基本变更，请使用之前生成的类，其中包含用于此目的的方法。&lt;br /&gt;
&lt;br /&gt;
但是，如果您希望在没有专用PHP对象的情况下访问表，这仍然是可能的（例如，检索记录列表）。在这种情况下，请考虑以下示例：&lt;br /&gt;
&lt;br /&gt;
对于插入、更新或删除：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$db-&amp;gt;begin();   // Start transaction&lt;br /&gt;
$db-&amp;gt;query(&amp;quot;My SQL request insert, update or delete&amp;quot;);&lt;br /&gt;
$db-&amp;gt;commit();       // Validate transaction&lt;br /&gt;
or $db-&amp;gt;rollback()  // Cancel transaction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
对于读取:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$resql=$db-&amp;gt;query(&amp;quot;My select request&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===定义页面样式===&lt;br /&gt;
为了使页面的外观与 Dolibarr 主题保持一致，必须使用 Dolibarr CSS 样式。&lt;br /&gt;
&lt;br /&gt;
例如：&lt;br /&gt;
&lt;br /&gt;
*在表格标题行的&#039;&#039;tr&#039;&#039;和&#039;&#039;td&#039;&#039;标签上使用 class=&amp;quot;&#039;&#039;&#039;liste_titre&#039;&#039;&#039;&amp;quot;&lt;br /&gt;
*在表格数据行的&#039;&#039;tr&#039;&#039;和&#039;&#039;td&#039;&#039;标签上使用 class=&amp;quot;&#039;&#039;&#039;pair&#039;&#039;&#039;&amp;quot; 或 class=&amp;quot;&#039;&#039;&#039;impair&#039;&#039;&#039;&amp;quot;&lt;br /&gt;
*在所有输入域（&#039;&#039;input, select, textarea&#039;&#039;...）上使用 class=&amp;quot;&#039;&#039;&#039;flat&#039;&#039;&#039;&amp;quot;&lt;br /&gt;
*在所有 &#039;&#039;type=&amp;quot;submit&amp;quot;&#039;&#039; 的 &#039;&#039;input&#039;&#039; 对象上使用 class=&amp;quot;&#039;&#039;&#039;button&#039;&#039;&#039;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===使用 Dolibarr 日期选择器===&lt;br /&gt;
如果您愿意，您可以使用 Dolibarr 屏幕页面中的日期选择器（带日历弹出窗口）。为此，请使用以下行：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight 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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
字符串&amp;lt;syntaxhighlight 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;/syntaxhighlight&amp;gt;标识表单中的日期选择器。如果在同一页面中使用多个日期选择器，则必须设置不同的值。&lt;br /&gt;
&lt;br /&gt;
字符串myform是FORM区域的名称（在HTML页面的form name=“myform”中）。因此，日期选择器的显示必须集成到FORM Html区域中。&lt;br /&gt;
&lt;br /&gt;
要在POST结束时检索值，命令为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight 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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===覆盖模板文件 (tpl)===&lt;br /&gt;
如果您想覆盖模块上的tpl文件，则需要在 module_parts 上声明它：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
&#039;tpl&#039; =&amp;gt; 1,&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后您可以在 &#039;&#039;&#039;mymodule/core/tpl&#039;&#039;&#039; 上放置任何tpl文件。&lt;br /&gt;
&lt;br /&gt;
一旦模块被激活，tpl就会被覆盖。&lt;br /&gt;
&lt;br /&gt;
==设置配置页面 (可选)==&lt;br /&gt;
&#039;&#039;&#039;何时&#039;&#039;&#039;：如果您的模块提供多个可配置选项。&lt;br /&gt;
&lt;br /&gt;
===创建配置编辑页面===&lt;br /&gt;
如果您的模块提供了多个可配置选项，则需要创建一个PHP页面来编辑这些选项（存储在 [[Table llx_const|表 &#039;&#039;&#039;llx_const&#039;&#039;&#039;]] 中）。&lt;br /&gt;
&lt;br /&gt;
创建一个名为 &#039;&#039;&#039;mymodule_setuppage.php&#039;&#039;&#039; 的PHP页面，显示可能的选项并更新它们。&lt;br /&gt;
&lt;br /&gt;
有必要以 &#039;&#039;&#039;/admin&#039;&#039;&#039; 中的一个页面为例，展示读取或保存选项的方法。将此配置页面也放在&#039;&#039;&#039;/admin&#039;&#039;&#039;目录中。&lt;br /&gt;
&lt;br /&gt;
===修改模块的描述符文件===&lt;br /&gt;
然后，在模块描述符文件中，修改变量 &#039;&#039;&#039;config_page_url&#039;&#039;&#039; 以指定该PHP页面的名称。&lt;br /&gt;
&lt;br /&gt;
如果页面在目录 &#039;&#039;&#039;admin/&#039;&#039;&#039; 中），则：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;config_page_url = array(&amp;quot;mymodule_setuppage.php&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果页面在目录 &#039;&#039;&#039;mymodule/admin/&#039;&#039;&#039; 中，则：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;config_page_url = array(&amp;quot;mymodule_setuppage.php@mymodule&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===测试您的页面===&lt;br /&gt;
前往“主页-&amp;gt;设置-&amp;gt;模块/应用”页面，您应该会看到一个齿轮图标，允许您访问配置页面，并且您应该能够修改这些选项并将其保存到数据库中。&lt;br /&gt;
&lt;br /&gt;
==设置菜单项 (可选)==&lt;br /&gt;
&#039;&#039;&#039;何时&#039;&#039;&#039; ：如果您创建了PHP页面，则必须从Dolibarr菜单访问这些屏幕页面。&lt;br /&gt;
&lt;br /&gt;
===设置菜单项===&lt;br /&gt;
为此，您需要在模块描述符文件中定义数组 this-&amp;gt;menu，该数组用于声明菜单。&lt;br /&gt;
&lt;br /&gt;
此数组包含模块激活后将显示在菜单中的所有条目。&lt;br /&gt;
&lt;br /&gt;
模块描述符文件的示例文件 &#039;&#039;&#039;modMyModule.class.php&#039;&#039;&#039; 中有一个声明顶部菜单及其相关的左侧菜单项的示例。&lt;br /&gt;
&lt;br /&gt;
以下是描述符文件中菜单项声明的示例：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight 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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
若要根据权限限制对菜单的访问，请更改数组的 &#039;&#039;&#039;perms&#039;&#039;&#039; 属性。有关如何添加权限的更多信息，请参阅后面有关权限的章节。&lt;br /&gt;
&lt;br /&gt;
===测试您的菜单项===&lt;br /&gt;
在Dolibarr中禁用并重新激活您的模块，然后应该会出现菜单项（如果 “enabled”为真）。&lt;br /&gt;
&lt;br /&gt;
==设置您自己的权限 (可选)==&lt;br /&gt;
&#039;&#039;&#039;何时&#039;&#039;&#039;： 如果要添加新权限。&lt;br /&gt;
&lt;br /&gt;
模块将其管理的权限定义，放在第一步中创建的模块描述符文件中完成。更改行：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;rights_class = &#039;mymodule&#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
录入正确的 myModule 值。&lt;br /&gt;
&lt;br /&gt;
然后在 $this-&amp;gt;rights 数组中填充与要管理的不同权限一样多的条目。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight 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;Label by default of permission&#039;;&lt;br /&gt;
$this-&amp;gt;rights[$r][3] = 1;&lt;br /&gt;
$this-&amp;gt;rights[$r][4] = &#039;action&#039;;&lt;br /&gt;
$this-&amp;gt;rights[$r][5] = &#039;subaction&#039;;&lt;br /&gt;
$r++;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在$this-&amp;gt;rights[$r][0]中，输入尚未使用的权限ID（请参阅&#039;&#039;&#039;系统信息&#039;&#039;&#039;菜单，在运行Dolibarr的设备上查看已在使用的ID）。&lt;br /&gt;
&lt;br /&gt;
在$this-&amp;gt;rights[$r][1]中，输入默认标签（如果在 &#039;&#039;&#039;admin.lang&#039;&#039;&#039; 文件中找不到您权限标签的翻译字符串，则显示该标签。翻译键值为 “Permission10001=我的超级权限的描述”）。&lt;br /&gt;
&lt;br /&gt;
在$this&amp;gt;rights[$r][2]中，输入权限类型。有三种类型的权限，“r”表示读取、列出清单或导出权限，“w”表示写入或更新权限，“d”表示删除权限。&lt;br /&gt;
&lt;br /&gt;
在$this-&amp;gt;rights[$r][3]中，如果任何一个新创建的用户都会被默认自动分配此权限，则输入1。&lt;br /&gt;
&lt;br /&gt;
在$this-&amp;gt;rights[$r][4]和$this-&amp;gt;rights[$r][5]中，输入不带空格的操作和子操作字符串。然后，您可以通过以下命令在PHP代码中测试用户是否具有正确的权限：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
if ($user-&amp;gt;rights-&amp;gt;mymodule-&amp;gt;action-&amp;gt;subaction) ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==设置您自己的消息框/widget小组件 (可选)==&lt;br /&gt;
&#039;&#039;&#039;何时&#039;&#039;&#039;：如果您的模块附带提供在主页上展示的一个或多个消息框。&lt;br /&gt;
&lt;br /&gt;
===设置您的消息框===&lt;br /&gt;
为此，请修改模块描述符文件中的数组 $this-&amp;gt;boxes。&lt;br /&gt;
&lt;br /&gt;
首先为即将在 &#039;&#039;&#039;htdocs/mymodule/core/boxes&#039;&#039;&#039; 目录中创建的每个box文件添加2行。&lt;br /&gt;
&lt;br /&gt;
例如：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;boxes[0][&#039;file&#039;]=&#039;mybox0.php@mymodule&#039;&lt;br /&gt;
$this-&amp;gt;boxes[0][&#039;note&#039;]=&#039;My box 0&#039;&lt;br /&gt;
 ...&lt;br /&gt;
$this-&amp;gt;boxes[n][&#039;file&#039;]=&#039;myboxn.php@mymodule&#039;&lt;br /&gt;
$this-&amp;gt;boxes[n][&#039;note&#039;]=&#039;My box n&#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其次，创建文件&#039;&#039;&#039;htdocs/mymodule/core/boxes/mybox0.php&#039;&#039;&#039;、&#039;&#039;&#039;htdocs/mymodule/core/boxes/mybox1.php&#039;&#039;&#039;…，以现有的消息框（在 &#039;&#039;&#039;htdocs/core/boxes&#039;&#039;&#039; 目录中）为示例。&lt;br /&gt;
&lt;br /&gt;
===测试您的消息框是否被 Dolibarr 检测到===&lt;br /&gt;
停用并重新激活模块。&lt;br /&gt;
&lt;br /&gt;
前往菜单  &#039;&#039;&#039;主页 - 设置 - widget小组件&#039;&#039;&#039; 。&lt;br /&gt;
&lt;br /&gt;
您的消息框必须显示在可激活消息框的清单中。激活它们，然后前往&#039;&#039;&#039;主页&#039;&#039;&#039;并检查它们是否正确显示。&lt;br /&gt;
&lt;br /&gt;
==定义您自己的导出 (可选)==&lt;br /&gt;
&#039;&#039;&#039;何时&#039;&#039;&#039;：如果您的模块附带提供预定义的数据导出（针对自己的表或来自另一个Dolibarr模块的现有表）。&lt;br /&gt;
&lt;br /&gt;
===定义导出===&lt;br /&gt;
为此，请取消注释并修改模块描述符文件中的 $this-&amp;gt;export_xxx 数组。&lt;br /&gt;
&lt;br /&gt;
===测试您的导出===&lt;br /&gt;
前往菜单 &#039;&#039;&#039;工具-&amp;gt;导出助手&#039;&#039;&#039; 。您的导出应显示在可用的预定义导出清单中（如果您的模块已激活）。选择它，您将看到在上一步时在表中定义的可能字段。选择几个字段并尝试生成导出文件。&lt;br /&gt;
&lt;br /&gt;
==设置CSS样式 (可选)==&lt;br /&gt;
&#039;&#039;&#039;何时&#039;&#039;&#039;：在PHP屏幕页面中，您使用的样式类不是Dolibarr主题的样式类（不推荐）。&lt;br /&gt;
&lt;br /&gt;
===创建并声明您的样式表===&lt;br /&gt;
创建一个名为 &#039;&#039;&#039;mymodule.css&#039;&#039;&#039; 或 &#039;&#039;&#039;mymodule.css.php&#039;&#039;&#039; 的CSS样式文件，并将其放在 &#039;&#039;&#039;htdocs/mymodule&#039;&#039;&#039; 目录中。每个模块只能有一个CSS文件。&lt;br /&gt;
&lt;br /&gt;
请记住，最好使用已有的Dolibarr样式（Dolibarr使用的CSS文件是&#039;&#039;&#039;themes/mytheme/&#039;&#039;themename&#039;&#039;.css.php&#039;&#039;&#039;）。仅当您必须处理不存在的样式时，才创建特定于模块的CSS文件。&lt;br /&gt;
&lt;br /&gt;
样式表准备就绪后，通过更改 &#039;&#039;&#039;$this-&amp;gt;modules_parts&#039;&#039;&#039; 属性在模块描述符文件中声明样式表。&lt;br /&gt;
&lt;br /&gt;
此处要输入的值必须是 CSS 文件 URL 的相对路径。&lt;br /&gt;
&lt;br /&gt;
例如：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;module_parts = array(&#039;css&#039; =&amp;gt; array(&#039;/mymodule/css/mymodule.css.php&#039;));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===测试您的样式表===&lt;br /&gt;
停用并重新激活模块。&lt;br /&gt;
&lt;br /&gt;
前往Dolibarr的主页。查看页面的HTML源代码。&lt;br /&gt;
&lt;br /&gt;
您应该在HTML标头中看到有一行是声明您的样式表。&lt;br /&gt;
&lt;br /&gt;
==定义Javascript函数 (可选)==&lt;br /&gt;
&#039;&#039;&#039;何时&#039;&#039;&#039;：当您在PHP屏幕页面中使用的 javascript 函数不是Dolibarr的标准js函数（在lib_head.js中）。&lt;br /&gt;
&lt;br /&gt;
如果在PHP屏幕页面上使用 javascript 函数，则必须将在 javascript 文件 &#039;&#039;&#039;htdocs/mymodule/js/mymodule.js&#039;&#039;&#039; 中声明的函数加载到HTML头中。&lt;br /&gt;
&lt;br /&gt;
若要求Dolibarr（负责生成 header 部分）包含一个 javascript 文件，必须在页面开头调用的llxHeader()函数的参数中提供包含要包含的JS URL的参数。&lt;br /&gt;
&lt;br /&gt;
页面 /htdocs/mymodule/mypage.php 的示例：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$morejs=array(&amp;quot;/mymodule/js/mymodule.js&amp;quot;);&lt;br /&gt;
llxHeader(&#039;&#039;,&#039;Titre&#039;,&#039;&#039;,&#039;&#039;,&#039;&#039;,&#039;&#039;,$morejs,&#039;&#039;,0,0); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==在Dolibarr事件上触发代码 (可选)==&lt;br /&gt;
&#039;&#039;&#039;何时&#039;&#039;&#039;：希望在Dolibarr标准操作后触发执行特定操作时（例如：当在Dolibarr中创建发票时，我想更新模块中的表），您需要创建一个 &#039;&#039;&#039;triggers&#039;&#039;&#039; 文件。&lt;br /&gt;
&lt;br /&gt;
另请参阅 [[Interfaces_Dolibarr_toward_foreign_systems|Dolibarr到外部系统的接口]] 和 [[Interfaces_from_foreign_systems_toward_Dolibarr|外部系统到Dolibarr的接口]]&lt;br /&gt;
&lt;br /&gt;
==在Dolibarr的hooks处插入代码 (可选)==&lt;br /&gt;
&#039;&#039;&#039;何时&#039;&#039;&#039;：当您想更改或添加业务事件以外的代码时（请参阅上一章）。&lt;br /&gt;
&lt;br /&gt;
请参阅页面 [[Hooks_system|Hooks系统]].&lt;br /&gt;
==添加编号模块（可选）==&lt;br /&gt;
&#039;&#039;&#039;何时&#039;&#039;&#039;：当您想添加默认模块未涵盖的编号规则时。&lt;br /&gt;
&lt;br /&gt;
请参阅页面 [[Create numbering module|创建编号模块]] 。&lt;br /&gt;
&lt;br /&gt;
==添加新文档模板 (可选)==&lt;br /&gt;
&#039;&#039;&#039;何时&#039;&#039;&#039;：需要添加新文档模板时。如想要个性化自己生成的 PDF 或 ODT 文档。&lt;br /&gt;
&lt;br /&gt;
注意：要添加此功能，您无需创建模块描述符文件。&lt;br /&gt;
&lt;br /&gt;
有关如何从模板生成文档的详情，请参阅页面 [[Create_a_PDF_document_template|创建PDF文档模板]] 或 [[Create_an_ODT_document_template|创建ODT文档模板]] 。&lt;br /&gt;
&lt;br /&gt;
==添加主题 (可选)==&lt;br /&gt;
&#039;&#039;&#039;何时&#039;&#039;&#039;：当您想要根据您的情况定制界面（颜色/字体/图形）时。&lt;br /&gt;
&lt;br /&gt;
注意：要添加此功能，您无需创建模块描述符。&lt;br /&gt;
&lt;br /&gt;
请参阅页面 [[Skins|主题]] 。&lt;br /&gt;
&lt;br /&gt;
==修改开发模块作者名==&lt;br /&gt;
&lt;br /&gt;
在myModule.class.php中查找editor_name&lt;br /&gt;
&lt;br /&gt;
修改以下变量的值以修改作者名称&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;editor_name = &#039;Roger@QQ:12464313&#039;;&lt;br /&gt;
$this-&amp;gt;editor_url = &#039;https://www.ivnun.cn&#039;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=面向开发人员的一些编码规则和函数=&lt;br /&gt;
要遵循的编码规则请参阅 [[语言和开发规则|开发语言和编码规范（PHP, SQL, HTML）]] 。&lt;br /&gt;
&lt;br /&gt;
要调用 Dolibarr 供开发人员使用的预定义函数，请参阅  [[开发文档]]  的“内部函数”一节。&lt;br /&gt;
&lt;br /&gt;
=创建一个安装包来分发和安装您的模块=&lt;br /&gt;
必须使用此步骤来制作安装包，以便将其提交到市场 http://www.dolistore.com。&lt;br /&gt;
&lt;br /&gt;
但您也可以使用它通过自己的分发网络轻松分发模块。&lt;br /&gt;
&lt;br /&gt;
*进入 &#039;&#039;&#039;/build&#039;&#039;&#039; 目录并将文件 &#039;&#039;&#039;makepack-dolibarrmodules.conf&#039;&#039;&#039; 复制到 &#039;&#039;&#039;makepack-mymodule.conf&#039;&#039;&#039;。请注意，稳定版本包中可能不提供此目录。如果是这种情况，可以在 Dolibarr 网站的“开发版本”部分供下载的快照中检索（在这种情况下，请获取整个 build 目录，这是一个独立于版本的目录）。&lt;br /&gt;
&lt;br /&gt;
在此文件中输入为模块创建的新文件的名称清单（模块描述符、新表的SQL文件、PHP页面、图像等）。&lt;br /&gt;
&lt;br /&gt;
*通过 Perl 运行脚本（需要Perl 5.0或更高版本）：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
perl makepack-dolibarrmodule.pl&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
该脚本将询问模块的名称、主要版本和次要版本。然后将生成一个 &#039;&#039;&#039;mymodule.zip &#039;&#039;&#039;文件，其中包含准备部署的模块。&lt;br /&gt;
&lt;br /&gt;
*接收您的模块的人员必须将该文件放在其 Dolibarr 的安装根目录中，并执行以下命令：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tar -xvf mymodule.zip&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*如果您希望您的模块惠及所有人，您可以在插件市场 {{LinkToPluginDownload}} 上提交它（zip文件）（您必须先创建一个帐户并登录，以使用“提交模块/产品”链接）。&lt;br /&gt;
**如果您的模块制作正确，文件将很快通过验证。&lt;br /&gt;
**如果质量足够好、许可证允许、并且模块的功能被证明是普遍感兴趣的，则可以将代码添加到 Dolibarr 的源代码中（除非您不希望这样做）。&lt;br /&gt;
&lt;br /&gt;
=Dolistore上外部模块的归档和验证=&lt;br /&gt;
&lt;br /&gt;
请参阅 [[Module_Dolistore_Validation_Rules|验证规则]]&lt;/div&gt;</summary>
		<author><name>ShengGang</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=%E6%A8%A1%E5%9D%97%E5%BC%80%E5%8F%91&amp;diff=58765</id>
		<title>模块开发</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=%E6%A8%A1%E5%9D%97%E5%BC%80%E5%8F%91&amp;diff=58765"/>
		<updated>2023-11-20T02:33:59Z</updated>

		<summary type="html">&lt;p&gt;ShengGang: /* 创建原始PHP屏幕页面 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- BEGIN interlang links --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Do NOT edit this section&lt;br /&gt;
     Links below are automatically managed by PolyglotBot&lt;br /&gt;
     You can edit links on the English source page : Module_development --&amp;gt;&lt;br /&gt;
[[en:Module_development]]&lt;br /&gt;
[[fr:Développement_module]]&lt;br /&gt;
[[es:Desarrollo_de_un_módulo]]&lt;br /&gt;
[[de:Modul_Entwicklung]]&lt;br /&gt;
[[ja:モジュール_開発]]&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Core]]&lt;br /&gt;
[[Category:开发]]&lt;br /&gt;
{{Template用户手册}}&lt;br /&gt;
{{Template开发文档}}&lt;br /&gt;
{{TemplateMainPageZh}}&lt;br /&gt;
&lt;br /&gt;
要创建新模块，需要执行以下几个步骤。本教程旨在向您介绍每一个步骤，以便添加一个模块来扩展Dolibarr的功能，例如添加以下一个或多个功能：&lt;br /&gt;
&lt;br /&gt;
*在数据库中添加新表&lt;br /&gt;
*在菜单中添加您自己的菜单项&lt;br /&gt;
*添加对象和屏幕以输入/查看新表&lt;br /&gt;
*在视图页上添加或删除选项卡/编辑对象（发票、产品、订单、事件等）&lt;br /&gt;
*为内部导出工具添加预定义的导出&lt;br /&gt;
*向主页添加新信息框/widget小组件&lt;br /&gt;
*添加新的替换变量&lt;br /&gt;
*定义新权限&lt;br /&gt;
*自动触发指定 Dolibarr 操作的代码&lt;br /&gt;
*将自定义代码插入 Dolibarr 的钩子位置&lt;br /&gt;
*为所创建的对象的引用添加编号模块（为数据自动编码的模块）&lt;br /&gt;
*添加PDF文档模板&lt;br /&gt;
*添加一个新主题/皮肤&lt;br /&gt;
&lt;br /&gt;
等等...&lt;br /&gt;
&lt;br /&gt;
以下章节介绍了如何以简单的方式手动完成所有这些操作。对于有经验的开发人员来说，使用MDA生成的方法也不错，详见最后一章。&lt;br /&gt;
&lt;br /&gt;
=使用模块生成器构建模块=&lt;br /&gt;
从Dolibarr 9.0开始，您可以使用&amp;quot;模块生成器&amp;quot;（Module Builder）创建模块的主要文件。要激活它 ：&lt;br /&gt;
&lt;br /&gt;
*设置参数 MAIN_FEATURES_LEVEL 的值为 2 ( 设置 / 其他 )（或者修改llx_const表中该项的记录的value值为2）&lt;br /&gt;
&lt;br /&gt;
[[File:企业微信截图 20180725114721.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*在 &#039;&#039;&#039;主页 - 设置 - 设置-模块/应用 多模块工具&#039;&#039;&#039; 中激活“模块生成器”（ModuleBuilder）&lt;br /&gt;
&lt;br /&gt;
[[File:激活modulebuilder.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*点击屏幕右上角菜单栏中出现的&#039;Bug&#039;图标&lt;br /&gt;
&lt;br /&gt;
[[File:Buglogo.png]]&lt;br /&gt;
&lt;br /&gt;
*运行的ModuleBuilder界面如下：&lt;br /&gt;
&lt;br /&gt;
[[File:Modulebuilder.png|800px]]&lt;br /&gt;
&lt;br /&gt;
=外部模块模板示例=&lt;br /&gt;
一个Dolibarr外部模块的模板/框架：[https://github.com/Dolibarr/dolibarr/tree/develop/htdocs/modulebuilder/template Github Dolibarr模块]&lt;br /&gt;
&lt;br /&gt;
=创建模块=&lt;br /&gt;
以下章节描述了创建Dolibarr模块所需的操作。无论模块的用途如何，第一章描述的操作都是必须要完成的，后续章节描述的操作是否要做将取决于模块的需求。 &lt;br /&gt;
&lt;br /&gt;
==创建模块描述符（必做）==&lt;br /&gt;
&#039;&#039;&#039;何时&#039;&#039;&#039;：无论其用途如何，开发扩展模块时都是强制性的。&#039;&#039;&#039;从Dolibarr 9.0开始，您可以使用“模块生成器”创建模块的描述符&#039;&#039;&#039;。该工具仍处于开发和完善阶段，但其已经可以使用。&lt;br /&gt;
&lt;br /&gt;
===使用模块生成器创建描述符===&lt;br /&gt;
&lt;br /&gt;
*通过单击&amp;quot;Bug&amp;quot;图标启动模块生成器&lt;br /&gt;
&lt;br /&gt;
[[File:Mod_builder_3.png|400px]]&lt;br /&gt;
&lt;br /&gt;
*在下图“模块名称”处输入不含空格的模块名称（模块名称不得包含下划线 ：_），然后单击&amp;quot;创建&amp;quot;按钮。&lt;br /&gt;
&lt;br /&gt;
[[file:模块名.png|800px]]&lt;br /&gt;
&lt;br /&gt;
*已初始化具有第一个文件的模块。然后，您可以更改模块描述符的参数：&lt;br /&gt;
&lt;br /&gt;
[[File:Mod_builder_5.png|400px]]&lt;br /&gt;
&lt;br /&gt;
===备选方案：手动创建描述符（不使用模块生成器）===&lt;br /&gt;
第一步是创建模块描述文件（描述符）。为此：&lt;br /&gt;
&lt;br /&gt;
*创建目录 &#039;&#039;&#039;htdocs/custom/&#039;&#039;mymodule&#039;&#039;/core/modules&#039;&#039;&#039; 。&lt;br /&gt;
*进入目录 &#039;&#039;&#039;htdocs/modulebuilder/template/core/modules&#039;&#039;&#039; 将文件 modMyModule.class.php 复制到目录 &#039;&#039;&#039;htdocs/custom/&#039;&#039;mymodule&#039;&#039;/core/modules&#039;&#039;&#039; 中。&lt;br /&gt;
*重命名mod&#039;&#039;&#039;MyModule&#039;&#039;&#039;.class.php文件，只需修改&#039;&#039;&#039;MyModule&#039;&#039;&#039;部分即可（文件必须以mod开头）&lt;br /&gt;
&lt;br /&gt;
然后，编辑此文件的内容：&lt;br /&gt;
&lt;br /&gt;
*将所有&#039;&#039;modMyModule&#039;&#039;替换为与模块用途相对应的值。此值必须始终以“&#039;&#039;&#039;mod&#039;&#039;&#039;”开头，并且仅包含&#039;&#039;&#039;字母字符&#039;&#039;&#039;。&lt;br /&gt;
*通过 $this-&amp;gt;numero = &#039;&#039;100000&#039;&#039; 设置模块ID。为避免冲突，您可以参考以下页面查找已分配的ID：[[List of modules id|模块ID清]]&amp;lt;nowiki/&amp;gt;[[List of modules id|单]] 。&lt;br /&gt;
*可能还需要修改构造函数中定义的其他变量（有关其含义，请参阅[[主模块代码框架|类文件代码]]中的注释）。&lt;br /&gt;
&lt;br /&gt;
模块的描述文件（描述符）已准备就绪。请参阅下一步“测试描述符”以激活您的新模块。&lt;br /&gt;
&lt;br /&gt;
===测试描述符===&lt;br /&gt;
&lt;br /&gt;
启动Dolibarr并进入 &#039;&#039;&#039;主页-&amp;gt;设置-&amp;gt;模块/应用&#039;&#039;&#039; 页面，您应该会看到一个新行，其中包含新模块以及是否激活它的选项（浏览每个模块类别的所有选项卡，直到找到它）。&lt;br /&gt;
&lt;br /&gt;
$this-&amp;gt;special 的值决定了模块位于哪个类别选项卡中。&lt;br /&gt;
&lt;br /&gt;
注意：如果在模块描述符中设置了属性 version ，则应在 &#039;&#039;&#039;模块/应用&#039;&#039;&#039; 页面看到包含新模块的新行以及是否激活它的选项。如果将属性 version 设置为“develop”或“experiental”，若要查看模块，必须先进入页面 &#039;&#039;&#039;“主页-&amp;gt;设置-&amp;gt;其他设置&#039;&#039;&#039;”，并将参数 MAIN_FEATURES_LEVEL 设置为 1 以查看“实验性”(experimental)模块，或设置为 2 以查看“开发”(development)模块。&lt;br /&gt;
&lt;br /&gt;
===模块的名称===&lt;br /&gt;
&lt;br /&gt;
模块名称不得包含下划线或下划线：_&lt;br /&gt;
==新模块的树视图（必需）==&lt;br /&gt;
&lt;br /&gt;
以下是组织模块文件时要遵循的树结构（如果使用ModuleBuilder生成文件，则自动采用此树结构）。&lt;br /&gt;
&lt;br /&gt;
注：zip 文件也必须符合此规则，只有第二行是强制性的。&lt;br /&gt;
&lt;br /&gt;
{{Template模块目录树}}&lt;br /&gt;
&lt;br /&gt;
一个好的Dolibarr扩展模块的模板/框架：[https://github.com/Dolibarr/dolibarr/tree/develop/htdocs/modulebuilder/template GitHub Dolibarr Module Modèle]&lt;br /&gt;
&lt;br /&gt;
==创建数据表和 PHP DAO 类 (可选)==&lt;br /&gt;
&#039;&#039;&#039;何时：&#039;&#039;&#039;如果您的模块需要管理自己的数据&lt;br /&gt;
&lt;br /&gt;
===创建 .sql 文件===&lt;br /&gt;
如果您的模块要处理在Dolibarr标准版中不存在的数据，则需要自定义数据库表来存储这些数据。&lt;br /&gt;
&lt;br /&gt;
在模块的目录中创建&#039;&#039;&#039;sql&#039;&#039;&#039;子目录（&#039;&#039;&#039;mymodule/sql&#039;&#039;&#039;），用于放置要创建的sql脚本（使用ModuleBuilder，在&amp;quot;对象&amp;quot;选项卡中创建新对象后，将自动执行此步骤）。&lt;br /&gt;
&lt;br /&gt;
接下来，检查模块描述符文件，在 &#039;&#039;&#039;init&#039;&#039;&#039; 函数中是否包括行：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight 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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
并且未被注释掉。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;应遵循的规则&#039;&#039;：&lt;br /&gt;
&lt;br /&gt;
*根据每个表1个文件的原则添加表的创建命令文件，命名为 &#039;&#039;&#039;llx_mytable.sql&#039;&#039;&#039;（用于表），可能还附带 &#039;&#039;&#039;llx_mytable.key.sql&#039;&#039;&#039; 文件（用于索引或外键）。示例请参阅 &#039;&#039;&#039;install/mysql/tables&#039;&#039;&#039; 中的现有文件。&lt;br /&gt;
*SQL字段的推荐类型和名称在 [[https://wiki.dolibarr.org/index.php/Langages_et_normes#R.C3.A8gles_de_codage_SQL]] 页中定义。&lt;br /&gt;
*管理数据：对于添加/操作数据的命令，它们都必须位于同一目录 &#039;&#039;&#039;/mymodule/sql/&#039;&#039;&#039; 中名为 &#039;&#039;&#039;data.sql&#039;&#039;&#039; 的文件中。&lt;br /&gt;
*不要使用双引号（如 &amp;quot;string&amp;quot;），因为双引号（&amp;quot;）在 PostGreSQL 中有特殊的含义&lt;br /&gt;
&lt;br /&gt;
data.sql文件内容示例：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight 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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
文件中的SQL语句必须对 &#039;&#039;&#039;mysql&#039;&#039;&#039; 数据库有效。请注意：不需要维护其他数据库类型的文件。它们由数据库驱动程序动态读取和转换。&lt;br /&gt;
&lt;br /&gt;
===测试 .sql 文件===&lt;br /&gt;
&lt;br /&gt;
文件准备就绪后，您可以返回Dolibarr的模块管理页面，禁用模块，删除数据库表（如果它们已经存在），然后重新激活模块。正常情况下，应该可以通过激活模块来重新创建表。否则，请手动检查脚本，或查看Dolibarr日志。&lt;br /&gt;
&lt;br /&gt;
===生成 PHP DAO 表访问类===&lt;br /&gt;
创建对象时，ModuleBuilder会自动生成对象的PHP DAO类文件。&lt;br /&gt;
&lt;br /&gt;
如果不使用模块生成器，您将在模块框架文件&#039;&#039;&#039;htdocs/modulebuilder/templates/class/myobject.class.php&#039;&#039;&#039; 中找到示例。&lt;br /&gt;
&lt;br /&gt;
在这个类中，已经有可调用的 CRUD（Create/Read/Update/Delete）方法来执行表行数据的插入、获取（select）、更新和删除。修改此文件以使用正确的模块名和表名，并将该文件放在模块的 &#039;&#039;&#039;class&#039;&#039;&#039; 子目录中。若使用 &#039;&#039;&#039;ModuleBuilder&#039;&#039;&#039; 只需点击几下鼠标即可完成此操作。&lt;br /&gt;
&lt;br /&gt;
====使用ModuleBuilder生成PHP DAO类文件====&lt;br /&gt;
&lt;br /&gt;
*使用ModuleBuilder生成PHP DAO类文件，简单至在下图中选择&#039;对象&#039;选项卡，输入&#039;对象名&#039;，然后点击创建，即可生成相关一切文档。&lt;br /&gt;
&lt;br /&gt;
[[File:新对象.png|800px]]&lt;br /&gt;
&lt;br /&gt;
参见[[ModuleBuilder用户手册]]&lt;br /&gt;
==选项卡显示(可选)==&lt;br /&gt;
&lt;br /&gt;
===添加或删除对象表单上的选项卡===&lt;br /&gt;
&#039;&#039;&#039;何时：&#039;&#039;&#039;在标准对象（发票、订单、报价单、会员…）的表单中添加您自己的选项卡&lt;br /&gt;
&lt;br /&gt;
要执行此操作，请打开之前创建的模块描述符文件并编辑 $this-&amp;gt;tabs 数组：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight 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:mylangfile@mymodule:$user-&amp;gt;rights-&amp;gt;mymodule-&amp;gt;read:/mymodule/mypagetab1.php?id=__ID__&#039;    // To add a new tab identified by code tabname1&lt;br /&gt;
                            &#039;objecttype:+tabname2:Title2:mylangfile@mymodule:$user-&amp;gt;rights-&amp;gt;mymodule-&amp;gt;read:/mymodule/mypagetab2.php?id=__ID__&#039;,   // To add a 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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
该表应包含字符串列表，每个字符串表示一个新选项卡。字符串格式由6个部分组成，由“：”分隔&lt;br /&gt;
&lt;br /&gt;
*第1部分：选项卡的元素类型（objecttype），只能是下列值之一：&lt;br /&gt;
{{TemplateModuleTabs-zh}}&lt;br /&gt;
&lt;br /&gt;
*第2部分：用于标识要添加（以+开头）或删除（以-开头）的选项卡的codeName&lt;br /&gt;
*第3部分：选项卡的标题。这可以是硬编码的字符串，或者是更好的，lang文件中的翻译代码。&lt;br /&gt;
*第4部分：文件“*.lang”的名称（不带.lang扩展名），此文件内有翻译代码和要显示的语言字符串之间的对应关系。如果这个文件名后面跟@mymodule，则Dolibarr将在模块自己的 lang 目录中查找翻译文件，即htdocs/mymodule/langs/code_CODE/mymodule.lang，否则Dolibarr将查找翻译文件htdocs/langs/code_CODE/mylangfile.lang。&lt;br /&gt;
*第5部分：判断选项卡是否可见的条件。设置为“1”，会使其始终可见。&lt;br /&gt;
*第6部分：单击选项卡时要显示的页面的URL。字符串“__ID__”将自动替换为相关元素的ID。&lt;br /&gt;
&lt;br /&gt;
要使声明生效，必须禁用并重新激活该模块。&lt;br /&gt;
&lt;br /&gt;
要使用来自数据库的数据填充选项卡的内容，请参阅下一章。&lt;br /&gt;
&lt;br /&gt;
为了获取现有选项卡的名称“tabname”，您必须检查文件“core/lib/module.lib.php”的函数“product_prepare_head”中使用的名称，该文件对应于“$head[$h][2]”部分。&lt;br /&gt;
&lt;br /&gt;
===将对象的标准选项卡添加到其自己的表单页面===&lt;br /&gt;
&#039;&#039;&#039;何时：&#039;&#039;&#039;在您自己的表单中添加标准对象（产品、合作方…）的选项卡&lt;br /&gt;
&lt;br /&gt;
必须遵循以下步骤：&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. 在代码中包含定义相关函数的文件&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
对于每种对象选项卡，都有两个文件需要使用下列语句：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;require_once($url_fichier) ;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下是要包含的文件示例（DOL_DOCUMENT_ROOT 对应于 dolibarr/htdocs/ 文件夹）：&lt;br /&gt;
&lt;br /&gt;
*合作方(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;
*产品(product) :&lt;br /&gt;
**DOL_DOCUMENT_ROOT/product/class/product.class.php&lt;br /&gt;
**DOL_DOCUMENT_ROOT/core/lib/product.lib.php&lt;br /&gt;
*发票 (invoice) :&lt;br /&gt;
**DOL_DOCUMENT_ROOT/compta/facture/class/facture.class.php&lt;br /&gt;
**DOL_DOCUMENT_ROOT/core/lib/invoice.lib.php&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. 创建并加载要在自己的表单中显示的标准对象&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
创建所需类的对象，并从数据库中获取对象数据。为此，您必须使用相应类的fetch()函数，并将从URL（/mytab.php?id=1）获取的对象id作为参数传递。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;例如：&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$id=GETPOST(&#039;id&#039;,&#039;int&#039;);&lt;br /&gt;
$ref=GETPOST(&#039;ref&#039;,&#039;alpha&#039;);&lt;br /&gt;
$product = new Product($db) ;&lt;br /&gt;
$result = $product-&amp;gt;fetch($id,$ref) ; // Test $result to check the database read is ok&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3. 检索与所选实体对应的选项卡列表&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
使用函数XXX_prepare_head($obj)（其中XXX是实体名称）创建一个包含要显示的选项卡定义的数组。要传递的参数是要显示选项卡的对象。&lt;br /&gt;
&lt;br /&gt;
返回的数组由以下内容组成：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$head        // Array of tabs&lt;br /&gt;
$head[$h]    // Element to describe one tab.&lt;br /&gt;
$head[$h][0] // Url of page to show when you click on tab&lt;br /&gt;
$head[$h][1] // Title of tab&lt;br /&gt;
$head[$h][2] // Code name to identify the tab&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;示例：&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$head = product_prepare_head($product, $user) ; // 参数 $user 是要显示选项卡的对象，这就是&amp;quot;产品&amp;quot;对象为&amp;quot;user&amp;quot;对象准备的所有可用的选项卡的数组。&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
某些函数上不存在$user参数&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4. 在您的页面上显示选项卡&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
使用dol_fiche_head()函数，该函数显示由 XX_prepare_head() 返回的 $head 数组中包含的选项卡。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight 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  // Title to show (shown into a special tab that you can&#039;t click)&lt;br /&gt;
//$notab&lt;br /&gt;
//$picto  // Name of image to show into title. Possible values are:&lt;br /&gt;
//            product&lt;br /&gt;
//            service&lt;br /&gt;
//            company&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
此函数将显示所需的选项卡，并打开一个html元素&#039;&#039;&amp;lt; div class=&amp;quot;&amp;quot; &amp;gt;&#039;&#039;，该元素对应于选项卡下方的显示区域（如果参数 $notab=0）。要关闭显示区域，只需在PHP代码中使用关闭元素&amp;lt;nowiki&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/nowiki&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
注：相关的更多细节，请参阅 [http://www.dolibarr.fr/doxygen/ Doxygen文档] 或直接参考 Dolibarr 代码。&lt;br /&gt;
&lt;br /&gt;
==创建PHP屏幕页面（可选）==&lt;br /&gt;
&#039;&#039;&#039;何时&#039;&#039;&#039;：如果新模块的目的是添加一个需要新屏幕页面的功能。&lt;br /&gt;
&lt;br /&gt;
===创建原始PHP屏幕页面===&lt;br /&gt;
随后，您可以使用 &#039;&#039;&#039;modulebuilder&#039;&#039;&#039; 目录中提供的示例模板（&#039;&#039;&#039;myobject_page.php&#039;&#039;&#039;）创建基于表数据的PHP页面（有关命令行脚本的开发，请参阅 [[脚本开发]] ）。同样，如果您使用的是 ModuleBuilder，则在初始化对象时会自动创建页面实例（清单、创建页面、Notes选项卡等）。&lt;br /&gt;
&lt;br /&gt;
要创建新的用户屏幕页面，请创建特定于模块的 &#039;&#039;&#039;htdocs&#039;&#039;&#039; 子目录（如果尚未创建）（如 &#039;&#039;&#039;htdocs/mymodule&#039;&#039;&#039; ），以便在其中放置要创建的页面。&lt;br /&gt;
&lt;br /&gt;
从复制文件 &#039;&#039;&#039;myobject_page.php&#039;&#039;&#039; 作为开始。编辑该文件，以便能正确找到并加载 main.inc.php 文件：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
// Load Dolibarr environment&lt;br /&gt;
$res=0;&lt;br /&gt;
// Try main.inc.php into web root known defined into CONTEXT_DOCUMENT_ROOT (not always defined)&lt;br /&gt;
if (! $res &amp;amp;&amp;amp; ! empty($_SERVER[&amp;quot;CONTEXT_DOCUMENT_ROOT&amp;quot;])) $res=@include($_SERVER[&amp;quot;CONTEXT_DOCUMENT_ROOT&amp;quot;].&amp;quot;/main.inc.php&amp;quot;);&lt;br /&gt;
// Try main.inc.php into web root detected using web root caluclated from SCRIPT_FILENAME&lt;br /&gt;
$tmp=empty($_SERVER[&#039;SCRIPT_FILENAME&#039;])?&#039;&#039;:$_SERVER[&#039;SCRIPT_FILENAME&#039;];$tmp2=realpath(__FILE__); $i=strlen($tmp)-1; $j=strlen($tmp2)-1;&lt;br /&gt;
while($i &amp;gt; 0 &amp;amp;&amp;amp; $j &amp;gt; 0 &amp;amp;&amp;amp; isset($tmp[$i]) &amp;amp;&amp;amp; isset($tmp2[$j]) &amp;amp;&amp;amp; $tmp[$i]==$tmp2[$j]) { $i--; $j--; }&lt;br /&gt;
if (! $res &amp;amp;&amp;amp; $i &amp;gt; 0 &amp;amp;&amp;amp; file_exists(substr($tmp, 0, ($i+1)).&amp;quot;/main.inc.php&amp;quot;)) $res=@include(substr($tmp, 0, ($i+1)).&amp;quot;/main.inc.php&amp;quot;);&lt;br /&gt;
if (! $res &amp;amp;&amp;amp; $i &amp;gt; 0 &amp;amp;&amp;amp; file_exists(dirname(substr($tmp, 0, ($i+1))).&amp;quot;/main.inc.php&amp;quot;)) $res=@include(dirname(substr($tmp, 0, ($i+1))).&amp;quot;/main.inc.php&amp;quot;);&lt;br /&gt;
// Try main.inc.php using relative path&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;);&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;);&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;);&lt;br /&gt;
if (! $res) die(&amp;quot;Include of main fails&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如您所见，其多次尝试加载 main.inc.php（或 master.inc.php）文件。目标是在尽可能多的场景下取得成功。最少为2行：一行用于尝试将 master/main.inc.php 文件加载到 dolibarr 的根目录中，另一行用于尝试加载该文件，以支持模块部署在“custom”目录中的场景。但你可能不得不处理更多的场景。上面提供的示例应该能够在几乎所有场景/配置下加载 main/master.inc.php 文件。&lt;br /&gt;
&lt;br /&gt;
在3.2之后，为所有版本的Dolibarr开发的扩展模块可以放置在不同的文件夹中，而不仅仅是“htdocs”，如“htdocs/custom”，为了不必修改模块的源代码，我们要做几个包含，所以这个规则必须被所有模块使用。&lt;br /&gt;
&lt;br /&gt;
请注意，您可以根据文件相对于模块目录树的深度添加更多的“../”。&lt;br /&gt;
&lt;br /&gt;
main.inc.php文件加载了技术环境变量和权限。然后设置以下对象变量：&lt;br /&gt;
&lt;br /&gt;
*$user    包含用户属性 + 权限的对象&lt;br /&gt;
*$conf    包含 Dolibarr 设置的对象&lt;br /&gt;
*$db       包含数据库连接句柄的对象&lt;br /&gt;
*$langs   包含用户语言的对象&lt;br /&gt;
&lt;br /&gt;
然后输入代码以显示页面。&lt;br /&gt;
&lt;br /&gt;
*在不知道从何处调用文件的情况下，使用Dolibarr函数dol_include_once()（而不是直接使用include_once）包含专用于模块的类或库&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;例如：&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
dol_include_once(&#039;/mymodule/class/myclass.class.php&#039;, &#039;MyClass&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*另一方面，Dolibarr提供的标准类将使用 require-once 直接调用，语法如下：&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;例如：&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight 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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
原因是，尽管dol_include_once很方便，却因它会扫描每个备用路径目录以找到文件，所以它的性能也很差，因为它会在每次调用时生成访问和磁盘搜索（实际上，PHP集成了已读文件的缓存，但未集成“未找到”文件的缓存）。由于给定的文件只可能存在于一个树中，所以总会有一个无此文件的备用树，这会产生对硬盘的不必要访问，从而影响性能。与Dolibarr的内部文件一样，我们总是知道确切的路径，应该首选带有该直接路径的 require_once）。&lt;br /&gt;
&lt;br /&gt;
===在已存在的表单上增加新字段===&lt;br /&gt;
您可能希望提供一个模块，将更多字段添加到某些元素的表单（录入和展示）中。&lt;br /&gt;
&lt;br /&gt;
一个繁琐（但不太糟糕）的解决方案可能是替换用于创建元素的所有页面（这意味着禁用“新建元素”菜单项并添加您的菜单项，并禁用显示元素的选项卡，以替换选项卡，该选项卡是您自己的完整页面（从原始页面复制/粘贴），使其与原始页面相同，但被修改为添加字段并将添加的数据存储到您自己的表中）。如果此解决方案适合您，请前往菜单 [[#Define your entries in menu (optional)]] 和 [[#The tab management (optional)]]（本解决方案更强大，因为您可以在页面中改变你想要改变的一切）。&lt;br /&gt;
&lt;br /&gt;
我们将在这里描述另一种解决方案，该解决方案仅适用于在现有字段的末尾“添加字段”，下面以元素“category”作为示例，但您可以将本教程转换为发票、报价单...&lt;br /&gt;
&lt;br /&gt;
*首先，添加一个由您的模块拥有的表，以存储新字段的值。此表将有一个名为“rowid”的列（将包含与元素表的字段rowid相同的值+每一个要添加的新字段。然后为这个新表创建一个具有CRUD（Create/Read/Update/Delete）方法的类。对于这两项任务，请返回前一章[[#创建数据表和表的PHP类文件 (可选)]]。&lt;br /&gt;
*其次，在模块中添加一个钩子，以将新字段添加到表单中。有关使用钩子的通用文档，请参阅[[Hooks_system#Implement_the_Hook]]章节。&lt;br /&gt;
&lt;br /&gt;
如果遵循本教程，则必须执行以下操作才能将字段添加到 category 表单中：&lt;br /&gt;
{{ToComplete}}&lt;br /&gt;
&lt;br /&gt;
===用钩子添加/替换部分字段===&lt;br /&gt;
请参阅  [[钩子系统#实现钩子]] 章节，了解如何使用Dolibarr现有的钩子在Dolibarr钩子位置添加/替换代码。&lt;br /&gt;
&lt;br /&gt;
===访问数据库===&lt;br /&gt;
如果您需要对自己添加的表进行基本变更，请使用之前生成的类，其中包含用于此目的的方法。&lt;br /&gt;
&lt;br /&gt;
但是，如果您希望在没有专用PHP对象的情况下访问表，这仍然是可能的（例如，检索记录列表）。在这种情况下，请考虑以下示例：&lt;br /&gt;
&lt;br /&gt;
对于插入、更新或删除：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$db-&amp;gt;begin();   // Start transaction&lt;br /&gt;
$db-&amp;gt;query(&amp;quot;My SQL request insert, update or delete&amp;quot;);&lt;br /&gt;
$db-&amp;gt;commit();       // Validate transaction&lt;br /&gt;
or $db-&amp;gt;rollback()  // Cancel transaction&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
对于读取:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$resql=$db-&amp;gt;query(&amp;quot;My select request&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===定义页面样式===&lt;br /&gt;
为了使页面的外观与 Dolibarr 主题保持一致，必须使用 Dolibarr CSS 样式。&lt;br /&gt;
&lt;br /&gt;
例如：&lt;br /&gt;
&lt;br /&gt;
*在表格标题行的&#039;&#039;tr&#039;&#039;和&#039;&#039;td&#039;&#039;标签上使用 class=&amp;quot;&#039;&#039;&#039;liste_titre&#039;&#039;&#039;&amp;quot;&lt;br /&gt;
*在表格数据行的&#039;&#039;tr&#039;&#039;和&#039;&#039;td&#039;&#039;标签上使用 class=&amp;quot;&#039;&#039;&#039;pair&#039;&#039;&#039;&amp;quot; 或 class=&amp;quot;&#039;&#039;&#039;impair&#039;&#039;&#039;&amp;quot;&lt;br /&gt;
*在所有输入域（&#039;&#039;input, select, textarea&#039;&#039;...）上使用 class=&amp;quot;&#039;&#039;&#039;flat&#039;&#039;&#039;&amp;quot;&lt;br /&gt;
*在所有 &#039;&#039;type=&amp;quot;submit&amp;quot;&#039;&#039; 的 &#039;&#039;input&#039;&#039; 对象上使用 class=&amp;quot;&#039;&#039;&#039;button&#039;&#039;&#039;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===使用 Dolibarr 日期选择器===&lt;br /&gt;
如果您愿意，您可以使用 Dolibarr 屏幕页面中的日期选择器（带日历弹出窗口）。为此，请使用以下行：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight 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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
字符串&amp;lt;syntaxhighlight 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;/syntaxhighlight&amp;gt;标识表单中的日期选择器。如果在同一页面中使用多个日期选择器，则必须设置不同的值。&lt;br /&gt;
&lt;br /&gt;
字符串myform是FORM区域的名称（在HTML页面的form name=“myform”中）。因此，日期选择器的显示必须集成到FORM Html区域中。&lt;br /&gt;
&lt;br /&gt;
要在POST结束时检索值，命令为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight 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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===覆盖模板文件 (tpl)===&lt;br /&gt;
如果您想覆盖模块上的tpl文件，则需要在 module_parts 上声明它：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
&#039;tpl&#039; =&amp;gt; 1,&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后您可以在 &#039;&#039;&#039;mymodule/core/tpl&#039;&#039;&#039; 上放置任何tpl文件。&lt;br /&gt;
&lt;br /&gt;
一旦模块被激活，tpl就会被覆盖。&lt;br /&gt;
&lt;br /&gt;
==设置配置页面 (可选)==&lt;br /&gt;
&#039;&#039;&#039;何时&#039;&#039;&#039;：如果您的模块提供多个可配置选项。&lt;br /&gt;
&lt;br /&gt;
===创建配置编辑页面===&lt;br /&gt;
如果您的模块提供了多个可配置选项，则需要创建一个PHP页面来编辑这些选项（存储在 [[Table llx_const|表 &#039;&#039;&#039;llx_const&#039;&#039;&#039;]] 中）。&lt;br /&gt;
&lt;br /&gt;
创建一个名为 &#039;&#039;&#039;mymodule_setuppage.php&#039;&#039;&#039; 的PHP页面，显示可能的选项并更新它们。&lt;br /&gt;
&lt;br /&gt;
有必要以 &#039;&#039;&#039;/admin&#039;&#039;&#039; 中的一个页面为例，展示读取或保存选项的方法。将此配置页面也放在&#039;&#039;&#039;/admin&#039;&#039;&#039;目录中。&lt;br /&gt;
&lt;br /&gt;
===修改模块的描述符文件===&lt;br /&gt;
然后，在模块描述符文件中，修改变量 &#039;&#039;&#039;config_page_url&#039;&#039;&#039; 以指定该PHP页面的名称。&lt;br /&gt;
&lt;br /&gt;
如果页面在目录 &#039;&#039;&#039;admin/&#039;&#039;&#039; 中），则：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;config_page_url = array(&amp;quot;mymodule_setuppage.php&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果页面在目录 &#039;&#039;&#039;mymodule/admin/&#039;&#039;&#039; 中，则：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;config_page_url = array(&amp;quot;mymodule_setuppage.php@mymodule&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===测试您的页面===&lt;br /&gt;
前往“主页-&amp;gt;设置-&amp;gt;模块/应用”页面，您应该会看到一个齿轮图标，允许您访问配置页面，并且您应该能够修改这些选项并将其保存到数据库中。&lt;br /&gt;
&lt;br /&gt;
==设置菜单项 (可选)==&lt;br /&gt;
&#039;&#039;&#039;何时&#039;&#039;&#039; ：如果您创建了PHP页面，则必须从Dolibarr菜单访问这些屏幕页面。&lt;br /&gt;
&lt;br /&gt;
===设置菜单项===&lt;br /&gt;
为此，您需要在模块描述符文件中定义数组 this-&amp;gt;menu，该数组用于声明菜单。&lt;br /&gt;
&lt;br /&gt;
此数组包含模块激活后将显示在菜单中的所有条目。&lt;br /&gt;
&lt;br /&gt;
模块描述符文件的示例文件 &#039;&#039;&#039;modMyModule.class.php&#039;&#039;&#039; 中有一个声明顶部菜单及其相关的左侧菜单项的示例。&lt;br /&gt;
&lt;br /&gt;
以下是描述符文件中菜单项声明的示例：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight 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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
若要根据权限限制对菜单的访问，请更改数组的 &#039;&#039;&#039;perms&#039;&#039;&#039; 属性。有关如何添加权限的更多信息，请参阅后面有关权限的章节。&lt;br /&gt;
&lt;br /&gt;
===测试您的菜单项===&lt;br /&gt;
在Dolibarr中禁用并重新激活您的模块，然后应该会出现菜单项（如果 “enabled”为真）。&lt;br /&gt;
&lt;br /&gt;
==设置您自己的权限 (可选)==&lt;br /&gt;
&#039;&#039;&#039;何时&#039;&#039;&#039;： 如果要添加新权限。&lt;br /&gt;
&lt;br /&gt;
模块将其管理的权限定义，放在第一步中创建的模块描述符文件中完成。更改行：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;rights_class = &#039;mymodule&#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
录入正确的 myModule 值。&lt;br /&gt;
&lt;br /&gt;
然后在 $this-&amp;gt;rights 数组中填充与要管理的不同权限一样多的条目。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight 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;Label by default of permission&#039;;&lt;br /&gt;
$this-&amp;gt;rights[$r][3] = 1;&lt;br /&gt;
$this-&amp;gt;rights[$r][4] = &#039;action&#039;;&lt;br /&gt;
$this-&amp;gt;rights[$r][5] = &#039;subaction&#039;;&lt;br /&gt;
$r++;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在$this-&amp;gt;rights[$r][0]中，输入尚未使用的权限ID（请参阅&#039;&#039;&#039;系统信息&#039;&#039;&#039;菜单，在运行Dolibarr的设备上查看已在使用的ID）。&lt;br /&gt;
&lt;br /&gt;
在$this-&amp;gt;rights[$r][1]中，输入默认标签（如果在 &#039;&#039;&#039;admin.lang&#039;&#039;&#039; 文件中找不到您权限标签的翻译字符串，则显示该标签。翻译键值为 “Permission10001=我的超级权限的描述”）。&lt;br /&gt;
&lt;br /&gt;
在$this&amp;gt;rights[$r][2]中，输入权限类型。有三种类型的权限，“r”表示读取、列出清单或导出权限，“w”表示写入或更新权限，“d”表示删除权限。&lt;br /&gt;
&lt;br /&gt;
在$this-&amp;gt;rights[$r][3]中，如果任何一个新创建的用户都会被默认自动分配此权限，则输入1。&lt;br /&gt;
&lt;br /&gt;
在$this-&amp;gt;rights[$r][4]和$this-&amp;gt;rights[$r][5]中，输入不带空格的操作和子操作字符串。然后，您可以通过以下命令在PHP代码中测试用户是否具有正确的权限：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
if ($user-&amp;gt;rights-&amp;gt;mymodule-&amp;gt;action-&amp;gt;subaction) ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==设置您自己的消息框/widget小组件 (可选)==&lt;br /&gt;
&#039;&#039;&#039;何时&#039;&#039;&#039;：如果您的模块附带提供在主页上展示的一个或多个消息框。&lt;br /&gt;
&lt;br /&gt;
===设置您的消息框===&lt;br /&gt;
为此，请修改模块描述符文件中的数组 $this-&amp;gt;boxes。&lt;br /&gt;
&lt;br /&gt;
首先为即将在 &#039;&#039;&#039;htdocs/mymodule/core/boxes&#039;&#039;&#039; 目录中创建的每个box文件添加2行。&lt;br /&gt;
&lt;br /&gt;
例如：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;boxes[0][&#039;file&#039;]=&#039;mybox0.php@mymodule&#039;&lt;br /&gt;
$this-&amp;gt;boxes[0][&#039;note&#039;]=&#039;My box 0&#039;&lt;br /&gt;
 ...&lt;br /&gt;
$this-&amp;gt;boxes[n][&#039;file&#039;]=&#039;myboxn.php@mymodule&#039;&lt;br /&gt;
$this-&amp;gt;boxes[n][&#039;note&#039;]=&#039;My box n&#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其次，创建文件&#039;&#039;&#039;htdocs/mymodule/core/boxes/mybox0.php&#039;&#039;&#039;、&#039;&#039;&#039;htdocs/mymodule/core/boxes/mybox1.php&#039;&#039;&#039;…，以现有的消息框（在 &#039;&#039;&#039;htdocs/core/boxes&#039;&#039;&#039; 目录中）为示例。&lt;br /&gt;
&lt;br /&gt;
===测试您的消息框是否被 Dolibarr 检测到===&lt;br /&gt;
停用并重新激活模块。&lt;br /&gt;
&lt;br /&gt;
前往菜单  &#039;&#039;&#039;主页 - 设置 - widget小组件&#039;&#039;&#039; 。&lt;br /&gt;
&lt;br /&gt;
您的消息框必须显示在可激活消息框的清单中。激活它们，然后前往&#039;&#039;&#039;主页&#039;&#039;&#039;并检查它们是否正确显示。&lt;br /&gt;
&lt;br /&gt;
==定义您自己的导出 (可选)==&lt;br /&gt;
&#039;&#039;&#039;何时&#039;&#039;&#039;：如果您的模块附带提供预定义的数据导出（针对自己的表或来自另一个Dolibarr模块的现有表）。&lt;br /&gt;
&lt;br /&gt;
===定义导出===&lt;br /&gt;
为此，请取消注释并修改模块描述符文件中的 $this-&amp;gt;export_xxx 数组。&lt;br /&gt;
&lt;br /&gt;
===测试您的导出===&lt;br /&gt;
前往菜单 &#039;&#039;&#039;工具-&amp;gt;导出助手&#039;&#039;&#039; 。您的导出应显示在可用的预定义导出清单中（如果您的模块已激活）。选择它，您将看到在上一步时在表中定义的可能字段。选择几个字段并尝试生成导出文件。&lt;br /&gt;
&lt;br /&gt;
==设置CSS样式 (可选)==&lt;br /&gt;
&#039;&#039;&#039;何时&#039;&#039;&#039;：在PHP屏幕页面中，您使用的样式类不是Dolibarr主题的样式类（不推荐）。&lt;br /&gt;
&lt;br /&gt;
===创建并声明您的样式表===&lt;br /&gt;
创建一个名为 &#039;&#039;&#039;mymodule.css&#039;&#039;&#039; 或 &#039;&#039;&#039;mymodule.css.php&#039;&#039;&#039; 的CSS样式文件，并将其放在 &#039;&#039;&#039;htdocs/mymodule&#039;&#039;&#039; 目录中。每个模块只能有一个CSS文件。&lt;br /&gt;
&lt;br /&gt;
请记住，最好使用已有的Dolibarr样式（Dolibarr使用的CSS文件是&#039;&#039;&#039;themes/mytheme/&#039;&#039;themename&#039;&#039;.css.php&#039;&#039;&#039;）。仅当您必须处理不存在的样式时，才创建特定于模块的CSS文件。&lt;br /&gt;
&lt;br /&gt;
样式表准备就绪后，通过更改 &#039;&#039;&#039;$this-&amp;gt;modules_parts&#039;&#039;&#039; 属性在模块描述符文件中声明样式表。&lt;br /&gt;
&lt;br /&gt;
此处要输入的值必须是 CSS 文件 URL 的相对路径。&lt;br /&gt;
&lt;br /&gt;
例如：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;module_parts = array(&#039;css&#039; =&amp;gt; array(&#039;/mymodule/css/mymodule.css.php&#039;));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===测试您的样式表===&lt;br /&gt;
停用并重新激活模块。&lt;br /&gt;
&lt;br /&gt;
前往Dolibarr的主页。查看页面的HTML源代码。&lt;br /&gt;
&lt;br /&gt;
您应该在HTML标头中看到有一行是声明您的样式表。&lt;br /&gt;
&lt;br /&gt;
==定义Javascript函数 (可选)==&lt;br /&gt;
&#039;&#039;&#039;何时&#039;&#039;&#039;：当您在PHP屏幕页面中使用的 javascript 函数不是Dolibarr的标准js函数（在lib_head.js中）。&lt;br /&gt;
&lt;br /&gt;
如果在PHP屏幕页面上使用 javascript 函数，则必须将在 javascript 文件 &#039;&#039;&#039;htdocs/mymodule/js/mymodule.js&#039;&#039;&#039; 中声明的函数加载到HTML头中。&lt;br /&gt;
&lt;br /&gt;
若要求Dolibarr（负责生成 header 部分）包含一个 javascript 文件，必须在页面开头调用的llxHeader()函数的参数中提供包含要包含的JS URL的参数。&lt;br /&gt;
&lt;br /&gt;
页面 /htdocs/mymodule/mypage.php 的示例：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$morejs=array(&amp;quot;/mymodule/js/mymodule.js&amp;quot;);&lt;br /&gt;
llxHeader(&#039;&#039;,&#039;Titre&#039;,&#039;&#039;,&#039;&#039;,&#039;&#039;,&#039;&#039;,$morejs,&#039;&#039;,0,0); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==在Dolibarr事件上触发代码 (可选)==&lt;br /&gt;
&#039;&#039;&#039;何时&#039;&#039;&#039;：希望在Dolibarr标准操作后触发执行特定操作时（例如：当在Dolibarr中创建发票时，我想更新模块中的表），您需要创建一个 &#039;&#039;&#039;triggers&#039;&#039;&#039; 文件。&lt;br /&gt;
&lt;br /&gt;
另请参阅 [[Interfaces_Dolibarr_toward_foreign_systems|Dolibarr到外部系统的接口]] 和 [[Interfaces_from_foreign_systems_toward_Dolibarr|外部系统到Dolibarr的接口]]&lt;br /&gt;
&lt;br /&gt;
==在Dolibarr的hooks处插入代码 (可选)==&lt;br /&gt;
&#039;&#039;&#039;何时&#039;&#039;&#039;：当您想更改或添加业务事件以外的代码时（请参阅上一章）。&lt;br /&gt;
&lt;br /&gt;
请参阅页面 [[Hooks_system|Hooks系统]].&lt;br /&gt;
==添加编号模块（可选）==&lt;br /&gt;
&#039;&#039;&#039;何时&#039;&#039;&#039;：当您想添加默认模块未涵盖的编号规则时。&lt;br /&gt;
&lt;br /&gt;
请参阅页面 [[Create numbering module|创建编号模块]] 。&lt;br /&gt;
&lt;br /&gt;
==添加新文档模板 (可选)==&lt;br /&gt;
&#039;&#039;&#039;何时&#039;&#039;&#039;：需要添加新文档模板时。如想要个性化自己生成的 PDF 或 ODT 文档。&lt;br /&gt;
&lt;br /&gt;
注意：要添加此功能，您无需创建模块描述符文件。&lt;br /&gt;
&lt;br /&gt;
有关如何从模板生成文档的详情，请参阅页面 [[Create_a_PDF_document_template|创建PDF文档模板]] 或 [[Create_an_ODT_document_template|创建ODT文档模板]] 。&lt;br /&gt;
&lt;br /&gt;
==添加主题 (可选)==&lt;br /&gt;
&#039;&#039;&#039;何时&#039;&#039;&#039;：当您想要根据您的情况定制界面（颜色/字体/图形）时。&lt;br /&gt;
&lt;br /&gt;
注意：要添加此功能，您无需创建模块描述符。&lt;br /&gt;
&lt;br /&gt;
请参阅页面 [[Skins|主题]] 。&lt;br /&gt;
&lt;br /&gt;
==修改开发模块作者名==&lt;br /&gt;
&lt;br /&gt;
在myModule.class.php中查找editor_name&lt;br /&gt;
&lt;br /&gt;
修改以下变量的值以修改作者名称&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;editor_name = &#039;Roger@QQ:12464313&#039;;&lt;br /&gt;
$this-&amp;gt;editor_url = &#039;https://www.ivnun.cn&#039;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=面向开发人员的一些编码规则和函数=&lt;br /&gt;
要遵循的编码规则请参阅 [[语言和开发规则|开发语言和编码规范（PHP, SQL, HTML）]] 。&lt;br /&gt;
&lt;br /&gt;
要调用 Dolibarr 供开发人员使用的预定义函数，请参阅  [[开发文档]]  的“内部函数”一节。&lt;br /&gt;
&lt;br /&gt;
=创建一个安装包来分发和安装您的模块=&lt;br /&gt;
必须使用此步骤来制作安装包，以便将其提交到市场 http://www.dolistore.com。&lt;br /&gt;
&lt;br /&gt;
但您也可以使用它通过自己的分发网络轻松分发模块。&lt;br /&gt;
&lt;br /&gt;
*进入 &#039;&#039;&#039;/build&#039;&#039;&#039; 目录并将文件 &#039;&#039;&#039;makepack-dolibarrmodules.conf&#039;&#039;&#039; 复制到 &#039;&#039;&#039;makepack-mymodule.conf&#039;&#039;&#039;。请注意，稳定版本包中可能不提供此目录。如果是这种情况，可以在 Dolibarr 网站的“开发版本”部分供下载的快照中检索（在这种情况下，请获取整个 build 目录，这是一个独立于版本的目录）。&lt;br /&gt;
&lt;br /&gt;
在此文件中输入为模块创建的新文件的名称清单（模块描述符、新表的SQL文件、PHP页面、图像等）。&lt;br /&gt;
&lt;br /&gt;
*通过 Perl 运行脚本（需要Perl 5.0或更高版本）：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
perl makepack-dolibarrmodule.pl&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
该脚本将询问模块的名称、主要版本和次要版本。然后将生成一个 &#039;&#039;&#039;mymodule.zip &#039;&#039;&#039;文件，其中包含准备部署的模块。&lt;br /&gt;
&lt;br /&gt;
*接收您的模块的人员必须将该文件放在其 Dolibarr 的安装根目录中，并执行以下命令：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tar -xvf mymodule.zip&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*如果您希望您的模块惠及所有人，您可以在插件市场 {{LinkToPluginDownload}} 上提交它（zip文件）（您必须先创建一个帐户并登录，以使用“提交模块/产品”链接）。&lt;br /&gt;
**如果您的模块制作正确，文件将很快通过验证。&lt;br /&gt;
**如果质量足够好、许可证允许、并且模块的功能被证明是普遍感兴趣的，则可以将代码添加到 Dolibarr 的源代码中（除非您不希望这样做）。&lt;br /&gt;
&lt;br /&gt;
=Dolistore上外部模块的归档和验证=&lt;br /&gt;
&lt;br /&gt;
请参阅 [[Module_Dolistore_Validation_Rules|验证规则]]&lt;/div&gt;</summary>
		<author><name>ShengGang</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=List_of_modules_id&amp;diff=58650</id>
		<title>List of modules id</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=List_of_modules_id&amp;diff=58650"/>
		<updated>2023-11-06T06:36:17Z</updated>

		<summary type="html">&lt;p&gt;ShengGang: /* ID &amp;gt; 500000 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TemplateDocDevEn}}&lt;br /&gt;
{{TemplateDocDevEs}}&lt;br /&gt;
{{TemplateDocDevFr}}&lt;br /&gt;
{{TemplateDocDevZh}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Flag en}}&lt;br /&gt;
This page list all reserved modules numbers / ID. If you build or want to build your own modules (like thi , you should take an ID range here. Please pick range into existing holes first.&lt;br /&gt;
&lt;br /&gt;
{{Flag fr}}&lt;br /&gt;
Cette page recense tous les numéros / ID réservés de modules. Si vous avez réalisé ou voulez réaliser vos propres modules (comme les [[:Category:Modules complémentaires|modules complémentaires suivant]]), vous devriez prendre une plage d&#039;ID ici. Merci de prendre dans les trous existant en priorité !&lt;br /&gt;
&lt;br /&gt;
{{Flag sp}}&lt;br /&gt;
Esta página contiene un listado de todos los id reservados para los módulos. Si ha creado o quiere realizar sus propios módulos, (como estos [[:Category:Módulos_complementarios|módulos complementarios]]), deberá reservarse un rango de ID aquí.&lt;br /&gt;
&lt;br /&gt;
{{Flag zh}}&lt;br /&gt;
此页面列出了所有保留的模块ID/编号。如果您正在构建或想要构建自己的模块（如 [[:Category:Complementary_modules|扩展模块]]），您应该在此处声明一个ID范围。感谢您优先考虑现有空当！&lt;br /&gt;
&lt;br /&gt;
=ID 0 - 99999=&lt;br /&gt;
{{Flag en}}&lt;br /&gt;
Reserved for Dolibarr&#039;s internal modules.&lt;br /&gt;
&lt;br /&gt;
{{Flag fr}}&lt;br /&gt;
Réservé aux modules internes de Dolibarr.&lt;br /&gt;
&lt;br /&gt;
{{Flag sp}}&lt;br /&gt;
Reservado a los módulos internos de Dolibarr.&lt;br /&gt;
&lt;br /&gt;
{{Flag zh}}&lt;br /&gt;
为Dolibarr的内部模块保留。&lt;br /&gt;
&lt;br /&gt;
=ID 100000 - 499999=&lt;br /&gt;
{{Flag en}} &lt;br /&gt;
&#039;&#039;&#039;Reserved area for editors in need for an ID range. You can edit this page to add your own range (take a range of 50 numbers only the first time, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Flag fr}}Zone réservée aux éditeurs qui ont besoin d&#039;une plage d&#039;ID spécifiques. Vous pouvez modifier cette page pour réserver votre plage (limitée à 50 valeurs la première fois, demandez nous pour plus)&lt;br /&gt;
&lt;br /&gt;
{{Flag sp}}&lt;br /&gt;
Área reservada para los partners que necesiten un rango de ID. Puede modificar esta página para reservar su rango (limitado a 50 valores por editor)&lt;br /&gt;
&lt;br /&gt;
{{Flag zh}}&lt;br /&gt;
为需要特定ID范围的开发者保留的区域。您可以更改此页面以预订您自己的范围（第一次限制为50个值，请向我们咨询更多信息）。&lt;br /&gt;
如果您预订超过50个ID，我们可能会在没有通知的情况下自动更改您的预订范围，您将来可能会遇到与其他模块的冲突，因此请遵守规则！ &lt;br /&gt;
&lt;br /&gt;
[[File:Warning.png]] If you reserve more than 50, we may automatically change your reservation range without information and you may experience conflicts with other modules in a future, so please follow the rules!&lt;br /&gt;
&lt;br /&gt;
*ID 100000 - 100999: OpenThink (http://www.openthink.be)&lt;br /&gt;
*ID 101000 - 101999: NLTechno (https://www.nltechno.com)&lt;br /&gt;
*ID 102000 - 102999: Tiaris (http://www.tiaris.fr)&lt;br /&gt;
*ID 103000 - 103999: Open-concept.pro (http://www.open-concept.pro)&lt;br /&gt;
*ID 104000 - 104999: ATM Consulting (http://www.atm-consulting.fr)&lt;br /&gt;
*ID 105000 - 105999: GPC.solutions&lt;br /&gt;
*ID 106000 - 106999: PHPASSO&lt;br /&gt;
*ID 107000 - 107999: TecLib (http://www.teclib.com) / Auguria (http://www.auguria.net)&lt;br /&gt;
*ID 108000 - 108999: ETHICWEB&lt;br /&gt;
*ID 109000 - 109999: Aplose ([http://www.aplose.fr https://www.aplose.fr])&lt;br /&gt;
*ID 110000 - 110999: Librethic (https://librethic.io)&lt;br /&gt;
*ID 111000 - 111999: Asset IT (www.assetit.ch)&lt;br /&gt;
*ID 112000 - 112999: Aarboard AG (www.aarboard.ch)&lt;br /&gt;
*ID 113000 - 113999: Asilib - Alexandre Spangaro&lt;br /&gt;
*ID 114000 - 114999: Iceleaf OÜ&lt;br /&gt;
*ID 115000 - 115999: 2A2C Conseil - Cyril ZEKSER&lt;br /&gt;
*ID 116000 - 116999: Wolftec GmbH&lt;br /&gt;
*ID 117000 - 117999: Oscim (http://www.oscim.fr)&lt;br /&gt;
*ID 118000 - 118999: Oarces Web (dev.oarces.com)&lt;br /&gt;
*ID 119000 - 119999: Manuel Berrocal - Absolacom&lt;br /&gt;
*ID 120000 - 120999: Régis Houssin (http://www.inodbox.com)&lt;br /&gt;
*ID 121000 - 121999: Oscss - Shop&lt;br /&gt;
*ID 122000 - 122999: MrSof - la Nation du Web&lt;br /&gt;
*ID 123000 - 123999: Bruno Généré (webiseasy.org)&lt;br /&gt;
*ID 124000 - 124999: backbone internet service (www.backbone.co.at)&lt;br /&gt;
*ID 125000 - 125999: ProgSI (www.progsi.ma)&lt;br /&gt;
*ID 126000 - 126999: Catalanet&lt;br /&gt;
*ID 127000 - 127999: Virgilio Filho pt-BR Brasil (@dolibarr.br)&lt;br /&gt;
*ID 128000 - 128999: Nicolas Frappé France (www.sospc.info)&lt;br /&gt;
*ID 129000 - 129999: Adeo-Informatique&lt;br /&gt;
*ID 130000 - 130999: Technicks ICT (http://www.technicks.eu)&lt;br /&gt;
*ID 131000 - 131999: Joan Louis (itaca.fr)&lt;br /&gt;
*ID 132000 - 132999: Jean-Marie Arsac (https://azimut.fr)&lt;br /&gt;
*ID 133000 - 133999: Oriel Systems Ltd, UK. (www.orielsystems.com)&lt;br /&gt;
*ID 134000 - 134999: ALSOFT PVT. LTD. (https://www.alsoft.org)&lt;br /&gt;
*ID 135000 - 135999: Net-Logic (https://netlogic.fr)&lt;br /&gt;
*ID 136000 - 136050: MONA.RE - France&lt;br /&gt;
*ID 136051 - 136099: La Vida Marketing&lt;br /&gt;
*ID 136100 - 136149: Synergies-Tech France. (https://www.synergies-france.fr/)&lt;br /&gt;
*ID 136150 - 136199: Lyta&lt;br /&gt;
*ID 136200 - 136219: Maison Théophile Leclerc&lt;br /&gt;
*ID 136220 - 136270: SegoFount - Spain&lt;br /&gt;
*ID 136271 - 136320: Labor Dispatch (Simon Sheng , China)&lt;br /&gt;
*ID 136321 - 138999: &#039;&#039;&#039;Free (take ranges of 50 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 139000 - 139999: Synergies-Tech France. (https://www.synergies-france.fr/)&lt;br /&gt;
*ID 140000 - 140999: Altairis (http://altairis.fr)&lt;br /&gt;
*ID 141000 - 141050: Projet2Team (https://www.projet2team.fr)&lt;br /&gt;
*ID 141051 - 141099: Elistair (http://elistair.com)&lt;br /&gt;
*ID 141100 - 141149: Blue Networks Technologies (https://www.blnt.fr)&lt;br /&gt;
*ID 141150 - 141199: Mainlab S.r.l. (https://www.mainlabonline.it)&lt;br /&gt;
*ID 141150 - 141199: Florian DUFOURG - France&lt;br /&gt;
*ID 142000 - 142049: ITANéA (https://www.itanea.fr)&lt;br /&gt;
*ID 142050 - 142099: ERP Consulting NZ ([https://www.erpconsulting.co.nz www.erpconsulting.co.nz])&lt;br /&gt;
*ID 142100 - 142149: Bloxera GmbH (https://www.bloxera.com)&lt;br /&gt;
*ID 142150 - 142199: Evangelos Souglakos - Greece&lt;br /&gt;
*ID 142200 - 142249: Luc CALARESU - France&lt;br /&gt;
*ID 142250 - 142299: OmnIT Services - Belgique (https://www.omnitservices.biz)&lt;br /&gt;
*ID 142300 - 142349: Gwadeyes - Guadeloupe (https://www.gwadeyes-informatique.com/)&lt;br /&gt;
*ID 142350 - 142399: Solution Libre (https://www.solution-libre.fr/)&lt;br /&gt;
*ID 142400 - 142449: Res Digital (https://res.digital)&lt;br /&gt;
*ID 149000 - 149999: SydTech - America Central (https://www.sydtech.io/)&lt;br /&gt;
*ID 150000 - 150999: Jeffinfo&lt;br /&gt;
*ID 151000 - 151999: Konverseo (https://konverseo.com)&lt;br /&gt;
*ID 152000 - 152049: Tanguy Pénet (http://tanguype.net)&lt;br /&gt;
*ID 160000 - 160999: Charles-François BENKE (http://www.patas-monkey.com)&lt;br /&gt;
*ID 161000 - 161999: Abbes Bahfir (http://dolipar.org)&lt;br /&gt;
*ID 162000 - 162999: Jacques Rébiscoul&lt;br /&gt;
*ID 163000 - 163999: Open-DSI (https://www.open-dsi.fr)&lt;br /&gt;
*ID 164000 - 164999: Pixelada S. Coop. And. (https://pixelada.org)&lt;br /&gt;
*ID 165000 - 165049: DovConnect&lt;br /&gt;
*ID 165050 - 165099: Mind Operated Systems (https://www.mosystems.biz)&lt;br /&gt;
*ID 165100 - 165150: SD-Formation (https://sdformation.fr)&lt;br /&gt;
*ID 165151 - 165199: NUM&#039;X (https://www.numx-sets.eu)&lt;br /&gt;
*ID 165200 - 165249: Benjam Préjent (https://www.benjam-prejent.fr)&lt;br /&gt;
*ID 165250 - 165299: Dhi Loka Private Limited, India (https://www.dhiloka.com)&lt;br /&gt;
*ID 170000 - 170999: TRIDENT CONSULTING LTD (www.tridentdxb.com)&lt;br /&gt;
*ID 171000 - 171999: LVSInformatique (www.lvsinformatique.com)&lt;br /&gt;
*ID 172000 - 172299: Ray Soft-Systems (https://www.ray-soft-systems.com)&lt;br /&gt;
*ID 172300 - 172349: Günter Lukas Consulting (https://gl.co.at)&lt;br /&gt;
*ID 172350 - 172399: MB Informatique (https://www.mb-informatique.fr)&lt;br /&gt;
*ID 172400 - 172449: Professional Structures Limited (https://pstructures.com)&lt;br /&gt;
*ID 172450 - 172699: IT-BS (https://www.it-bs.fr)&lt;br /&gt;
*ID 172700 - 172749: Indelog (https://www.indelog.fr)&lt;br /&gt;
*ID 172750 - 172799: NS-INFO90 (https://www.ns-info90.fr)&lt;br /&gt;
*ID 180000 - 180999: Triangle Ingénierie&lt;br /&gt;
*ID 181000 - 181999: TI Sin Problemas (https://www.tisinproblemas.com)&lt;br /&gt;
*ID 182000 - 182049: Chipserv Pawel Wlizlo (https://www.testware.it)&lt;br /&gt;
*ID 183000 - 183999: BB2A Anthony Berton (https://www.bb2a.fr)&lt;br /&gt;
*ID 184000 - 184999: DPS PRINTING &amp;amp; DOCUMENTS SOCIEDAD ANONIMA (https://www.dps-lat.com)&lt;br /&gt;
*ID 190000 - 190999: Diciannove (http://19.coop)&lt;br /&gt;
*ID 191000 - 191999: Elonet (https://elonet.fr)&lt;br /&gt;
*ID 199000 - 199999: RFMS&lt;br /&gt;
*ID 200000 - 200999: Noxiome&lt;br /&gt;
*ID 201000 - 201999: Sasa Ostrouska (saxa)&lt;br /&gt;
*ID 202000 - 202999: Z-Application&lt;br /&gt;
*ID 203000 - 203099: Elidee - elidee.com&lt;br /&gt;
*ID 203100 - 203999: Garcia MICHEL (soamichel.fr)&lt;br /&gt;
*ID 204000 - 204999: Ari Elbaz elarifr - accedinfo.com&lt;br /&gt;
*ID 205000 - 205999: Kreiz IT&lt;br /&gt;
*ID 206000 - 206999: GBINFO (www.gbinfo.fr)&lt;br /&gt;
*ID 207000 - 207099: MacroProg (https://www.macroprog.com)&lt;br /&gt;
*ID 207100 - 207149: Reactiva Software&lt;br /&gt;
*ID 207150 - 207199: Ndejje University Water Research and Development Centre ([https://github.com/NDUWRDC/LIMS/])&lt;br /&gt;
*ID 207200 - 207299: Massaoud Bouzenad ([https://www.dzprod.net dzprod.net])&lt;br /&gt;
*ID 207300 - 207349: Ksar&lt;br /&gt;
*ID 207350 - 207399: Easylinux (www.easylinux.fr)&lt;br /&gt;
*ID 222000 - 222999:  dolibit  (https://www.dolibit.de)&lt;br /&gt;
*ID 230000 - 230049: Unareil (https://www.unareil.eu)&lt;br /&gt;
*ID 230050 - 230099: Lyra Network (https://www.lyra.com/)&lt;br /&gt;
*ID 230100 - 230149: Gheorghe Iftimi - CTW - RO&lt;br /&gt;
*ID 230150 - 230199: MEMA Machinery &amp;amp; Tools (https://www.mema.be)&lt;br /&gt;
*ID 230200 - 230249: Teleassist&lt;br /&gt;
*ID 230250 - 230299: Nh Developer&lt;br /&gt;
*ID 230300 - 230499: Chickenforce/code-chicken, IT Services Hahn (https://github.com/code-chicken [http://itservices-hahn.de/ https://itservices-hahn.de])&lt;br /&gt;
*ID 230500 - 230549: Hidup Consulting (https://consulting.hidup.io)&lt;br /&gt;
*ID 230550 - 230599 : CMR Conseil (https://www.weblockup.fr)&lt;br /&gt;
*ID 230600 - 230649 : aFreeMind Studio&lt;br /&gt;
*ID 230650 - 230699 : Unideal (https://www.uni-deal.com)&lt;br /&gt;
*ID 230700 - 230749 : DevLansdes (https://devlandes.com/)&lt;br /&gt;
*ID 262700 - 262799: Scopen (https://www.scopen.fr)&lt;br /&gt;
*ID 274250 - 274299: Nerv Project (www.nerv-project.eu)&lt;br /&gt;
*ID 274300 - 274349: Knowhere Consulting S.L. (https://www.knowhere-consulting.eu)&lt;br /&gt;
*ID 274350 - 274399: Milen karaganski (https://blacktiehost.com)&lt;br /&gt;
*ID 274400 - 274449: Vincent MAURY ([https://www.timgroup.fr www.timgroup.fr])&lt;br /&gt;
*ID 274450 - 274499: Daraelmin&lt;br /&gt;
*ID 274500 - 274550: Emilie LAFORET (http://www.ermvallon.com)&lt;br /&gt;
*ID 279000 - 279049: VSDigital Electronics (https://vsdigital.ar) - Argentina&lt;br /&gt;
*ID 280000 - 280050: Bingroup (https://www.beinng.com)&lt;br /&gt;
*ID 280051 - 280100: Medialta (https://medialta.com)&lt;br /&gt;
*ID 290000 - 290099: BNS - Project doliBRA ([https://www.beinng.com https://www.bns.net.br]) - Brasil&lt;br /&gt;
*ID 300000 - 300049: RapidProgress (https://www.rapidprogress.eu) - Bulgaria&lt;br /&gt;
*ID 300050 : 300099: M@ Solution (https://www.ma-solution.fr/)&lt;br /&gt;
*ID 300100 : 300149: LAVA RUN (https://www.lavarun.re)&lt;br /&gt;
*ID 300200 : 300249 : Computences (https://www.computences.com/)&lt;br /&gt;
*ID 300250 : 300299 : LEVEL IT (https://levelit.com.ar)&lt;br /&gt;
*ID 300300 : 300349 : Progiseize (https://progiseize.fr)&lt;br /&gt;
*ID 300350 - 300399: MB Informatique (https://www.mb-informatique.fr)&lt;br /&gt;
*ID 300400 - 300449: Anouar Touati&lt;br /&gt;
*ID 300450 - 300499: Martin Danger&lt;br /&gt;
*ID 300500 - 301499: Whale Blows&lt;br /&gt;
*ID 301500 - 301549: Tom Trust - International&lt;br /&gt;
*ID 302500 - 302549: Diamubi (https://diamubi.com)&lt;br /&gt;
*ID 302550 - 302599: Datolab (https://www.datolab.com)&lt;br /&gt;
*ID 302600 - 302649: DuMaCo (https://www.dumaco.de)&lt;br /&gt;
*ID 302650 - 302699: Resilio SA&lt;br /&gt;
*ID 302700 - 302749: Aroga&lt;br /&gt;
*ID 302750 - 302799: Productivix (https://www.productivix.com)&lt;br /&gt;
*ID 302800 - 302849: Slibzz&lt;br /&gt;
*ID 302850 - 302899: idea design (https://ideadesign.dz)&lt;br /&gt;
*ID 302900 - 302949: AL MISBAH INFORMATIQUE (https://www.almisbah.ma)&lt;br /&gt;
*ID 302950 - 302999: Atis Solutions - France&lt;br /&gt;
*ID 303000 - 303499: Obixav - Nigeria&lt;br /&gt;
*ID 303500 - 303550: buschler plus GmbH, Germany (https://buschler.plus)&lt;br /&gt;
*ID 303551 - 303599: Prestalidaire - France (https://prestalidaire.com)&lt;br /&gt;
*ID 314000 - 314049: Ruemmler IT Solutions (https://www.ruemmler.net)&lt;br /&gt;
*ID 320000 - 320999: Novus Studios (www.novusstudios.it)&lt;br /&gt;
*ID 321000 - 321999: AtooNet (http://www.atoo-net.com)&lt;br /&gt;
*ID 332000 - 332099: Gecka (https://gecka.nc)&lt;br /&gt;
*ID 332100 - 332149: Agence Milkshake (http://agencemilkshake.com)&lt;br /&gt;
*ID 332150 - 332199: Daniel Prowald IT – Service (https://prowald-it.de)&lt;br /&gt;
*ID 332200 - 332249: UNITICE (https://unitice.com)&lt;br /&gt;
*ID 332250 - 332299: Sidonie Moulart&lt;br /&gt;
*ID 332300 - 332349: LTDJ (Antonin MARCHAL - Le Temple du Jeu)&lt;br /&gt;
*ID 330000 - 330049: XTEC Industries (www.xtec-ind.com)&lt;br /&gt;
*ID 330050 - 330099: 10100 S.R.L. - (www.10100.to)&lt;br /&gt;
*ID 330100 - 330149: AES Dana SRL (https://aes-dana.be)&lt;br /&gt;
*ID 330150 - 330199: Freshcore (https://www.freshcore.fr)&lt;br /&gt;
*ID 330200 - 399999: (take ranges of 50 only please, ask us for more)&lt;br /&gt;
*ID 333300 - 333349: Sense Africa (http://sense.africa)&lt;br /&gt;
*ID 350000 - 350049: SOUNDOU &amp;amp; MIDAS (https://www.soundou.org/)&lt;br /&gt;
*ID 400000 - 400999: 2byte.es (http://www.2byte.es)&lt;br /&gt;
*ID 401000 - 401999: B&amp;amp;D Informática&lt;br /&gt;
*ID 402000 - 402999: Marcos García de La Fuente (marcosgdf)&lt;br /&gt;
*ID 403000 - 403999: Sergibyte&lt;br /&gt;
*ID 404000 - 404999: Aikhan&lt;br /&gt;
*ID 405000 - 405999: AIME (http://www.aime.mx)&lt;br /&gt;
*ID 406000 - 406999: Som Núvol (https://somnuvol.coop)&lt;br /&gt;
*ID 409000 - 409999: LliureTIC (https://www.lliuretic.cat)&lt;br /&gt;
*ID 410000 - 410999: DoliGov&lt;br /&gt;
*ID 420000 - 420099: BBS Concept&lt;br /&gt;
*ID 420100 - 420199: LeMousticProduction (www.lemousticproduction.info) -&amp;lt; module DoliRH&lt;br /&gt;
*ID 420200 - 421199: VatCheck (www.abnc.be)&lt;br /&gt;
*ID 422200 - 422999: Artaban (http://artaban.fr)&lt;br /&gt;
*ID 423000 - 423050: cyberesprit&lt;br /&gt;
*ID 423051 - 423099: R.Bossard&lt;br /&gt;
*ID 423100 - 423199: Joliciel (www.joliciel.fr)&lt;br /&gt;
*ID 424000 - 424049: A3sys - Mon-Dolibarr (http://www.mon-dolibarr.fr) by Philazerty&lt;br /&gt;
*ID 424050 - 424099: Pragma-tech (www.pragma-tech.fr)&lt;br /&gt;
*ID 424100 - 424149: Ohoo Solutions (http://www.ohoosolutions.com)&lt;br /&gt;
*ID 424150 - 424199: DAGARCAM Informática (https://www.dagarcam.com/)&lt;br /&gt;
*ID 424200 - 424999: Lab51 (https://github.com/lab51org)&lt;br /&gt;
*ID 425000 - 425999: Sébastien SERRE Thivinfo (www.thivinfo.com)&lt;br /&gt;
*ID 426000 - 426099: Arkesis-Solution&lt;br /&gt;
*ID 426100 - 426149: GetLandy (www.getlandy.com)&lt;br /&gt;
*ID 426150 - 426649: OOB Software&lt;br /&gt;
*ID 426650 - 426849: Soft-Task Serviços e Sistemas (www.soft-task.com.br)&lt;br /&gt;
*ID 426850 - 427000: Bruno Caldas (https://github.com/BCaldas)&lt;br /&gt;
*ID 427001 - 427999: Kevin GUERRIER (alias xcl.saian)&lt;br /&gt;
*ID 428000 - 428099: af83&lt;br /&gt;
*ID 428100 - 428199: Arnaud Serrut - Adalon&lt;br /&gt;
*ID 428200 - 428249: imschweiler consulting (http://www.imschweiler-consulting.de&#039;&#039;&#039;&amp;lt;nowiki/&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
*ID 428250 - 428299: AL1FO&lt;br /&gt;
*ID 428300 - 428349: Federico García-Patiño Barbolani (&amp;lt;federico.garcia.patino@gmail.com&amp;gt;)&lt;br /&gt;
*ID 428350 - 428399: INTM Groupe - France (www.intm.com)&lt;br /&gt;
*ID 428400 - 428449: Nick Fragoulis - Greece&lt;br /&gt;
*ID 428450 - 428499: Letusgeek - France&lt;br /&gt;
*id 428500 - 428549 hkwhitten - USA&lt;br /&gt;
*ID 428550 - 428999 SmartOne&lt;br /&gt;
*ID 429000 - 429999: induslab&lt;br /&gt;
*ID 430000 - 430099: Mixity sprl (www.mixity.be)&lt;br /&gt;
*ID 430100 - 430199: sgiraud&lt;br /&gt;
*ID 430200 - 430299: Merlion TI (www.merlion-si.com.br)&lt;br /&gt;
*ID 430300 - 431299: Libre Expert (www.libre-expert.com)&lt;br /&gt;
*ID 431300 - 431399: ptibogxiv (www.ptibogxiv.net)&lt;br /&gt;
*ID 431400 - 431499: Befox (www.befox.fr)&lt;br /&gt;
*ID 431500 - 431599: rue Béjo (www.ruebejo.fr)&lt;br /&gt;
*ID 431600 - 431699: Avizzeo (www.avizzeo.com)&lt;br /&gt;
*ID 431700 - 432199: Multisistemas (www.multisistemas.com.sv)&lt;br /&gt;
*ID 432200 - 432399: Burbuja - Chile (www.burbuja.cl)&lt;br /&gt;
*ID 432400 - 433399: INOVEA CONSEIL (https://www.inovea-conseil.com)&lt;br /&gt;
*ID 433400 - 434399: Rachid HRICH - Maroc (HricH ServiceS.)&lt;br /&gt;
*ID 434400 - 435399: Lance Bleakley - LanceIT (www.lanceit.net)&lt;br /&gt;
*ID 436000 - 436099: SOWEBIO (www.soweb.io)&lt;br /&gt;
*ID 436100 - 436199: CAP-REL (www.cap-rel.fr)&lt;br /&gt;
*ID 436200 - 436300: TDE-INFORMATIQUE (www.tde-informatique.fr)&lt;br /&gt;
*ID 436301 - 436349: Evarisk ([https://www.evarisk.com/id-module-dolibarr/ www.evarisk.com])&lt;br /&gt;
*ID 436350 - 436399: Eoxia ([https://www.eoxia.com/dolibarr/modules/ www.eoxia.com])&lt;br /&gt;
*ID 436400 - 437399: Mohamed AHERDANE - Morocco - IT Consultant ( www.wave.ma )&lt;br /&gt;
*ID 437400 - 437449: Martin Neubauer - Germany&lt;br /&gt;
*ID 437450 - 437599: Club1click (www.club1click.es)&lt;br /&gt;
*ID 437600 - 437629: Coulon Vincent (https://github.com/HoverEpic)&lt;br /&gt;
*ID 437630 - 437649: Aytechnet (https://www.aytechnet.fr/) - François Pons&lt;br /&gt;
*ID 437650 - 437699: LibreMaster (https://libremaster.com) - Christophe T.&lt;br /&gt;
*ID 437700 - 437749: STELLAR Broadband (https://www.stellarbb.com) - U.S.A. - Philip Laycock&lt;br /&gt;
*ID 437750 - 437799: DIGITA.LU Ajous Solutions&lt;br /&gt;
*ID 437800 - 437850: iProspective (https://iprospective.fr) - Mathieu Moulin&lt;br /&gt;
*ID 437851 - 437900: Theobald Groupe.&lt;br /&gt;
*ID 437901 - 437950: Neuronnexion (http://neuronnexion.coop)&lt;br /&gt;
*ID 437951 - 437952: jmbc - APIA-ASSO (https://www.apia-asso.fr)&lt;br /&gt;
*ID 437953 - 438002: IPCZEN SARL (https://www.ipczeninformatique.fr/)&lt;br /&gt;
*ID 438003 - 438052: FESF IT Department (https://fesf.org.pk)&lt;br /&gt;
*ID 438053 - 438399: &#039;&#039;&#039;Free (take ranges of 50 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 438400 - 439399: Tetras Libre - France - Développement logiciels libres (www.tetras-libre.fr)&lt;br /&gt;
*ID 439400 - 440399: Dolibarr-pro - France - Développement Dolibarr (www.dolibarr-pro.com)&lt;br /&gt;
*ID 440400 - 441399: Quidlab Co., Ltd - Thailand - ( www.quidlab.com )&lt;br /&gt;
*ID 441400 - 442399: Ide@log - France - (https://www.idealog-info.net) - Laurent Leblanc&lt;br /&gt;
*ID 442400 - 443399: Valerio Bianchi (www.valeriobianchi.com)&lt;br /&gt;
*ID 443400 - 444399: delassalle - France - (www.delassalle.fr) - Joseph Delassalle&lt;br /&gt;
*ID 444400 - 445399: Webartis - Maroc - (www.webartis.net) - François Dry&lt;br /&gt;
*ID 445400 - 445499: SCOP Au-delà des nuages - France&lt;br /&gt;
*ID 446000 - 446999: iouston (http://www.iouston.com) - France - Julien Marchand&lt;br /&gt;
*ID 447000 - 447999: rSanjoSEO - Rafael San José Tovar (www.rsanjoseo.com) - Spain&lt;br /&gt;
*ID 448000 - 448999: Code 42 (www.code42.fr)&lt;br /&gt;
*ID 449000 - 449999: TakePOS (www.takepos.com)&lt;br /&gt;
*ID 450000 - 450999: Pierre ARDOIN&lt;br /&gt;
*ID 451000 - 451999: Éditeur depordi.fr&lt;br /&gt;
*ID 452000 - 452999: Dylan NAKONG&lt;br /&gt;
*ID 453000 - 453999: Menahd Ouchenir - France - menahd-ouchenir.com&lt;br /&gt;
*ID 454000 - 454999: Withheld - Canada&lt;br /&gt;
*ID 455000 - 455999: Gaëtan MAISON - Info Libre @ Dom - France (https://www.infolibreadom.com)&lt;br /&gt;
*ID 456000 - 456999: Laurent LEBLEU - B.L.C. - Blue Line Company - Lille - France (www.bluelinecompany.fr/dolibarr)&lt;br /&gt;
*ID 457000 - 457999: Sébastien BOUCHER&lt;br /&gt;
*ID 458000 - 458999: Lester HERNÁNDEZ - Argentina - (freelancerlrhd@gmail.com)&lt;br /&gt;
*ID 459000 - 459999: Infopen - France&lt;br /&gt;
*ID 460000 - 460050: torvista - Spain&lt;br /&gt;
*ID 461000 - 461999: MEGALOGI - Maroc (www.erpcloud.ma)&lt;br /&gt;
*ID 462000 - 462999: Making Digital (www.making-digital.fr) - France&lt;br /&gt;
*ID 463000 - 463999: linx s.r.l.s.&lt;br /&gt;
*ID 464000 - 464999: NimbleCubed Inc. (www.nimblecubed.com)&lt;br /&gt;
*ID 465000 - 465999: Artefacts - CourantAlternatif&lt;br /&gt;
*ID 466000 - 466999: CDM Consultores - (www.cdm.guru)&lt;br /&gt;
*ID 467000 - 467999: M71 Service GmbH - (www.m71-service.de)&lt;br /&gt;
*ID 468000 - 468049: Clément Segonzac - France (clement.segonzac@gmail.com)&lt;br /&gt;
*ID 468050 - 468099: Flavien Belli - France (https://github.com/Marshlyin || belliflaviencontactpro@gmail.com)&lt;br /&gt;
*ID 468100 - 468119: Chl (https://code.bugness.org/Dolibarr)&lt;br /&gt;
*ID 468120 - 468170: Commotron GmbH (https://www.commotron.com/)&lt;br /&gt;
*ID 468171 - 468220: Infans Group (franck.lauby@infans.fr)&lt;br /&gt;
*ID 468221 - 468174 &#039;&#039;&#039;Free (take ranges of 50 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 468175 - 468199: Gaëlle Rauffet - France (kiwiscan.net)&lt;br /&gt;
*ID 468200 - 468250: Paulo Oliveira - Brasil (paulorcdo@gmail.com)&lt;br /&gt;
*ID 468251 - 468270:  CD-Systems - France (https://www.cd-systems.fr)&lt;br /&gt;
*ID 468300 - 468349: Uvensys - Germany (https://uvensys.de)&lt;br /&gt;
*ID 468350 - 468399 : Laudeco - Belgium (http://github.com/laudeco)&lt;br /&gt;
*ID 468400 - 468449 : Alexis LAURIER - France (https://www.alexislaurier.fr)&lt;br /&gt;
*ID 468450 - 468499 : Mehdi Belkhayat - Maroc (https://opensi.ma)&lt;br /&gt;
*ID 468500 - 468599 : InvIT GmbH - Germany (https://invit.sh)&lt;br /&gt;
*ID 468600 - 468649 : Ricardo Sequeira - Portugal (https://ricardo-sequeira.com)&lt;br /&gt;
*ID 468650 - 468699 : J-IT - Belgique (https://www.j-it.be)&lt;br /&gt;
*ID 468700 - 468749 : Fidesio - France (https://www.fidesio.com/)&lt;br /&gt;
*ID 468750 - 468799 : Sgestion - Spain (http://www.sgestion.net/)&lt;br /&gt;
*ID 468800 - 468849 : Denis JULIEN - Brasil (matrinxa@free.fr)&lt;br /&gt;
*ID 468850 - 468900: Mmariko - Module GED - Effios&lt;br /&gt;
*ID 468901 - 468950: Maazou Amadou Abdoul aziz - Maroc (yaronfada@gmail.com)&lt;br /&gt;
*ID 468951 - 469000: Alexis LAURIER - France (https://www.alexislaurier.fr)&lt;br /&gt;
*ID 469001 - 469050: John Livingston (https://github.com/JohnXLivingston/)&lt;br /&gt;
*ID 469051 - 469100: Macrorom ICT-services (https://macrorom.nl/)&lt;br /&gt;
*ID 469101 - 469150: HABOT IT - France (https://habot.it)&lt;br /&gt;
*ID 469151 - 469160: CaribbeanConsult.Com CCC - France Guadeloupe (https://dolibarr.ccc.gp)&lt;br /&gt;
*ID 469161 - 469171: GMBG - Portugal&lt;br /&gt;
*ID 469172 - 469192: BGi Lda - Portugal&lt;br /&gt;
*ID 469949 - 469999: Goldoweb (http://goldoweb.com)&lt;br /&gt;
*ID 470000 - 470999: Reindeer Digital (https://rdeer.cz)&lt;br /&gt;
*ID 471000 - 471099: CAP-REL (www.cap-rel.fr)&lt;br /&gt;
*ID 471100 - 471199: M. Morillon&lt;br /&gt;
*ID 471200 - 471209: Pablo Nuñez&lt;br /&gt;
*ID 481000 - 482000: Alhaidab-ITIS (https://alhaidab.dolibarr.sd)&lt;br /&gt;
*ID 482001 - 483000: Basix IT (https://www.basix.de)&lt;br /&gt;
*ID 483001 - 483050: SASCO SpA (https://www.sasco.cl)&lt;br /&gt;
*ID 483051 - 483100: WIP Engineering (https://www.wip-gmbh.com)&lt;br /&gt;
*ID 483101 - 483150: J.Kaiser&lt;br /&gt;
*ID 483151 - 483201: CodLines (https://www.codlines.com)&lt;br /&gt;
*ID 485000 - 485049: Gest Info Service Plus (contact@gest-plus.fr)&lt;br /&gt;
*ID 490000 - 490050: VOLD (https://vold.lu)&lt;br /&gt;
*ID 491000 - 491050: NORD ERP CRM (https://www.nord-erp-crm.fr/)&lt;br /&gt;
*ID 491051 - 491100: KJR-online (https://kjr-online.fr/)&lt;br /&gt;
*ID 491101 - 491149: eNova&lt;br /&gt;
*ID 491150 - 491200: App 4 Business&lt;br /&gt;
*ID 491201 - 491250: Mil24 (http://www.mil24.com.py)&lt;br /&gt;
*ID 491251 - 491301: M2AM&lt;br /&gt;
&lt;br /&gt;
DO NOT ADD RECORD HERE, PLEASE FILL HOLES FIRST !!!!&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
=ID &amp;gt; 500000=&lt;br /&gt;
&lt;br /&gt;
This range can&#039;t be reserved. It is a common range. If you don&#039;t plan to distribute your module, you can use an ID in this range with no need to reserve it.&lt;br /&gt;
&lt;br /&gt;
{{Flag en}}&lt;br /&gt;
If you don&#039;t already have reserved ids and need some, please don&#039;t use hazardous number and use a number higher than 500000, but it is better to ask a wiki account, and reserve your own range by editing the  100000 - 499999 range (50 ids at once, 1000 ids maximum per partner).&lt;br /&gt;
&lt;br /&gt;
{{Flag fr}}&lt;br /&gt;
Si vous n&#039;avez pas de numéros réservés et en avez besoin, n&#039;utilisez pas de chiffres au hasard et utilisez une valeur supérieure à 500000, toutefois, il est préférable d&#039;obtenir un compte wiki, et  réserver vous-même votre plage en ajoutant votre entrée dans la zone 100000 - 499999 (par lot de 50 d&#039;abord, pas plus de 1000 numéros par partenaire).&lt;br /&gt;
&lt;br /&gt;
{{Flag sp}}&lt;br /&gt;
Si no dispone de número reservado y necesita, no use cifras redondeadas y usa un valor superior a 500000. Si tiene una cuenta wiki, puede reservarse usted mismo sus id añadiendo su entrada en la zona 100000 - 499999 (no más de 1000 id por partner).&lt;br /&gt;
&lt;br /&gt;
{{Flag zh}}&lt;br /&gt;
如果您没有预留ID，并且现在需要预留，请不要使用随机数字，要使用大于500000的值。但最好是获得一个wiki帐户，并通过在字段100000-499999中添加您的条目来保留您的ID范围（第一次限制为50个ID，每个合作伙伴不超过1000个ID）。&lt;/div&gt;</summary>
		<author><name>ShengGang</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=List_of_modules_id&amp;diff=58649</id>
		<title>List of modules id</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=List_of_modules_id&amp;diff=58649"/>
		<updated>2023-11-06T06:27:49Z</updated>

		<summary type="html">&lt;p&gt;ShengGang: /* ID 100000 - 499999 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TemplateDocDevEn}}&lt;br /&gt;
{{TemplateDocDevEs}}&lt;br /&gt;
{{TemplateDocDevFr}}&lt;br /&gt;
{{TemplateDocDevZh}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Flag en}}&lt;br /&gt;
This page list all reserved modules numbers / ID. If you build or want to build your own modules (like thi , you should take an ID range here. Please pick range into existing holes first.&lt;br /&gt;
&lt;br /&gt;
{{Flag fr}}&lt;br /&gt;
Cette page recense tous les numéros / ID réservés de modules. Si vous avez réalisé ou voulez réaliser vos propres modules (comme les [[:Category:Modules complémentaires|modules complémentaires suivant]]), vous devriez prendre une plage d&#039;ID ici. Merci de prendre dans les trous existant en priorité !&lt;br /&gt;
&lt;br /&gt;
{{Flag sp}}&lt;br /&gt;
Esta página contiene un listado de todos los id reservados para los módulos. Si ha creado o quiere realizar sus propios módulos, (como estos [[:Category:Módulos_complementarios|módulos complementarios]]), deberá reservarse un rango de ID aquí.&lt;br /&gt;
&lt;br /&gt;
{{Flag zh}}&lt;br /&gt;
此页面列出了所有保留的模块ID/编号。如果您正在构建或想要构建自己的模块（如 [[:Category:Complementary_modules|扩展模块]]），您应该在此处声明一个ID范围。感谢您优先考虑现有空当！&lt;br /&gt;
&lt;br /&gt;
=ID 0 - 99999=&lt;br /&gt;
{{Flag en}}&lt;br /&gt;
Reserved for Dolibarr&#039;s internal modules.&lt;br /&gt;
&lt;br /&gt;
{{Flag fr}}&lt;br /&gt;
Réservé aux modules internes de Dolibarr.&lt;br /&gt;
&lt;br /&gt;
{{Flag sp}}&lt;br /&gt;
Reservado a los módulos internos de Dolibarr.&lt;br /&gt;
&lt;br /&gt;
{{Flag zh}}&lt;br /&gt;
为Dolibarr的内部模块保留。&lt;br /&gt;
&lt;br /&gt;
=ID 100000 - 499999=&lt;br /&gt;
{{Flag en}} &lt;br /&gt;
&#039;&#039;&#039;Reserved area for editors in need for an ID range. You can edit this page to add your own range (take a range of 50 numbers only the first time, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Flag fr}}Zone réservée aux éditeurs qui ont besoin d&#039;une plage d&#039;ID spécifiques. Vous pouvez modifier cette page pour réserver votre plage (limitée à 50 valeurs la première fois, demandez nous pour plus)&lt;br /&gt;
&lt;br /&gt;
{{Flag sp}}&lt;br /&gt;
Área reservada para los partners que necesiten un rango de ID. Puede modificar esta página para reservar su rango (limitado a 50 valores por editor)&lt;br /&gt;
&lt;br /&gt;
{{Flag zh}}&lt;br /&gt;
为需要特定ID范围的开发者保留的区域。您可以更改此页面以预订您自己的范围（第一次限制为50个值，请向我们咨询更多信息）。&lt;br /&gt;
如果您预订超过50个ID，我们可能会在没有通知的情况下自动更改您的预订范围，您将来可能会遇到与其他模块的冲突，因此请遵守规则！ &lt;br /&gt;
&lt;br /&gt;
[[File:Warning.png]] If you reserve more than 50, we may automatically change your reservation range without information and you may experience conflicts with other modules in a future, so please follow the rules!&lt;br /&gt;
&lt;br /&gt;
*ID 100000 - 100999: OpenThink (http://www.openthink.be)&lt;br /&gt;
*ID 101000 - 101999: NLTechno (https://www.nltechno.com)&lt;br /&gt;
*ID 102000 - 102999: Tiaris (http://www.tiaris.fr)&lt;br /&gt;
*ID 103000 - 103999: Open-concept.pro (http://www.open-concept.pro)&lt;br /&gt;
*ID 104000 - 104999: ATM Consulting (http://www.atm-consulting.fr)&lt;br /&gt;
*ID 105000 - 105999: GPC.solutions&lt;br /&gt;
*ID 106000 - 106999: PHPASSO&lt;br /&gt;
*ID 107000 - 107999: TecLib (http://www.teclib.com) / Auguria (http://www.auguria.net)&lt;br /&gt;
*ID 108000 - 108999: ETHICWEB&lt;br /&gt;
*ID 109000 - 109999: Aplose ([http://www.aplose.fr https://www.aplose.fr])&lt;br /&gt;
*ID 110000 - 110999: Librethic (https://librethic.io)&lt;br /&gt;
*ID 111000 - 111999: Asset IT (www.assetit.ch)&lt;br /&gt;
*ID 112000 - 112999: Aarboard AG (www.aarboard.ch)&lt;br /&gt;
*ID 113000 - 113999: Asilib - Alexandre Spangaro&lt;br /&gt;
*ID 114000 - 114999: Iceleaf OÜ&lt;br /&gt;
*ID 115000 - 115999: 2A2C Conseil - Cyril ZEKSER&lt;br /&gt;
*ID 116000 - 116999: Wolftec GmbH&lt;br /&gt;
*ID 117000 - 117999: Oscim (http://www.oscim.fr)&lt;br /&gt;
*ID 118000 - 118999: Oarces Web (dev.oarces.com)&lt;br /&gt;
*ID 119000 - 119999: Manuel Berrocal - Absolacom&lt;br /&gt;
*ID 120000 - 120999: Régis Houssin (http://www.inodbox.com)&lt;br /&gt;
*ID 121000 - 121999: Oscss - Shop&lt;br /&gt;
*ID 122000 - 122999: MrSof - la Nation du Web&lt;br /&gt;
*ID 123000 - 123999: Bruno Généré (webiseasy.org)&lt;br /&gt;
*ID 124000 - 124999: backbone internet service (www.backbone.co.at)&lt;br /&gt;
*ID 125000 - 125999: ProgSI (www.progsi.ma)&lt;br /&gt;
*ID 126000 - 126999: Catalanet&lt;br /&gt;
*ID 127000 - 127999: Virgilio Filho pt-BR Brasil (@dolibarr.br)&lt;br /&gt;
*ID 128000 - 128999: Nicolas Frappé France (www.sospc.info)&lt;br /&gt;
*ID 129000 - 129999: Adeo-Informatique&lt;br /&gt;
*ID 130000 - 130999: Technicks ICT (http://www.technicks.eu)&lt;br /&gt;
*ID 131000 - 131999: Joan Louis (itaca.fr)&lt;br /&gt;
*ID 132000 - 132999: Jean-Marie Arsac (https://azimut.fr)&lt;br /&gt;
*ID 133000 - 133999: Oriel Systems Ltd, UK. (www.orielsystems.com)&lt;br /&gt;
*ID 134000 - 134999: ALSOFT PVT. LTD. (https://www.alsoft.org)&lt;br /&gt;
*ID 135000 - 135999: Net-Logic (https://netlogic.fr)&lt;br /&gt;
*ID 136000 - 136050: MONA.RE - France&lt;br /&gt;
*ID 136051 - 136099: La Vida Marketing&lt;br /&gt;
*ID 136100 - 136149: Synergies-Tech France. (https://www.synergies-france.fr/)&lt;br /&gt;
*ID 136150 - 136199: Lyta&lt;br /&gt;
*ID 136200 - 136219: Maison Théophile Leclerc&lt;br /&gt;
*ID 136220 - 136270: SegoFount - Spain&lt;br /&gt;
*ID 136271 - 136320: Labor Dispatch (Simon Sheng , China)&lt;br /&gt;
*ID 136321 - 138999: &#039;&#039;&#039;Free (take ranges of 50 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 139000 - 139999: Synergies-Tech France. (https://www.synergies-france.fr/)&lt;br /&gt;
*ID 140000 - 140999: Altairis (http://altairis.fr)&lt;br /&gt;
*ID 141000 - 141050: Projet2Team (https://www.projet2team.fr)&lt;br /&gt;
*ID 141051 - 141099: Elistair (http://elistair.com)&lt;br /&gt;
*ID 141100 - 141149: Blue Networks Technologies (https://www.blnt.fr)&lt;br /&gt;
*ID 141150 - 141199: Mainlab S.r.l. (https://www.mainlabonline.it)&lt;br /&gt;
*ID 141150 - 141199: Florian DUFOURG - France&lt;br /&gt;
*ID 142000 - 142049: ITANéA (https://www.itanea.fr)&lt;br /&gt;
*ID 142050 - 142099: ERP Consulting NZ ([https://www.erpconsulting.co.nz www.erpconsulting.co.nz])&lt;br /&gt;
*ID 142100 - 142149: Bloxera GmbH (https://www.bloxera.com)&lt;br /&gt;
*ID 142150 - 142199: Evangelos Souglakos - Greece&lt;br /&gt;
*ID 142200 - 142249: Luc CALARESU - France&lt;br /&gt;
*ID 142250 - 142299: OmnIT Services - Belgique (https://www.omnitservices.biz)&lt;br /&gt;
*ID 142300 - 142349: Gwadeyes - Guadeloupe (https://www.gwadeyes-informatique.com/)&lt;br /&gt;
*ID 142350 - 142399: Solution Libre (https://www.solution-libre.fr/)&lt;br /&gt;
*ID 142400 - 142449: Res Digital (https://res.digital)&lt;br /&gt;
*ID 149000 - 149999: SydTech - America Central (https://www.sydtech.io/)&lt;br /&gt;
*ID 150000 - 150999: Jeffinfo&lt;br /&gt;
*ID 151000 - 151999: Konverseo (https://konverseo.com)&lt;br /&gt;
*ID 152000 - 152049: Tanguy Pénet (http://tanguype.net)&lt;br /&gt;
*ID 160000 - 160999: Charles-François BENKE (http://www.patas-monkey.com)&lt;br /&gt;
*ID 161000 - 161999: Abbes Bahfir (http://dolipar.org)&lt;br /&gt;
*ID 162000 - 162999: Jacques Rébiscoul&lt;br /&gt;
*ID 163000 - 163999: Open-DSI (https://www.open-dsi.fr)&lt;br /&gt;
*ID 164000 - 164999: Pixelada S. Coop. And. (https://pixelada.org)&lt;br /&gt;
*ID 165000 - 165049: DovConnect&lt;br /&gt;
*ID 165050 - 165099: Mind Operated Systems (https://www.mosystems.biz)&lt;br /&gt;
*ID 165100 - 165150: SD-Formation (https://sdformation.fr)&lt;br /&gt;
*ID 165151 - 165199: NUM&#039;X (https://www.numx-sets.eu)&lt;br /&gt;
*ID 165200 - 165249: Benjam Préjent (https://www.benjam-prejent.fr)&lt;br /&gt;
*ID 165250 - 165299: Dhi Loka Private Limited, India (https://www.dhiloka.com)&lt;br /&gt;
*ID 170000 - 170999: TRIDENT CONSULTING LTD (www.tridentdxb.com)&lt;br /&gt;
*ID 171000 - 171999: LVSInformatique (www.lvsinformatique.com)&lt;br /&gt;
*ID 172000 - 172299: Ray Soft-Systems (https://www.ray-soft-systems.com)&lt;br /&gt;
*ID 172300 - 172349: Günter Lukas Consulting (https://gl.co.at)&lt;br /&gt;
*ID 172350 - 172399: MB Informatique (https://www.mb-informatique.fr)&lt;br /&gt;
*ID 172400 - 172449: Professional Structures Limited (https://pstructures.com)&lt;br /&gt;
*ID 172450 - 172699: IT-BS (https://www.it-bs.fr)&lt;br /&gt;
*ID 172700 - 172749: Indelog (https://www.indelog.fr)&lt;br /&gt;
*ID 172750 - 172799: NS-INFO90 (https://www.ns-info90.fr)&lt;br /&gt;
*ID 180000 - 180999: Triangle Ingénierie&lt;br /&gt;
*ID 181000 - 181999: TI Sin Problemas (https://www.tisinproblemas.com)&lt;br /&gt;
*ID 182000 - 182049: Chipserv Pawel Wlizlo (https://www.testware.it)&lt;br /&gt;
*ID 183000 - 183999: BB2A Anthony Berton (https://www.bb2a.fr)&lt;br /&gt;
*ID 184000 - 184999: DPS PRINTING &amp;amp; DOCUMENTS SOCIEDAD ANONIMA (https://www.dps-lat.com)&lt;br /&gt;
*ID 190000 - 190999: Diciannove (http://19.coop)&lt;br /&gt;
*ID 191000 - 191999: Elonet (https://elonet.fr)&lt;br /&gt;
*ID 199000 - 199999: RFMS&lt;br /&gt;
*ID 200000 - 200999: Noxiome&lt;br /&gt;
*ID 201000 - 201999: Sasa Ostrouska (saxa)&lt;br /&gt;
*ID 202000 - 202999: Z-Application&lt;br /&gt;
*ID 203000 - 203099: Elidee - elidee.com&lt;br /&gt;
*ID 203100 - 203999: Garcia MICHEL (soamichel.fr)&lt;br /&gt;
*ID 204000 - 204999: Ari Elbaz elarifr - accedinfo.com&lt;br /&gt;
*ID 205000 - 205999: Kreiz IT&lt;br /&gt;
*ID 206000 - 206999: GBINFO (www.gbinfo.fr)&lt;br /&gt;
*ID 207000 - 207099: MacroProg (https://www.macroprog.com)&lt;br /&gt;
*ID 207100 - 207149: Reactiva Software&lt;br /&gt;
*ID 207150 - 207199: Ndejje University Water Research and Development Centre ([https://github.com/NDUWRDC/LIMS/])&lt;br /&gt;
*ID 207200 - 207299: Massaoud Bouzenad ([https://www.dzprod.net dzprod.net])&lt;br /&gt;
*ID 207300 - 207349: Ksar&lt;br /&gt;
*ID 207350 - 207399: Easylinux (www.easylinux.fr)&lt;br /&gt;
*ID 222000 - 222999:  dolibit  (https://www.dolibit.de)&lt;br /&gt;
*ID 230000 - 230049: Unareil (https://www.unareil.eu)&lt;br /&gt;
*ID 230050 - 230099: Lyra Network (https://www.lyra.com/)&lt;br /&gt;
*ID 230100 - 230149: Gheorghe Iftimi - CTW - RO&lt;br /&gt;
*ID 230150 - 230199: MEMA Machinery &amp;amp; Tools (https://www.mema.be)&lt;br /&gt;
*ID 230200 - 230249: Teleassist&lt;br /&gt;
*ID 230250 - 230299: Nh Developer&lt;br /&gt;
*ID 230300 - 230499: Chickenforce/code-chicken, IT Services Hahn (https://github.com/code-chicken [http://itservices-hahn.de/ https://itservices-hahn.de])&lt;br /&gt;
*ID 230500 - 230549: Hidup Consulting (https://consulting.hidup.io)&lt;br /&gt;
*ID 230550 - 230599 : CMR Conseil (https://www.weblockup.fr)&lt;br /&gt;
*ID 230600 - 230649 : aFreeMind Studio&lt;br /&gt;
*ID 230650 - 230699 : Unideal (https://www.uni-deal.com)&lt;br /&gt;
*ID 230700 - 230749 : DevLansdes (https://devlandes.com/)&lt;br /&gt;
*ID 262700 - 262799: Scopen (https://www.scopen.fr)&lt;br /&gt;
*ID 274250 - 274299: Nerv Project (www.nerv-project.eu)&lt;br /&gt;
*ID 274300 - 274349: Knowhere Consulting S.L. (https://www.knowhere-consulting.eu)&lt;br /&gt;
*ID 274350 - 274399: Milen karaganski (https://blacktiehost.com)&lt;br /&gt;
*ID 274400 - 274449: Vincent MAURY ([https://www.timgroup.fr www.timgroup.fr])&lt;br /&gt;
*ID 274450 - 274499: Daraelmin&lt;br /&gt;
*ID 274500 - 274550: Emilie LAFORET (http://www.ermvallon.com)&lt;br /&gt;
*ID 279000 - 279049: VSDigital Electronics (https://vsdigital.ar) - Argentina&lt;br /&gt;
*ID 280000 - 280050: Bingroup (https://www.beinng.com)&lt;br /&gt;
*ID 280051 - 280100: Medialta (https://medialta.com)&lt;br /&gt;
*ID 290000 - 290099: BNS - Project doliBRA ([https://www.beinng.com https://www.bns.net.br]) - Brasil&lt;br /&gt;
*ID 300000 - 300049: RapidProgress (https://www.rapidprogress.eu) - Bulgaria&lt;br /&gt;
*ID 300050 : 300099: M@ Solution (https://www.ma-solution.fr/)&lt;br /&gt;
*ID 300100 : 300149: LAVA RUN (https://www.lavarun.re)&lt;br /&gt;
*ID 300200 : 300249 : Computences (https://www.computences.com/)&lt;br /&gt;
*ID 300250 : 300299 : LEVEL IT (https://levelit.com.ar)&lt;br /&gt;
*ID 300300 : 300349 : Progiseize (https://progiseize.fr)&lt;br /&gt;
*ID 300350 - 300399: MB Informatique (https://www.mb-informatique.fr)&lt;br /&gt;
*ID 300400 - 300449: Anouar Touati&lt;br /&gt;
*ID 300450 - 300499: Martin Danger&lt;br /&gt;
*ID 300500 - 301499: Whale Blows&lt;br /&gt;
*ID 301500 - 301549: Tom Trust - International&lt;br /&gt;
*ID 302500 - 302549: Diamubi (https://diamubi.com)&lt;br /&gt;
*ID 302550 - 302599: Datolab (https://www.datolab.com)&lt;br /&gt;
*ID 302600 - 302649: DuMaCo (https://www.dumaco.de)&lt;br /&gt;
*ID 302650 - 302699: Resilio SA&lt;br /&gt;
*ID 302700 - 302749: Aroga&lt;br /&gt;
*ID 302750 - 302799: Productivix (https://www.productivix.com)&lt;br /&gt;
*ID 302800 - 302849: Slibzz&lt;br /&gt;
*ID 302850 - 302899: idea design (https://ideadesign.dz)&lt;br /&gt;
*ID 302900 - 302949: AL MISBAH INFORMATIQUE (https://www.almisbah.ma)&lt;br /&gt;
*ID 302950 - 302999: Atis Solutions - France&lt;br /&gt;
*ID 303000 - 303499: Obixav - Nigeria&lt;br /&gt;
*ID 303500 - 303550: buschler plus GmbH, Germany (https://buschler.plus)&lt;br /&gt;
*ID 303551 - 303599: Prestalidaire - France (https://prestalidaire.com)&lt;br /&gt;
*ID 314000 - 314049: Ruemmler IT Solutions (https://www.ruemmler.net)&lt;br /&gt;
*ID 320000 - 320999: Novus Studios (www.novusstudios.it)&lt;br /&gt;
*ID 321000 - 321999: AtooNet (http://www.atoo-net.com)&lt;br /&gt;
*ID 332000 - 332099: Gecka (https://gecka.nc)&lt;br /&gt;
*ID 332100 - 332149: Agence Milkshake (http://agencemilkshake.com)&lt;br /&gt;
*ID 332150 - 332199: Daniel Prowald IT – Service (https://prowald-it.de)&lt;br /&gt;
*ID 332200 - 332249: UNITICE (https://unitice.com)&lt;br /&gt;
*ID 332250 - 332299: Sidonie Moulart&lt;br /&gt;
*ID 332300 - 332349: LTDJ (Antonin MARCHAL - Le Temple du Jeu)&lt;br /&gt;
*ID 330000 - 330049: XTEC Industries (www.xtec-ind.com)&lt;br /&gt;
*ID 330050 - 330099: 10100 S.R.L. - (www.10100.to)&lt;br /&gt;
*ID 330100 - 330149: AES Dana SRL (https://aes-dana.be)&lt;br /&gt;
*ID 330150 - 330199: Freshcore (https://www.freshcore.fr)&lt;br /&gt;
*ID 330200 - 399999: (take ranges of 50 only please, ask us for more)&lt;br /&gt;
*ID 333300 - 333349: Sense Africa (http://sense.africa)&lt;br /&gt;
*ID 350000 - 350049: SOUNDOU &amp;amp; MIDAS (https://www.soundou.org/)&lt;br /&gt;
*ID 400000 - 400999: 2byte.es (http://www.2byte.es)&lt;br /&gt;
*ID 401000 - 401999: B&amp;amp;D Informática&lt;br /&gt;
*ID 402000 - 402999: Marcos García de La Fuente (marcosgdf)&lt;br /&gt;
*ID 403000 - 403999: Sergibyte&lt;br /&gt;
*ID 404000 - 404999: Aikhan&lt;br /&gt;
*ID 405000 - 405999: AIME (http://www.aime.mx)&lt;br /&gt;
*ID 406000 - 406999: Som Núvol (https://somnuvol.coop)&lt;br /&gt;
*ID 409000 - 409999: LliureTIC (https://www.lliuretic.cat)&lt;br /&gt;
*ID 410000 - 410999: DoliGov&lt;br /&gt;
*ID 420000 - 420099: BBS Concept&lt;br /&gt;
*ID 420100 - 420199: LeMousticProduction (www.lemousticproduction.info) -&amp;lt; module DoliRH&lt;br /&gt;
*ID 420200 - 421199: VatCheck (www.abnc.be)&lt;br /&gt;
*ID 422200 - 422999: Artaban (http://artaban.fr)&lt;br /&gt;
*ID 423000 - 423050: cyberesprit&lt;br /&gt;
*ID 423051 - 423099: R.Bossard&lt;br /&gt;
*ID 423100 - 423199: Joliciel (www.joliciel.fr)&lt;br /&gt;
*ID 424000 - 424049: A3sys - Mon-Dolibarr (http://www.mon-dolibarr.fr) by Philazerty&lt;br /&gt;
*ID 424050 - 424099: Pragma-tech (www.pragma-tech.fr)&lt;br /&gt;
*ID 424100 - 424149: Ohoo Solutions (http://www.ohoosolutions.com)&lt;br /&gt;
*ID 424150 - 424199: DAGARCAM Informática (https://www.dagarcam.com/)&lt;br /&gt;
*ID 424200 - 424999: Lab51 (https://github.com/lab51org)&lt;br /&gt;
*ID 425000 - 425999: Sébastien SERRE Thivinfo (www.thivinfo.com)&lt;br /&gt;
*ID 426000 - 426099: Arkesis-Solution&lt;br /&gt;
*ID 426100 - 426149: GetLandy (www.getlandy.com)&lt;br /&gt;
*ID 426150 - 426649: OOB Software&lt;br /&gt;
*ID 426650 - 426849: Soft-Task Serviços e Sistemas (www.soft-task.com.br)&lt;br /&gt;
*ID 426850 - 427000: Bruno Caldas (https://github.com/BCaldas)&lt;br /&gt;
*ID 427001 - 427999: Kevin GUERRIER (alias xcl.saian)&lt;br /&gt;
*ID 428000 - 428099: af83&lt;br /&gt;
*ID 428100 - 428199: Arnaud Serrut - Adalon&lt;br /&gt;
*ID 428200 - 428249: imschweiler consulting (http://www.imschweiler-consulting.de&#039;&#039;&#039;&amp;lt;nowiki/&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
*ID 428250 - 428299: AL1FO&lt;br /&gt;
*ID 428300 - 428349: Federico García-Patiño Barbolani (&amp;lt;federico.garcia.patino@gmail.com&amp;gt;)&lt;br /&gt;
*ID 428350 - 428399: INTM Groupe - France (www.intm.com)&lt;br /&gt;
*ID 428400 - 428449: Nick Fragoulis - Greece&lt;br /&gt;
*ID 428450 - 428499: Letusgeek - France&lt;br /&gt;
*id 428500 - 428549 hkwhitten - USA&lt;br /&gt;
*ID 428550 - 428999 SmartOne&lt;br /&gt;
*ID 429000 - 429999: induslab&lt;br /&gt;
*ID 430000 - 430099: Mixity sprl (www.mixity.be)&lt;br /&gt;
*ID 430100 - 430199: sgiraud&lt;br /&gt;
*ID 430200 - 430299: Merlion TI (www.merlion-si.com.br)&lt;br /&gt;
*ID 430300 - 431299: Libre Expert (www.libre-expert.com)&lt;br /&gt;
*ID 431300 - 431399: ptibogxiv (www.ptibogxiv.net)&lt;br /&gt;
*ID 431400 - 431499: Befox (www.befox.fr)&lt;br /&gt;
*ID 431500 - 431599: rue Béjo (www.ruebejo.fr)&lt;br /&gt;
*ID 431600 - 431699: Avizzeo (www.avizzeo.com)&lt;br /&gt;
*ID 431700 - 432199: Multisistemas (www.multisistemas.com.sv)&lt;br /&gt;
*ID 432200 - 432399: Burbuja - Chile (www.burbuja.cl)&lt;br /&gt;
*ID 432400 - 433399: INOVEA CONSEIL (https://www.inovea-conseil.com)&lt;br /&gt;
*ID 433400 - 434399: Rachid HRICH - Maroc (HricH ServiceS.)&lt;br /&gt;
*ID 434400 - 435399: Lance Bleakley - LanceIT (www.lanceit.net)&lt;br /&gt;
*ID 436000 - 436099: SOWEBIO (www.soweb.io)&lt;br /&gt;
*ID 436100 - 436199: CAP-REL (www.cap-rel.fr)&lt;br /&gt;
*ID 436200 - 436300: TDE-INFORMATIQUE (www.tde-informatique.fr)&lt;br /&gt;
*ID 436301 - 436349: Evarisk ([https://www.evarisk.com/id-module-dolibarr/ www.evarisk.com])&lt;br /&gt;
*ID 436350 - 436399: Eoxia ([https://www.eoxia.com/dolibarr/modules/ www.eoxia.com])&lt;br /&gt;
*ID 436400 - 437399: Mohamed AHERDANE - Morocco - IT Consultant ( www.wave.ma )&lt;br /&gt;
*ID 437400 - 437449: Martin Neubauer - Germany&lt;br /&gt;
*ID 437450 - 437599: Club1click (www.club1click.es)&lt;br /&gt;
*ID 437600 - 437629: Coulon Vincent (https://github.com/HoverEpic)&lt;br /&gt;
*ID 437630 - 437649: Aytechnet (https://www.aytechnet.fr/) - François Pons&lt;br /&gt;
*ID 437650 - 437699: LibreMaster (https://libremaster.com) - Christophe T.&lt;br /&gt;
*ID 437700 - 437749: STELLAR Broadband (https://www.stellarbb.com) - U.S.A. - Philip Laycock&lt;br /&gt;
*ID 437750 - 437799: DIGITA.LU Ajous Solutions&lt;br /&gt;
*ID 437800 - 437850: iProspective (https://iprospective.fr) - Mathieu Moulin&lt;br /&gt;
*ID 437851 - 437900: Theobald Groupe.&lt;br /&gt;
*ID 437901 - 437950: Neuronnexion (http://neuronnexion.coop)&lt;br /&gt;
*ID 437951 - 437952: jmbc - APIA-ASSO (https://www.apia-asso.fr)&lt;br /&gt;
*ID 437953 - 438002: IPCZEN SARL (https://www.ipczeninformatique.fr/)&lt;br /&gt;
*ID 438003 - 438052: FESF IT Department (https://fesf.org.pk)&lt;br /&gt;
*ID 438053 - 438399: &#039;&#039;&#039;Free (take ranges of 50 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 438400 - 439399: Tetras Libre - France - Développement logiciels libres (www.tetras-libre.fr)&lt;br /&gt;
*ID 439400 - 440399: Dolibarr-pro - France - Développement Dolibarr (www.dolibarr-pro.com)&lt;br /&gt;
*ID 440400 - 441399: Quidlab Co., Ltd - Thailand - ( www.quidlab.com )&lt;br /&gt;
*ID 441400 - 442399: Ide@log - France - (https://www.idealog-info.net) - Laurent Leblanc&lt;br /&gt;
*ID 442400 - 443399: Valerio Bianchi (www.valeriobianchi.com)&lt;br /&gt;
*ID 443400 - 444399: delassalle - France - (www.delassalle.fr) - Joseph Delassalle&lt;br /&gt;
*ID 444400 - 445399: Webartis - Maroc - (www.webartis.net) - François Dry&lt;br /&gt;
*ID 445400 - 445499: SCOP Au-delà des nuages - France&lt;br /&gt;
*ID 446000 - 446999: iouston (http://www.iouston.com) - France - Julien Marchand&lt;br /&gt;
*ID 447000 - 447999: rSanjoSEO - Rafael San José Tovar (www.rsanjoseo.com) - Spain&lt;br /&gt;
*ID 448000 - 448999: Code 42 (www.code42.fr)&lt;br /&gt;
*ID 449000 - 449999: TakePOS (www.takepos.com)&lt;br /&gt;
*ID 450000 - 450999: Pierre ARDOIN&lt;br /&gt;
*ID 451000 - 451999: Éditeur depordi.fr&lt;br /&gt;
*ID 452000 - 452999: Dylan NAKONG&lt;br /&gt;
*ID 453000 - 453999: Menahd Ouchenir - France - menahd-ouchenir.com&lt;br /&gt;
*ID 454000 - 454999: Withheld - Canada&lt;br /&gt;
*ID 455000 - 455999: Gaëtan MAISON - Info Libre @ Dom - France (https://www.infolibreadom.com)&lt;br /&gt;
*ID 456000 - 456999: Laurent LEBLEU - B.L.C. - Blue Line Company - Lille - France (www.bluelinecompany.fr/dolibarr)&lt;br /&gt;
*ID 457000 - 457999: Sébastien BOUCHER&lt;br /&gt;
*ID 458000 - 458999: Lester HERNÁNDEZ - Argentina - (freelancerlrhd@gmail.com)&lt;br /&gt;
*ID 459000 - 459999: Infopen - France&lt;br /&gt;
*ID 460000 - 460050: torvista - Spain&lt;br /&gt;
*ID 461000 - 461999: MEGALOGI - Maroc (www.erpcloud.ma)&lt;br /&gt;
*ID 462000 - 462999: Making Digital (www.making-digital.fr) - France&lt;br /&gt;
*ID 463000 - 463999: linx s.r.l.s.&lt;br /&gt;
*ID 464000 - 464999: NimbleCubed Inc. (www.nimblecubed.com)&lt;br /&gt;
*ID 465000 - 465999: Artefacts - CourantAlternatif&lt;br /&gt;
*ID 466000 - 466999: CDM Consultores - (www.cdm.guru)&lt;br /&gt;
*ID 467000 - 467999: M71 Service GmbH - (www.m71-service.de)&lt;br /&gt;
*ID 468000 - 468049: Clément Segonzac - France (clement.segonzac@gmail.com)&lt;br /&gt;
*ID 468050 - 468099: Flavien Belli - France (https://github.com/Marshlyin || belliflaviencontactpro@gmail.com)&lt;br /&gt;
*ID 468100 - 468119: Chl (https://code.bugness.org/Dolibarr)&lt;br /&gt;
*ID 468120 - 468170: Commotron GmbH (https://www.commotron.com/)&lt;br /&gt;
*ID 468171 - 468220: Infans Group (franck.lauby@infans.fr)&lt;br /&gt;
*ID 468221 - 468174 &#039;&#039;&#039;Free (take ranges of 50 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 468175 - 468199: Gaëlle Rauffet - France (kiwiscan.net)&lt;br /&gt;
*ID 468200 - 468250: Paulo Oliveira - Brasil (paulorcdo@gmail.com)&lt;br /&gt;
*ID 468251 - 468270:  CD-Systems - France (https://www.cd-systems.fr)&lt;br /&gt;
*ID 468300 - 468349: Uvensys - Germany (https://uvensys.de)&lt;br /&gt;
*ID 468350 - 468399 : Laudeco - Belgium (http://github.com/laudeco)&lt;br /&gt;
*ID 468400 - 468449 : Alexis LAURIER - France (https://www.alexislaurier.fr)&lt;br /&gt;
*ID 468450 - 468499 : Mehdi Belkhayat - Maroc (https://opensi.ma)&lt;br /&gt;
*ID 468500 - 468599 : InvIT GmbH - Germany (https://invit.sh)&lt;br /&gt;
*ID 468600 - 468649 : Ricardo Sequeira - Portugal (https://ricardo-sequeira.com)&lt;br /&gt;
*ID 468650 - 468699 : J-IT - Belgique (https://www.j-it.be)&lt;br /&gt;
*ID 468700 - 468749 : Fidesio - France (https://www.fidesio.com/)&lt;br /&gt;
*ID 468750 - 468799 : Sgestion - Spain (http://www.sgestion.net/)&lt;br /&gt;
*ID 468800 - 468849 : Denis JULIEN - Brasil (matrinxa@free.fr)&lt;br /&gt;
*ID 468850 - 468900: Mmariko - Module GED - Effios&lt;br /&gt;
*ID 468901 - 468950: Maazou Amadou Abdoul aziz - Maroc (yaronfada@gmail.com)&lt;br /&gt;
*ID 468951 - 469000: Alexis LAURIER - France (https://www.alexislaurier.fr)&lt;br /&gt;
*ID 469001 - 469050: John Livingston (https://github.com/JohnXLivingston/)&lt;br /&gt;
*ID 469051 - 469100: Macrorom ICT-services (https://macrorom.nl/)&lt;br /&gt;
*ID 469101 - 469150: HABOT IT - France (https://habot.it)&lt;br /&gt;
*ID 469151 - 469160: CaribbeanConsult.Com CCC - France Guadeloupe (https://dolibarr.ccc.gp)&lt;br /&gt;
*ID 469161 - 469171: GMBG - Portugal&lt;br /&gt;
*ID 469172 - 469192: BGi Lda - Portugal&lt;br /&gt;
*ID 469949 - 469999: Goldoweb (http://goldoweb.com)&lt;br /&gt;
*ID 470000 - 470999: Reindeer Digital (https://rdeer.cz)&lt;br /&gt;
*ID 471000 - 471099: CAP-REL (www.cap-rel.fr)&lt;br /&gt;
*ID 471100 - 471199: M. Morillon&lt;br /&gt;
*ID 471200 - 471209: Pablo Nuñez&lt;br /&gt;
*ID 481000 - 482000: Alhaidab-ITIS (https://alhaidab.dolibarr.sd)&lt;br /&gt;
*ID 482001 - 483000: Basix IT (https://www.basix.de)&lt;br /&gt;
*ID 483001 - 483050: SASCO SpA (https://www.sasco.cl)&lt;br /&gt;
*ID 483051 - 483100: WIP Engineering (https://www.wip-gmbh.com)&lt;br /&gt;
*ID 483101 - 483150: J.Kaiser&lt;br /&gt;
*ID 483151 - 483201: CodLines (https://www.codlines.com)&lt;br /&gt;
*ID 485000 - 485049: Gest Info Service Plus (contact@gest-plus.fr)&lt;br /&gt;
*ID 490000 - 490050: VOLD (https://vold.lu)&lt;br /&gt;
*ID 491000 - 491050: NORD ERP CRM (https://www.nord-erp-crm.fr/)&lt;br /&gt;
*ID 491051 - 491100: KJR-online (https://kjr-online.fr/)&lt;br /&gt;
*ID 491101 - 491149: eNova&lt;br /&gt;
*ID 491150 - 491200: App 4 Business&lt;br /&gt;
*ID 491201 - 491250: Mil24 (http://www.mil24.com.py)&lt;br /&gt;
*ID 491251 - 491301: M2AM&lt;br /&gt;
&lt;br /&gt;
DO NOT ADD RECORD HERE, PLEASE FILL HOLES FIRST !!!!&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
=ID &amp;gt; 500000=&lt;br /&gt;
&lt;br /&gt;
This range can&#039;t be reserved. It is a common range. If you don&#039;t plan to distribute your module, you can use an ID in this range with no need to reserve it.&lt;br /&gt;
&lt;br /&gt;
{{Flag en}}&lt;br /&gt;
If you don&#039;t already have reserved ids and need some, please don&#039;t use hazardous number and use a number higher than 500000, but it is better to ask a wiki account, and reserve your own range by editing the  100000 - 499999 range (50 ids at once, 1000 ids maximum per partner).&lt;br /&gt;
&lt;br /&gt;
{{Flag fr}}&lt;br /&gt;
Si vous n&#039;avez pas de numéros réservés et en avez besoin, n&#039;utilisez pas de chiffres au hasard et utilisez une valeur supérieure à 500000, toutefois, il est préférable d&#039;obtenir un compte wiki, et  réserver vous-même votre plage en ajoutant votre entrée dans la zone 100000 - 499999 (par lot de 50 d&#039;abord, pas plus de 1000 numéros par partenaire).&lt;br /&gt;
&lt;br /&gt;
{{Flag sp}}&lt;br /&gt;
Si no dispone de número reservado y necesita, no use cifras redondeadas y usa un valor superior a 500000. Si tiene una cuenta wiki, puede reservarse usted mismo sus id añadiendo su entrada en la zona 100000 - 499999 (no más de 1000 id por partner).&lt;/div&gt;</summary>
		<author><name>ShengGang</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=List_of_modules_id&amp;diff=58648</id>
		<title>List of modules id</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=List_of_modules_id&amp;diff=58648"/>
		<updated>2023-11-06T06:04:00Z</updated>

		<summary type="html">&lt;p&gt;ShengGang: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TemplateDocDevEn}}&lt;br /&gt;
{{TemplateDocDevEs}}&lt;br /&gt;
{{TemplateDocDevFr}}&lt;br /&gt;
{{TemplateDocDevZh}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Flag en}}&lt;br /&gt;
This page list all reserved modules numbers / ID. If you build or want to build your own modules (like thi , you should take an ID range here. Please pick range into existing holes first.&lt;br /&gt;
&lt;br /&gt;
{{Flag fr}}&lt;br /&gt;
Cette page recense tous les numéros / ID réservés de modules. Si vous avez réalisé ou voulez réaliser vos propres modules (comme les [[:Category:Modules complémentaires|modules complémentaires suivant]]), vous devriez prendre une plage d&#039;ID ici. Merci de prendre dans les trous existant en priorité !&lt;br /&gt;
&lt;br /&gt;
{{Flag sp}}&lt;br /&gt;
Esta página contiene un listado de todos los id reservados para los módulos. Si ha creado o quiere realizar sus propios módulos, (como estos [[:Category:Módulos_complementarios|módulos complementarios]]), deberá reservarse un rango de ID aquí.&lt;br /&gt;
&lt;br /&gt;
{{Flag zh}}&lt;br /&gt;
此页面列出了所有保留的模块ID/编号。如果您正在构建或想要构建自己的模块（如 [[:Category:Complementary_modules|扩展模块]]），您应该在此处声明一个ID范围。感谢您优先考虑现有空当！&lt;br /&gt;
&lt;br /&gt;
=ID 0 - 99999=&lt;br /&gt;
{{Flag en}}&lt;br /&gt;
Reserved for Dolibarr&#039;s internal modules.&lt;br /&gt;
&lt;br /&gt;
{{Flag fr}}&lt;br /&gt;
Réservé aux modules internes de Dolibarr.&lt;br /&gt;
&lt;br /&gt;
{{Flag sp}}&lt;br /&gt;
Reservado a los módulos internos de Dolibarr.&lt;br /&gt;
&lt;br /&gt;
{{Flag zh}}&lt;br /&gt;
为Dolibarr的内部模块保留。&lt;br /&gt;
&lt;br /&gt;
=ID 100000 - 499999=&lt;br /&gt;
{{Flag en}} &lt;br /&gt;
&#039;&#039;&#039;Reserved area for editors in need for an ID range. You can edit this page to add your own range (take a range of 50 numbers only the first time, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Flag fr}}Zone réservée aux éditeurs qui ont besoin d&#039;une plage d&#039;ID spécifiques. Vous pouvez modifier cette page pour réserver votre plage (limitée à 50 valeurs la première fois, demandez nous pour plus)&lt;br /&gt;
&lt;br /&gt;
{{Flag sp}}&lt;br /&gt;
Área reservada para los partners que necesiten un rango de ID. Puede modificar esta página para reservar su rango (limitado a 50 valores por editor)&lt;br /&gt;
&lt;br /&gt;
{{Flag zh}}&lt;br /&gt;
为需要特定ID范围的开发者保留的区域。您可以更改此页面以预订您自己的范围（第一次限制为50个值，请向我们咨询更多信息）。&lt;br /&gt;
如果您预订超过50个ID，我们可能会在没有通知的情况下自动更改您的预订范围，您将来可能会遇到与其他模块的冲突，因此请遵守规则！ &lt;br /&gt;
&lt;br /&gt;
[[File:Warning.png]] If you reserve more than 50, we may automatically change your reservation range without information and you may experience conflicts with other modules in a future, so please follow the rules!&lt;br /&gt;
&lt;br /&gt;
*ID 100000 - 100999: OpenThink (http://www.openthink.be)&lt;br /&gt;
*ID 101000 - 101999: NLTechno (https://www.nltechno.com)&lt;br /&gt;
*ID 102000 - 102999: Tiaris (http://www.tiaris.fr)&lt;br /&gt;
*ID 103000 - 103999: Open-concept.pro (http://www.open-concept.pro)&lt;br /&gt;
*ID 104000 - 104999: ATM Consulting (http://www.atm-consulting.fr)&lt;br /&gt;
*ID 105000 - 105999: GPC.solutions&lt;br /&gt;
*ID 106000 - 106999: PHPASSO&lt;br /&gt;
*ID 107000 - 107999: TecLib (http://www.teclib.com) / Auguria (http://www.auguria.net)&lt;br /&gt;
*ID 108000 - 108999: ETHICWEB&lt;br /&gt;
*ID 109000 - 109999: Aplose ([http://www.aplose.fr https://www.aplose.fr])&lt;br /&gt;
*ID 110000 - 110999: Librethic (https://librethic.io)&lt;br /&gt;
*ID 111000 - 111999: Asset IT (www.assetit.ch)&lt;br /&gt;
*ID 112000 - 112999: Aarboard AG (www.aarboard.ch)&lt;br /&gt;
*ID 113000 - 113999: Asilib - Alexandre Spangaro&lt;br /&gt;
*ID 114000 - 114999: Iceleaf OÜ&lt;br /&gt;
*ID 115000 - 115999: 2A2C Conseil - Cyril ZEKSER&lt;br /&gt;
*ID 116000 - 116999: Wolftec GmbH&lt;br /&gt;
*ID 117000 - 117999: Oscim (http://www.oscim.fr)&lt;br /&gt;
*ID 118000 - 118999: Oarces Web (dev.oarces.com)&lt;br /&gt;
*ID 119000 - 119999: Manuel Berrocal - Absolacom&lt;br /&gt;
*ID 120000 - 120999: Régis Houssin (http://www.inodbox.com)&lt;br /&gt;
*ID 121000 - 121999: Oscss - Shop&lt;br /&gt;
*ID 122000 - 122999: MrSof - la Nation du Web&lt;br /&gt;
*ID 123000 - 123999: Bruno Généré (webiseasy.org)&lt;br /&gt;
*ID 124000 - 124999: backbone internet service (www.backbone.co.at)&lt;br /&gt;
*ID 125000 - 125999: ProgSI (www.progsi.ma)&lt;br /&gt;
*ID 126000 - 126999: Catalanet&lt;br /&gt;
*ID 127000 - 127999: Virgilio Filho pt-BR Brasil (@dolibarr.br)&lt;br /&gt;
*ID 128000 - 128999: Nicolas Frappé France (www.sospc.info)&lt;br /&gt;
*ID 129000 - 129999: Adeo-Informatique&lt;br /&gt;
*ID 130000 - 130999: Technicks ICT (http://www.technicks.eu)&lt;br /&gt;
*ID 131000 - 131999: Joan Louis (itaca.fr)&lt;br /&gt;
*ID 132000 - 132999: Jean-Marie Arsac (https://azimut.fr)&lt;br /&gt;
*ID 133000 - 133999: Oriel Systems Ltd, UK. (www.orielsystems.com)&lt;br /&gt;
*ID 134000 - 134999: ALSOFT PVT. LTD. (https://www.alsoft.org)&lt;br /&gt;
*ID 135000 - 135999: Net-Logic (https://netlogic.fr)&lt;br /&gt;
*ID 136000 - 136050: MONA.RE - France&lt;br /&gt;
*ID 136051 - 136099: La Vida Marketing&lt;br /&gt;
*ID 136100 - 136149: Synergies-Tech France. (https://www.synergies-france.fr/)&lt;br /&gt;
*ID 136150 - 136199: Lyta&lt;br /&gt;
*ID 136200 - 136219: Maison Théophile Leclerc&lt;br /&gt;
*ID 136220 - 136270: SegoFount - Spain&lt;br /&gt;
*ID 136271 - 138999: &#039;&#039;&#039;Free (take ranges of 50 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 139000 - 139999: Synergies-Tech France. (https://www.synergies-france.fr/)&lt;br /&gt;
*ID 140000 - 140999: Altairis (http://altairis.fr)&lt;br /&gt;
*ID 141000 - 141050: Projet2Team (https://www.projet2team.fr)&lt;br /&gt;
*ID 141051 - 141099: Elistair (http://elistair.com)&lt;br /&gt;
*ID 141100 - 141149: Blue Networks Technologies (https://www.blnt.fr)&lt;br /&gt;
*ID 141150 - 141199: Mainlab S.r.l. (https://www.mainlabonline.it)&lt;br /&gt;
*ID 141150 - 141199: Florian DUFOURG - France&lt;br /&gt;
*ID 142000 - 142049: ITANéA (https://www.itanea.fr)&lt;br /&gt;
*ID 142050 - 142099: ERP Consulting NZ ([https://www.erpconsulting.co.nz www.erpconsulting.co.nz])&lt;br /&gt;
*ID 142100 - 142149: Bloxera GmbH (https://www.bloxera.com)&lt;br /&gt;
*ID 142150 - 142199: Evangelos Souglakos - Greece&lt;br /&gt;
*ID 142200 - 142249: Luc CALARESU - France&lt;br /&gt;
*ID 142250 - 142299: OmnIT Services - Belgique (https://www.omnitservices.biz)&lt;br /&gt;
*ID 142300 - 142349: Gwadeyes - Guadeloupe (https://www.gwadeyes-informatique.com/)&lt;br /&gt;
*ID 142350 - 142399: Solution Libre (https://www.solution-libre.fr/)&lt;br /&gt;
*ID 142400 - 142449: Res Digital (https://res.digital)&lt;br /&gt;
*ID 149000 - 149999: SydTech - America Central (https://www.sydtech.io/)&lt;br /&gt;
*ID 150000 - 150999: Jeffinfo&lt;br /&gt;
*ID 151000 - 151999: Konverseo (https://konverseo.com)&lt;br /&gt;
*ID 152000 - 152049: Tanguy Pénet (http://tanguype.net)&lt;br /&gt;
*ID 160000 - 160999: Charles-François BENKE (http://www.patas-monkey.com)&lt;br /&gt;
*ID 161000 - 161999: Abbes Bahfir (http://dolipar.org)&lt;br /&gt;
*ID 162000 - 162999: Jacques Rébiscoul&lt;br /&gt;
*ID 163000 - 163999: Open-DSI (https://www.open-dsi.fr)&lt;br /&gt;
*ID 164000 - 164999: Pixelada S. Coop. And. (https://pixelada.org)&lt;br /&gt;
*ID 165000 - 165049: DovConnect&lt;br /&gt;
*ID 165050 - 165099: Mind Operated Systems (https://www.mosystems.biz)&lt;br /&gt;
*ID 165100 - 165150: SD-Formation (https://sdformation.fr)&lt;br /&gt;
*ID 165151 - 165199: NUM&#039;X (https://www.numx-sets.eu)&lt;br /&gt;
*ID 165200 - 165249: Benjam Préjent (https://www.benjam-prejent.fr)&lt;br /&gt;
*ID 165250 - 165299: Dhi Loka Private Limited, India (https://www.dhiloka.com)&lt;br /&gt;
*ID 170000 - 170999: TRIDENT CONSULTING LTD (www.tridentdxb.com)&lt;br /&gt;
*ID 171000 - 171999: LVSInformatique (www.lvsinformatique.com)&lt;br /&gt;
*ID 172000 - 172299: Ray Soft-Systems (https://www.ray-soft-systems.com)&lt;br /&gt;
*ID 172300 - 172349: Günter Lukas Consulting (https://gl.co.at)&lt;br /&gt;
*ID 172350 - 172399: MB Informatique (https://www.mb-informatique.fr)&lt;br /&gt;
*ID 172400 - 172449: Professional Structures Limited (https://pstructures.com)&lt;br /&gt;
*ID 172450 - 172699: IT-BS (https://www.it-bs.fr)&lt;br /&gt;
*ID 172700 - 172749: Indelog (https://www.indelog.fr)&lt;br /&gt;
*ID 172750 - 172799: NS-INFO90 (https://www.ns-info90.fr)&lt;br /&gt;
*ID 180000 - 180999: Triangle Ingénierie&lt;br /&gt;
*ID 181000 - 181999: TI Sin Problemas (https://www.tisinproblemas.com)&lt;br /&gt;
*ID 182000 - 182049: Chipserv Pawel Wlizlo (https://www.testware.it)&lt;br /&gt;
*ID 183000 - 183999: BB2A Anthony Berton (https://www.bb2a.fr)&lt;br /&gt;
*ID 184000 - 184999: DPS PRINTING &amp;amp; DOCUMENTS SOCIEDAD ANONIMA (https://www.dps-lat.com)&lt;br /&gt;
*ID 190000 - 190999: Diciannove (http://19.coop)&lt;br /&gt;
*ID 191000 - 191999: Elonet (https://elonet.fr)&lt;br /&gt;
*ID 199000 - 199999: RFMS&lt;br /&gt;
*ID 200000 - 200999: Noxiome&lt;br /&gt;
*ID 201000 - 201999: Sasa Ostrouska (saxa)&lt;br /&gt;
*ID 202000 - 202999: Z-Application&lt;br /&gt;
*ID 203000 - 203099: Elidee - elidee.com&lt;br /&gt;
*ID 203100 - 203999: Garcia MICHEL (soamichel.fr)&lt;br /&gt;
*ID 204000 - 204999: Ari Elbaz elarifr - accedinfo.com&lt;br /&gt;
*ID 205000 - 205999: Kreiz IT&lt;br /&gt;
*ID 206000 - 206999: GBINFO (www.gbinfo.fr)&lt;br /&gt;
*ID 207000 - 207099: MacroProg (https://www.macroprog.com)&lt;br /&gt;
*ID 207100 - 207149: Reactiva Software&lt;br /&gt;
*ID 207150 - 207199: Ndejje University Water Research and Development Centre ([https://github.com/NDUWRDC/LIMS/])&lt;br /&gt;
*ID 207200 - 207299: Massaoud Bouzenad ([https://www.dzprod.net dzprod.net])&lt;br /&gt;
*ID 207300 - 207349: Ksar&lt;br /&gt;
*ID 207350 - 207399: Easylinux (www.easylinux.fr)&lt;br /&gt;
*ID 222000 - 222999:  dolibit  (https://www.dolibit.de)&lt;br /&gt;
*ID 230000 - 230049: Unareil (https://www.unareil.eu)&lt;br /&gt;
*ID 230050 - 230099: Lyra Network (https://www.lyra.com/)&lt;br /&gt;
*ID 230100 - 230149: Gheorghe Iftimi - CTW - RO&lt;br /&gt;
*ID 230150 - 230199: MEMA Machinery &amp;amp; Tools (https://www.mema.be)&lt;br /&gt;
*ID 230200 - 230249: Teleassist&lt;br /&gt;
*ID 230250 - 230299: Nh Developer&lt;br /&gt;
*ID 230300 - 230499: Chickenforce/code-chicken, IT Services Hahn (https://github.com/code-chicken [http://itservices-hahn.de/ https://itservices-hahn.de])&lt;br /&gt;
*ID 230500 - 230549: Hidup Consulting (https://consulting.hidup.io)&lt;br /&gt;
*ID 230550 - 230599 : CMR Conseil (https://www.weblockup.fr)&lt;br /&gt;
*ID 230600 - 230649 : aFreeMind Studio&lt;br /&gt;
*ID 230650 - 230699 : Unideal (https://www.uni-deal.com)&lt;br /&gt;
*ID 230700 - 230749 : DevLansdes (https://devlandes.com/)&lt;br /&gt;
*ID 262700 - 262799: Scopen (https://www.scopen.fr)&lt;br /&gt;
*ID 274250 - 274299: Nerv Project (www.nerv-project.eu)&lt;br /&gt;
*ID 274300 - 274349: Knowhere Consulting S.L. (https://www.knowhere-consulting.eu)&lt;br /&gt;
*ID 274350 - 274399: Milen karaganski (https://blacktiehost.com)&lt;br /&gt;
*ID 274400 - 274449: Vincent MAURY ([https://www.timgroup.fr www.timgroup.fr])&lt;br /&gt;
*ID 274450 - 274499: Daraelmin&lt;br /&gt;
*ID 274500 - 274550: Emilie LAFORET (http://www.ermvallon.com)&lt;br /&gt;
*ID 279000 - 279049: VSDigital Electronics (https://vsdigital.ar) - Argentina&lt;br /&gt;
*ID 280000 - 280050: Bingroup (https://www.beinng.com)&lt;br /&gt;
*ID 280051 - 280100: Medialta (https://medialta.com)&lt;br /&gt;
*ID 290000 - 290099: BNS - Project doliBRA ([https://www.beinng.com https://www.bns.net.br]) - Brasil&lt;br /&gt;
*ID 300000 - 300049: RapidProgress (https://www.rapidprogress.eu) - Bulgaria&lt;br /&gt;
*ID 300050 : 300099: M@ Solution (https://www.ma-solution.fr/)&lt;br /&gt;
*ID 300100 : 300149: LAVA RUN (https://www.lavarun.re)&lt;br /&gt;
*ID 300200 : 300249 : Computences (https://www.computences.com/)&lt;br /&gt;
*ID 300250 : 300299 : LEVEL IT (https://levelit.com.ar)&lt;br /&gt;
*ID 300300 : 300349 : Progiseize (https://progiseize.fr)&lt;br /&gt;
*ID 300350 - 300399: MB Informatique (https://www.mb-informatique.fr)&lt;br /&gt;
*ID 300400 - 300449: Anouar Touati&lt;br /&gt;
*ID 300450 - 300499: Martin Danger&lt;br /&gt;
*ID 300500 - 301499: Whale Blows&lt;br /&gt;
*ID 301500 - 301549: Tom Trust - International&lt;br /&gt;
*ID 302500 - 302549: Diamubi (https://diamubi.com)&lt;br /&gt;
*ID 302550 - 302599: Datolab (https://www.datolab.com)&lt;br /&gt;
*ID 302600 - 302649: DuMaCo (https://www.dumaco.de)&lt;br /&gt;
*ID 302650 - 302699: Resilio SA&lt;br /&gt;
*ID 302700 - 302749: Aroga&lt;br /&gt;
*ID 302750 - 302799: Productivix (https://www.productivix.com)&lt;br /&gt;
*ID 302800 - 302849: Slibzz&lt;br /&gt;
*ID 302850 - 302899: idea design (https://ideadesign.dz)&lt;br /&gt;
*ID 302900 - 302949: AL MISBAH INFORMATIQUE (https://www.almisbah.ma)&lt;br /&gt;
*ID 302950 - 302999: Atis Solutions - France&lt;br /&gt;
*ID 303000 - 303499: Obixav - Nigeria&lt;br /&gt;
*ID 303500 - 303550: buschler plus GmbH, Germany (https://buschler.plus)&lt;br /&gt;
*ID 303551 - 303599: Prestalidaire - France (https://prestalidaire.com)&lt;br /&gt;
*ID 314000 - 314049: Ruemmler IT Solutions (https://www.ruemmler.net)&lt;br /&gt;
*ID 320000 - 320999: Novus Studios (www.novusstudios.it)&lt;br /&gt;
*ID 321000 - 321999: AtooNet (http://www.atoo-net.com)&lt;br /&gt;
*ID 332000 - 332099: Gecka (https://gecka.nc)&lt;br /&gt;
*ID 332100 - 332149: Agence Milkshake (http://agencemilkshake.com)&lt;br /&gt;
*ID 332150 - 332199: Daniel Prowald IT – Service (https://prowald-it.de)&lt;br /&gt;
*ID 332200 - 332249: UNITICE (https://unitice.com)&lt;br /&gt;
*ID 332250 - 332299: Sidonie Moulart&lt;br /&gt;
*ID 332300 - 332349: LTDJ (Antonin MARCHAL - Le Temple du Jeu)&lt;br /&gt;
*ID 330000 - 330049: XTEC Industries (www.xtec-ind.com)&lt;br /&gt;
*ID 330050 - 330099: 10100 S.R.L. - (www.10100.to)&lt;br /&gt;
*ID 330100 - 330149: AES Dana SRL (https://aes-dana.be)&lt;br /&gt;
*ID 330150 - 330199: Freshcore (https://www.freshcore.fr)&lt;br /&gt;
*ID 330200 - 399999: (take ranges of 50 only please, ask us for more)&lt;br /&gt;
*ID 333300 - 333349: Sense Africa (http://sense.africa)&lt;br /&gt;
*ID 350000 - 350049: SOUNDOU &amp;amp; MIDAS (https://www.soundou.org/)&lt;br /&gt;
*ID 400000 - 400999: 2byte.es (http://www.2byte.es)&lt;br /&gt;
*ID 401000 - 401999: B&amp;amp;D Informática&lt;br /&gt;
*ID 402000 - 402999: Marcos García de La Fuente (marcosgdf)&lt;br /&gt;
*ID 403000 - 403999: Sergibyte&lt;br /&gt;
*ID 404000 - 404999: Aikhan&lt;br /&gt;
*ID 405000 - 405999: AIME (http://www.aime.mx)&lt;br /&gt;
*ID 406000 - 406999: Som Núvol (https://somnuvol.coop)&lt;br /&gt;
*ID 409000 - 409999: LliureTIC (https://www.lliuretic.cat)&lt;br /&gt;
*ID 410000 - 410999: DoliGov&lt;br /&gt;
*ID 420000 - 420099: BBS Concept&lt;br /&gt;
*ID 420100 - 420199: LeMousticProduction (www.lemousticproduction.info) -&amp;lt; module DoliRH&lt;br /&gt;
*ID 420200 - 421199: VatCheck (www.abnc.be)&lt;br /&gt;
*ID 422200 - 422999: Artaban (http://artaban.fr)&lt;br /&gt;
*ID 423000 - 423050: cyberesprit&lt;br /&gt;
*ID 423051 - 423099: R.Bossard&lt;br /&gt;
*ID 423100 - 423199: Joliciel (www.joliciel.fr)&lt;br /&gt;
*ID 424000 - 424049: A3sys - Mon-Dolibarr (http://www.mon-dolibarr.fr) by Philazerty&lt;br /&gt;
*ID 424050 - 424099: Pragma-tech (www.pragma-tech.fr)&lt;br /&gt;
*ID 424100 - 424149: Ohoo Solutions (http://www.ohoosolutions.com)&lt;br /&gt;
*ID 424150 - 424199: DAGARCAM Informática (https://www.dagarcam.com/)&lt;br /&gt;
*ID 424200 - 424999: Lab51 (https://github.com/lab51org)&lt;br /&gt;
*ID 425000 - 425999: Sébastien SERRE Thivinfo (www.thivinfo.com)&lt;br /&gt;
*ID 426000 - 426099: Arkesis-Solution&lt;br /&gt;
*ID 426100 - 426149: GetLandy (www.getlandy.com)&lt;br /&gt;
*ID 426150 - 426649: OOB Software&lt;br /&gt;
*ID 426650 - 426849: Soft-Task Serviços e Sistemas (www.soft-task.com.br)&lt;br /&gt;
*ID 426850 - 427000: Bruno Caldas (https://github.com/BCaldas)&lt;br /&gt;
*ID 427001 - 427999: Kevin GUERRIER (alias xcl.saian)&lt;br /&gt;
*ID 428000 - 428099: af83&lt;br /&gt;
*ID 428100 - 428199: Arnaud Serrut - Adalon&lt;br /&gt;
*ID 428200 - 428249: imschweiler consulting (http://www.imschweiler-consulting.de&#039;&#039;&#039;&amp;lt;nowiki/&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
*ID 428250 - 428299: AL1FO&lt;br /&gt;
*ID 428300 - 428349: Federico García-Patiño Barbolani (&amp;lt;federico.garcia.patino@gmail.com&amp;gt;)&lt;br /&gt;
*ID 428350 - 428399: INTM Groupe - France (www.intm.com)&lt;br /&gt;
*ID 428400 - 428449: Nick Fragoulis - Greece&lt;br /&gt;
*ID 428450 - 428499: Letusgeek - France&lt;br /&gt;
*id 428500 - 428549 hkwhitten - USA&lt;br /&gt;
*ID 428550 - 428999 SmartOne&lt;br /&gt;
*ID 429000 - 429999: induslab&lt;br /&gt;
*ID 430000 - 430099: Mixity sprl (www.mixity.be)&lt;br /&gt;
*ID 430100 - 430199: sgiraud&lt;br /&gt;
*ID 430200 - 430299: Merlion TI (www.merlion-si.com.br)&lt;br /&gt;
*ID 430300 - 431299: Libre Expert (www.libre-expert.com)&lt;br /&gt;
*ID 431300 - 431399: ptibogxiv (www.ptibogxiv.net)&lt;br /&gt;
*ID 431400 - 431499: Befox (www.befox.fr)&lt;br /&gt;
*ID 431500 - 431599: rue Béjo (www.ruebejo.fr)&lt;br /&gt;
*ID 431600 - 431699: Avizzeo (www.avizzeo.com)&lt;br /&gt;
*ID 431700 - 432199: Multisistemas (www.multisistemas.com.sv)&lt;br /&gt;
*ID 432200 - 432399: Burbuja - Chile (www.burbuja.cl)&lt;br /&gt;
*ID 432400 - 433399: INOVEA CONSEIL (https://www.inovea-conseil.com)&lt;br /&gt;
*ID 433400 - 434399: Rachid HRICH - Maroc (HricH ServiceS.)&lt;br /&gt;
*ID 434400 - 435399: Lance Bleakley - LanceIT (www.lanceit.net)&lt;br /&gt;
*ID 436000 - 436099: SOWEBIO (www.soweb.io)&lt;br /&gt;
*ID 436100 - 436199: CAP-REL (www.cap-rel.fr)&lt;br /&gt;
*ID 436200 - 436300: TDE-INFORMATIQUE (www.tde-informatique.fr)&lt;br /&gt;
*ID 436301 - 436349: Evarisk ([https://www.evarisk.com/id-module-dolibarr/ www.evarisk.com])&lt;br /&gt;
*ID 436350 - 436399: Eoxia ([https://www.eoxia.com/dolibarr/modules/ www.eoxia.com])&lt;br /&gt;
*ID 436400 - 437399: Mohamed AHERDANE - Morocco - IT Consultant ( www.wave.ma )&lt;br /&gt;
*ID 437400 - 437449: Martin Neubauer - Germany&lt;br /&gt;
*ID 437450 - 437599: Club1click (www.club1click.es)&lt;br /&gt;
*ID 437600 - 437629: Coulon Vincent (https://github.com/HoverEpic)&lt;br /&gt;
*ID 437630 - 437649: Aytechnet (https://www.aytechnet.fr/) - François Pons&lt;br /&gt;
*ID 437650 - 437699: LibreMaster (https://libremaster.com) - Christophe T.&lt;br /&gt;
*ID 437700 - 437749: STELLAR Broadband (https://www.stellarbb.com) - U.S.A. - Philip Laycock&lt;br /&gt;
*ID 437750 - 437799: DIGITA.LU Ajous Solutions&lt;br /&gt;
*ID 437800 - 437850: iProspective (https://iprospective.fr) - Mathieu Moulin&lt;br /&gt;
*ID 437851 - 437900: Theobald Groupe.&lt;br /&gt;
*ID 437901 - 437950: Neuronnexion (http://neuronnexion.coop)&lt;br /&gt;
*ID 437951 - 437952: jmbc - APIA-ASSO (https://www.apia-asso.fr)&lt;br /&gt;
*ID 437953 - 438002: IPCZEN SARL (https://www.ipczeninformatique.fr/)&lt;br /&gt;
*ID 438003 - 438052: FESF IT Department (https://fesf.org.pk)&lt;br /&gt;
*ID 438053 - 438399: &#039;&#039;&#039;Free (take ranges of 50 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 438400 - 439399: Tetras Libre - France - Développement logiciels libres (www.tetras-libre.fr)&lt;br /&gt;
*ID 439400 - 440399: Dolibarr-pro - France - Développement Dolibarr (www.dolibarr-pro.com)&lt;br /&gt;
*ID 440400 - 441399: Quidlab Co., Ltd - Thailand - ( www.quidlab.com )&lt;br /&gt;
*ID 441400 - 442399: Ide@log - France - (https://www.idealog-info.net) - Laurent Leblanc&lt;br /&gt;
*ID 442400 - 443399: Valerio Bianchi (www.valeriobianchi.com)&lt;br /&gt;
*ID 443400 - 444399: delassalle - France - (www.delassalle.fr) - Joseph Delassalle&lt;br /&gt;
*ID 444400 - 445399: Webartis - Maroc - (www.webartis.net) - François Dry&lt;br /&gt;
*ID 445400 - 445499: SCOP Au-delà des nuages - France&lt;br /&gt;
*ID 446000 - 446999: iouston (http://www.iouston.com) - France - Julien Marchand&lt;br /&gt;
*ID 447000 - 447999: rSanjoSEO - Rafael San José Tovar (www.rsanjoseo.com) - Spain&lt;br /&gt;
*ID 448000 - 448999: Code 42 (www.code42.fr)&lt;br /&gt;
*ID 449000 - 449999: TakePOS (www.takepos.com)&lt;br /&gt;
*ID 450000 - 450999: Pierre ARDOIN&lt;br /&gt;
*ID 451000 - 451999: Éditeur depordi.fr&lt;br /&gt;
*ID 452000 - 452999: Dylan NAKONG&lt;br /&gt;
*ID 453000 - 453999: Menahd Ouchenir - France - menahd-ouchenir.com&lt;br /&gt;
*ID 454000 - 454999: Withheld - Canada&lt;br /&gt;
*ID 455000 - 455999: Gaëtan MAISON - Info Libre @ Dom - France (https://www.infolibreadom.com)&lt;br /&gt;
*ID 456000 - 456999: Laurent LEBLEU - B.L.C. - Blue Line Company - Lille - France (www.bluelinecompany.fr/dolibarr)&lt;br /&gt;
*ID 457000 - 457999: Sébastien BOUCHER&lt;br /&gt;
*ID 458000 - 458999: Lester HERNÁNDEZ - Argentina - (freelancerlrhd@gmail.com)&lt;br /&gt;
*ID 459000 - 459999: Infopen - France&lt;br /&gt;
*ID 460000 - 460050: torvista - Spain&lt;br /&gt;
*ID 461000 - 461999: MEGALOGI - Maroc (www.erpcloud.ma)&lt;br /&gt;
*ID 462000 - 462999: Making Digital (www.making-digital.fr) - France&lt;br /&gt;
*ID 463000 - 463999: linx s.r.l.s.&lt;br /&gt;
*ID 464000 - 464999: NimbleCubed Inc. (www.nimblecubed.com)&lt;br /&gt;
*ID 465000 - 465999: Artefacts - CourantAlternatif&lt;br /&gt;
*ID 466000 - 466999: CDM Consultores - (www.cdm.guru)&lt;br /&gt;
*ID 467000 - 467999: M71 Service GmbH - (www.m71-service.de)&lt;br /&gt;
*ID 468000 - 468049: Clément Segonzac - France (clement.segonzac@gmail.com)&lt;br /&gt;
*ID 468050 - 468099: Flavien Belli - France (https://github.com/Marshlyin || belliflaviencontactpro@gmail.com)&lt;br /&gt;
*ID 468100 - 468119: Chl (https://code.bugness.org/Dolibarr)&lt;br /&gt;
*ID 468120 - 468170: Commotron GmbH (https://www.commotron.com/)&lt;br /&gt;
*ID 468171 - 468220: Infans Group (franck.lauby@infans.fr)&lt;br /&gt;
*ID 468221 - 468174 &#039;&#039;&#039;Free (take ranges of 50 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 468175 - 468199: Gaëlle Rauffet - France (kiwiscan.net)&lt;br /&gt;
*ID 468200 - 468250: Paulo Oliveira - Brasil (paulorcdo@gmail.com)&lt;br /&gt;
*ID 468251 - 468270:  CD-Systems - France (https://www.cd-systems.fr)&lt;br /&gt;
*ID 468300 - 468349: Uvensys - Germany (https://uvensys.de)&lt;br /&gt;
*ID 468350 - 468399 : Laudeco - Belgium (http://github.com/laudeco)&lt;br /&gt;
*ID 468400 - 468449 : Alexis LAURIER - France (https://www.alexislaurier.fr)&lt;br /&gt;
*ID 468450 - 468499 : Mehdi Belkhayat - Maroc (https://opensi.ma)&lt;br /&gt;
*ID 468500 - 468599 : InvIT GmbH - Germany (https://invit.sh)&lt;br /&gt;
*ID 468600 - 468649 : Ricardo Sequeira - Portugal (https://ricardo-sequeira.com)&lt;br /&gt;
*ID 468650 - 468699 : J-IT - Belgique (https://www.j-it.be)&lt;br /&gt;
*ID 468700 - 468749 : Fidesio - France (https://www.fidesio.com/)&lt;br /&gt;
*ID 468750 - 468799 : Sgestion - Spain (http://www.sgestion.net/)&lt;br /&gt;
*ID 468800 - 468849 : Denis JULIEN - Brasil (matrinxa@free.fr)&lt;br /&gt;
*ID 468850 - 468900: Mmariko - Module GED - Effios&lt;br /&gt;
*ID 468901 - 468950: Maazou Amadou Abdoul aziz - Maroc (yaronfada@gmail.com)&lt;br /&gt;
*ID 468951 - 469000: Alexis LAURIER - France (https://www.alexislaurier.fr)&lt;br /&gt;
*ID 469001 - 469050: John Livingston (https://github.com/JohnXLivingston/)&lt;br /&gt;
*ID 469051 - 469100: Macrorom ICT-services (https://macrorom.nl/)&lt;br /&gt;
*ID 469101 - 469150: HABOT IT - France (https://habot.it)&lt;br /&gt;
*ID 469151 - 469160: CaribbeanConsult.Com CCC - France Guadeloupe (https://dolibarr.ccc.gp)&lt;br /&gt;
*ID 469161 - 469171: GMBG - Portugal&lt;br /&gt;
*ID 469172 - 469192: BGi Lda - Portugal&lt;br /&gt;
*ID 469949 - 469999: Goldoweb (http://goldoweb.com)&lt;br /&gt;
*ID 470000 - 470999: Reindeer Digital (https://rdeer.cz)&lt;br /&gt;
*ID 471000 - 471099: CAP-REL (www.cap-rel.fr)&lt;br /&gt;
*ID 471100 - 471199: M. Morillon&lt;br /&gt;
*ID 471200 - 471209: Pablo Nuñez&lt;br /&gt;
*ID 481000 - 482000: Alhaidab-ITIS (https://alhaidab.dolibarr.sd)&lt;br /&gt;
*ID 482001 - 483000: Basix IT (https://www.basix.de)&lt;br /&gt;
*ID 483001 - 483050: SASCO SpA (https://www.sasco.cl)&lt;br /&gt;
*ID 483051 - 483100: WIP Engineering (https://www.wip-gmbh.com)&lt;br /&gt;
*ID 483101 - 483150: J.Kaiser&lt;br /&gt;
*ID 483151 - 483201: CodLines (https://www.codlines.com)&lt;br /&gt;
*ID 485000 - 485049: Gest Info Service Plus (contact@gest-plus.fr)&lt;br /&gt;
*ID 490000 - 490050: VOLD (https://vold.lu)&lt;br /&gt;
*ID 491000 - 491050: NORD ERP CRM (https://www.nord-erp-crm.fr/)&lt;br /&gt;
*ID 491051 - 491100: KJR-online (https://kjr-online.fr/)&lt;br /&gt;
*ID 491101 - 491149: eNova&lt;br /&gt;
*ID 491150 - 491200: App 4 Business&lt;br /&gt;
*ID 491201 - 491250: Mil24 (http://www.mil24.com.py)&lt;br /&gt;
*ID 491251 - 491301: M2AM&lt;br /&gt;
&lt;br /&gt;
DO NOT ADD RECORD HERE, PLEASE FILL HOLES FIRST !!!!&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
=ID &amp;gt; 500000=&lt;br /&gt;
&lt;br /&gt;
This range can&#039;t be reserved. It is a common range. If you don&#039;t plan to distribute your module, you can use an ID in this range with no need to reserve it.&lt;br /&gt;
&lt;br /&gt;
{{Flag en}}&lt;br /&gt;
If you don&#039;t already have reserved ids and need some, please don&#039;t use hazardous number and use a number higher than 500000, but it is better to ask a wiki account, and reserve your own range by editing the  100000 - 499999 range (50 ids at once, 1000 ids maximum per partner).&lt;br /&gt;
&lt;br /&gt;
{{Flag fr}}&lt;br /&gt;
Si vous n&#039;avez pas de numéros réservés et en avez besoin, n&#039;utilisez pas de chiffres au hasard et utilisez une valeur supérieure à 500000, toutefois, il est préférable d&#039;obtenir un compte wiki, et  réserver vous-même votre plage en ajoutant votre entrée dans la zone 100000 - 499999 (par lot de 50 d&#039;abord, pas plus de 1000 numéros par partenaire).&lt;br /&gt;
&lt;br /&gt;
{{Flag sp}}&lt;br /&gt;
Si no dispone de número reservado y necesita, no use cifras redondeadas y usa un valor superior a 500000. Si tiene una cuenta wiki, puede reservarse usted mismo sus id añadiendo su entrada en la zona 100000 - 499999 (no más de 1000 id por partner).&lt;/div&gt;</summary>
		<author><name>ShengGang</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=List_of_modules_id&amp;diff=58647</id>
		<title>List of modules id</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=List_of_modules_id&amp;diff=58647"/>
		<updated>2023-11-06T05:58:00Z</updated>

		<summary type="html">&lt;p&gt;ShengGang: /* ID 0 - 99999 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TemplateDocDevEn}}&lt;br /&gt;
{{TemplateDocDevEs}}&lt;br /&gt;
{{TemplateDocDevFr}}&lt;br /&gt;
{{TemplateDocDevZh}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Flag en}}&lt;br /&gt;
This page list all reserved modules numbers / ID. If you build or want to build your own modules (like thi , you should take an ID range here. Please pick range into existing holes first.&lt;br /&gt;
&lt;br /&gt;
{{Flag fr}}&lt;br /&gt;
Cette page recense tous les numéros / ID réservés de modules. Si vous avez réalisé ou voulez réaliser vos propres modules (comme les [[:Category:Modules complémentaires|modules complémentaires suivant]]), vous devriez prendre une plage d&#039;ID ici. Merci de prendre dans les trous existant en priorité !&lt;br /&gt;
&lt;br /&gt;
{{Flag sp}}&lt;br /&gt;
Esta página contiene un listado de todos los id reservados para los módulos. Si ha creado o quiere realizar sus propios módulos, (como estos [[:Category:Módulos_complementarios|módulos complementarios]]), deberá reservarse un rango de ID aquí.&lt;br /&gt;
&lt;br /&gt;
{{Flag zh}}&lt;br /&gt;
&lt;br /&gt;
此页面列出了所有保留的模块ID/编号。如果您正在构建或想要构建自己的模块（如 [[:Category:Complementary_modules|扩展模块]]），您应该在此处声明一个ID范围。感谢您优先考虑现有空当！&lt;br /&gt;
&lt;br /&gt;
=ID 0 - 99999=&lt;br /&gt;
{{Flag en}}&lt;br /&gt;
Reserved for Dolibarr&#039;s internal modules.&lt;br /&gt;
&lt;br /&gt;
{{Flag fr}}&lt;br /&gt;
Réservé aux modules internes de Dolibarr.&lt;br /&gt;
&lt;br /&gt;
{{Flag sp}}&lt;br /&gt;
Reservado a los módulos internos de Dolibarr.&lt;br /&gt;
&lt;br /&gt;
{{Flag zh}}&lt;br /&gt;
为Dolibarr的内部模块保留。&lt;br /&gt;
&lt;br /&gt;
=ID 100000 - 499999=&lt;br /&gt;
{{Flag en}} &lt;br /&gt;
&#039;&#039;&#039;Reserved area for editors in need for an ID range. You can edit this page to add your own range (take a range of 50 numbers only the first time, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Flag fr}}Zone réservée aux éditeurs qui ont besoin d&#039;une plage d&#039;ID spécifiques. Vous pouvez modifier cette page pour réserver votre plage (limitée à 50 valeurs la première fois, demandez nous pour plus)&lt;br /&gt;
&lt;br /&gt;
{{Flag sp}}&lt;br /&gt;
Área reservada para los partners que necesiten un rango de ID. Puede modificar esta página para reservar su rango (limitado a 50 valores por editor)&lt;br /&gt;
&lt;br /&gt;
[[File:Warning.png]] If you reserve more than 50, we may automatically change your reservation range without information and you may experience conflicts with other modules in a future, so please follow the rules!&lt;br /&gt;
&lt;br /&gt;
*ID 100000 - 100999: OpenThink (http://www.openthink.be)&lt;br /&gt;
*ID 101000 - 101999: NLTechno (https://www.nltechno.com)&lt;br /&gt;
*ID 102000 - 102999: Tiaris (http://www.tiaris.fr)&lt;br /&gt;
*ID 103000 - 103999: Open-concept.pro (http://www.open-concept.pro)&lt;br /&gt;
*ID 104000 - 104999: ATM Consulting (http://www.atm-consulting.fr)&lt;br /&gt;
*ID 105000 - 105999: GPC.solutions&lt;br /&gt;
*ID 106000 - 106999: PHPASSO&lt;br /&gt;
*ID 107000 - 107999: TecLib (http://www.teclib.com) / Auguria (http://www.auguria.net)&lt;br /&gt;
*ID 108000 - 108999: ETHICWEB&lt;br /&gt;
*ID 109000 - 109999: Aplose ([http://www.aplose.fr https://www.aplose.fr])&lt;br /&gt;
*ID 110000 - 110999: Librethic (https://librethic.io)&lt;br /&gt;
*ID 111000 - 111999: Asset IT (www.assetit.ch)&lt;br /&gt;
*ID 112000 - 112999: Aarboard AG (www.aarboard.ch)&lt;br /&gt;
*ID 113000 - 113999: Asilib - Alexandre Spangaro&lt;br /&gt;
*ID 114000 - 114999: Iceleaf OÜ&lt;br /&gt;
*ID 115000 - 115999: 2A2C Conseil - Cyril ZEKSER&lt;br /&gt;
*ID 116000 - 116999: Wolftec GmbH&lt;br /&gt;
*ID 117000 - 117999: Oscim (http://www.oscim.fr)&lt;br /&gt;
*ID 118000 - 118999: Oarces Web (dev.oarces.com)&lt;br /&gt;
*ID 119000 - 119999: Manuel Berrocal - Absolacom&lt;br /&gt;
*ID 120000 - 120999: Régis Houssin (http://www.inodbox.com)&lt;br /&gt;
*ID 121000 - 121999: Oscss - Shop&lt;br /&gt;
*ID 122000 - 122999: MrSof - la Nation du Web&lt;br /&gt;
*ID 123000 - 123999: Bruno Généré (webiseasy.org)&lt;br /&gt;
*ID 124000 - 124999: backbone internet service (www.backbone.co.at)&lt;br /&gt;
*ID 125000 - 125999: ProgSI (www.progsi.ma)&lt;br /&gt;
*ID 126000 - 126999: Catalanet&lt;br /&gt;
*ID 127000 - 127999: Virgilio Filho pt-BR Brasil (@dolibarr.br)&lt;br /&gt;
*ID 128000 - 128999: Nicolas Frappé France (www.sospc.info)&lt;br /&gt;
*ID 129000 - 129999: Adeo-Informatique&lt;br /&gt;
*ID 130000 - 130999: Technicks ICT (http://www.technicks.eu)&lt;br /&gt;
*ID 131000 - 131999: Joan Louis (itaca.fr)&lt;br /&gt;
*ID 132000 - 132999: Jean-Marie Arsac (https://azimut.fr)&lt;br /&gt;
*ID 133000 - 133999: Oriel Systems Ltd, UK. (www.orielsystems.com)&lt;br /&gt;
*ID 134000 - 134999: ALSOFT PVT. LTD. (https://www.alsoft.org)&lt;br /&gt;
*ID 135000 - 135999: Net-Logic (https://netlogic.fr)&lt;br /&gt;
*ID 136000 - 136050: MONA.RE - France&lt;br /&gt;
*ID 136051 - 136099: La Vida Marketing&lt;br /&gt;
*ID 136100 - 136149: Synergies-Tech France. (https://www.synergies-france.fr/)&lt;br /&gt;
*ID 136150 - 136199: Lyta&lt;br /&gt;
*ID 136200 - 136219: Maison Théophile Leclerc&lt;br /&gt;
*ID 136220 - 136270: SegoFount - Spain&lt;br /&gt;
*ID 136271 - 138999: &#039;&#039;&#039;Free (take ranges of 50 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 139000 - 139999: Synergies-Tech France. (https://www.synergies-france.fr/)&lt;br /&gt;
*ID 140000 - 140999: Altairis (http://altairis.fr)&lt;br /&gt;
*ID 141000 - 141050: Projet2Team (https://www.projet2team.fr)&lt;br /&gt;
*ID 141051 - 141099: Elistair (http://elistair.com)&lt;br /&gt;
*ID 141100 - 141149: Blue Networks Technologies (https://www.blnt.fr)&lt;br /&gt;
*ID 141150 - 141199: Mainlab S.r.l. (https://www.mainlabonline.it)&lt;br /&gt;
*ID 141150 - 141199: Florian DUFOURG - France&lt;br /&gt;
*ID 142000 - 142049: ITANéA (https://www.itanea.fr)&lt;br /&gt;
*ID 142050 - 142099: ERP Consulting NZ ([https://www.erpconsulting.co.nz www.erpconsulting.co.nz])&lt;br /&gt;
*ID 142100 - 142149: Bloxera GmbH (https://www.bloxera.com)&lt;br /&gt;
*ID 142150 - 142199: Evangelos Souglakos - Greece&lt;br /&gt;
*ID 142200 - 142249: Luc CALARESU - France&lt;br /&gt;
*ID 142250 - 142299: OmnIT Services - Belgique (https://www.omnitservices.biz)&lt;br /&gt;
*ID 142300 - 142349: Gwadeyes - Guadeloupe (https://www.gwadeyes-informatique.com/)&lt;br /&gt;
*ID 142350 - 142399: Solution Libre (https://www.solution-libre.fr/)&lt;br /&gt;
*ID 142400 - 142449: Res Digital (https://res.digital)&lt;br /&gt;
*ID 149000 - 149999: SydTech - America Central (https://www.sydtech.io/)&lt;br /&gt;
*ID 150000 - 150999: Jeffinfo&lt;br /&gt;
*ID 151000 - 151999: Konverseo (https://konverseo.com)&lt;br /&gt;
*ID 152000 - 152049: Tanguy Pénet (http://tanguype.net)&lt;br /&gt;
*ID 160000 - 160999: Charles-François BENKE (http://www.patas-monkey.com)&lt;br /&gt;
*ID 161000 - 161999: Abbes Bahfir (http://dolipar.org)&lt;br /&gt;
*ID 162000 - 162999: Jacques Rébiscoul&lt;br /&gt;
*ID 163000 - 163999: Open-DSI (https://www.open-dsi.fr)&lt;br /&gt;
*ID 164000 - 164999: Pixelada S. Coop. And. (https://pixelada.org)&lt;br /&gt;
*ID 165000 - 165049: DovConnect&lt;br /&gt;
*ID 165050 - 165099: Mind Operated Systems (https://www.mosystems.biz)&lt;br /&gt;
*ID 165100 - 165150: SD-Formation (https://sdformation.fr)&lt;br /&gt;
*ID 165151 - 165199: NUM&#039;X (https://www.numx-sets.eu)&lt;br /&gt;
*ID 165200 - 165249: Benjam Préjent (https://www.benjam-prejent.fr)&lt;br /&gt;
*ID 165250 - 165299: Dhi Loka Private Limited, India (https://www.dhiloka.com)&lt;br /&gt;
*ID 170000 - 170999: TRIDENT CONSULTING LTD (www.tridentdxb.com)&lt;br /&gt;
*ID 171000 - 171999: LVSInformatique (www.lvsinformatique.com)&lt;br /&gt;
*ID 172000 - 172299: Ray Soft-Systems (https://www.ray-soft-systems.com)&lt;br /&gt;
*ID 172300 - 172349: Günter Lukas Consulting (https://gl.co.at)&lt;br /&gt;
*ID 172350 - 172399: MB Informatique (https://www.mb-informatique.fr)&lt;br /&gt;
*ID 172400 - 172449: Professional Structures Limited (https://pstructures.com)&lt;br /&gt;
*ID 172450 - 172699: IT-BS (https://www.it-bs.fr)&lt;br /&gt;
*ID 172700 - 172749: Indelog (https://www.indelog.fr)&lt;br /&gt;
*ID 172750 - 172799: NS-INFO90 (https://www.ns-info90.fr)&lt;br /&gt;
*ID 180000 - 180999: Triangle Ingénierie&lt;br /&gt;
*ID 181000 - 181999: TI Sin Problemas (https://www.tisinproblemas.com)&lt;br /&gt;
*ID 182000 - 182049: Chipserv Pawel Wlizlo (https://www.testware.it)&lt;br /&gt;
*ID 183000 - 183999: BB2A Anthony Berton (https://www.bb2a.fr)&lt;br /&gt;
*ID 184000 - 184999: DPS PRINTING &amp;amp; DOCUMENTS SOCIEDAD ANONIMA (https://www.dps-lat.com)&lt;br /&gt;
*ID 190000 - 190999: Diciannove (http://19.coop)&lt;br /&gt;
*ID 191000 - 191999: Elonet (https://elonet.fr)&lt;br /&gt;
*ID 199000 - 199999: RFMS&lt;br /&gt;
*ID 200000 - 200999: Noxiome&lt;br /&gt;
*ID 201000 - 201999: Sasa Ostrouska (saxa)&lt;br /&gt;
*ID 202000 - 202999: Z-Application&lt;br /&gt;
*ID 203000 - 203099: Elidee - elidee.com&lt;br /&gt;
*ID 203100 - 203999: Garcia MICHEL (soamichel.fr)&lt;br /&gt;
*ID 204000 - 204999: Ari Elbaz elarifr - accedinfo.com&lt;br /&gt;
*ID 205000 - 205999: Kreiz IT&lt;br /&gt;
*ID 206000 - 206999: GBINFO (www.gbinfo.fr)&lt;br /&gt;
*ID 207000 - 207099: MacroProg (https://www.macroprog.com)&lt;br /&gt;
*ID 207100 - 207149: Reactiva Software&lt;br /&gt;
*ID 207150 - 207199: Ndejje University Water Research and Development Centre ([https://github.com/NDUWRDC/LIMS/])&lt;br /&gt;
*ID 207200 - 207299: Massaoud Bouzenad ([https://www.dzprod.net dzprod.net])&lt;br /&gt;
*ID 207300 - 207349: Ksar&lt;br /&gt;
*ID 207350 - 207399: Easylinux (www.easylinux.fr)&lt;br /&gt;
*ID 222000 - 222999:  dolibit  (https://www.dolibit.de)&lt;br /&gt;
*ID 230000 - 230049: Unareil (https://www.unareil.eu)&lt;br /&gt;
*ID 230050 - 230099: Lyra Network (https://www.lyra.com/)&lt;br /&gt;
*ID 230100 - 230149: Gheorghe Iftimi - CTW - RO&lt;br /&gt;
*ID 230150 - 230199: MEMA Machinery &amp;amp; Tools (https://www.mema.be)&lt;br /&gt;
*ID 230200 - 230249: Teleassist&lt;br /&gt;
*ID 230250 - 230299: Nh Developer&lt;br /&gt;
*ID 230300 - 230499: Chickenforce/code-chicken, IT Services Hahn (https://github.com/code-chicken [http://itservices-hahn.de/ https://itservices-hahn.de])&lt;br /&gt;
*ID 230500 - 230549: Hidup Consulting (https://consulting.hidup.io)&lt;br /&gt;
*ID 230550 - 230599 : CMR Conseil (https://www.weblockup.fr)&lt;br /&gt;
*ID 230600 - 230649 : aFreeMind Studio&lt;br /&gt;
*ID 230650 - 230699 : Unideal (https://www.uni-deal.com)&lt;br /&gt;
*ID 230700 - 230749 : DevLansdes (https://devlandes.com/)&lt;br /&gt;
*ID 262700 - 262799: Scopen (https://www.scopen.fr)&lt;br /&gt;
*ID 274250 - 274299: Nerv Project (www.nerv-project.eu)&lt;br /&gt;
*ID 274300 - 274349: Knowhere Consulting S.L. (https://www.knowhere-consulting.eu)&lt;br /&gt;
*ID 274350 - 274399: Milen karaganski (https://blacktiehost.com)&lt;br /&gt;
*ID 274400 - 274449: Vincent MAURY ([https://www.timgroup.fr www.timgroup.fr])&lt;br /&gt;
*ID 274450 - 274499: Daraelmin&lt;br /&gt;
*ID 274500 - 274550: Emilie LAFORET (http://www.ermvallon.com)&lt;br /&gt;
*ID 279000 - 279049: VSDigital Electronics (https://vsdigital.ar) - Argentina&lt;br /&gt;
*ID 280000 - 280050: Bingroup (https://www.beinng.com)&lt;br /&gt;
*ID 280051 - 280100: Medialta (https://medialta.com)&lt;br /&gt;
*ID 290000 - 290099: BNS - Project doliBRA ([https://www.beinng.com https://www.bns.net.br]) - Brasil&lt;br /&gt;
*ID 300000 - 300049: RapidProgress (https://www.rapidprogress.eu) - Bulgaria&lt;br /&gt;
*ID 300050 : 300099: M@ Solution (https://www.ma-solution.fr/)&lt;br /&gt;
*ID 300100 : 300149: LAVA RUN (https://www.lavarun.re)&lt;br /&gt;
*ID 300200 : 300249 : Computences (https://www.computences.com/)&lt;br /&gt;
*ID 300250 : 300299 : LEVEL IT (https://levelit.com.ar)&lt;br /&gt;
*ID 300300 : 300349 : Progiseize (https://progiseize.fr)&lt;br /&gt;
*ID 300350 - 300399: MB Informatique (https://www.mb-informatique.fr)&lt;br /&gt;
*ID 300400 - 300449: Anouar Touati&lt;br /&gt;
*ID 300450 - 300499: Martin Danger&lt;br /&gt;
*ID 300500 - 301499: Whale Blows&lt;br /&gt;
*ID 301500 - 301549: Tom Trust - International&lt;br /&gt;
*ID 302500 - 302549: Diamubi (https://diamubi.com)&lt;br /&gt;
*ID 302550 - 302599: Datolab (https://www.datolab.com)&lt;br /&gt;
*ID 302600 - 302649: DuMaCo (https://www.dumaco.de)&lt;br /&gt;
*ID 302650 - 302699: Resilio SA&lt;br /&gt;
*ID 302700 - 302749: Aroga&lt;br /&gt;
*ID 302750 - 302799: Productivix (https://www.productivix.com)&lt;br /&gt;
*ID 302800 - 302849: Slibzz&lt;br /&gt;
*ID 302850 - 302899: idea design (https://ideadesign.dz)&lt;br /&gt;
*ID 302900 - 302949: AL MISBAH INFORMATIQUE (https://www.almisbah.ma)&lt;br /&gt;
*ID 302950 - 302999: Atis Solutions - France&lt;br /&gt;
*ID 303000 - 303499: Obixav - Nigeria&lt;br /&gt;
*ID 303500 - 303550: buschler plus GmbH, Germany (https://buschler.plus)&lt;br /&gt;
*ID 303551 - 303599: Prestalidaire - France (https://prestalidaire.com)&lt;br /&gt;
*ID 314000 - 314049: Ruemmler IT Solutions (https://www.ruemmler.net)&lt;br /&gt;
*ID 320000 - 320999: Novus Studios (www.novusstudios.it)&lt;br /&gt;
*ID 321000 - 321999: AtooNet (http://www.atoo-net.com)&lt;br /&gt;
*ID 332000 - 332099: Gecka (https://gecka.nc)&lt;br /&gt;
*ID 332100 - 332149: Agence Milkshake (http://agencemilkshake.com)&lt;br /&gt;
*ID 332150 - 332199: Daniel Prowald IT – Service (https://prowald-it.de)&lt;br /&gt;
*ID 332200 - 332249: UNITICE (https://unitice.com)&lt;br /&gt;
*ID 332250 - 332299: Sidonie Moulart&lt;br /&gt;
*ID 332300 - 332349: LTDJ (Antonin MARCHAL - Le Temple du Jeu)&lt;br /&gt;
*ID 330000 - 330049: XTEC Industries (www.xtec-ind.com)&lt;br /&gt;
*ID 330050 - 330099: 10100 S.R.L. - (www.10100.to)&lt;br /&gt;
*ID 330100 - 330149: AES Dana SRL (https://aes-dana.be)&lt;br /&gt;
*ID 330150 - 330199: Freshcore (https://www.freshcore.fr)&lt;br /&gt;
*ID 330200 - 399999: (take ranges of 50 only please, ask us for more)&lt;br /&gt;
*ID 333300 - 333349: Sense Africa (http://sense.africa)&lt;br /&gt;
*ID 350000 - 350049: SOUNDOU &amp;amp; MIDAS (https://www.soundou.org/)&lt;br /&gt;
*ID 400000 - 400999: 2byte.es (http://www.2byte.es)&lt;br /&gt;
*ID 401000 - 401999: B&amp;amp;D Informática&lt;br /&gt;
*ID 402000 - 402999: Marcos García de La Fuente (marcosgdf)&lt;br /&gt;
*ID 403000 - 403999: Sergibyte&lt;br /&gt;
*ID 404000 - 404999: Aikhan&lt;br /&gt;
*ID 405000 - 405999: AIME (http://www.aime.mx)&lt;br /&gt;
*ID 406000 - 406999: Som Núvol (https://somnuvol.coop)&lt;br /&gt;
*ID 409000 - 409999: LliureTIC (https://www.lliuretic.cat)&lt;br /&gt;
*ID 410000 - 410999: DoliGov&lt;br /&gt;
*ID 420000 - 420099: BBS Concept&lt;br /&gt;
*ID 420100 - 420199: LeMousticProduction (www.lemousticproduction.info) -&amp;lt; module DoliRH&lt;br /&gt;
*ID 420200 - 421199: VatCheck (www.abnc.be)&lt;br /&gt;
*ID 422200 - 422999: Artaban (http://artaban.fr)&lt;br /&gt;
*ID 423000 - 423050: cyberesprit&lt;br /&gt;
*ID 423051 - 423099: R.Bossard&lt;br /&gt;
*ID 423100 - 423199: Joliciel (www.joliciel.fr)&lt;br /&gt;
*ID 424000 - 424049: A3sys - Mon-Dolibarr (http://www.mon-dolibarr.fr) by Philazerty&lt;br /&gt;
*ID 424050 - 424099: Pragma-tech (www.pragma-tech.fr)&lt;br /&gt;
*ID 424100 - 424149: Ohoo Solutions (http://www.ohoosolutions.com)&lt;br /&gt;
*ID 424150 - 424199: DAGARCAM Informática (https://www.dagarcam.com/)&lt;br /&gt;
*ID 424200 - 424999: Lab51 (https://github.com/lab51org)&lt;br /&gt;
*ID 425000 - 425999: Sébastien SERRE Thivinfo (www.thivinfo.com)&lt;br /&gt;
*ID 426000 - 426099: Arkesis-Solution&lt;br /&gt;
*ID 426100 - 426149: GetLandy (www.getlandy.com)&lt;br /&gt;
*ID 426150 - 426649: OOB Software&lt;br /&gt;
*ID 426650 - 426849: Soft-Task Serviços e Sistemas (www.soft-task.com.br)&lt;br /&gt;
*ID 426850 - 427000: Bruno Caldas (https://github.com/BCaldas)&lt;br /&gt;
*ID 427001 - 427999: Kevin GUERRIER (alias xcl.saian)&lt;br /&gt;
*ID 428000 - 428099: af83&lt;br /&gt;
*ID 428100 - 428199: Arnaud Serrut - Adalon&lt;br /&gt;
*ID 428200 - 428249: imschweiler consulting (http://www.imschweiler-consulting.de&#039;&#039;&#039;&amp;lt;nowiki/&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
*ID 428250 - 428299: AL1FO&lt;br /&gt;
*ID 428300 - 428349: Federico García-Patiño Barbolani (&amp;lt;federico.garcia.patino@gmail.com&amp;gt;)&lt;br /&gt;
*ID 428350 - 428399: INTM Groupe - France (www.intm.com)&lt;br /&gt;
*ID 428400 - 428449: Nick Fragoulis - Greece&lt;br /&gt;
*ID 428450 - 428499: Letusgeek - France&lt;br /&gt;
*id 428500 - 428549 hkwhitten - USA&lt;br /&gt;
*ID 428550 - 428999 SmartOne&lt;br /&gt;
*ID 429000 - 429999: induslab&lt;br /&gt;
*ID 430000 - 430099: Mixity sprl (www.mixity.be)&lt;br /&gt;
*ID 430100 - 430199: sgiraud&lt;br /&gt;
*ID 430200 - 430299: Merlion TI (www.merlion-si.com.br)&lt;br /&gt;
*ID 430300 - 431299: Libre Expert (www.libre-expert.com)&lt;br /&gt;
*ID 431300 - 431399: ptibogxiv (www.ptibogxiv.net)&lt;br /&gt;
*ID 431400 - 431499: Befox (www.befox.fr)&lt;br /&gt;
*ID 431500 - 431599: rue Béjo (www.ruebejo.fr)&lt;br /&gt;
*ID 431600 - 431699: Avizzeo (www.avizzeo.com)&lt;br /&gt;
*ID 431700 - 432199: Multisistemas (www.multisistemas.com.sv)&lt;br /&gt;
*ID 432200 - 432399: Burbuja - Chile (www.burbuja.cl)&lt;br /&gt;
*ID 432400 - 433399: INOVEA CONSEIL (https://www.inovea-conseil.com)&lt;br /&gt;
*ID 433400 - 434399: Rachid HRICH - Maroc (HricH ServiceS.)&lt;br /&gt;
*ID 434400 - 435399: Lance Bleakley - LanceIT (www.lanceit.net)&lt;br /&gt;
*ID 436000 - 436099: SOWEBIO (www.soweb.io)&lt;br /&gt;
*ID 436100 - 436199: CAP-REL (www.cap-rel.fr)&lt;br /&gt;
*ID 436200 - 436300: TDE-INFORMATIQUE (www.tde-informatique.fr)&lt;br /&gt;
*ID 436301 - 436349: Evarisk ([https://www.evarisk.com/id-module-dolibarr/ www.evarisk.com])&lt;br /&gt;
*ID 436350 - 436399: Eoxia ([https://www.eoxia.com/dolibarr/modules/ www.eoxia.com])&lt;br /&gt;
*ID 436400 - 437399: Mohamed AHERDANE - Morocco - IT Consultant ( www.wave.ma )&lt;br /&gt;
*ID 437400 - 437449: Martin Neubauer - Germany&lt;br /&gt;
*ID 437450 - 437599: Club1click (www.club1click.es)&lt;br /&gt;
*ID 437600 - 437629: Coulon Vincent (https://github.com/HoverEpic)&lt;br /&gt;
*ID 437630 - 437649: Aytechnet (https://www.aytechnet.fr/) - François Pons&lt;br /&gt;
*ID 437650 - 437699: LibreMaster (https://libremaster.com) - Christophe T.&lt;br /&gt;
*ID 437700 - 437749: STELLAR Broadband (https://www.stellarbb.com) - U.S.A. - Philip Laycock&lt;br /&gt;
*ID 437750 - 437799: DIGITA.LU Ajous Solutions&lt;br /&gt;
*ID 437800 - 437850: iProspective (https://iprospective.fr) - Mathieu Moulin&lt;br /&gt;
*ID 437851 - 437900: Theobald Groupe.&lt;br /&gt;
*ID 437901 - 437950: Neuronnexion (http://neuronnexion.coop)&lt;br /&gt;
*ID 437951 - 437952: jmbc - APIA-ASSO (https://www.apia-asso.fr)&lt;br /&gt;
*ID 437953 - 438002: IPCZEN SARL (https://www.ipczeninformatique.fr/)&lt;br /&gt;
*ID 438003 - 438052: FESF IT Department (https://fesf.org.pk)&lt;br /&gt;
*ID 438053 - 438399: &#039;&#039;&#039;Free (take ranges of 50 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 438400 - 439399: Tetras Libre - France - Développement logiciels libres (www.tetras-libre.fr)&lt;br /&gt;
*ID 439400 - 440399: Dolibarr-pro - France - Développement Dolibarr (www.dolibarr-pro.com)&lt;br /&gt;
*ID 440400 - 441399: Quidlab Co., Ltd - Thailand - ( www.quidlab.com )&lt;br /&gt;
*ID 441400 - 442399: Ide@log - France - (https://www.idealog-info.net) - Laurent Leblanc&lt;br /&gt;
*ID 442400 - 443399: Valerio Bianchi (www.valeriobianchi.com)&lt;br /&gt;
*ID 443400 - 444399: delassalle - France - (www.delassalle.fr) - Joseph Delassalle&lt;br /&gt;
*ID 444400 - 445399: Webartis - Maroc - (www.webartis.net) - François Dry&lt;br /&gt;
*ID 445400 - 445499: SCOP Au-delà des nuages - France&lt;br /&gt;
*ID 446000 - 446999: iouston (http://www.iouston.com) - France - Julien Marchand&lt;br /&gt;
*ID 447000 - 447999: rSanjoSEO - Rafael San José Tovar (www.rsanjoseo.com) - Spain&lt;br /&gt;
*ID 448000 - 448999: Code 42 (www.code42.fr)&lt;br /&gt;
*ID 449000 - 449999: TakePOS (www.takepos.com)&lt;br /&gt;
*ID 450000 - 450999: Pierre ARDOIN&lt;br /&gt;
*ID 451000 - 451999: Éditeur depordi.fr&lt;br /&gt;
*ID 452000 - 452999: Dylan NAKONG&lt;br /&gt;
*ID 453000 - 453999: Menahd Ouchenir - France - menahd-ouchenir.com&lt;br /&gt;
*ID 454000 - 454999: Withheld - Canada&lt;br /&gt;
*ID 455000 - 455999: Gaëtan MAISON - Info Libre @ Dom - France (https://www.infolibreadom.com)&lt;br /&gt;
*ID 456000 - 456999: Laurent LEBLEU - B.L.C. - Blue Line Company - Lille - France (www.bluelinecompany.fr/dolibarr)&lt;br /&gt;
*ID 457000 - 457999: Sébastien BOUCHER&lt;br /&gt;
*ID 458000 - 458999: Lester HERNÁNDEZ - Argentina - (freelancerlrhd@gmail.com)&lt;br /&gt;
*ID 459000 - 459999: Infopen - France&lt;br /&gt;
*ID 460000 - 460050: torvista - Spain&lt;br /&gt;
*ID 461000 - 461999: MEGALOGI - Maroc (www.erpcloud.ma)&lt;br /&gt;
*ID 462000 - 462999: Making Digital (www.making-digital.fr) - France&lt;br /&gt;
*ID 463000 - 463999: linx s.r.l.s.&lt;br /&gt;
*ID 464000 - 464999: NimbleCubed Inc. (www.nimblecubed.com)&lt;br /&gt;
*ID 465000 - 465999: Artefacts - CourantAlternatif&lt;br /&gt;
*ID 466000 - 466999: CDM Consultores - (www.cdm.guru)&lt;br /&gt;
*ID 467000 - 467999: M71 Service GmbH - (www.m71-service.de)&lt;br /&gt;
*ID 468000 - 468049: Clément Segonzac - France (clement.segonzac@gmail.com)&lt;br /&gt;
*ID 468050 - 468099: Flavien Belli - France (https://github.com/Marshlyin || belliflaviencontactpro@gmail.com)&lt;br /&gt;
*ID 468100 - 468119: Chl (https://code.bugness.org/Dolibarr)&lt;br /&gt;
*ID 468120 - 468170: Commotron GmbH (https://www.commotron.com/)&lt;br /&gt;
*ID 468171 - 468220: Infans Group (franck.lauby@infans.fr)&lt;br /&gt;
*ID 468221 - 468174 &#039;&#039;&#039;Free (take ranges of 50 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 468175 - 468199: Gaëlle Rauffet - France (kiwiscan.net)&lt;br /&gt;
*ID 468200 - 468250: Paulo Oliveira - Brasil (paulorcdo@gmail.com)&lt;br /&gt;
*ID 468251 - 468270:  CD-Systems - France (https://www.cd-systems.fr)&lt;br /&gt;
*ID 468300 - 468349: Uvensys - Germany (https://uvensys.de)&lt;br /&gt;
*ID 468350 - 468399 : Laudeco - Belgium (http://github.com/laudeco)&lt;br /&gt;
*ID 468400 - 468449 : Alexis LAURIER - France (https://www.alexislaurier.fr)&lt;br /&gt;
*ID 468450 - 468499 : Mehdi Belkhayat - Maroc (https://opensi.ma)&lt;br /&gt;
*ID 468500 - 468599 : InvIT GmbH - Germany (https://invit.sh)&lt;br /&gt;
*ID 468600 - 468649 : Ricardo Sequeira - Portugal (https://ricardo-sequeira.com)&lt;br /&gt;
*ID 468650 - 468699 : J-IT - Belgique (https://www.j-it.be)&lt;br /&gt;
*ID 468700 - 468749 : Fidesio - France (https://www.fidesio.com/)&lt;br /&gt;
*ID 468750 - 468799 : Sgestion - Spain (http://www.sgestion.net/)&lt;br /&gt;
*ID 468800 - 468849 : Denis JULIEN - Brasil (matrinxa@free.fr)&lt;br /&gt;
*ID 468850 - 468900: Mmariko - Module GED - Effios&lt;br /&gt;
*ID 468901 - 468950: Maazou Amadou Abdoul aziz - Maroc (yaronfada@gmail.com)&lt;br /&gt;
*ID 468951 - 469000: Alexis LAURIER - France (https://www.alexislaurier.fr)&lt;br /&gt;
*ID 469001 - 469050: John Livingston (https://github.com/JohnXLivingston/)&lt;br /&gt;
*ID 469051 - 469100: Macrorom ICT-services (https://macrorom.nl/)&lt;br /&gt;
*ID 469101 - 469150: HABOT IT - France (https://habot.it)&lt;br /&gt;
*ID 469151 - 469160: CaribbeanConsult.Com CCC - France Guadeloupe (https://dolibarr.ccc.gp)&lt;br /&gt;
*ID 469161 - 469171: GMBG - Portugal&lt;br /&gt;
*ID 469172 - 469192: BGi Lda - Portugal&lt;br /&gt;
*ID 469949 - 469999: Goldoweb (http://goldoweb.com)&lt;br /&gt;
*ID 470000 - 470999: Reindeer Digital (https://rdeer.cz)&lt;br /&gt;
*ID 471000 - 471099: CAP-REL (www.cap-rel.fr)&lt;br /&gt;
*ID 471100 - 471199: M. Morillon&lt;br /&gt;
*ID 471200 - 471209: Pablo Nuñez&lt;br /&gt;
*ID 481000 - 482000: Alhaidab-ITIS (https://alhaidab.dolibarr.sd)&lt;br /&gt;
*ID 482001 - 483000: Basix IT (https://www.basix.de)&lt;br /&gt;
*ID 483001 - 483050: SASCO SpA (https://www.sasco.cl)&lt;br /&gt;
*ID 483051 - 483100: WIP Engineering (https://www.wip-gmbh.com)&lt;br /&gt;
*ID 483101 - 483150: J.Kaiser&lt;br /&gt;
*ID 483151 - 483201: CodLines (https://www.codlines.com)&lt;br /&gt;
*ID 485000 - 485049: Gest Info Service Plus (contact@gest-plus.fr)&lt;br /&gt;
*ID 490000 - 490050: VOLD (https://vold.lu)&lt;br /&gt;
*ID 491000 - 491050: NORD ERP CRM (https://www.nord-erp-crm.fr/)&lt;br /&gt;
*ID 491051 - 491100: KJR-online (https://kjr-online.fr/)&lt;br /&gt;
*ID 491101 - 491149: eNova&lt;br /&gt;
*ID 491150 - 491200: App 4 Business&lt;br /&gt;
*ID 491201 - 491250: Mil24 (http://www.mil24.com.py)&lt;br /&gt;
*ID 491251 - 491301: M2AM&lt;br /&gt;
&lt;br /&gt;
DO NOT ADD RECORD HERE, PLEASE FILL HOLES FIRST !!!!&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
=ID &amp;gt; 500000=&lt;br /&gt;
&lt;br /&gt;
This range can&#039;t be reserved. It is a common range. If you don&#039;t plan to distribute your module, you can use an ID in this range with no need to reserve it.&lt;br /&gt;
&lt;br /&gt;
{{Flag en}}&lt;br /&gt;
If you don&#039;t already have reserved ids and need some, please don&#039;t use hazardous number and use a number higher than 500000, but it is better to ask a wiki account, and reserve your own range by editing the  100000 - 499999 range (50 ids at once, 1000 ids maximum per partner).&lt;br /&gt;
&lt;br /&gt;
{{Flag fr}}&lt;br /&gt;
Si vous n&#039;avez pas de numéros réservés et en avez besoin, n&#039;utilisez pas de chiffres au hasard et utilisez une valeur supérieure à 500000, toutefois, il est préférable d&#039;obtenir un compte wiki, et  réserver vous-même votre plage en ajoutant votre entrée dans la zone 100000 - 499999 (par lot de 50 d&#039;abord, pas plus de 1000 numéros par partenaire).&lt;br /&gt;
&lt;br /&gt;
{{Flag sp}}&lt;br /&gt;
Si no dispone de número reservado y necesita, no use cifras redondeadas y usa un valor superior a 500000. Si tiene una cuenta wiki, puede reservarse usted mismo sus id añadiendo su entrada en la zona 100000 - 499999 (no más de 1000 id por partner).&lt;/div&gt;</summary>
		<author><name>ShengGang</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=List_of_modules_id&amp;diff=58646</id>
		<title>List of modules id</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=List_of_modules_id&amp;diff=58646"/>
		<updated>2023-11-06T05:55:41Z</updated>

		<summary type="html">&lt;p&gt;ShengGang: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TemplateDocDevEn}}&lt;br /&gt;
{{TemplateDocDevEs}}&lt;br /&gt;
{{TemplateDocDevFr}}&lt;br /&gt;
{{TemplateDocDevZh}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Flag en}}&lt;br /&gt;
This page list all reserved modules numbers / ID. If you build or want to build your own modules (like thi , you should take an ID range here. Please pick range into existing holes first.&lt;br /&gt;
&lt;br /&gt;
{{Flag fr}}&lt;br /&gt;
Cette page recense tous les numéros / ID réservés de modules. Si vous avez réalisé ou voulez réaliser vos propres modules (comme les [[:Category:Modules complémentaires|modules complémentaires suivant]]), vous devriez prendre une plage d&#039;ID ici. Merci de prendre dans les trous existant en priorité !&lt;br /&gt;
&lt;br /&gt;
{{Flag sp}}&lt;br /&gt;
Esta página contiene un listado de todos los id reservados para los módulos. Si ha creado o quiere realizar sus propios módulos, (como estos [[:Category:Módulos_complementarios|módulos complementarios]]), deberá reservarse un rango de ID aquí.&lt;br /&gt;
&lt;br /&gt;
{{Flag zh}}&lt;br /&gt;
&lt;br /&gt;
此页面列出了所有保留的模块ID/编号。如果您正在构建或想要构建自己的模块（如 [[:Category:Complementary_modules|扩展模块]]），您应该在此处声明一个ID范围。感谢您优先考虑现有空当！&lt;br /&gt;
&lt;br /&gt;
=ID 0 - 99999=&lt;br /&gt;
{{Flag en}}&lt;br /&gt;
Reserved for Dolibarr&#039;s internal modules.&lt;br /&gt;
&lt;br /&gt;
{{Flag fr}}&lt;br /&gt;
Réservé aux modules internes de Dolibarr.&lt;br /&gt;
&lt;br /&gt;
{{Flag sp}}&lt;br /&gt;
Reservado a los módulos internos de Dolibarr.&lt;br /&gt;
&lt;br /&gt;
=ID 100000 - 499999=&lt;br /&gt;
{{Flag en}} &lt;br /&gt;
&#039;&#039;&#039;Reserved area for editors in need for an ID range. You can edit this page to add your own range (take a range of 50 numbers only the first time, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Flag fr}}Zone réservée aux éditeurs qui ont besoin d&#039;une plage d&#039;ID spécifiques. Vous pouvez modifier cette page pour réserver votre plage (limitée à 50 valeurs la première fois, demandez nous pour plus)&lt;br /&gt;
&lt;br /&gt;
{{Flag sp}}&lt;br /&gt;
Área reservada para los partners que necesiten un rango de ID. Puede modificar esta página para reservar su rango (limitado a 50 valores por editor)&lt;br /&gt;
&lt;br /&gt;
[[File:Warning.png]] If you reserve more than 50, we may automatically change your reservation range without information and you may experience conflicts with other modules in a future, so please follow the rules!&lt;br /&gt;
&lt;br /&gt;
*ID 100000 - 100999: OpenThink (http://www.openthink.be)&lt;br /&gt;
*ID 101000 - 101999: NLTechno (https://www.nltechno.com)&lt;br /&gt;
*ID 102000 - 102999: Tiaris (http://www.tiaris.fr)&lt;br /&gt;
*ID 103000 - 103999: Open-concept.pro (http://www.open-concept.pro)&lt;br /&gt;
*ID 104000 - 104999: ATM Consulting (http://www.atm-consulting.fr)&lt;br /&gt;
*ID 105000 - 105999: GPC.solutions&lt;br /&gt;
*ID 106000 - 106999: PHPASSO&lt;br /&gt;
*ID 107000 - 107999: TecLib (http://www.teclib.com) / Auguria (http://www.auguria.net)&lt;br /&gt;
*ID 108000 - 108999: ETHICWEB&lt;br /&gt;
*ID 109000 - 109999: Aplose ([http://www.aplose.fr https://www.aplose.fr])&lt;br /&gt;
*ID 110000 - 110999: Librethic (https://librethic.io)&lt;br /&gt;
*ID 111000 - 111999: Asset IT (www.assetit.ch)&lt;br /&gt;
*ID 112000 - 112999: Aarboard AG (www.aarboard.ch)&lt;br /&gt;
*ID 113000 - 113999: Asilib - Alexandre Spangaro&lt;br /&gt;
*ID 114000 - 114999: Iceleaf OÜ&lt;br /&gt;
*ID 115000 - 115999: 2A2C Conseil - Cyril ZEKSER&lt;br /&gt;
*ID 116000 - 116999: Wolftec GmbH&lt;br /&gt;
*ID 117000 - 117999: Oscim (http://www.oscim.fr)&lt;br /&gt;
*ID 118000 - 118999: Oarces Web (dev.oarces.com)&lt;br /&gt;
*ID 119000 - 119999: Manuel Berrocal - Absolacom&lt;br /&gt;
*ID 120000 - 120999: Régis Houssin (http://www.inodbox.com)&lt;br /&gt;
*ID 121000 - 121999: Oscss - Shop&lt;br /&gt;
*ID 122000 - 122999: MrSof - la Nation du Web&lt;br /&gt;
*ID 123000 - 123999: Bruno Généré (webiseasy.org)&lt;br /&gt;
*ID 124000 - 124999: backbone internet service (www.backbone.co.at)&lt;br /&gt;
*ID 125000 - 125999: ProgSI (www.progsi.ma)&lt;br /&gt;
*ID 126000 - 126999: Catalanet&lt;br /&gt;
*ID 127000 - 127999: Virgilio Filho pt-BR Brasil (@dolibarr.br)&lt;br /&gt;
*ID 128000 - 128999: Nicolas Frappé France (www.sospc.info)&lt;br /&gt;
*ID 129000 - 129999: Adeo-Informatique&lt;br /&gt;
*ID 130000 - 130999: Technicks ICT (http://www.technicks.eu)&lt;br /&gt;
*ID 131000 - 131999: Joan Louis (itaca.fr)&lt;br /&gt;
*ID 132000 - 132999: Jean-Marie Arsac (https://azimut.fr)&lt;br /&gt;
*ID 133000 - 133999: Oriel Systems Ltd, UK. (www.orielsystems.com)&lt;br /&gt;
*ID 134000 - 134999: ALSOFT PVT. LTD. (https://www.alsoft.org)&lt;br /&gt;
*ID 135000 - 135999: Net-Logic (https://netlogic.fr)&lt;br /&gt;
*ID 136000 - 136050: MONA.RE - France&lt;br /&gt;
*ID 136051 - 136099: La Vida Marketing&lt;br /&gt;
*ID 136100 - 136149: Synergies-Tech France. (https://www.synergies-france.fr/)&lt;br /&gt;
*ID 136150 - 136199: Lyta&lt;br /&gt;
*ID 136200 - 136219: Maison Théophile Leclerc&lt;br /&gt;
*ID 136220 - 136270: SegoFount - Spain&lt;br /&gt;
*ID 136271 - 138999: &#039;&#039;&#039;Free (take ranges of 50 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 139000 - 139999: Synergies-Tech France. (https://www.synergies-france.fr/)&lt;br /&gt;
*ID 140000 - 140999: Altairis (http://altairis.fr)&lt;br /&gt;
*ID 141000 - 141050: Projet2Team (https://www.projet2team.fr)&lt;br /&gt;
*ID 141051 - 141099: Elistair (http://elistair.com)&lt;br /&gt;
*ID 141100 - 141149: Blue Networks Technologies (https://www.blnt.fr)&lt;br /&gt;
*ID 141150 - 141199: Mainlab S.r.l. (https://www.mainlabonline.it)&lt;br /&gt;
*ID 141150 - 141199: Florian DUFOURG - France&lt;br /&gt;
*ID 142000 - 142049: ITANéA (https://www.itanea.fr)&lt;br /&gt;
*ID 142050 - 142099: ERP Consulting NZ ([https://www.erpconsulting.co.nz www.erpconsulting.co.nz])&lt;br /&gt;
*ID 142100 - 142149: Bloxera GmbH (https://www.bloxera.com)&lt;br /&gt;
*ID 142150 - 142199: Evangelos Souglakos - Greece&lt;br /&gt;
*ID 142200 - 142249: Luc CALARESU - France&lt;br /&gt;
*ID 142250 - 142299: OmnIT Services - Belgique (https://www.omnitservices.biz)&lt;br /&gt;
*ID 142300 - 142349: Gwadeyes - Guadeloupe (https://www.gwadeyes-informatique.com/)&lt;br /&gt;
*ID 142350 - 142399: Solution Libre (https://www.solution-libre.fr/)&lt;br /&gt;
*ID 142400 - 142449: Res Digital (https://res.digital)&lt;br /&gt;
*ID 149000 - 149999: SydTech - America Central (https://www.sydtech.io/)&lt;br /&gt;
*ID 150000 - 150999: Jeffinfo&lt;br /&gt;
*ID 151000 - 151999: Konverseo (https://konverseo.com)&lt;br /&gt;
*ID 152000 - 152049: Tanguy Pénet (http://tanguype.net)&lt;br /&gt;
*ID 160000 - 160999: Charles-François BENKE (http://www.patas-monkey.com)&lt;br /&gt;
*ID 161000 - 161999: Abbes Bahfir (http://dolipar.org)&lt;br /&gt;
*ID 162000 - 162999: Jacques Rébiscoul&lt;br /&gt;
*ID 163000 - 163999: Open-DSI (https://www.open-dsi.fr)&lt;br /&gt;
*ID 164000 - 164999: Pixelada S. Coop. And. (https://pixelada.org)&lt;br /&gt;
*ID 165000 - 165049: DovConnect&lt;br /&gt;
*ID 165050 - 165099: Mind Operated Systems (https://www.mosystems.biz)&lt;br /&gt;
*ID 165100 - 165150: SD-Formation (https://sdformation.fr)&lt;br /&gt;
*ID 165151 - 165199: NUM&#039;X (https://www.numx-sets.eu)&lt;br /&gt;
*ID 165200 - 165249: Benjam Préjent (https://www.benjam-prejent.fr)&lt;br /&gt;
*ID 165250 - 165299: Dhi Loka Private Limited, India (https://www.dhiloka.com)&lt;br /&gt;
*ID 170000 - 170999: TRIDENT CONSULTING LTD (www.tridentdxb.com)&lt;br /&gt;
*ID 171000 - 171999: LVSInformatique (www.lvsinformatique.com)&lt;br /&gt;
*ID 172000 - 172299: Ray Soft-Systems (https://www.ray-soft-systems.com)&lt;br /&gt;
*ID 172300 - 172349: Günter Lukas Consulting (https://gl.co.at)&lt;br /&gt;
*ID 172350 - 172399: MB Informatique (https://www.mb-informatique.fr)&lt;br /&gt;
*ID 172400 - 172449: Professional Structures Limited (https://pstructures.com)&lt;br /&gt;
*ID 172450 - 172699: IT-BS (https://www.it-bs.fr)&lt;br /&gt;
*ID 172700 - 172749: Indelog (https://www.indelog.fr)&lt;br /&gt;
*ID 172750 - 172799: NS-INFO90 (https://www.ns-info90.fr)&lt;br /&gt;
*ID 180000 - 180999: Triangle Ingénierie&lt;br /&gt;
*ID 181000 - 181999: TI Sin Problemas (https://www.tisinproblemas.com)&lt;br /&gt;
*ID 182000 - 182049: Chipserv Pawel Wlizlo (https://www.testware.it)&lt;br /&gt;
*ID 183000 - 183999: BB2A Anthony Berton (https://www.bb2a.fr)&lt;br /&gt;
*ID 184000 - 184999: DPS PRINTING &amp;amp; DOCUMENTS SOCIEDAD ANONIMA (https://www.dps-lat.com)&lt;br /&gt;
*ID 190000 - 190999: Diciannove (http://19.coop)&lt;br /&gt;
*ID 191000 - 191999: Elonet (https://elonet.fr)&lt;br /&gt;
*ID 199000 - 199999: RFMS&lt;br /&gt;
*ID 200000 - 200999: Noxiome&lt;br /&gt;
*ID 201000 - 201999: Sasa Ostrouska (saxa)&lt;br /&gt;
*ID 202000 - 202999: Z-Application&lt;br /&gt;
*ID 203000 - 203099: Elidee - elidee.com&lt;br /&gt;
*ID 203100 - 203999: Garcia MICHEL (soamichel.fr)&lt;br /&gt;
*ID 204000 - 204999: Ari Elbaz elarifr - accedinfo.com&lt;br /&gt;
*ID 205000 - 205999: Kreiz IT&lt;br /&gt;
*ID 206000 - 206999: GBINFO (www.gbinfo.fr)&lt;br /&gt;
*ID 207000 - 207099: MacroProg (https://www.macroprog.com)&lt;br /&gt;
*ID 207100 - 207149: Reactiva Software&lt;br /&gt;
*ID 207150 - 207199: Ndejje University Water Research and Development Centre ([https://github.com/NDUWRDC/LIMS/])&lt;br /&gt;
*ID 207200 - 207299: Massaoud Bouzenad ([https://www.dzprod.net dzprod.net])&lt;br /&gt;
*ID 207300 - 207349: Ksar&lt;br /&gt;
*ID 207350 - 207399: Easylinux (www.easylinux.fr)&lt;br /&gt;
*ID 222000 - 222999:  dolibit  (https://www.dolibit.de)&lt;br /&gt;
*ID 230000 - 230049: Unareil (https://www.unareil.eu)&lt;br /&gt;
*ID 230050 - 230099: Lyra Network (https://www.lyra.com/)&lt;br /&gt;
*ID 230100 - 230149: Gheorghe Iftimi - CTW - RO&lt;br /&gt;
*ID 230150 - 230199: MEMA Machinery &amp;amp; Tools (https://www.mema.be)&lt;br /&gt;
*ID 230200 - 230249: Teleassist&lt;br /&gt;
*ID 230250 - 230299: Nh Developer&lt;br /&gt;
*ID 230300 - 230499: Chickenforce/code-chicken, IT Services Hahn (https://github.com/code-chicken [http://itservices-hahn.de/ https://itservices-hahn.de])&lt;br /&gt;
*ID 230500 - 230549: Hidup Consulting (https://consulting.hidup.io)&lt;br /&gt;
*ID 230550 - 230599 : CMR Conseil (https://www.weblockup.fr)&lt;br /&gt;
*ID 230600 - 230649 : aFreeMind Studio&lt;br /&gt;
*ID 230650 - 230699 : Unideal (https://www.uni-deal.com)&lt;br /&gt;
*ID 230700 - 230749 : DevLansdes (https://devlandes.com/)&lt;br /&gt;
*ID 262700 - 262799: Scopen (https://www.scopen.fr)&lt;br /&gt;
*ID 274250 - 274299: Nerv Project (www.nerv-project.eu)&lt;br /&gt;
*ID 274300 - 274349: Knowhere Consulting S.L. (https://www.knowhere-consulting.eu)&lt;br /&gt;
*ID 274350 - 274399: Milen karaganski (https://blacktiehost.com)&lt;br /&gt;
*ID 274400 - 274449: Vincent MAURY ([https://www.timgroup.fr www.timgroup.fr])&lt;br /&gt;
*ID 274450 - 274499: Daraelmin&lt;br /&gt;
*ID 274500 - 274550: Emilie LAFORET (http://www.ermvallon.com)&lt;br /&gt;
*ID 279000 - 279049: VSDigital Electronics (https://vsdigital.ar) - Argentina&lt;br /&gt;
*ID 280000 - 280050: Bingroup (https://www.beinng.com)&lt;br /&gt;
*ID 280051 - 280100: Medialta (https://medialta.com)&lt;br /&gt;
*ID 290000 - 290099: BNS - Project doliBRA ([https://www.beinng.com https://www.bns.net.br]) - Brasil&lt;br /&gt;
*ID 300000 - 300049: RapidProgress (https://www.rapidprogress.eu) - Bulgaria&lt;br /&gt;
*ID 300050 : 300099: M@ Solution (https://www.ma-solution.fr/)&lt;br /&gt;
*ID 300100 : 300149: LAVA RUN (https://www.lavarun.re)&lt;br /&gt;
*ID 300200 : 300249 : Computences (https://www.computences.com/)&lt;br /&gt;
*ID 300250 : 300299 : LEVEL IT (https://levelit.com.ar)&lt;br /&gt;
*ID 300300 : 300349 : Progiseize (https://progiseize.fr)&lt;br /&gt;
*ID 300350 - 300399: MB Informatique (https://www.mb-informatique.fr)&lt;br /&gt;
*ID 300400 - 300449: Anouar Touati&lt;br /&gt;
*ID 300450 - 300499: Martin Danger&lt;br /&gt;
*ID 300500 - 301499: Whale Blows&lt;br /&gt;
*ID 301500 - 301549: Tom Trust - International&lt;br /&gt;
*ID 302500 - 302549: Diamubi (https://diamubi.com)&lt;br /&gt;
*ID 302550 - 302599: Datolab (https://www.datolab.com)&lt;br /&gt;
*ID 302600 - 302649: DuMaCo (https://www.dumaco.de)&lt;br /&gt;
*ID 302650 - 302699: Resilio SA&lt;br /&gt;
*ID 302700 - 302749: Aroga&lt;br /&gt;
*ID 302750 - 302799: Productivix (https://www.productivix.com)&lt;br /&gt;
*ID 302800 - 302849: Slibzz&lt;br /&gt;
*ID 302850 - 302899: idea design (https://ideadesign.dz)&lt;br /&gt;
*ID 302900 - 302949: AL MISBAH INFORMATIQUE (https://www.almisbah.ma)&lt;br /&gt;
*ID 302950 - 302999: Atis Solutions - France&lt;br /&gt;
*ID 303000 - 303499: Obixav - Nigeria&lt;br /&gt;
*ID 303500 - 303550: buschler plus GmbH, Germany (https://buschler.plus)&lt;br /&gt;
*ID 303551 - 303599: Prestalidaire - France (https://prestalidaire.com)&lt;br /&gt;
*ID 314000 - 314049: Ruemmler IT Solutions (https://www.ruemmler.net)&lt;br /&gt;
*ID 320000 - 320999: Novus Studios (www.novusstudios.it)&lt;br /&gt;
*ID 321000 - 321999: AtooNet (http://www.atoo-net.com)&lt;br /&gt;
*ID 332000 - 332099: Gecka (https://gecka.nc)&lt;br /&gt;
*ID 332100 - 332149: Agence Milkshake (http://agencemilkshake.com)&lt;br /&gt;
*ID 332150 - 332199: Daniel Prowald IT – Service (https://prowald-it.de)&lt;br /&gt;
*ID 332200 - 332249: UNITICE (https://unitice.com)&lt;br /&gt;
*ID 332250 - 332299: Sidonie Moulart&lt;br /&gt;
*ID 332300 - 332349: LTDJ (Antonin MARCHAL - Le Temple du Jeu)&lt;br /&gt;
*ID 330000 - 330049: XTEC Industries (www.xtec-ind.com)&lt;br /&gt;
*ID 330050 - 330099: 10100 S.R.L. - (www.10100.to)&lt;br /&gt;
*ID 330100 - 330149: AES Dana SRL (https://aes-dana.be)&lt;br /&gt;
*ID 330150 - 330199: Freshcore (https://www.freshcore.fr)&lt;br /&gt;
*ID 330200 - 399999: (take ranges of 50 only please, ask us for more)&lt;br /&gt;
*ID 333300 - 333349: Sense Africa (http://sense.africa)&lt;br /&gt;
*ID 350000 - 350049: SOUNDOU &amp;amp; MIDAS (https://www.soundou.org/)&lt;br /&gt;
*ID 400000 - 400999: 2byte.es (http://www.2byte.es)&lt;br /&gt;
*ID 401000 - 401999: B&amp;amp;D Informática&lt;br /&gt;
*ID 402000 - 402999: Marcos García de La Fuente (marcosgdf)&lt;br /&gt;
*ID 403000 - 403999: Sergibyte&lt;br /&gt;
*ID 404000 - 404999: Aikhan&lt;br /&gt;
*ID 405000 - 405999: AIME (http://www.aime.mx)&lt;br /&gt;
*ID 406000 - 406999: Som Núvol (https://somnuvol.coop)&lt;br /&gt;
*ID 409000 - 409999: LliureTIC (https://www.lliuretic.cat)&lt;br /&gt;
*ID 410000 - 410999: DoliGov&lt;br /&gt;
*ID 420000 - 420099: BBS Concept&lt;br /&gt;
*ID 420100 - 420199: LeMousticProduction (www.lemousticproduction.info) -&amp;lt; module DoliRH&lt;br /&gt;
*ID 420200 - 421199: VatCheck (www.abnc.be)&lt;br /&gt;
*ID 422200 - 422999: Artaban (http://artaban.fr)&lt;br /&gt;
*ID 423000 - 423050: cyberesprit&lt;br /&gt;
*ID 423051 - 423099: R.Bossard&lt;br /&gt;
*ID 423100 - 423199: Joliciel (www.joliciel.fr)&lt;br /&gt;
*ID 424000 - 424049: A3sys - Mon-Dolibarr (http://www.mon-dolibarr.fr) by Philazerty&lt;br /&gt;
*ID 424050 - 424099: Pragma-tech (www.pragma-tech.fr)&lt;br /&gt;
*ID 424100 - 424149: Ohoo Solutions (http://www.ohoosolutions.com)&lt;br /&gt;
*ID 424150 - 424199: DAGARCAM Informática (https://www.dagarcam.com/)&lt;br /&gt;
*ID 424200 - 424999: Lab51 (https://github.com/lab51org)&lt;br /&gt;
*ID 425000 - 425999: Sébastien SERRE Thivinfo (www.thivinfo.com)&lt;br /&gt;
*ID 426000 - 426099: Arkesis-Solution&lt;br /&gt;
*ID 426100 - 426149: GetLandy (www.getlandy.com)&lt;br /&gt;
*ID 426150 - 426649: OOB Software&lt;br /&gt;
*ID 426650 - 426849: Soft-Task Serviços e Sistemas (www.soft-task.com.br)&lt;br /&gt;
*ID 426850 - 427000: Bruno Caldas (https://github.com/BCaldas)&lt;br /&gt;
*ID 427001 - 427999: Kevin GUERRIER (alias xcl.saian)&lt;br /&gt;
*ID 428000 - 428099: af83&lt;br /&gt;
*ID 428100 - 428199: Arnaud Serrut - Adalon&lt;br /&gt;
*ID 428200 - 428249: imschweiler consulting (http://www.imschweiler-consulting.de&#039;&#039;&#039;&amp;lt;nowiki/&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
*ID 428250 - 428299: AL1FO&lt;br /&gt;
*ID 428300 - 428349: Federico García-Patiño Barbolani (&amp;lt;federico.garcia.patino@gmail.com&amp;gt;)&lt;br /&gt;
*ID 428350 - 428399: INTM Groupe - France (www.intm.com)&lt;br /&gt;
*ID 428400 - 428449: Nick Fragoulis - Greece&lt;br /&gt;
*ID 428450 - 428499: Letusgeek - France&lt;br /&gt;
*id 428500 - 428549 hkwhitten - USA&lt;br /&gt;
*ID 428550 - 428999 SmartOne&lt;br /&gt;
*ID 429000 - 429999: induslab&lt;br /&gt;
*ID 430000 - 430099: Mixity sprl (www.mixity.be)&lt;br /&gt;
*ID 430100 - 430199: sgiraud&lt;br /&gt;
*ID 430200 - 430299: Merlion TI (www.merlion-si.com.br)&lt;br /&gt;
*ID 430300 - 431299: Libre Expert (www.libre-expert.com)&lt;br /&gt;
*ID 431300 - 431399: ptibogxiv (www.ptibogxiv.net)&lt;br /&gt;
*ID 431400 - 431499: Befox (www.befox.fr)&lt;br /&gt;
*ID 431500 - 431599: rue Béjo (www.ruebejo.fr)&lt;br /&gt;
*ID 431600 - 431699: Avizzeo (www.avizzeo.com)&lt;br /&gt;
*ID 431700 - 432199: Multisistemas (www.multisistemas.com.sv)&lt;br /&gt;
*ID 432200 - 432399: Burbuja - Chile (www.burbuja.cl)&lt;br /&gt;
*ID 432400 - 433399: INOVEA CONSEIL (https://www.inovea-conseil.com)&lt;br /&gt;
*ID 433400 - 434399: Rachid HRICH - Maroc (HricH ServiceS.)&lt;br /&gt;
*ID 434400 - 435399: Lance Bleakley - LanceIT (www.lanceit.net)&lt;br /&gt;
*ID 436000 - 436099: SOWEBIO (www.soweb.io)&lt;br /&gt;
*ID 436100 - 436199: CAP-REL (www.cap-rel.fr)&lt;br /&gt;
*ID 436200 - 436300: TDE-INFORMATIQUE (www.tde-informatique.fr)&lt;br /&gt;
*ID 436301 - 436349: Evarisk ([https://www.evarisk.com/id-module-dolibarr/ www.evarisk.com])&lt;br /&gt;
*ID 436350 - 436399: Eoxia ([https://www.eoxia.com/dolibarr/modules/ www.eoxia.com])&lt;br /&gt;
*ID 436400 - 437399: Mohamed AHERDANE - Morocco - IT Consultant ( www.wave.ma )&lt;br /&gt;
*ID 437400 - 437449: Martin Neubauer - Germany&lt;br /&gt;
*ID 437450 - 437599: Club1click (www.club1click.es)&lt;br /&gt;
*ID 437600 - 437629: Coulon Vincent (https://github.com/HoverEpic)&lt;br /&gt;
*ID 437630 - 437649: Aytechnet (https://www.aytechnet.fr/) - François Pons&lt;br /&gt;
*ID 437650 - 437699: LibreMaster (https://libremaster.com) - Christophe T.&lt;br /&gt;
*ID 437700 - 437749: STELLAR Broadband (https://www.stellarbb.com) - U.S.A. - Philip Laycock&lt;br /&gt;
*ID 437750 - 437799: DIGITA.LU Ajous Solutions&lt;br /&gt;
*ID 437800 - 437850: iProspective (https://iprospective.fr) - Mathieu Moulin&lt;br /&gt;
*ID 437851 - 437900: Theobald Groupe.&lt;br /&gt;
*ID 437901 - 437950: Neuronnexion (http://neuronnexion.coop)&lt;br /&gt;
*ID 437951 - 437952: jmbc - APIA-ASSO (https://www.apia-asso.fr)&lt;br /&gt;
*ID 437953 - 438002: IPCZEN SARL (https://www.ipczeninformatique.fr/)&lt;br /&gt;
*ID 438003 - 438052: FESF IT Department (https://fesf.org.pk)&lt;br /&gt;
*ID 438053 - 438399: &#039;&#039;&#039;Free (take ranges of 50 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 438400 - 439399: Tetras Libre - France - Développement logiciels libres (www.tetras-libre.fr)&lt;br /&gt;
*ID 439400 - 440399: Dolibarr-pro - France - Développement Dolibarr (www.dolibarr-pro.com)&lt;br /&gt;
*ID 440400 - 441399: Quidlab Co., Ltd - Thailand - ( www.quidlab.com )&lt;br /&gt;
*ID 441400 - 442399: Ide@log - France - (https://www.idealog-info.net) - Laurent Leblanc&lt;br /&gt;
*ID 442400 - 443399: Valerio Bianchi (www.valeriobianchi.com)&lt;br /&gt;
*ID 443400 - 444399: delassalle - France - (www.delassalle.fr) - Joseph Delassalle&lt;br /&gt;
*ID 444400 - 445399: Webartis - Maroc - (www.webartis.net) - François Dry&lt;br /&gt;
*ID 445400 - 445499: SCOP Au-delà des nuages - France&lt;br /&gt;
*ID 446000 - 446999: iouston (http://www.iouston.com) - France - Julien Marchand&lt;br /&gt;
*ID 447000 - 447999: rSanjoSEO - Rafael San José Tovar (www.rsanjoseo.com) - Spain&lt;br /&gt;
*ID 448000 - 448999: Code 42 (www.code42.fr)&lt;br /&gt;
*ID 449000 - 449999: TakePOS (www.takepos.com)&lt;br /&gt;
*ID 450000 - 450999: Pierre ARDOIN&lt;br /&gt;
*ID 451000 - 451999: Éditeur depordi.fr&lt;br /&gt;
*ID 452000 - 452999: Dylan NAKONG&lt;br /&gt;
*ID 453000 - 453999: Menahd Ouchenir - France - menahd-ouchenir.com&lt;br /&gt;
*ID 454000 - 454999: Withheld - Canada&lt;br /&gt;
*ID 455000 - 455999: Gaëtan MAISON - Info Libre @ Dom - France (https://www.infolibreadom.com)&lt;br /&gt;
*ID 456000 - 456999: Laurent LEBLEU - B.L.C. - Blue Line Company - Lille - France (www.bluelinecompany.fr/dolibarr)&lt;br /&gt;
*ID 457000 - 457999: Sébastien BOUCHER&lt;br /&gt;
*ID 458000 - 458999: Lester HERNÁNDEZ - Argentina - (freelancerlrhd@gmail.com)&lt;br /&gt;
*ID 459000 - 459999: Infopen - France&lt;br /&gt;
*ID 460000 - 460050: torvista - Spain&lt;br /&gt;
*ID 461000 - 461999: MEGALOGI - Maroc (www.erpcloud.ma)&lt;br /&gt;
*ID 462000 - 462999: Making Digital (www.making-digital.fr) - France&lt;br /&gt;
*ID 463000 - 463999: linx s.r.l.s.&lt;br /&gt;
*ID 464000 - 464999: NimbleCubed Inc. (www.nimblecubed.com)&lt;br /&gt;
*ID 465000 - 465999: Artefacts - CourantAlternatif&lt;br /&gt;
*ID 466000 - 466999: CDM Consultores - (www.cdm.guru)&lt;br /&gt;
*ID 467000 - 467999: M71 Service GmbH - (www.m71-service.de)&lt;br /&gt;
*ID 468000 - 468049: Clément Segonzac - France (clement.segonzac@gmail.com)&lt;br /&gt;
*ID 468050 - 468099: Flavien Belli - France (https://github.com/Marshlyin || belliflaviencontactpro@gmail.com)&lt;br /&gt;
*ID 468100 - 468119: Chl (https://code.bugness.org/Dolibarr)&lt;br /&gt;
*ID 468120 - 468170: Commotron GmbH (https://www.commotron.com/)&lt;br /&gt;
*ID 468171 - 468220: Infans Group (franck.lauby@infans.fr)&lt;br /&gt;
*ID 468221 - 468174 &#039;&#039;&#039;Free (take ranges of 50 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 468175 - 468199: Gaëlle Rauffet - France (kiwiscan.net)&lt;br /&gt;
*ID 468200 - 468250: Paulo Oliveira - Brasil (paulorcdo@gmail.com)&lt;br /&gt;
*ID 468251 - 468270:  CD-Systems - France (https://www.cd-systems.fr)&lt;br /&gt;
*ID 468300 - 468349: Uvensys - Germany (https://uvensys.de)&lt;br /&gt;
*ID 468350 - 468399 : Laudeco - Belgium (http://github.com/laudeco)&lt;br /&gt;
*ID 468400 - 468449 : Alexis LAURIER - France (https://www.alexislaurier.fr)&lt;br /&gt;
*ID 468450 - 468499 : Mehdi Belkhayat - Maroc (https://opensi.ma)&lt;br /&gt;
*ID 468500 - 468599 : InvIT GmbH - Germany (https://invit.sh)&lt;br /&gt;
*ID 468600 - 468649 : Ricardo Sequeira - Portugal (https://ricardo-sequeira.com)&lt;br /&gt;
*ID 468650 - 468699 : J-IT - Belgique (https://www.j-it.be)&lt;br /&gt;
*ID 468700 - 468749 : Fidesio - France (https://www.fidesio.com/)&lt;br /&gt;
*ID 468750 - 468799 : Sgestion - Spain (http://www.sgestion.net/)&lt;br /&gt;
*ID 468800 - 468849 : Denis JULIEN - Brasil (matrinxa@free.fr)&lt;br /&gt;
*ID 468850 - 468900: Mmariko - Module GED - Effios&lt;br /&gt;
*ID 468901 - 468950: Maazou Amadou Abdoul aziz - Maroc (yaronfada@gmail.com)&lt;br /&gt;
*ID 468951 - 469000: Alexis LAURIER - France (https://www.alexislaurier.fr)&lt;br /&gt;
*ID 469001 - 469050: John Livingston (https://github.com/JohnXLivingston/)&lt;br /&gt;
*ID 469051 - 469100: Macrorom ICT-services (https://macrorom.nl/)&lt;br /&gt;
*ID 469101 - 469150: HABOT IT - France (https://habot.it)&lt;br /&gt;
*ID 469151 - 469160: CaribbeanConsult.Com CCC - France Guadeloupe (https://dolibarr.ccc.gp)&lt;br /&gt;
*ID 469161 - 469171: GMBG - Portugal&lt;br /&gt;
*ID 469172 - 469192: BGi Lda - Portugal&lt;br /&gt;
*ID 469949 - 469999: Goldoweb (http://goldoweb.com)&lt;br /&gt;
*ID 470000 - 470999: Reindeer Digital (https://rdeer.cz)&lt;br /&gt;
*ID 471000 - 471099: CAP-REL (www.cap-rel.fr)&lt;br /&gt;
*ID 471100 - 471199: M. Morillon&lt;br /&gt;
*ID 471200 - 471209: Pablo Nuñez&lt;br /&gt;
*ID 481000 - 482000: Alhaidab-ITIS (https://alhaidab.dolibarr.sd)&lt;br /&gt;
*ID 482001 - 483000: Basix IT (https://www.basix.de)&lt;br /&gt;
*ID 483001 - 483050: SASCO SpA (https://www.sasco.cl)&lt;br /&gt;
*ID 483051 - 483100: WIP Engineering (https://www.wip-gmbh.com)&lt;br /&gt;
*ID 483101 - 483150: J.Kaiser&lt;br /&gt;
*ID 483151 - 483201: CodLines (https://www.codlines.com)&lt;br /&gt;
*ID 485000 - 485049: Gest Info Service Plus (contact@gest-plus.fr)&lt;br /&gt;
*ID 490000 - 490050: VOLD (https://vold.lu)&lt;br /&gt;
*ID 491000 - 491050: NORD ERP CRM (https://www.nord-erp-crm.fr/)&lt;br /&gt;
*ID 491051 - 491100: KJR-online (https://kjr-online.fr/)&lt;br /&gt;
*ID 491101 - 491149: eNova&lt;br /&gt;
*ID 491150 - 491200: App 4 Business&lt;br /&gt;
*ID 491201 - 491250: Mil24 (http://www.mil24.com.py)&lt;br /&gt;
*ID 491251 - 491301: M2AM&lt;br /&gt;
&lt;br /&gt;
DO NOT ADD RECORD HERE, PLEASE FILL HOLES FIRST !!!!&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
=ID &amp;gt; 500000=&lt;br /&gt;
&lt;br /&gt;
This range can&#039;t be reserved. It is a common range. If you don&#039;t plan to distribute your module, you can use an ID in this range with no need to reserve it.&lt;br /&gt;
&lt;br /&gt;
{{Flag en}}&lt;br /&gt;
If you don&#039;t already have reserved ids and need some, please don&#039;t use hazardous number and use a number higher than 500000, but it is better to ask a wiki account, and reserve your own range by editing the  100000 - 499999 range (50 ids at once, 1000 ids maximum per partner).&lt;br /&gt;
&lt;br /&gt;
{{Flag fr}}&lt;br /&gt;
Si vous n&#039;avez pas de numéros réservés et en avez besoin, n&#039;utilisez pas de chiffres au hasard et utilisez une valeur supérieure à 500000, toutefois, il est préférable d&#039;obtenir un compte wiki, et  réserver vous-même votre plage en ajoutant votre entrée dans la zone 100000 - 499999 (par lot de 50 d&#039;abord, pas plus de 1000 numéros par partenaire).&lt;br /&gt;
&lt;br /&gt;
{{Flag sp}}&lt;br /&gt;
Si no dispone de número reservado y necesita, no use cifras redondeadas y usa un valor superior a 500000. Si tiene una cuenta wiki, puede reservarse usted mismo sus id añadiendo su entrada en la zona 100000 - 499999 (no más de 1000 id por partner).&lt;/div&gt;</summary>
		<author><name>ShengGang</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=List_of_modules_id&amp;diff=58645</id>
		<title>List of modules id</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=List_of_modules_id&amp;diff=58645"/>
		<updated>2023-11-06T05:47:13Z</updated>

		<summary type="html">&lt;p&gt;ShengGang: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TemplateDocDevEn}}&lt;br /&gt;
{{TemplateDocDevEs}}&lt;br /&gt;
{{TemplateDocDevFr}}&lt;br /&gt;
{{TemplateDocDevZh}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Flag en}}&lt;br /&gt;
This page list all reserved modules numbers / ID. If you build or want to build your own modules (like this [[:Category:Complementary_modules|complementary module]]), you should take an ID range here. Please pick range into existing holes first.&lt;br /&gt;
&lt;br /&gt;
{{Flag fr}}&lt;br /&gt;
Cette page recense tous les numéros / ID réservés de modules. Si vous avez réalisé ou voulez réaliser vos propres modules (comme les [[:Category:Modules complémentaires|modules complémentaires suivant]]), vous devriez prendre une plage d&#039;ID ici. Merci de prendre dans les trous existant en priorité !&lt;br /&gt;
&lt;br /&gt;
{{Flag sp}}&lt;br /&gt;
Esta página contiene un listado de todos los id reservados para los módulos. Si ha creado o quiere realizar sus propios módulos, (como estos [[:Category:Módulos_complementarios|módulos complementarios]]), deberá reservarse un rango de ID aquí.&lt;br /&gt;
&lt;br /&gt;
{{Flag zh}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=ID 0 - 99999=&lt;br /&gt;
{{Flag en}}&lt;br /&gt;
Reserved for Dolibarr&#039;s internal modules.&lt;br /&gt;
&lt;br /&gt;
{{Flag fr}}&lt;br /&gt;
Réservé aux modules internes de Dolibarr.&lt;br /&gt;
&lt;br /&gt;
{{Flag sp}}&lt;br /&gt;
Reservado a los módulos internos de Dolibarr.&lt;br /&gt;
&lt;br /&gt;
=ID 100000 - 499999=&lt;br /&gt;
{{Flag en}} &lt;br /&gt;
&#039;&#039;&#039;Reserved area for editors in need for an ID range. You can edit this page to add your own range (take a range of 50 numbers only the first time, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Flag fr}}Zone réservée aux éditeurs qui ont besoin d&#039;une plage d&#039;ID spécifiques. Vous pouvez modifier cette page pour réserver votre plage (limitée à 50 valeurs la première fois, demandez nous pour plus)&lt;br /&gt;
&lt;br /&gt;
{{Flag sp}}&lt;br /&gt;
Área reservada para los partners que necesiten un rango de ID. Puede modificar esta página para reservar su rango (limitado a 50 valores por editor)&lt;br /&gt;
&lt;br /&gt;
[[File:Warning.png]] If you reserve more than 50, we may automatically change your reservation range without information and you may experience conflicts with other modules in a future, so please follow the rules!&lt;br /&gt;
&lt;br /&gt;
*ID 100000 - 100999: OpenThink (http://www.openthink.be)&lt;br /&gt;
*ID 101000 - 101999: NLTechno (https://www.nltechno.com)&lt;br /&gt;
*ID 102000 - 102999: Tiaris (http://www.tiaris.fr)&lt;br /&gt;
*ID 103000 - 103999: Open-concept.pro (http://www.open-concept.pro)&lt;br /&gt;
*ID 104000 - 104999: ATM Consulting (http://www.atm-consulting.fr)&lt;br /&gt;
*ID 105000 - 105999: GPC.solutions&lt;br /&gt;
*ID 106000 - 106999: PHPASSO&lt;br /&gt;
*ID 107000 - 107999: TecLib (http://www.teclib.com) / Auguria (http://www.auguria.net)&lt;br /&gt;
*ID 108000 - 108999: ETHICWEB&lt;br /&gt;
*ID 109000 - 109999: Aplose ([http://www.aplose.fr https://www.aplose.fr])&lt;br /&gt;
*ID 110000 - 110999: Librethic (https://librethic.io)&lt;br /&gt;
*ID 111000 - 111999: Asset IT (www.assetit.ch)&lt;br /&gt;
*ID 112000 - 112999: Aarboard AG (www.aarboard.ch)&lt;br /&gt;
*ID 113000 - 113999: Asilib - Alexandre Spangaro&lt;br /&gt;
*ID 114000 - 114999: Iceleaf OÜ&lt;br /&gt;
*ID 115000 - 115999: 2A2C Conseil - Cyril ZEKSER&lt;br /&gt;
*ID 116000 - 116999: Wolftec GmbH&lt;br /&gt;
*ID 117000 - 117999: Oscim (http://www.oscim.fr)&lt;br /&gt;
*ID 118000 - 118999: Oarces Web (dev.oarces.com)&lt;br /&gt;
*ID 119000 - 119999: Manuel Berrocal - Absolacom&lt;br /&gt;
*ID 120000 - 120999: Régis Houssin (http://www.inodbox.com)&lt;br /&gt;
*ID 121000 - 121999: Oscss - Shop&lt;br /&gt;
*ID 122000 - 122999: MrSof - la Nation du Web&lt;br /&gt;
*ID 123000 - 123999: Bruno Généré (webiseasy.org)&lt;br /&gt;
*ID 124000 - 124999: backbone internet service (www.backbone.co.at)&lt;br /&gt;
*ID 125000 - 125999: ProgSI (www.progsi.ma)&lt;br /&gt;
*ID 126000 - 126999: Catalanet&lt;br /&gt;
*ID 127000 - 127999: Virgilio Filho pt-BR Brasil (@dolibarr.br)&lt;br /&gt;
*ID 128000 - 128999: Nicolas Frappé France (www.sospc.info)&lt;br /&gt;
*ID 129000 - 129999: Adeo-Informatique&lt;br /&gt;
*ID 130000 - 130999: Technicks ICT (http://www.technicks.eu)&lt;br /&gt;
*ID 131000 - 131999: Joan Louis (itaca.fr)&lt;br /&gt;
*ID 132000 - 132999: Jean-Marie Arsac (https://azimut.fr)&lt;br /&gt;
*ID 133000 - 133999: Oriel Systems Ltd, UK. (www.orielsystems.com)&lt;br /&gt;
*ID 134000 - 134999: ALSOFT PVT. LTD. (https://www.alsoft.org)&lt;br /&gt;
*ID 135000 - 135999: Net-Logic (https://netlogic.fr)&lt;br /&gt;
*ID 136000 - 136050: MONA.RE - France&lt;br /&gt;
*ID 136051 - 136099: La Vida Marketing&lt;br /&gt;
*ID 136100 - 136149: Synergies-Tech France. (https://www.synergies-france.fr/)&lt;br /&gt;
*ID 136150 - 136199: Lyta&lt;br /&gt;
*ID 136200 - 136219: Maison Théophile Leclerc&lt;br /&gt;
*ID 136220 - 136270: SegoFount - Spain&lt;br /&gt;
*ID 136271 - 138999: &#039;&#039;&#039;Free (take ranges of 50 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 139000 - 139999: Synergies-Tech France. (https://www.synergies-france.fr/)&lt;br /&gt;
*ID 140000 - 140999: Altairis (http://altairis.fr)&lt;br /&gt;
*ID 141000 - 141050: Projet2Team (https://www.projet2team.fr)&lt;br /&gt;
*ID 141051 - 141099: Elistair (http://elistair.com)&lt;br /&gt;
*ID 141100 - 141149: Blue Networks Technologies (https://www.blnt.fr)&lt;br /&gt;
*ID 141150 - 141199: Mainlab S.r.l. (https://www.mainlabonline.it)&lt;br /&gt;
*ID 141150 - 141199: Florian DUFOURG - France&lt;br /&gt;
*ID 142000 - 142049: ITANéA (https://www.itanea.fr)&lt;br /&gt;
*ID 142050 - 142099: ERP Consulting NZ ([https://www.erpconsulting.co.nz www.erpconsulting.co.nz])&lt;br /&gt;
*ID 142100 - 142149: Bloxera GmbH (https://www.bloxera.com)&lt;br /&gt;
*ID 142150 - 142199: Evangelos Souglakos - Greece&lt;br /&gt;
*ID 142200 - 142249: Luc CALARESU - France&lt;br /&gt;
*ID 142250 - 142299: OmnIT Services - Belgique (https://www.omnitservices.biz)&lt;br /&gt;
*ID 142300 - 142349: Gwadeyes - Guadeloupe (https://www.gwadeyes-informatique.com/)&lt;br /&gt;
*ID 142350 - 142399: Solution Libre (https://www.solution-libre.fr/)&lt;br /&gt;
*ID 142400 - 142449: Res Digital (https://res.digital)&lt;br /&gt;
*ID 149000 - 149999: SydTech - America Central (https://www.sydtech.io/)&lt;br /&gt;
*ID 150000 - 150999: Jeffinfo&lt;br /&gt;
*ID 151000 - 151999: Konverseo (https://konverseo.com)&lt;br /&gt;
*ID 152000 - 152049: Tanguy Pénet (http://tanguype.net)&lt;br /&gt;
*ID 160000 - 160999: Charles-François BENKE (http://www.patas-monkey.com)&lt;br /&gt;
*ID 161000 - 161999: Abbes Bahfir (http://dolipar.org)&lt;br /&gt;
*ID 162000 - 162999: Jacques Rébiscoul&lt;br /&gt;
*ID 163000 - 163999: Open-DSI (https://www.open-dsi.fr)&lt;br /&gt;
*ID 164000 - 164999: Pixelada S. Coop. And. (https://pixelada.org)&lt;br /&gt;
*ID 165000 - 165049: DovConnect&lt;br /&gt;
*ID 165050 - 165099: Mind Operated Systems (https://www.mosystems.biz)&lt;br /&gt;
*ID 165100 - 165150: SD-Formation (https://sdformation.fr)&lt;br /&gt;
*ID 165151 - 165199: NUM&#039;X (https://www.numx-sets.eu)&lt;br /&gt;
*ID 165200 - 165249: Benjam Préjent (https://www.benjam-prejent.fr)&lt;br /&gt;
*ID 165250 - 165299: Dhi Loka Private Limited, India (https://www.dhiloka.com)&lt;br /&gt;
*ID 170000 - 170999: TRIDENT CONSULTING LTD (www.tridentdxb.com)&lt;br /&gt;
*ID 171000 - 171999: LVSInformatique (www.lvsinformatique.com)&lt;br /&gt;
*ID 172000 - 172299: Ray Soft-Systems (https://www.ray-soft-systems.com)&lt;br /&gt;
*ID 172300 - 172349: Günter Lukas Consulting (https://gl.co.at)&lt;br /&gt;
*ID 172350 - 172399: MB Informatique (https://www.mb-informatique.fr)&lt;br /&gt;
*ID 172400 - 172449: Professional Structures Limited (https://pstructures.com)&lt;br /&gt;
*ID 172450 - 172699: IT-BS (https://www.it-bs.fr)&lt;br /&gt;
*ID 172700 - 172749: Indelog (https://www.indelog.fr)&lt;br /&gt;
*ID 172750 - 172799: NS-INFO90 (https://www.ns-info90.fr)&lt;br /&gt;
*ID 180000 - 180999: Triangle Ingénierie&lt;br /&gt;
*ID 181000 - 181999: TI Sin Problemas (https://www.tisinproblemas.com)&lt;br /&gt;
*ID 182000 - 182049: Chipserv Pawel Wlizlo (https://www.testware.it)&lt;br /&gt;
*ID 183000 - 183999: BB2A Anthony Berton (https://www.bb2a.fr)&lt;br /&gt;
*ID 184000 - 184999: DPS PRINTING &amp;amp; DOCUMENTS SOCIEDAD ANONIMA (https://www.dps-lat.com)&lt;br /&gt;
*ID 190000 - 190999: Diciannove (http://19.coop)&lt;br /&gt;
*ID 191000 - 191999: Elonet (https://elonet.fr)&lt;br /&gt;
*ID 199000 - 199999: RFMS&lt;br /&gt;
*ID 200000 - 200999: Noxiome&lt;br /&gt;
*ID 201000 - 201999: Sasa Ostrouska (saxa)&lt;br /&gt;
*ID 202000 - 202999: Z-Application&lt;br /&gt;
*ID 203000 - 203099: Elidee - elidee.com&lt;br /&gt;
*ID 203100 - 203999: Garcia MICHEL (soamichel.fr)&lt;br /&gt;
*ID 204000 - 204999: Ari Elbaz elarifr - accedinfo.com&lt;br /&gt;
*ID 205000 - 205999: Kreiz IT&lt;br /&gt;
*ID 206000 - 206999: GBINFO (www.gbinfo.fr)&lt;br /&gt;
*ID 207000 - 207099: MacroProg (https://www.macroprog.com)&lt;br /&gt;
*ID 207100 - 207149: Reactiva Software&lt;br /&gt;
*ID 207150 - 207199: Ndejje University Water Research and Development Centre ([https://github.com/NDUWRDC/LIMS/])&lt;br /&gt;
*ID 207200 - 207299: Massaoud Bouzenad ([https://www.dzprod.net dzprod.net])&lt;br /&gt;
*ID 207300 - 207349: Ksar&lt;br /&gt;
*ID 207350 - 207399: Easylinux (www.easylinux.fr)&lt;br /&gt;
*ID 222000 - 222999:  dolibit  (https://www.dolibit.de)&lt;br /&gt;
*ID 230000 - 230049: Unareil (https://www.unareil.eu)&lt;br /&gt;
*ID 230050 - 230099: Lyra Network (https://www.lyra.com/)&lt;br /&gt;
*ID 230100 - 230149: Gheorghe Iftimi - CTW - RO&lt;br /&gt;
*ID 230150 - 230199: MEMA Machinery &amp;amp; Tools (https://www.mema.be)&lt;br /&gt;
*ID 230200 - 230249: Teleassist&lt;br /&gt;
*ID 230250 - 230299: Nh Developer&lt;br /&gt;
*ID 230300 - 230499: Chickenforce/code-chicken, IT Services Hahn (https://github.com/code-chicken [http://itservices-hahn.de/ https://itservices-hahn.de])&lt;br /&gt;
*ID 230500 - 230549: Hidup Consulting (https://consulting.hidup.io)&lt;br /&gt;
*ID 230550 - 230599 : CMR Conseil (https://www.weblockup.fr)&lt;br /&gt;
*ID 230600 - 230649 : aFreeMind Studio&lt;br /&gt;
*ID 230650 - 230699 : Unideal (https://www.uni-deal.com)&lt;br /&gt;
*ID 230700 - 230749 : DevLansdes (https://devlandes.com/)&lt;br /&gt;
*ID 262700 - 262799: Scopen (https://www.scopen.fr)&lt;br /&gt;
*ID 274250 - 274299: Nerv Project (www.nerv-project.eu)&lt;br /&gt;
*ID 274300 - 274349: Knowhere Consulting S.L. (https://www.knowhere-consulting.eu)&lt;br /&gt;
*ID 274350 - 274399: Milen karaganski (https://blacktiehost.com)&lt;br /&gt;
*ID 274400 - 274449: Vincent MAURY ([https://www.timgroup.fr www.timgroup.fr])&lt;br /&gt;
*ID 274450 - 274499: Daraelmin&lt;br /&gt;
*ID 274500 - 274550: Emilie LAFORET (http://www.ermvallon.com)&lt;br /&gt;
*ID 279000 - 279049: VSDigital Electronics (https://vsdigital.ar) - Argentina&lt;br /&gt;
*ID 280000 - 280050: Bingroup (https://www.beinng.com)&lt;br /&gt;
*ID 280051 - 280100: Medialta (https://medialta.com)&lt;br /&gt;
*ID 290000 - 290099: BNS - Project doliBRA ([https://www.beinng.com https://www.bns.net.br]) - Brasil&lt;br /&gt;
*ID 300000 - 300049: RapidProgress (https://www.rapidprogress.eu) - Bulgaria&lt;br /&gt;
*ID 300050 : 300099: M@ Solution (https://www.ma-solution.fr/)&lt;br /&gt;
*ID 300100 : 300149: LAVA RUN (https://www.lavarun.re)&lt;br /&gt;
*ID 300200 : 300249 : Computences (https://www.computences.com/)&lt;br /&gt;
*ID 300250 : 300299 : LEVEL IT (https://levelit.com.ar)&lt;br /&gt;
*ID 300300 : 300349 : Progiseize (https://progiseize.fr)&lt;br /&gt;
*ID 300350 - 300399: MB Informatique (https://www.mb-informatique.fr)&lt;br /&gt;
*ID 300400 - 300449: Anouar Touati&lt;br /&gt;
*ID 300450 - 300499: Martin Danger&lt;br /&gt;
*ID 300500 - 301499: Whale Blows&lt;br /&gt;
*ID 301500 - 301549: Tom Trust - International&lt;br /&gt;
*ID 302500 - 302549: Diamubi (https://diamubi.com)&lt;br /&gt;
*ID 302550 - 302599: Datolab (https://www.datolab.com)&lt;br /&gt;
*ID 302600 - 302649: DuMaCo (https://www.dumaco.de)&lt;br /&gt;
*ID 302650 - 302699: Resilio SA&lt;br /&gt;
*ID 302700 - 302749: Aroga&lt;br /&gt;
*ID 302750 - 302799: Productivix (https://www.productivix.com)&lt;br /&gt;
*ID 302800 - 302849: Slibzz&lt;br /&gt;
*ID 302850 - 302899: idea design (https://ideadesign.dz)&lt;br /&gt;
*ID 302900 - 302949: AL MISBAH INFORMATIQUE (https://www.almisbah.ma)&lt;br /&gt;
*ID 302950 - 302999: Atis Solutions - France&lt;br /&gt;
*ID 303000 - 303499: Obixav - Nigeria&lt;br /&gt;
*ID 303500 - 303550: buschler plus GmbH, Germany (https://buschler.plus)&lt;br /&gt;
*ID 303551 - 303599: Prestalidaire - France (https://prestalidaire.com)&lt;br /&gt;
*ID 314000 - 314049: Ruemmler IT Solutions (https://www.ruemmler.net)&lt;br /&gt;
*ID 320000 - 320999: Novus Studios (www.novusstudios.it)&lt;br /&gt;
*ID 321000 - 321999: AtooNet (http://www.atoo-net.com)&lt;br /&gt;
*ID 332000 - 332099: Gecka (https://gecka.nc)&lt;br /&gt;
*ID 332100 - 332149: Agence Milkshake (http://agencemilkshake.com)&lt;br /&gt;
*ID 332150 - 332199: Daniel Prowald IT – Service (https://prowald-it.de)&lt;br /&gt;
*ID 332200 - 332249: UNITICE (https://unitice.com)&lt;br /&gt;
*ID 332250 - 332299: Sidonie Moulart&lt;br /&gt;
*ID 332300 - 332349: LTDJ (Antonin MARCHAL - Le Temple du Jeu)&lt;br /&gt;
*ID 330000 - 330049: XTEC Industries (www.xtec-ind.com)&lt;br /&gt;
*ID 330050 - 330099: 10100 S.R.L. - (www.10100.to)&lt;br /&gt;
*ID 330100 - 330149: AES Dana SRL (https://aes-dana.be)&lt;br /&gt;
*ID 330150 - 330199: Freshcore (https://www.freshcore.fr)&lt;br /&gt;
*ID 330200 - 399999: (take ranges of 50 only please, ask us for more)&lt;br /&gt;
*ID 333300 - 333349: Sense Africa (http://sense.africa)&lt;br /&gt;
*ID 350000 - 350049: SOUNDOU &amp;amp; MIDAS (https://www.soundou.org/)&lt;br /&gt;
*ID 400000 - 400999: 2byte.es (http://www.2byte.es)&lt;br /&gt;
*ID 401000 - 401999: B&amp;amp;D Informática&lt;br /&gt;
*ID 402000 - 402999: Marcos García de La Fuente (marcosgdf)&lt;br /&gt;
*ID 403000 - 403999: Sergibyte&lt;br /&gt;
*ID 404000 - 404999: Aikhan&lt;br /&gt;
*ID 405000 - 405999: AIME (http://www.aime.mx)&lt;br /&gt;
*ID 406000 - 406999: Som Núvol (https://somnuvol.coop)&lt;br /&gt;
*ID 409000 - 409999: LliureTIC (https://www.lliuretic.cat)&lt;br /&gt;
*ID 410000 - 410999: DoliGov&lt;br /&gt;
*ID 420000 - 420099: BBS Concept&lt;br /&gt;
*ID 420100 - 420199: LeMousticProduction (www.lemousticproduction.info) -&amp;lt; module DoliRH&lt;br /&gt;
*ID 420200 - 421199: VatCheck (www.abnc.be)&lt;br /&gt;
*ID 422200 - 422999: Artaban (http://artaban.fr)&lt;br /&gt;
*ID 423000 - 423050: cyberesprit&lt;br /&gt;
*ID 423051 - 423099: R.Bossard&lt;br /&gt;
*ID 423100 - 423199: Joliciel (www.joliciel.fr)&lt;br /&gt;
*ID 424000 - 424049: A3sys - Mon-Dolibarr (http://www.mon-dolibarr.fr) by Philazerty&lt;br /&gt;
*ID 424050 - 424099: Pragma-tech (www.pragma-tech.fr)&lt;br /&gt;
*ID 424100 - 424149: Ohoo Solutions (http://www.ohoosolutions.com)&lt;br /&gt;
*ID 424150 - 424199: DAGARCAM Informática (https://www.dagarcam.com/)&lt;br /&gt;
*ID 424200 - 424999: Lab51 (https://github.com/lab51org)&lt;br /&gt;
*ID 425000 - 425999: Sébastien SERRE Thivinfo (www.thivinfo.com)&lt;br /&gt;
*ID 426000 - 426099: Arkesis-Solution&lt;br /&gt;
*ID 426100 - 426149: GetLandy (www.getlandy.com)&lt;br /&gt;
*ID 426150 - 426649: OOB Software&lt;br /&gt;
*ID 426650 - 426849: Soft-Task Serviços e Sistemas (www.soft-task.com.br)&lt;br /&gt;
*ID 426850 - 427000: Bruno Caldas (https://github.com/BCaldas)&lt;br /&gt;
*ID 427001 - 427999: Kevin GUERRIER (alias xcl.saian)&lt;br /&gt;
*ID 428000 - 428099: af83&lt;br /&gt;
*ID 428100 - 428199: Arnaud Serrut - Adalon&lt;br /&gt;
*ID 428200 - 428249: imschweiler consulting (http://www.imschweiler-consulting.de&#039;&#039;&#039;&amp;lt;nowiki/&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
*ID 428250 - 428299: AL1FO&lt;br /&gt;
*ID 428300 - 428349: Federico García-Patiño Barbolani (&amp;lt;federico.garcia.patino@gmail.com&amp;gt;)&lt;br /&gt;
*ID 428350 - 428399: INTM Groupe - France (www.intm.com)&lt;br /&gt;
*ID 428400 - 428449: Nick Fragoulis - Greece&lt;br /&gt;
*ID 428450 - 428499: Letusgeek - France&lt;br /&gt;
*id 428500 - 428549 hkwhitten - USA&lt;br /&gt;
*ID 428550 - 428999 SmartOne&lt;br /&gt;
*ID 429000 - 429999: induslab&lt;br /&gt;
*ID 430000 - 430099: Mixity sprl (www.mixity.be)&lt;br /&gt;
*ID 430100 - 430199: sgiraud&lt;br /&gt;
*ID 430200 - 430299: Merlion TI (www.merlion-si.com.br)&lt;br /&gt;
*ID 430300 - 431299: Libre Expert (www.libre-expert.com)&lt;br /&gt;
*ID 431300 - 431399: ptibogxiv (www.ptibogxiv.net)&lt;br /&gt;
*ID 431400 - 431499: Befox (www.befox.fr)&lt;br /&gt;
*ID 431500 - 431599: rue Béjo (www.ruebejo.fr)&lt;br /&gt;
*ID 431600 - 431699: Avizzeo (www.avizzeo.com)&lt;br /&gt;
*ID 431700 - 432199: Multisistemas (www.multisistemas.com.sv)&lt;br /&gt;
*ID 432200 - 432399: Burbuja - Chile (www.burbuja.cl)&lt;br /&gt;
*ID 432400 - 433399: INOVEA CONSEIL (https://www.inovea-conseil.com)&lt;br /&gt;
*ID 433400 - 434399: Rachid HRICH - Maroc (HricH ServiceS.)&lt;br /&gt;
*ID 434400 - 435399: Lance Bleakley - LanceIT (www.lanceit.net)&lt;br /&gt;
*ID 436000 - 436099: SOWEBIO (www.soweb.io)&lt;br /&gt;
*ID 436100 - 436199: CAP-REL (www.cap-rel.fr)&lt;br /&gt;
*ID 436200 - 436300: TDE-INFORMATIQUE (www.tde-informatique.fr)&lt;br /&gt;
*ID 436301 - 436349: Evarisk ([https://www.evarisk.com/id-module-dolibarr/ www.evarisk.com])&lt;br /&gt;
*ID 436350 - 436399: Eoxia ([https://www.eoxia.com/dolibarr/modules/ www.eoxia.com])&lt;br /&gt;
*ID 436400 - 437399: Mohamed AHERDANE - Morocco - IT Consultant ( www.wave.ma )&lt;br /&gt;
*ID 437400 - 437449: Martin Neubauer - Germany&lt;br /&gt;
*ID 437450 - 437599: Club1click (www.club1click.es)&lt;br /&gt;
*ID 437600 - 437629: Coulon Vincent (https://github.com/HoverEpic)&lt;br /&gt;
*ID 437630 - 437649: Aytechnet (https://www.aytechnet.fr/) - François Pons&lt;br /&gt;
*ID 437650 - 437699: LibreMaster (https://libremaster.com) - Christophe T.&lt;br /&gt;
*ID 437700 - 437749: STELLAR Broadband (https://www.stellarbb.com) - U.S.A. - Philip Laycock&lt;br /&gt;
*ID 437750 - 437799: DIGITA.LU Ajous Solutions&lt;br /&gt;
*ID 437800 - 437850: iProspective (https://iprospective.fr) - Mathieu Moulin&lt;br /&gt;
*ID 437851 - 437900: Theobald Groupe.&lt;br /&gt;
*ID 437901 - 437950: Neuronnexion (http://neuronnexion.coop)&lt;br /&gt;
*ID 437951 - 437952: jmbc - APIA-ASSO (https://www.apia-asso.fr)&lt;br /&gt;
*ID 437953 - 438002: IPCZEN SARL (https://www.ipczeninformatique.fr/)&lt;br /&gt;
*ID 438003 - 438052: FESF IT Department (https://fesf.org.pk)&lt;br /&gt;
*ID 438053 - 438399: &#039;&#039;&#039;Free (take ranges of 50 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 438400 - 439399: Tetras Libre - France - Développement logiciels libres (www.tetras-libre.fr)&lt;br /&gt;
*ID 439400 - 440399: Dolibarr-pro - France - Développement Dolibarr (www.dolibarr-pro.com)&lt;br /&gt;
*ID 440400 - 441399: Quidlab Co., Ltd - Thailand - ( www.quidlab.com )&lt;br /&gt;
*ID 441400 - 442399: Ide@log - France - (https://www.idealog-info.net) - Laurent Leblanc&lt;br /&gt;
*ID 442400 - 443399: Valerio Bianchi (www.valeriobianchi.com)&lt;br /&gt;
*ID 443400 - 444399: delassalle - France - (www.delassalle.fr) - Joseph Delassalle&lt;br /&gt;
*ID 444400 - 445399: Webartis - Maroc - (www.webartis.net) - François Dry&lt;br /&gt;
*ID 445400 - 445499: SCOP Au-delà des nuages - France&lt;br /&gt;
*ID 446000 - 446999: iouston (http://www.iouston.com) - France - Julien Marchand&lt;br /&gt;
*ID 447000 - 447999: rSanjoSEO - Rafael San José Tovar (www.rsanjoseo.com) - Spain&lt;br /&gt;
*ID 448000 - 448999: Code 42 (www.code42.fr)&lt;br /&gt;
*ID 449000 - 449999: TakePOS (www.takepos.com)&lt;br /&gt;
*ID 450000 - 450999: Pierre ARDOIN&lt;br /&gt;
*ID 451000 - 451999: Éditeur depordi.fr&lt;br /&gt;
*ID 452000 - 452999: Dylan NAKONG&lt;br /&gt;
*ID 453000 - 453999: Menahd Ouchenir - France - menahd-ouchenir.com&lt;br /&gt;
*ID 454000 - 454999: Withheld - Canada&lt;br /&gt;
*ID 455000 - 455999: Gaëtan MAISON - Info Libre @ Dom - France (https://www.infolibreadom.com)&lt;br /&gt;
*ID 456000 - 456999: Laurent LEBLEU - B.L.C. - Blue Line Company - Lille - France (www.bluelinecompany.fr/dolibarr)&lt;br /&gt;
*ID 457000 - 457999: Sébastien BOUCHER&lt;br /&gt;
*ID 458000 - 458999: Lester HERNÁNDEZ - Argentina - (freelancerlrhd@gmail.com)&lt;br /&gt;
*ID 459000 - 459999: Infopen - France&lt;br /&gt;
*ID 460000 - 460050: torvista - Spain&lt;br /&gt;
*ID 461000 - 461999: MEGALOGI - Maroc (www.erpcloud.ma)&lt;br /&gt;
*ID 462000 - 462999: Making Digital (www.making-digital.fr) - France&lt;br /&gt;
*ID 463000 - 463999: linx s.r.l.s.&lt;br /&gt;
*ID 464000 - 464999: NimbleCubed Inc. (www.nimblecubed.com)&lt;br /&gt;
*ID 465000 - 465999: Artefacts - CourantAlternatif&lt;br /&gt;
*ID 466000 - 466999: CDM Consultores - (www.cdm.guru)&lt;br /&gt;
*ID 467000 - 467999: M71 Service GmbH - (www.m71-service.de)&lt;br /&gt;
*ID 468000 - 468049: Clément Segonzac - France (clement.segonzac@gmail.com)&lt;br /&gt;
*ID 468050 - 468099: Flavien Belli - France (https://github.com/Marshlyin || belliflaviencontactpro@gmail.com)&lt;br /&gt;
*ID 468100 - 468119: Chl (https://code.bugness.org/Dolibarr)&lt;br /&gt;
*ID 468120 - 468170: Commotron GmbH (https://www.commotron.com/)&lt;br /&gt;
*ID 468171 - 468220: Infans Group (franck.lauby@infans.fr)&lt;br /&gt;
*ID 468221 - 468174 &#039;&#039;&#039;Free (take ranges of 50 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 468175 - 468199: Gaëlle Rauffet - France (kiwiscan.net)&lt;br /&gt;
*ID 468200 - 468250: Paulo Oliveira - Brasil (paulorcdo@gmail.com)&lt;br /&gt;
*ID 468251 - 468270:  CD-Systems - France (https://www.cd-systems.fr)&lt;br /&gt;
*ID 468300 - 468349: Uvensys - Germany (https://uvensys.de)&lt;br /&gt;
*ID 468350 - 468399 : Laudeco - Belgium (http://github.com/laudeco)&lt;br /&gt;
*ID 468400 - 468449 : Alexis LAURIER - France (https://www.alexislaurier.fr)&lt;br /&gt;
*ID 468450 - 468499 : Mehdi Belkhayat - Maroc (https://opensi.ma)&lt;br /&gt;
*ID 468500 - 468599 : InvIT GmbH - Germany (https://invit.sh)&lt;br /&gt;
*ID 468600 - 468649 : Ricardo Sequeira - Portugal (https://ricardo-sequeira.com)&lt;br /&gt;
*ID 468650 - 468699 : J-IT - Belgique (https://www.j-it.be)&lt;br /&gt;
*ID 468700 - 468749 : Fidesio - France (https://www.fidesio.com/)&lt;br /&gt;
*ID 468750 - 468799 : Sgestion - Spain (http://www.sgestion.net/)&lt;br /&gt;
*ID 468800 - 468849 : Denis JULIEN - Brasil (matrinxa@free.fr)&lt;br /&gt;
*ID 468850 - 468900: Mmariko - Module GED - Effios&lt;br /&gt;
*ID 468901 - 468950: Maazou Amadou Abdoul aziz - Maroc (yaronfada@gmail.com)&lt;br /&gt;
*ID 468951 - 469000: Alexis LAURIER - France (https://www.alexislaurier.fr)&lt;br /&gt;
*ID 469001 - 469050: John Livingston (https://github.com/JohnXLivingston/)&lt;br /&gt;
*ID 469051 - 469100: Macrorom ICT-services (https://macrorom.nl/)&lt;br /&gt;
*ID 469101 - 469150: HABOT IT - France (https://habot.it)&lt;br /&gt;
*ID 469151 - 469160: CaribbeanConsult.Com CCC - France Guadeloupe (https://dolibarr.ccc.gp)&lt;br /&gt;
*ID 469161 - 469171: GMBG - Portugal&lt;br /&gt;
*ID 469172 - 469192: BGi Lda - Portugal&lt;br /&gt;
*ID 469949 - 469999: Goldoweb (http://goldoweb.com)&lt;br /&gt;
*ID 470000 - 470999: Reindeer Digital (https://rdeer.cz)&lt;br /&gt;
*ID 471000 - 471099: CAP-REL (www.cap-rel.fr)&lt;br /&gt;
*ID 471100 - 471199: M. Morillon&lt;br /&gt;
*ID 471200 - 471209: Pablo Nuñez&lt;br /&gt;
*ID 481000 - 482000: Alhaidab-ITIS (https://alhaidab.dolibarr.sd)&lt;br /&gt;
*ID 482001 - 483000: Basix IT (https://www.basix.de)&lt;br /&gt;
*ID 483001 - 483050: SASCO SpA (https://www.sasco.cl)&lt;br /&gt;
*ID 483051 - 483100: WIP Engineering (https://www.wip-gmbh.com)&lt;br /&gt;
*ID 483101 - 483150: J.Kaiser&lt;br /&gt;
*ID 483151 - 483201: CodLines (https://www.codlines.com)&lt;br /&gt;
*ID 485000 - 485049: Gest Info Service Plus (contact@gest-plus.fr)&lt;br /&gt;
*ID 490000 - 490050: VOLD (https://vold.lu)&lt;br /&gt;
*ID 491000 - 491050: NORD ERP CRM (https://www.nord-erp-crm.fr/)&lt;br /&gt;
*ID 491051 - 491100: KJR-online (https://kjr-online.fr/)&lt;br /&gt;
*ID 491101 - 491149: eNova&lt;br /&gt;
*ID 491150 - 491200: App 4 Business&lt;br /&gt;
*ID 491201 - 491250: Mil24 (http://www.mil24.com.py)&lt;br /&gt;
*ID 491251 - 491301: M2AM&lt;br /&gt;
&lt;br /&gt;
DO NOT ADD RECORD HERE, PLEASE FILL HOLES FIRST !!!!&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
=ID &amp;gt; 500000=&lt;br /&gt;
&lt;br /&gt;
This range can&#039;t be reserved. It is a common range. If you don&#039;t plan to distribute your module, you can use an ID in this range with no need to reserve it.&lt;br /&gt;
&lt;br /&gt;
{{Flag en}}&lt;br /&gt;
If you don&#039;t already have reserved ids and need some, please don&#039;t use hazardous number and use a number higher than 500000, but it is better to ask a wiki account, and reserve your own range by editing the  100000 - 499999 range (50 ids at once, 1000 ids maximum per partner).&lt;br /&gt;
&lt;br /&gt;
{{Flag fr}}&lt;br /&gt;
Si vous n&#039;avez pas de numéros réservés et en avez besoin, n&#039;utilisez pas de chiffres au hasard et utilisez une valeur supérieure à 500000, toutefois, il est préférable d&#039;obtenir un compte wiki, et  réserver vous-même votre plage en ajoutant votre entrée dans la zone 100000 - 499999 (par lot de 50 d&#039;abord, pas plus de 1000 numéros par partenaire).&lt;br /&gt;
&lt;br /&gt;
{{Flag sp}}&lt;br /&gt;
Si no dispone de número reservado y necesita, no use cifras redondeadas y usa un valor superior a 500000. Si tiene una cuenta wiki, puede reservarse usted mismo sus id añadiendo su entrada en la zona 100000 - 499999 (no más de 1000 id por partner).&lt;/div&gt;</summary>
		<author><name>ShengGang</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=List_of_modules_id&amp;diff=58644</id>
		<title>List of modules id</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=List_of_modules_id&amp;diff=58644"/>
		<updated>2023-11-06T05:46:35Z</updated>

		<summary type="html">&lt;p&gt;ShengGang: Add Chinese&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TemplateDocDevEn}}&lt;br /&gt;
{{TemplateDocDevEs}}&lt;br /&gt;
{{TemplateDocDevFr}}&lt;br /&gt;
{{TemplateDocDevZh}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Flag en}}&lt;br /&gt;
This page list all reserved modules numbers / ID. If you build or want to build your own modules (like this [[:Category:Complementary_modules|complementary module]]), you should take an ID range here. Please pick range into existing holes first.&lt;br /&gt;
&lt;br /&gt;
{{Flag fr}}&lt;br /&gt;
Cette page recense tous les numéros / ID réservés de modules. Si vous avez réalisé ou voulez réaliser vos propres modules (comme les [[:Category:Modules complémentaires|modules complémentaires suivant]]), vous devriez prendre une plage d&#039;ID ici. Merci de prendre dans les trous existant en priorité !&lt;br /&gt;
&lt;br /&gt;
{{Flag sp}}&lt;br /&gt;
Esta página contiene un listado de todos los id reservados para los módulos. Si ha creado o quiere realizar sus propios módulos, (como estos [[:Category:Módulos_complementarios|módulos complementarios]]), deberá reservarse un rango de ID aquí.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=ID 0 - 99999=&lt;br /&gt;
{{Flag en}}&lt;br /&gt;
Reserved for Dolibarr&#039;s internal modules.&lt;br /&gt;
&lt;br /&gt;
{{Flag fr}}&lt;br /&gt;
Réservé aux modules internes de Dolibarr.&lt;br /&gt;
&lt;br /&gt;
{{Flag sp}}&lt;br /&gt;
Reservado a los módulos internos de Dolibarr.&lt;br /&gt;
&lt;br /&gt;
=ID 100000 - 499999=&lt;br /&gt;
{{Flag en}} &lt;br /&gt;
&#039;&#039;&#039;Reserved area for editors in need for an ID range. You can edit this page to add your own range (take a range of 50 numbers only the first time, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Flag fr}}Zone réservée aux éditeurs qui ont besoin d&#039;une plage d&#039;ID spécifiques. Vous pouvez modifier cette page pour réserver votre plage (limitée à 50 valeurs la première fois, demandez nous pour plus)&lt;br /&gt;
&lt;br /&gt;
{{Flag sp}}&lt;br /&gt;
Área reservada para los partners que necesiten un rango de ID. Puede modificar esta página para reservar su rango (limitado a 50 valores por editor)&lt;br /&gt;
&lt;br /&gt;
[[File:Warning.png]] If you reserve more than 50, we may automatically change your reservation range without information and you may experience conflicts with other modules in a future, so please follow the rules!&lt;br /&gt;
&lt;br /&gt;
*ID 100000 - 100999: OpenThink (http://www.openthink.be)&lt;br /&gt;
*ID 101000 - 101999: NLTechno (https://www.nltechno.com)&lt;br /&gt;
*ID 102000 - 102999: Tiaris (http://www.tiaris.fr)&lt;br /&gt;
*ID 103000 - 103999: Open-concept.pro (http://www.open-concept.pro)&lt;br /&gt;
*ID 104000 - 104999: ATM Consulting (http://www.atm-consulting.fr)&lt;br /&gt;
*ID 105000 - 105999: GPC.solutions&lt;br /&gt;
*ID 106000 - 106999: PHPASSO&lt;br /&gt;
*ID 107000 - 107999: TecLib (http://www.teclib.com) / Auguria (http://www.auguria.net)&lt;br /&gt;
*ID 108000 - 108999: ETHICWEB&lt;br /&gt;
*ID 109000 - 109999: Aplose ([http://www.aplose.fr https://www.aplose.fr])&lt;br /&gt;
*ID 110000 - 110999: Librethic (https://librethic.io)&lt;br /&gt;
*ID 111000 - 111999: Asset IT (www.assetit.ch)&lt;br /&gt;
*ID 112000 - 112999: Aarboard AG (www.aarboard.ch)&lt;br /&gt;
*ID 113000 - 113999: Asilib - Alexandre Spangaro&lt;br /&gt;
*ID 114000 - 114999: Iceleaf OÜ&lt;br /&gt;
*ID 115000 - 115999: 2A2C Conseil - Cyril ZEKSER&lt;br /&gt;
*ID 116000 - 116999: Wolftec GmbH&lt;br /&gt;
*ID 117000 - 117999: Oscim (http://www.oscim.fr)&lt;br /&gt;
*ID 118000 - 118999: Oarces Web (dev.oarces.com)&lt;br /&gt;
*ID 119000 - 119999: Manuel Berrocal - Absolacom&lt;br /&gt;
*ID 120000 - 120999: Régis Houssin (http://www.inodbox.com)&lt;br /&gt;
*ID 121000 - 121999: Oscss - Shop&lt;br /&gt;
*ID 122000 - 122999: MrSof - la Nation du Web&lt;br /&gt;
*ID 123000 - 123999: Bruno Généré (webiseasy.org)&lt;br /&gt;
*ID 124000 - 124999: backbone internet service (www.backbone.co.at)&lt;br /&gt;
*ID 125000 - 125999: ProgSI (www.progsi.ma)&lt;br /&gt;
*ID 126000 - 126999: Catalanet&lt;br /&gt;
*ID 127000 - 127999: Virgilio Filho pt-BR Brasil (@dolibarr.br)&lt;br /&gt;
*ID 128000 - 128999: Nicolas Frappé France (www.sospc.info)&lt;br /&gt;
*ID 129000 - 129999: Adeo-Informatique&lt;br /&gt;
*ID 130000 - 130999: Technicks ICT (http://www.technicks.eu)&lt;br /&gt;
*ID 131000 - 131999: Joan Louis (itaca.fr)&lt;br /&gt;
*ID 132000 - 132999: Jean-Marie Arsac (https://azimut.fr)&lt;br /&gt;
*ID 133000 - 133999: Oriel Systems Ltd, UK. (www.orielsystems.com)&lt;br /&gt;
*ID 134000 - 134999: ALSOFT PVT. LTD. (https://www.alsoft.org)&lt;br /&gt;
*ID 135000 - 135999: Net-Logic (https://netlogic.fr)&lt;br /&gt;
*ID 136000 - 136050: MONA.RE - France&lt;br /&gt;
*ID 136051 - 136099: La Vida Marketing&lt;br /&gt;
*ID 136100 - 136149: Synergies-Tech France. (https://www.synergies-france.fr/)&lt;br /&gt;
*ID 136150 - 136199: Lyta&lt;br /&gt;
*ID 136200 - 136219: Maison Théophile Leclerc&lt;br /&gt;
*ID 136220 - 136270: SegoFount - Spain&lt;br /&gt;
*ID 136271 - 138999: &#039;&#039;&#039;Free (take ranges of 50 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 139000 - 139999: Synergies-Tech France. (https://www.synergies-france.fr/)&lt;br /&gt;
*ID 140000 - 140999: Altairis (http://altairis.fr)&lt;br /&gt;
*ID 141000 - 141050: Projet2Team (https://www.projet2team.fr)&lt;br /&gt;
*ID 141051 - 141099: Elistair (http://elistair.com)&lt;br /&gt;
*ID 141100 - 141149: Blue Networks Technologies (https://www.blnt.fr)&lt;br /&gt;
*ID 141150 - 141199: Mainlab S.r.l. (https://www.mainlabonline.it)&lt;br /&gt;
*ID 141150 - 141199: Florian DUFOURG - France&lt;br /&gt;
*ID 142000 - 142049: ITANéA (https://www.itanea.fr)&lt;br /&gt;
*ID 142050 - 142099: ERP Consulting NZ ([https://www.erpconsulting.co.nz www.erpconsulting.co.nz])&lt;br /&gt;
*ID 142100 - 142149: Bloxera GmbH (https://www.bloxera.com)&lt;br /&gt;
*ID 142150 - 142199: Evangelos Souglakos - Greece&lt;br /&gt;
*ID 142200 - 142249: Luc CALARESU - France&lt;br /&gt;
*ID 142250 - 142299: OmnIT Services - Belgique (https://www.omnitservices.biz)&lt;br /&gt;
*ID 142300 - 142349: Gwadeyes - Guadeloupe (https://www.gwadeyes-informatique.com/)&lt;br /&gt;
*ID 142350 - 142399: Solution Libre (https://www.solution-libre.fr/)&lt;br /&gt;
*ID 142400 - 142449: Res Digital (https://res.digital)&lt;br /&gt;
*ID 149000 - 149999: SydTech - America Central (https://www.sydtech.io/)&lt;br /&gt;
*ID 150000 - 150999: Jeffinfo&lt;br /&gt;
*ID 151000 - 151999: Konverseo (https://konverseo.com)&lt;br /&gt;
*ID 152000 - 152049: Tanguy Pénet (http://tanguype.net)&lt;br /&gt;
*ID 160000 - 160999: Charles-François BENKE (http://www.patas-monkey.com)&lt;br /&gt;
*ID 161000 - 161999: Abbes Bahfir (http://dolipar.org)&lt;br /&gt;
*ID 162000 - 162999: Jacques Rébiscoul&lt;br /&gt;
*ID 163000 - 163999: Open-DSI (https://www.open-dsi.fr)&lt;br /&gt;
*ID 164000 - 164999: Pixelada S. Coop. And. (https://pixelada.org)&lt;br /&gt;
*ID 165000 - 165049: DovConnect&lt;br /&gt;
*ID 165050 - 165099: Mind Operated Systems (https://www.mosystems.biz)&lt;br /&gt;
*ID 165100 - 165150: SD-Formation (https://sdformation.fr)&lt;br /&gt;
*ID 165151 - 165199: NUM&#039;X (https://www.numx-sets.eu)&lt;br /&gt;
*ID 165200 - 165249: Benjam Préjent (https://www.benjam-prejent.fr)&lt;br /&gt;
*ID 165250 - 165299: Dhi Loka Private Limited, India (https://www.dhiloka.com)&lt;br /&gt;
*ID 170000 - 170999: TRIDENT CONSULTING LTD (www.tridentdxb.com)&lt;br /&gt;
*ID 171000 - 171999: LVSInformatique (www.lvsinformatique.com)&lt;br /&gt;
*ID 172000 - 172299: Ray Soft-Systems (https://www.ray-soft-systems.com)&lt;br /&gt;
*ID 172300 - 172349: Günter Lukas Consulting (https://gl.co.at)&lt;br /&gt;
*ID 172350 - 172399: MB Informatique (https://www.mb-informatique.fr)&lt;br /&gt;
*ID 172400 - 172449: Professional Structures Limited (https://pstructures.com)&lt;br /&gt;
*ID 172450 - 172699: IT-BS (https://www.it-bs.fr)&lt;br /&gt;
*ID 172700 - 172749: Indelog (https://www.indelog.fr)&lt;br /&gt;
*ID 172750 - 172799: NS-INFO90 (https://www.ns-info90.fr)&lt;br /&gt;
*ID 180000 - 180999: Triangle Ingénierie&lt;br /&gt;
*ID 181000 - 181999: TI Sin Problemas (https://www.tisinproblemas.com)&lt;br /&gt;
*ID 182000 - 182049: Chipserv Pawel Wlizlo (https://www.testware.it)&lt;br /&gt;
*ID 183000 - 183999: BB2A Anthony Berton (https://www.bb2a.fr)&lt;br /&gt;
*ID 184000 - 184999: DPS PRINTING &amp;amp; DOCUMENTS SOCIEDAD ANONIMA (https://www.dps-lat.com)&lt;br /&gt;
*ID 190000 - 190999: Diciannove (http://19.coop)&lt;br /&gt;
*ID 191000 - 191999: Elonet (https://elonet.fr)&lt;br /&gt;
*ID 199000 - 199999: RFMS&lt;br /&gt;
*ID 200000 - 200999: Noxiome&lt;br /&gt;
*ID 201000 - 201999: Sasa Ostrouska (saxa)&lt;br /&gt;
*ID 202000 - 202999: Z-Application&lt;br /&gt;
*ID 203000 - 203099: Elidee - elidee.com&lt;br /&gt;
*ID 203100 - 203999: Garcia MICHEL (soamichel.fr)&lt;br /&gt;
*ID 204000 - 204999: Ari Elbaz elarifr - accedinfo.com&lt;br /&gt;
*ID 205000 - 205999: Kreiz IT&lt;br /&gt;
*ID 206000 - 206999: GBINFO (www.gbinfo.fr)&lt;br /&gt;
*ID 207000 - 207099: MacroProg (https://www.macroprog.com)&lt;br /&gt;
*ID 207100 - 207149: Reactiva Software&lt;br /&gt;
*ID 207150 - 207199: Ndejje University Water Research and Development Centre ([https://github.com/NDUWRDC/LIMS/])&lt;br /&gt;
*ID 207200 - 207299: Massaoud Bouzenad ([https://www.dzprod.net dzprod.net])&lt;br /&gt;
*ID 207300 - 207349: Ksar&lt;br /&gt;
*ID 207350 - 207399: Easylinux (www.easylinux.fr)&lt;br /&gt;
*ID 222000 - 222999:  dolibit  (https://www.dolibit.de)&lt;br /&gt;
*ID 230000 - 230049: Unareil (https://www.unareil.eu)&lt;br /&gt;
*ID 230050 - 230099: Lyra Network (https://www.lyra.com/)&lt;br /&gt;
*ID 230100 - 230149: Gheorghe Iftimi - CTW - RO&lt;br /&gt;
*ID 230150 - 230199: MEMA Machinery &amp;amp; Tools (https://www.mema.be)&lt;br /&gt;
*ID 230200 - 230249: Teleassist&lt;br /&gt;
*ID 230250 - 230299: Nh Developer&lt;br /&gt;
*ID 230300 - 230499: Chickenforce/code-chicken, IT Services Hahn (https://github.com/code-chicken [http://itservices-hahn.de/ https://itservices-hahn.de])&lt;br /&gt;
*ID 230500 - 230549: Hidup Consulting (https://consulting.hidup.io)&lt;br /&gt;
*ID 230550 - 230599 : CMR Conseil (https://www.weblockup.fr)&lt;br /&gt;
*ID 230600 - 230649 : aFreeMind Studio&lt;br /&gt;
*ID 230650 - 230699 : Unideal (https://www.uni-deal.com)&lt;br /&gt;
*ID 230700 - 230749 : DevLansdes (https://devlandes.com/)&lt;br /&gt;
*ID 262700 - 262799: Scopen (https://www.scopen.fr)&lt;br /&gt;
*ID 274250 - 274299: Nerv Project (www.nerv-project.eu)&lt;br /&gt;
*ID 274300 - 274349: Knowhere Consulting S.L. (https://www.knowhere-consulting.eu)&lt;br /&gt;
*ID 274350 - 274399: Milen karaganski (https://blacktiehost.com)&lt;br /&gt;
*ID 274400 - 274449: Vincent MAURY ([https://www.timgroup.fr www.timgroup.fr])&lt;br /&gt;
*ID 274450 - 274499: Daraelmin&lt;br /&gt;
*ID 274500 - 274550: Emilie LAFORET (http://www.ermvallon.com)&lt;br /&gt;
*ID 279000 - 279049: VSDigital Electronics (https://vsdigital.ar) - Argentina&lt;br /&gt;
*ID 280000 - 280050: Bingroup (https://www.beinng.com)&lt;br /&gt;
*ID 280051 - 280100: Medialta (https://medialta.com)&lt;br /&gt;
*ID 290000 - 290099: BNS - Project doliBRA ([https://www.beinng.com https://www.bns.net.br]) - Brasil&lt;br /&gt;
*ID 300000 - 300049: RapidProgress (https://www.rapidprogress.eu) - Bulgaria&lt;br /&gt;
*ID 300050 : 300099: M@ Solution (https://www.ma-solution.fr/)&lt;br /&gt;
*ID 300100 : 300149: LAVA RUN (https://www.lavarun.re)&lt;br /&gt;
*ID 300200 : 300249 : Computences (https://www.computences.com/)&lt;br /&gt;
*ID 300250 : 300299 : LEVEL IT (https://levelit.com.ar)&lt;br /&gt;
*ID 300300 : 300349 : Progiseize (https://progiseize.fr)&lt;br /&gt;
*ID 300350 - 300399: MB Informatique (https://www.mb-informatique.fr)&lt;br /&gt;
*ID 300400 - 300449: Anouar Touati&lt;br /&gt;
*ID 300450 - 300499: Martin Danger&lt;br /&gt;
*ID 300500 - 301499: Whale Blows&lt;br /&gt;
*ID 301500 - 301549: Tom Trust - International&lt;br /&gt;
*ID 302500 - 302549: Diamubi (https://diamubi.com)&lt;br /&gt;
*ID 302550 - 302599: Datolab (https://www.datolab.com)&lt;br /&gt;
*ID 302600 - 302649: DuMaCo (https://www.dumaco.de)&lt;br /&gt;
*ID 302650 - 302699: Resilio SA&lt;br /&gt;
*ID 302700 - 302749: Aroga&lt;br /&gt;
*ID 302750 - 302799: Productivix (https://www.productivix.com)&lt;br /&gt;
*ID 302800 - 302849: Slibzz&lt;br /&gt;
*ID 302850 - 302899: idea design (https://ideadesign.dz)&lt;br /&gt;
*ID 302900 - 302949: AL MISBAH INFORMATIQUE (https://www.almisbah.ma)&lt;br /&gt;
*ID 302950 - 302999: Atis Solutions - France&lt;br /&gt;
*ID 303000 - 303499: Obixav - Nigeria&lt;br /&gt;
*ID 303500 - 303550: buschler plus GmbH, Germany (https://buschler.plus)&lt;br /&gt;
*ID 303551 - 303599: Prestalidaire - France (https://prestalidaire.com)&lt;br /&gt;
*ID 314000 - 314049: Ruemmler IT Solutions (https://www.ruemmler.net)&lt;br /&gt;
*ID 320000 - 320999: Novus Studios (www.novusstudios.it)&lt;br /&gt;
*ID 321000 - 321999: AtooNet (http://www.atoo-net.com)&lt;br /&gt;
*ID 332000 - 332099: Gecka (https://gecka.nc)&lt;br /&gt;
*ID 332100 - 332149: Agence Milkshake (http://agencemilkshake.com)&lt;br /&gt;
*ID 332150 - 332199: Daniel Prowald IT – Service (https://prowald-it.de)&lt;br /&gt;
*ID 332200 - 332249: UNITICE (https://unitice.com)&lt;br /&gt;
*ID 332250 - 332299: Sidonie Moulart&lt;br /&gt;
*ID 332300 - 332349: LTDJ (Antonin MARCHAL - Le Temple du Jeu)&lt;br /&gt;
*ID 330000 - 330049: XTEC Industries (www.xtec-ind.com)&lt;br /&gt;
*ID 330050 - 330099: 10100 S.R.L. - (www.10100.to)&lt;br /&gt;
*ID 330100 - 330149: AES Dana SRL (https://aes-dana.be)&lt;br /&gt;
*ID 330150 - 330199: Freshcore (https://www.freshcore.fr)&lt;br /&gt;
*ID 330200 - 399999: (take ranges of 50 only please, ask us for more)&lt;br /&gt;
*ID 333300 - 333349: Sense Africa (http://sense.africa)&lt;br /&gt;
*ID 350000 - 350049: SOUNDOU &amp;amp; MIDAS (https://www.soundou.org/)&lt;br /&gt;
*ID 400000 - 400999: 2byte.es (http://www.2byte.es)&lt;br /&gt;
*ID 401000 - 401999: B&amp;amp;D Informática&lt;br /&gt;
*ID 402000 - 402999: Marcos García de La Fuente (marcosgdf)&lt;br /&gt;
*ID 403000 - 403999: Sergibyte&lt;br /&gt;
*ID 404000 - 404999: Aikhan&lt;br /&gt;
*ID 405000 - 405999: AIME (http://www.aime.mx)&lt;br /&gt;
*ID 406000 - 406999: Som Núvol (https://somnuvol.coop)&lt;br /&gt;
*ID 409000 - 409999: LliureTIC (https://www.lliuretic.cat)&lt;br /&gt;
*ID 410000 - 410999: DoliGov&lt;br /&gt;
*ID 420000 - 420099: BBS Concept&lt;br /&gt;
*ID 420100 - 420199: LeMousticProduction (www.lemousticproduction.info) -&amp;lt; module DoliRH&lt;br /&gt;
*ID 420200 - 421199: VatCheck (www.abnc.be)&lt;br /&gt;
*ID 422200 - 422999: Artaban (http://artaban.fr)&lt;br /&gt;
*ID 423000 - 423050: cyberesprit&lt;br /&gt;
*ID 423051 - 423099: R.Bossard&lt;br /&gt;
*ID 423100 - 423199: Joliciel (www.joliciel.fr)&lt;br /&gt;
*ID 424000 - 424049: A3sys - Mon-Dolibarr (http://www.mon-dolibarr.fr) by Philazerty&lt;br /&gt;
*ID 424050 - 424099: Pragma-tech (www.pragma-tech.fr)&lt;br /&gt;
*ID 424100 - 424149: Ohoo Solutions (http://www.ohoosolutions.com)&lt;br /&gt;
*ID 424150 - 424199: DAGARCAM Informática (https://www.dagarcam.com/)&lt;br /&gt;
*ID 424200 - 424999: Lab51 (https://github.com/lab51org)&lt;br /&gt;
*ID 425000 - 425999: Sébastien SERRE Thivinfo (www.thivinfo.com)&lt;br /&gt;
*ID 426000 - 426099: Arkesis-Solution&lt;br /&gt;
*ID 426100 - 426149: GetLandy (www.getlandy.com)&lt;br /&gt;
*ID 426150 - 426649: OOB Software&lt;br /&gt;
*ID 426650 - 426849: Soft-Task Serviços e Sistemas (www.soft-task.com.br)&lt;br /&gt;
*ID 426850 - 427000: Bruno Caldas (https://github.com/BCaldas)&lt;br /&gt;
*ID 427001 - 427999: Kevin GUERRIER (alias xcl.saian)&lt;br /&gt;
*ID 428000 - 428099: af83&lt;br /&gt;
*ID 428100 - 428199: Arnaud Serrut - Adalon&lt;br /&gt;
*ID 428200 - 428249: imschweiler consulting (http://www.imschweiler-consulting.de&#039;&#039;&#039;&amp;lt;nowiki/&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
*ID 428250 - 428299: AL1FO&lt;br /&gt;
*ID 428300 - 428349: Federico García-Patiño Barbolani (&amp;lt;federico.garcia.patino@gmail.com&amp;gt;)&lt;br /&gt;
*ID 428350 - 428399: INTM Groupe - France (www.intm.com)&lt;br /&gt;
*ID 428400 - 428449: Nick Fragoulis - Greece&lt;br /&gt;
*ID 428450 - 428499: Letusgeek - France&lt;br /&gt;
*id 428500 - 428549 hkwhitten - USA&lt;br /&gt;
*ID 428550 - 428999 SmartOne&lt;br /&gt;
*ID 429000 - 429999: induslab&lt;br /&gt;
*ID 430000 - 430099: Mixity sprl (www.mixity.be)&lt;br /&gt;
*ID 430100 - 430199: sgiraud&lt;br /&gt;
*ID 430200 - 430299: Merlion TI (www.merlion-si.com.br)&lt;br /&gt;
*ID 430300 - 431299: Libre Expert (www.libre-expert.com)&lt;br /&gt;
*ID 431300 - 431399: ptibogxiv (www.ptibogxiv.net)&lt;br /&gt;
*ID 431400 - 431499: Befox (www.befox.fr)&lt;br /&gt;
*ID 431500 - 431599: rue Béjo (www.ruebejo.fr)&lt;br /&gt;
*ID 431600 - 431699: Avizzeo (www.avizzeo.com)&lt;br /&gt;
*ID 431700 - 432199: Multisistemas (www.multisistemas.com.sv)&lt;br /&gt;
*ID 432200 - 432399: Burbuja - Chile (www.burbuja.cl)&lt;br /&gt;
*ID 432400 - 433399: INOVEA CONSEIL (https://www.inovea-conseil.com)&lt;br /&gt;
*ID 433400 - 434399: Rachid HRICH - Maroc (HricH ServiceS.)&lt;br /&gt;
*ID 434400 - 435399: Lance Bleakley - LanceIT (www.lanceit.net)&lt;br /&gt;
*ID 436000 - 436099: SOWEBIO (www.soweb.io)&lt;br /&gt;
*ID 436100 - 436199: CAP-REL (www.cap-rel.fr)&lt;br /&gt;
*ID 436200 - 436300: TDE-INFORMATIQUE (www.tde-informatique.fr)&lt;br /&gt;
*ID 436301 - 436349: Evarisk ([https://www.evarisk.com/id-module-dolibarr/ www.evarisk.com])&lt;br /&gt;
*ID 436350 - 436399: Eoxia ([https://www.eoxia.com/dolibarr/modules/ www.eoxia.com])&lt;br /&gt;
*ID 436400 - 437399: Mohamed AHERDANE - Morocco - IT Consultant ( www.wave.ma )&lt;br /&gt;
*ID 437400 - 437449: Martin Neubauer - Germany&lt;br /&gt;
*ID 437450 - 437599: Club1click (www.club1click.es)&lt;br /&gt;
*ID 437600 - 437629: Coulon Vincent (https://github.com/HoverEpic)&lt;br /&gt;
*ID 437630 - 437649: Aytechnet (https://www.aytechnet.fr/) - François Pons&lt;br /&gt;
*ID 437650 - 437699: LibreMaster (https://libremaster.com) - Christophe T.&lt;br /&gt;
*ID 437700 - 437749: STELLAR Broadband (https://www.stellarbb.com) - U.S.A. - Philip Laycock&lt;br /&gt;
*ID 437750 - 437799: DIGITA.LU Ajous Solutions&lt;br /&gt;
*ID 437800 - 437850: iProspective (https://iprospective.fr) - Mathieu Moulin&lt;br /&gt;
*ID 437851 - 437900: Theobald Groupe.&lt;br /&gt;
*ID 437901 - 437950: Neuronnexion (http://neuronnexion.coop)&lt;br /&gt;
*ID 437951 - 437952: jmbc - APIA-ASSO (https://www.apia-asso.fr)&lt;br /&gt;
*ID 437953 - 438002: IPCZEN SARL (https://www.ipczeninformatique.fr/)&lt;br /&gt;
*ID 438003 - 438052: FESF IT Department (https://fesf.org.pk)&lt;br /&gt;
*ID 438053 - 438399: &#039;&#039;&#039;Free (take ranges of 50 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 438400 - 439399: Tetras Libre - France - Développement logiciels libres (www.tetras-libre.fr)&lt;br /&gt;
*ID 439400 - 440399: Dolibarr-pro - France - Développement Dolibarr (www.dolibarr-pro.com)&lt;br /&gt;
*ID 440400 - 441399: Quidlab Co., Ltd - Thailand - ( www.quidlab.com )&lt;br /&gt;
*ID 441400 - 442399: Ide@log - France - (https://www.idealog-info.net) - Laurent Leblanc&lt;br /&gt;
*ID 442400 - 443399: Valerio Bianchi (www.valeriobianchi.com)&lt;br /&gt;
*ID 443400 - 444399: delassalle - France - (www.delassalle.fr) - Joseph Delassalle&lt;br /&gt;
*ID 444400 - 445399: Webartis - Maroc - (www.webartis.net) - François Dry&lt;br /&gt;
*ID 445400 - 445499: SCOP Au-delà des nuages - France&lt;br /&gt;
*ID 446000 - 446999: iouston (http://www.iouston.com) - France - Julien Marchand&lt;br /&gt;
*ID 447000 - 447999: rSanjoSEO - Rafael San José Tovar (www.rsanjoseo.com) - Spain&lt;br /&gt;
*ID 448000 - 448999: Code 42 (www.code42.fr)&lt;br /&gt;
*ID 449000 - 449999: TakePOS (www.takepos.com)&lt;br /&gt;
*ID 450000 - 450999: Pierre ARDOIN&lt;br /&gt;
*ID 451000 - 451999: Éditeur depordi.fr&lt;br /&gt;
*ID 452000 - 452999: Dylan NAKONG&lt;br /&gt;
*ID 453000 - 453999: Menahd Ouchenir - France - menahd-ouchenir.com&lt;br /&gt;
*ID 454000 - 454999: Withheld - Canada&lt;br /&gt;
*ID 455000 - 455999: Gaëtan MAISON - Info Libre @ Dom - France (https://www.infolibreadom.com)&lt;br /&gt;
*ID 456000 - 456999: Laurent LEBLEU - B.L.C. - Blue Line Company - Lille - France (www.bluelinecompany.fr/dolibarr)&lt;br /&gt;
*ID 457000 - 457999: Sébastien BOUCHER&lt;br /&gt;
*ID 458000 - 458999: Lester HERNÁNDEZ - Argentina - (freelancerlrhd@gmail.com)&lt;br /&gt;
*ID 459000 - 459999: Infopen - France&lt;br /&gt;
*ID 460000 - 460050: torvista - Spain&lt;br /&gt;
*ID 461000 - 461999: MEGALOGI - Maroc (www.erpcloud.ma)&lt;br /&gt;
*ID 462000 - 462999: Making Digital (www.making-digital.fr) - France&lt;br /&gt;
*ID 463000 - 463999: linx s.r.l.s.&lt;br /&gt;
*ID 464000 - 464999: NimbleCubed Inc. (www.nimblecubed.com)&lt;br /&gt;
*ID 465000 - 465999: Artefacts - CourantAlternatif&lt;br /&gt;
*ID 466000 - 466999: CDM Consultores - (www.cdm.guru)&lt;br /&gt;
*ID 467000 - 467999: M71 Service GmbH - (www.m71-service.de)&lt;br /&gt;
*ID 468000 - 468049: Clément Segonzac - France (clement.segonzac@gmail.com)&lt;br /&gt;
*ID 468050 - 468099: Flavien Belli - France (https://github.com/Marshlyin || belliflaviencontactpro@gmail.com)&lt;br /&gt;
*ID 468100 - 468119: Chl (https://code.bugness.org/Dolibarr)&lt;br /&gt;
*ID 468120 - 468170: Commotron GmbH (https://www.commotron.com/)&lt;br /&gt;
*ID 468171 - 468220: Infans Group (franck.lauby@infans.fr)&lt;br /&gt;
*ID 468221 - 468174 &#039;&#039;&#039;Free (take ranges of 50 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 468175 - 468199: Gaëlle Rauffet - France (kiwiscan.net)&lt;br /&gt;
*ID 468200 - 468250: Paulo Oliveira - Brasil (paulorcdo@gmail.com)&lt;br /&gt;
*ID 468251 - 468270:  CD-Systems - France (https://www.cd-systems.fr)&lt;br /&gt;
*ID 468300 - 468349: Uvensys - Germany (https://uvensys.de)&lt;br /&gt;
*ID 468350 - 468399 : Laudeco - Belgium (http://github.com/laudeco)&lt;br /&gt;
*ID 468400 - 468449 : Alexis LAURIER - France (https://www.alexislaurier.fr)&lt;br /&gt;
*ID 468450 - 468499 : Mehdi Belkhayat - Maroc (https://opensi.ma)&lt;br /&gt;
*ID 468500 - 468599 : InvIT GmbH - Germany (https://invit.sh)&lt;br /&gt;
*ID 468600 - 468649 : Ricardo Sequeira - Portugal (https://ricardo-sequeira.com)&lt;br /&gt;
*ID 468650 - 468699 : J-IT - Belgique (https://www.j-it.be)&lt;br /&gt;
*ID 468700 - 468749 : Fidesio - France (https://www.fidesio.com/)&lt;br /&gt;
*ID 468750 - 468799 : Sgestion - Spain (http://www.sgestion.net/)&lt;br /&gt;
*ID 468800 - 468849 : Denis JULIEN - Brasil (matrinxa@free.fr)&lt;br /&gt;
*ID 468850 - 468900: Mmariko - Module GED - Effios&lt;br /&gt;
*ID 468901 - 468950: Maazou Amadou Abdoul aziz - Maroc (yaronfada@gmail.com)&lt;br /&gt;
*ID 468951 - 469000: Alexis LAURIER - France (https://www.alexislaurier.fr)&lt;br /&gt;
*ID 469001 - 469050: John Livingston (https://github.com/JohnXLivingston/)&lt;br /&gt;
*ID 469051 - 469100: Macrorom ICT-services (https://macrorom.nl/)&lt;br /&gt;
*ID 469101 - 469150: HABOT IT - France (https://habot.it)&lt;br /&gt;
*ID 469151 - 469160: CaribbeanConsult.Com CCC - France Guadeloupe (https://dolibarr.ccc.gp)&lt;br /&gt;
*ID 469161 - 469171: GMBG - Portugal&lt;br /&gt;
*ID 469172 - 469192: BGi Lda - Portugal&lt;br /&gt;
*ID 469949 - 469999: Goldoweb (http://goldoweb.com)&lt;br /&gt;
*ID 470000 - 470999: Reindeer Digital (https://rdeer.cz)&lt;br /&gt;
*ID 471000 - 471099: CAP-REL (www.cap-rel.fr)&lt;br /&gt;
*ID 471100 - 471199: M. Morillon&lt;br /&gt;
*ID 471200 - 471209: Pablo Nuñez&lt;br /&gt;
*ID 481000 - 482000: Alhaidab-ITIS (https://alhaidab.dolibarr.sd)&lt;br /&gt;
*ID 482001 - 483000: Basix IT (https://www.basix.de)&lt;br /&gt;
*ID 483001 - 483050: SASCO SpA (https://www.sasco.cl)&lt;br /&gt;
*ID 483051 - 483100: WIP Engineering (https://www.wip-gmbh.com)&lt;br /&gt;
*ID 483101 - 483150: J.Kaiser&lt;br /&gt;
*ID 483151 - 483201: CodLines (https://www.codlines.com)&lt;br /&gt;
*ID 485000 - 485049: Gest Info Service Plus (contact@gest-plus.fr)&lt;br /&gt;
*ID 490000 - 490050: VOLD (https://vold.lu)&lt;br /&gt;
*ID 491000 - 491050: NORD ERP CRM (https://www.nord-erp-crm.fr/)&lt;br /&gt;
*ID 491051 - 491100: KJR-online (https://kjr-online.fr/)&lt;br /&gt;
*ID 491101 - 491149: eNova&lt;br /&gt;
*ID 491150 - 491200: App 4 Business&lt;br /&gt;
*ID 491201 - 491250: Mil24 (http://www.mil24.com.py)&lt;br /&gt;
*ID 491251 - 491301: M2AM&lt;br /&gt;
&lt;br /&gt;
DO NOT ADD RECORD HERE, PLEASE FILL HOLES FIRST !!!!&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
=ID &amp;gt; 500000=&lt;br /&gt;
&lt;br /&gt;
This range can&#039;t be reserved. It is a common range. If you don&#039;t plan to distribute your module, you can use an ID in this range with no need to reserve it.&lt;br /&gt;
&lt;br /&gt;
{{Flag en}}&lt;br /&gt;
If you don&#039;t already have reserved ids and need some, please don&#039;t use hazardous number and use a number higher than 500000, but it is better to ask a wiki account, and reserve your own range by editing the  100000 - 499999 range (50 ids at once, 1000 ids maximum per partner).&lt;br /&gt;
&lt;br /&gt;
{{Flag fr}}&lt;br /&gt;
Si vous n&#039;avez pas de numéros réservés et en avez besoin, n&#039;utilisez pas de chiffres au hasard et utilisez une valeur supérieure à 500000, toutefois, il est préférable d&#039;obtenir un compte wiki, et  réserver vous-même votre plage en ajoutant votre entrée dans la zone 100000 - 499999 (par lot de 50 d&#039;abord, pas plus de 1000 numéros par partenaire).&lt;br /&gt;
&lt;br /&gt;
{{Flag sp}}&lt;br /&gt;
Si no dispone de número reservado y necesita, no use cifras redondeadas y usa un valor superior a 500000. Si tiene una cuenta wiki, puede reservarse usted mismo sus id añadiendo su entrada en la zona 100000 - 499999 (no más de 1000 id por partner).&lt;/div&gt;</summary>
		<author><name>ShengGang</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=%E6%8A%A5%E4%BB%B7%E5%8D%95%E6%A8%A1%E5%9D%97%EF%BC%88%E5%BC%80%E5%8F%91%EF%BC%89&amp;diff=58487</id>
		<title>报价单模块（开发）</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=%E6%8A%A5%E4%BB%B7%E5%8D%95%E6%A8%A1%E5%9D%97%EF%BC%88%E5%BC%80%E5%8F%91%EF%BC%89&amp;diff=58487"/>
		<updated>2023-10-25T03:41:47Z</updated>

		<summary type="html">&lt;p&gt;ShengGang: /* 功能 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- BEGIN interlang links --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Do NOT edit this section&lt;br /&gt;
     Links below are automatically managed by PolyglotBot&lt;br /&gt;
     You can edit links on the English source page : Module_Commercial_Proposals_(developer) --&amp;gt;&lt;br /&gt;
[[en:Module_Commercial_Proposals_(developer)]]&lt;br /&gt;
[[fr:Module_Propositions_commerciales_(développeur)]]&lt;br /&gt;
[[es:Módulo_Presupuestos_(desarrollador)]]&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Proposal]]&lt;br /&gt;
{{TemplateDocDevZh}}&lt;br /&gt;
{{TemplateModEN Developer}}&lt;br /&gt;
{{模块模板|&lt;br /&gt;
name=报价单| &lt;br /&gt;
num=20|&lt;br /&gt;
devdoc=本页|&lt;br /&gt;
userdoc=[[报价单模块]]|}}&lt;br /&gt;
&lt;br /&gt;
=功能=&lt;br /&gt;
管理商业报价单&lt;br /&gt;
&lt;br /&gt;
=报价单实体=&lt;br /&gt;
{{TemplateDocDevEntityEn|&lt;br /&gt;
class=htdocs/comm/propal/class/propal.class.php}}&lt;br /&gt;
&lt;br /&gt;
=权限=&lt;br /&gt;
&lt;br /&gt;
*-&amp;gt;propal-&amp;gt;lire&lt;br /&gt;
*-&amp;gt;propal-&amp;gt;creer&lt;br /&gt;
*-&amp;gt;propal-&amp;gt;valider&lt;br /&gt;
*-&amp;gt;propal-&amp;gt;envoyer&lt;br /&gt;
*-&amp;gt;propal-&amp;gt;cloturer&lt;br /&gt;
*-&amp;gt;propal-&amp;gt;supprimer&lt;br /&gt;
&lt;br /&gt;
=表 SQL=&lt;br /&gt;
&lt;br /&gt;
*[[Table llx_propal|llx_propal]] 商业报价单主表&lt;br /&gt;
*[[Table llx_propaldet|llx_propaledet]] 商业报价单明细表&lt;br /&gt;
&lt;br /&gt;
=常量=&lt;br /&gt;
&lt;br /&gt;
*PROPALE_ADDON_PDF&lt;br /&gt;
*PROPALE_ADDON&lt;br /&gt;
*PROPALE_VALIDITY_DURATION&lt;/div&gt;</summary>
		<author><name>ShengGang</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Module_Commercial_Proposals_(developer)&amp;diff=58483</id>
		<title>Module Commercial Proposals (developer)</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Module_Commercial_Proposals_(developer)&amp;diff=58483"/>
		<updated>2023-10-25T03:36:41Z</updated>

		<summary type="html">&lt;p&gt;ShengGang: Add Chinese&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- BEGIN origin interlang links --&amp;gt;&lt;br /&gt;
&amp;lt;!-- You can edit this section but do NOT remove these comments&lt;br /&gt;
     Links below will be automatically replicated on translated pages by PolyglotBot --&amp;gt;&lt;br /&gt;
[[fr:Module_Propositions_commerciales_(développeur)]]&lt;br /&gt;
[[es:Módulo_Presupuestos_(desarrollador)]]&lt;br /&gt;
[[zh:报价单模块（开发）]]&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Proposal]]&lt;br /&gt;
{{TemplateDocDevEn}}&lt;br /&gt;
{{TemplateModEN Developer}}&lt;br /&gt;
{{BasculeDevUserEn|&lt;br /&gt;
name=Commercial Proposals| &lt;br /&gt;
num=20|&lt;br /&gt;
devdoc=This page|&lt;br /&gt;
userdoc=[[Module Commercial Proposals]]|}}&lt;br /&gt;
&lt;br /&gt;
= Feature =&lt;br /&gt;
Manage commercial proposals&lt;br /&gt;
&lt;br /&gt;
= Entity Proposal=&lt;br /&gt;
{{TemplateDocDevEntityEn|&lt;br /&gt;
class=htdocs/comm/propal/class/propal.class.php}}&lt;br /&gt;
&lt;br /&gt;
= Permissions =&lt;br /&gt;
*-&amp;gt;propal-&amp;gt;lire&lt;br /&gt;
*-&amp;gt;propal-&amp;gt;creer&lt;br /&gt;
*-&amp;gt;propal-&amp;gt;valider&lt;br /&gt;
*-&amp;gt;propal-&amp;gt;envoyer&lt;br /&gt;
*-&amp;gt;propal-&amp;gt;cloturer&lt;br /&gt;
*-&amp;gt;propal-&amp;gt;supprimer&lt;br /&gt;
&lt;br /&gt;
= Tables SQL =&lt;br /&gt;
* [[Table llx_propal|llx_propal]] Main table of commercial proposals&lt;br /&gt;
* [[Table llx_propaldet|llx_propaledet]] Line of commercial proposals details&lt;br /&gt;
&lt;br /&gt;
= Constants =&lt;br /&gt;
* PROPALE_ADDON_PDF&lt;br /&gt;
* PROPALE_ADDON &lt;br /&gt;
* PROPALE_VALIDITY_DURATION&lt;/div&gt;</summary>
		<author><name>ShengGang</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=%E6%8A%A5%E4%BB%B7%E5%8D%95%E6%A8%A1%E5%9D%97&amp;diff=58482</id>
		<title>报价单模块</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=%E6%8A%A5%E4%BB%B7%E5%8D%95%E6%A8%A1%E5%9D%97&amp;diff=58482"/>
		<updated>2023-10-25T03:35:50Z</updated>

		<summary type="html">&lt;p&gt;ShengGang: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- BEGIN interlang links --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Do NOT edit this section&lt;br /&gt;
     Links below are automatically managed by PolyglotBot&lt;br /&gt;
     You can edit links on the English source page : Module_Commercial_Proposals_-_Quotes --&amp;gt;&lt;br /&gt;
[[en:Module_Commercial_Proposals_-_Quotes]]&lt;br /&gt;
[[fr:Module Propositions commerciales - Devis]]&lt;br /&gt;
[[es:Módulo_Presupuestos]]&lt;br /&gt;
[[de:Modul_Angebote]]&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Proposal]]&lt;br /&gt;
{{Template用户手册}}&lt;br /&gt;
{{TemplateModZH}}&lt;br /&gt;
{{模块模板|&lt;br /&gt;
name=报价单|&lt;br /&gt;
num=20|&lt;br /&gt;
devdoc=[[报价单模块（开发）]]|&lt;br /&gt;
userdoc=本页|}}&lt;br /&gt;
&lt;br /&gt;
=简介=&lt;br /&gt;
报价单或商业建议书是您向客户提供的建议文档，使客户了解您提供的服务或产品的价格。&lt;br /&gt;
&lt;br /&gt;
=安装=&lt;br /&gt;
{{NoInstallModuleZh}}&lt;br /&gt;
&lt;br /&gt;
=配置=&lt;br /&gt;
{{ActivationModuleZh}}&lt;br /&gt;
&lt;br /&gt;
=生命周期 / 业务规则=&lt;br /&gt;
报价单刚创建时，处于草稿状态。&lt;br /&gt;
&lt;br /&gt;
确认后，处于已验证状态。 最后，您可以关闭处于&amp;quot;已签署&amp;quot;（客户已接受报价）或&amp;quot;已拒绝&amp;quot;状态的报价单。&lt;br /&gt;
&lt;br /&gt;
之后，您可以手动或自动将报价单转换为发票或订单。&lt;br /&gt;
&lt;br /&gt;
=创建报价单=&lt;br /&gt;
报价单的创建是在合作方表单页。该合作方必须是&amp;quot;客户&amp;quot;或&amp;quot;准客户&amp;quot;。 此外，还必须激活报价单模块。&lt;br /&gt;
&lt;br /&gt;
要创建建议书，请打开相关合作方表单页的&amp;quot;客户&amp;quot;或&amp;quot;准客户&amp;quot;标签页。 单击&amp;quot;添加报价单&amp;quot;按钮。&lt;br /&gt;
&lt;br /&gt;
然后按照提示创建报价单草稿，并在准备就绪时进行验证。&lt;br /&gt;
&lt;br /&gt;
=关闭报价单()osal (Refused or Signed then Billed)=&lt;br /&gt;
&lt;br /&gt;
当报价单被设置为&amp;quot;已拒绝&amp;quot;时，报价单将被关闭。 &lt;br /&gt;
&lt;br /&gt;
如果客户同意报价后将报价单设置为&amp;quot;已签署&amp;quot;，则准客户将自动转变为客户（如果他们还不是客户）。&lt;br /&gt;
&lt;br /&gt;
接下来，您需要决定何时关闭报价单（在创建订单或验证发票时）。&lt;br /&gt;
&lt;br /&gt;
如果您正确配置了 [[Module Workflow|工作流模块]] ，可以自动创建订单&amp;quot;草稿&amp;quot;，还可以在创建订单之后或发票验证通过时自动关闭报价单。&lt;br /&gt;
&lt;br /&gt;
=文档模板=&lt;br /&gt;
Dolibarr可以处理多个报价单模板，这些模板必须在模块的配置部分被激活。如果您了解PHP语言，还可以创建自己的模板。报价单模板位于目录：/includes/modules/propale/ 中。&lt;br /&gt;
&lt;br /&gt;
=相关视频=&lt;br /&gt;
&amp;lt;youtube width=&amp;quot;200&amp;quot; height=&amp;quot;120&amp;quot;&amp;gt;OkbncQwiWIw&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
报价单：&lt;br /&gt;
（法语配音，但字幕可用，并使用法语评论）&lt;br /&gt;
&lt;br /&gt;
&amp;lt;youtube width=&amp;quot;200&amp;quot; height=&amp;quot;120&amp;quot;&amp;gt;2xcEjyGFSg8&amp;lt;/youtube&amp;gt;&lt;/div&gt;</summary>
		<author><name>ShengGang</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=%E6%8A%A5%E4%BB%B7%E5%8D%95%E6%A8%A1%E5%9D%97%EF%BC%88%E5%BC%80%E5%8F%91%EF%BC%89&amp;diff=58481</id>
		<title>报价单模块（开发）</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=%E6%8A%A5%E4%BB%B7%E5%8D%95%E6%A8%A1%E5%9D%97%EF%BC%88%E5%BC%80%E5%8F%91%EF%BC%89&amp;diff=58481"/>
		<updated>2023-10-25T03:35:18Z</updated>

		<summary type="html">&lt;p&gt;ShengGang: initialization&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Proposal]]&lt;br /&gt;
{{TemplateDocDevZh}}&lt;br /&gt;
{{TemplateModEN Developer}}&lt;br /&gt;
{{模块模板|&lt;br /&gt;
name=报价单| &lt;br /&gt;
num=20|&lt;br /&gt;
devdoc=本页|&lt;br /&gt;
userdoc=[[报价单模块]]|}}&lt;br /&gt;
&lt;br /&gt;
= 功能 =&lt;br /&gt;
Manage commercial proposals&lt;br /&gt;
&lt;br /&gt;
= Entity Proposal=&lt;br /&gt;
{{TemplateDocDevEntityEn|&lt;br /&gt;
class=htdocs/comm/propal/class/propal.class.php}}&lt;br /&gt;
&lt;br /&gt;
= Permissions =&lt;br /&gt;
*-&amp;gt;propal-&amp;gt;lire&lt;br /&gt;
*-&amp;gt;propal-&amp;gt;creer&lt;br /&gt;
*-&amp;gt;propal-&amp;gt;valider&lt;br /&gt;
*-&amp;gt;propal-&amp;gt;envoyer&lt;br /&gt;
*-&amp;gt;propal-&amp;gt;cloturer&lt;br /&gt;
*-&amp;gt;propal-&amp;gt;supprimer&lt;br /&gt;
&lt;br /&gt;
= Tables SQL =&lt;br /&gt;
* [[Table llx_propal|llx_propal]] Main table of commercial proposals&lt;br /&gt;
* [[Table llx_propaldet|llx_propaledet]] Line of commercial proposals details&lt;br /&gt;
&lt;br /&gt;
= Constants =&lt;br /&gt;
* PROPALE_ADDON_PDF&lt;br /&gt;
* PROPALE_ADDON &lt;br /&gt;
* PROPALE_VALIDITY_DURATION&lt;/div&gt;</summary>
		<author><name>ShengGang</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=%E6%9C%8D%E5%8A%A1%E6%A8%A1%E5%9D%97%EF%BC%88%E5%BC%80%E5%8F%91%EF%BC%89&amp;diff=58401</id>
		<title>服务模块（开发）</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=%E6%9C%8D%E5%8A%A1%E6%A8%A1%E5%9D%97%EF%BC%88%E5%BC%80%E5%8F%91%EF%BC%89&amp;diff=58401"/>
		<updated>2023-10-16T08:49:52Z</updated>

		<summary type="html">&lt;p&gt;ShengGang: /* Feature */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- BEGIN interlang links --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Do NOT edit this section&lt;br /&gt;
     Links below are automatically managed by PolyglotBot&lt;br /&gt;
     You can edit links on the English source page : Module_Service_(developer) --&amp;gt;&lt;br /&gt;
[[en:Module_Service_(developer)]]&lt;br /&gt;
[[fr:Module_Services_(développeur)]]&lt;br /&gt;
[[es:Módulo_Servicios_(desarrollador)]]&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Service]]&lt;br /&gt;
{{TemplateDocDevZh}}&lt;br /&gt;
{{TemplateModEN Developer}}&lt;br /&gt;
{{模块模板|&lt;br /&gt;
name=服务|&lt;br /&gt;
num=53|&lt;br /&gt;
devdoc=本页|&lt;br /&gt;
userdoc=[[服务模块]]|}}&lt;br /&gt;
&lt;br /&gt;
=功能=&lt;br /&gt;
服务模块用于管理服务目录。&lt;br /&gt;
&lt;br /&gt;
=服务实体=&lt;br /&gt;
{{TemplateDocDevEntityEn|&lt;br /&gt;
class=htdocs/product/class/service.class.php}}&lt;br /&gt;
&lt;br /&gt;
=权限=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=表 SQL=&lt;br /&gt;
&lt;br /&gt;
*[[Table llx_product|llx_product]] 包含产品和服务&lt;br /&gt;
*[[Table llx product price|llx product price]] 包含对应于不同级别客户的服务价格。&lt;/div&gt;</summary>
		<author><name>ShengGang</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=%E6%9C%8D%E5%8A%A1%E6%A8%A1%E5%9D%97&amp;diff=58400</id>
		<title>服务模块</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=%E6%9C%8D%E5%8A%A1%E6%A8%A1%E5%9D%97&amp;diff=58400"/>
		<updated>2023-10-16T08:45:29Z</updated>

		<summary type="html">&lt;p&gt;ShengGang: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- BEGIN interlang links --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Do NOT edit this section&lt;br /&gt;
     Links below are automatically managed by PolyglotBot&lt;br /&gt;
     You can edit links on the English source page : Module_Services_En --&amp;gt;&lt;br /&gt;
[[en:Module_Services_En]]&lt;br /&gt;
[[fr:Module_Services]]&lt;br /&gt;
[[es:Módulo_Servicios]]&lt;br /&gt;
[[de:Modul_Leistungen]]&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Service]]&lt;br /&gt;
{{Template用户手册}}&lt;br /&gt;
{{TemplateModZH}}&lt;br /&gt;
{{模块模板|&lt;br /&gt;
name=服务|&lt;br /&gt;
num=53|&lt;br /&gt;
devdoc=[[服务模块（开发）]]|&lt;br /&gt;
userdoc=本页|}}&lt;br /&gt;
&lt;br /&gt;
=简介=&lt;br /&gt;
本模块用于管理服务。若要管理产品请参阅 [[产品模块]] 。&lt;br /&gt;
&lt;br /&gt;
=安装=&lt;br /&gt;
{{NoInstallModuleZh}}&lt;br /&gt;
&lt;br /&gt;
=配置=&lt;br /&gt;
{{ActivationModuleZh}}&lt;br /&gt;
&lt;br /&gt;
=定义=&lt;br /&gt;
产品和服务经常被混淆。然而，它们遵循不同的规则。 服务是一种非物质商品，它可以被出售、购买或提供，但是不能被存储在仓库中。服务是被准时提供的或是在一个持续时间内提供的。&lt;br /&gt;
&lt;br /&gt;
识别服务的特征： &lt;br /&gt;
&lt;br /&gt;
*可以是一次性、准时的（将硬件安装到客户家中），也可以是有期限的（如产品保修）。&lt;br /&gt;
*服务不能被存储在仓库中。&lt;br /&gt;
*因此，服务不受库存的限制，也无法计算库存的服务有多少。&lt;br /&gt;
&lt;br /&gt;
==虚拟服务==&lt;br /&gt;
虚拟产品或服务是由其他产品/服务组成的父产品。此功能从产品或服务模块的配置页面激活。其目的是定义服务的“包”或“批次”，允许使用单个元素而不是构成批次的N个服务对订单、发票进行操作。&lt;br /&gt;
&lt;br /&gt;
虚拟服务满足以下规则：&lt;br /&gt;
&lt;br /&gt;
*将服务添加到文档（报价单、发票、订单）时，仅显示父虚拟服务的行。&lt;br /&gt;
*虚拟服务本身可以由包含真实服务的其他虚拟服务组成。&lt;br /&gt;
&lt;br /&gt;
=生命周期/业务规则=&lt;br /&gt;
{{ToComplete}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=相关视频=&lt;br /&gt;
&amp;lt;youtube width=&amp;quot;200&amp;quot; height=&amp;quot;120&amp;quot;&amp;gt;Qm0k1G4BYsE&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
服务：&lt;br /&gt;
&lt;br /&gt;
（法语配音，但字幕可用，并用法语评论）&lt;br /&gt;
&lt;br /&gt;
&amp;lt;youtube width=&amp;quot;200&amp;quot; height=&amp;quot;120&amp;quot;&amp;gt;DfIqjelxZgA&amp;lt;/youtube&amp;gt;&lt;/div&gt;</summary>
		<author><name>ShengGang</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Module_Service_(developer)&amp;diff=58396</id>
		<title>Module Service (developer)</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Module_Service_(developer)&amp;diff=58396"/>
		<updated>2023-10-16T08:32:48Z</updated>

		<summary type="html">&lt;p&gt;ShengGang: Add Chinese&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- BEGIN origin interlang links --&amp;gt;&lt;br /&gt;
&amp;lt;!-- You can edit this section but do NOT remove these comments&lt;br /&gt;
     Links below will be automatically replicated on translated pages by PolyglotBot --&amp;gt;&lt;br /&gt;
[[fr:Module_Services_(développeur)]]&lt;br /&gt;
[[es:Módulo_Servicios_(desarrollador)]]&lt;br /&gt;
[[zh:服务模块（开发）]]&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Service]]&lt;br /&gt;
{{TemplateDocDevEn}}&lt;br /&gt;
{{TemplateModEN Developer}}&lt;br /&gt;
{{BasculeDevUserEn|&lt;br /&gt;
name=Services|&lt;br /&gt;
num=53|&lt;br /&gt;
devdoc=This page|&lt;br /&gt;
userdoc=[[Module Services En|Module Services]]|}}&lt;br /&gt;
&lt;br /&gt;
= Feature =&lt;br /&gt;
The Service module is used to manage a catalog of services.&lt;br /&gt;
&lt;br /&gt;
= Entity Service =&lt;br /&gt;
{{TemplateDocDevEntityEn|&lt;br /&gt;
class=htdocs/product/class/service.class.php}}&lt;br /&gt;
&lt;br /&gt;
= Permissions =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Tables SQL =&lt;br /&gt;
* [[Table llx_product|llx_product]] Contains products and services&lt;br /&gt;
* [[Table llx product price|llx product price]] Contains service prices for different level of customers&lt;/div&gt;</summary>
		<author><name>ShengGang</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=%E6%9C%8D%E5%8A%A1%E6%A8%A1%E5%9D%97%EF%BC%88%E5%BC%80%E5%8F%91%EF%BC%89&amp;diff=58395</id>
		<title>服务模块（开发）</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=%E6%9C%8D%E5%8A%A1%E6%A8%A1%E5%9D%97%EF%BC%88%E5%BC%80%E5%8F%91%EF%BC%89&amp;diff=58395"/>
		<updated>2023-10-16T08:31:38Z</updated>

		<summary type="html">&lt;p&gt;ShengGang: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Service]]&lt;br /&gt;
{{TemplateDocDevZh}}&lt;br /&gt;
{{TemplateModEN Developer}}&lt;br /&gt;
{{模块模板|&lt;br /&gt;
name=服务|&lt;br /&gt;
num=53|&lt;br /&gt;
devdoc=本页|&lt;br /&gt;
userdoc=[[服务模块]]|}}&lt;br /&gt;
&lt;br /&gt;
=Feature=&lt;br /&gt;
The Service module is used to manage a catalog of services.&lt;br /&gt;
&lt;br /&gt;
=Entity Service=&lt;br /&gt;
{{TemplateDocDevEntityEn|&lt;br /&gt;
class=htdocs/product/class/service.class.php}}&lt;br /&gt;
&lt;br /&gt;
=Permissions=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Tables SQL=&lt;br /&gt;
&lt;br /&gt;
*[[Table llx_product|llx_product]] Contains products and services&lt;br /&gt;
*[[Table llx product price|llx product price]] Contains service prices for different level of customers&lt;/div&gt;</summary>
		<author><name>ShengGang</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=%E6%9C%8D%E5%8A%A1%E6%A8%A1%E5%9D%97%EF%BC%88%E5%BC%80%E5%8F%91%EF%BC%89&amp;diff=58394</id>
		<title>服务模块（开发）</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=%E6%9C%8D%E5%8A%A1%E6%A8%A1%E5%9D%97%EF%BC%88%E5%BC%80%E5%8F%91%EF%BC%89&amp;diff=58394"/>
		<updated>2023-10-16T08:30:51Z</updated>

		<summary type="html">&lt;p&gt;ShengGang: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Service]]&lt;br /&gt;
{{TemplateDocDevZh}}&lt;br /&gt;
{{TemplateModEN Developer}}&lt;br /&gt;
{{模块模板|&lt;br /&gt;
name=服务|&lt;br /&gt;
num=53|&lt;br /&gt;
devdoc=本页|&lt;br /&gt;
userdoc=服务模块|}}&lt;br /&gt;
&lt;br /&gt;
=Feature=&lt;br /&gt;
The Service module is used to manage a catalog of services.&lt;br /&gt;
&lt;br /&gt;
=Entity Service=&lt;br /&gt;
{{TemplateDocDevEntityEn|&lt;br /&gt;
class=htdocs/product/class/service.class.php}}&lt;br /&gt;
&lt;br /&gt;
=Permissions=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Tables SQL=&lt;br /&gt;
&lt;br /&gt;
*[[Table llx_product|llx_product]] Contains products and services&lt;br /&gt;
*[[Table llx product price|llx product price]] Contains service prices for different level of customers&lt;/div&gt;</summary>
		<author><name>ShengGang</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=%E6%9C%8D%E5%8A%A1%E6%A8%A1%E5%9D%97%EF%BC%88%E5%BC%80%E5%8F%91%EF%BC%89&amp;diff=58393</id>
		<title>服务模块（开发）</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=%E6%9C%8D%E5%8A%A1%E6%A8%A1%E5%9D%97%EF%BC%88%E5%BC%80%E5%8F%91%EF%BC%89&amp;diff=58393"/>
		<updated>2023-10-16T08:30:11Z</updated>

		<summary type="html">&lt;p&gt;ShengGang: initialization&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Service]]&lt;br /&gt;
{{TemplateDocDevZh}}&lt;br /&gt;
{{TemplateModEN Developer}}&lt;br /&gt;
{{模块模板|&lt;br /&gt;
name=服务|&lt;br /&gt;
num=53|&lt;br /&gt;
devdoc=本页|&lt;br /&gt;
userdoc=[[Module Services En|Module Services]]|}}&lt;br /&gt;
&lt;br /&gt;
= Feature =&lt;br /&gt;
The Service module is used to manage a catalog of services.&lt;br /&gt;
&lt;br /&gt;
= Entity Service =&lt;br /&gt;
{{TemplateDocDevEntityEn|&lt;br /&gt;
class=htdocs/product/class/service.class.php}}&lt;br /&gt;
&lt;br /&gt;
= Permissions =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Tables SQL =&lt;br /&gt;
* [[Table llx_product|llx_product]] Contains products and services&lt;br /&gt;
* [[Table llx product price|llx product price]] Contains service prices for different level of customers&lt;/div&gt;</summary>
		<author><name>ShengGang</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=%E6%95%85%E9%9A%9C%E6%8E%92%E9%99%A4&amp;diff=58392</id>
		<title>故障排除</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=%E6%95%85%E9%9A%9C%E6%8E%92%E9%99%A4&amp;diff=58392"/>
		<updated>2023-10-16T08:13:30Z</updated>

		<summary type="html">&lt;p&gt;ShengGang: /* 信息 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- BEGIN interlang links --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Do NOT edit this section&lt;br /&gt;
     Links below are automatically managed by PolyglotBot&lt;br /&gt;
     You can edit links on the English source page : Troubleshooting --&amp;gt;&lt;br /&gt;
[[en:Troubleshooting]]&lt;br /&gt;
[[fr:Troubleshooting_FR]]&lt;br /&gt;
[[es:Troubleshooting_ES]]&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:FAQ_ZH]]&lt;br /&gt;
本页面列出了您在使用过程中可能遇到的常见技术问题。&lt;br /&gt;
&lt;br /&gt;
如果遇到问题，首先要激活 Syslog 模块，其次重复导致错误的操作，最后检查日志文件 &#039;&#039;&#039;/documents/dolibarr.log 。&#039;&#039;&#039;&lt;br /&gt;
=Dolibarr每次点击链接都会询问我的登录名/密码=&lt;br /&gt;
您的PHP sessions 存储系统可能有缺陷。&lt;br /&gt;
&lt;br /&gt;
前往菜单 &#039;&#039;&#039;主页 - 管理工具 - 用户会话&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
参数 “session.save_handler” 的值是多少？&lt;br /&gt;
&lt;br /&gt;
如果是&#039;&#039;&#039;files&#039;&#039;&#039;，请查看参数“session.save_path”。其值必须是一个目录路径。检查web服务器是否具有读取和写入此目录的权限。检查磁盘上是否有剩余空间。&lt;br /&gt;
&lt;br /&gt;
=我无法验证发票/报价单/订单/任何其他模块=&lt;br /&gt;
验证文档时，Dolibarr会将属于旧临时文档的文件夹和文件重命名为其最终名称。&lt;br /&gt;
&lt;br /&gt;
在大多数情况下，此重命名过程中会出现验证问题，可能由以下原因引起：&lt;br /&gt;
&lt;br /&gt;
*文件夹 /documents/ 的权限不正确，导致Dolibarr无法重命名子文件夹。如果是这种情况，您应该会在日志中看到以下内容：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
ERROR 127.0.0.1 user fiche Interfaces::run_triggers action=ORDER_SUPPLIER_VALIDATE Files found: 6, Files launched: 5, Done: 0, Failed: 1&lt;br /&gt;
ERROR 127.0.0.1 user fiche CommandeFournisseur::valid &lt;br /&gt;
DEBUG 127.0.0.1 user fiche ROLLBACK Transaction&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*错误的自定义编号掩码：如果您在掩码中对文件系统中的文件名使用非法字符（如“/”），则在尝试验证文档时会出现错误，因为Dolibarr无法使用您指定的非法字符。请尝试暂时禁用自定义掩码并重新启用默认编号系统，以查看是否修复了问题。&lt;br /&gt;
&lt;br /&gt;
=我遇到 DB_ERROR 消息=&lt;br /&gt;
运行 /install/repair.php 页面。运行此页面可能需要几分钟时间。不要忘记先运行 [[备份]] 。&lt;br /&gt;
&lt;br /&gt;
repair.php 可以做些什么：&lt;br /&gt;
&lt;br /&gt;
*运行 repair SQL 文件。&lt;br /&gt;
*搜索已声明的字段列表和已创建到数据库中的字段列表，然后创建缺少的字段&lt;br /&gt;
*将数据清除到表 ecm_directories 中&lt;br /&gt;
*将 logos 移动到正确的新目录&lt;br /&gt;
*重建产品文件的缩略图&lt;br /&gt;
*检查并清理链接的元素&lt;br /&gt;
*检查孤儿菜单&lt;br /&gt;
*运行目录 purge&lt;br /&gt;
*当模块的文件被删除而没有&lt;br /&gt;
*当模块文件被删除而不存在时，将数据清理为const&lt;br /&gt;
&lt;br /&gt;
要进行repair操作，应至少使用一个命令打开页面：&lt;br /&gt;
&lt;br /&gt;
*/install/repair.php?standard=confirmed&lt;br /&gt;
*/install/repair.php?clean_linked_elements=confirmed&lt;br /&gt;
*/install/repair.php?restore_thirdparties_logos=confirmed&lt;br /&gt;
*/install/repair.php?clean_menus=confirmed&lt;br /&gt;
*/install/repair.php?clean_orphelin_dir=confirmed&lt;br /&gt;
*/install/repair.php?clean_product_stock_batch=confirmed&lt;br /&gt;
*/install/repair.php?set_empty_time_spent_amount=confirmed&lt;br /&gt;
*/install/repair.php?rebuild_product_thumbs=confirmed&lt;br /&gt;
*/install/repair.php?force_disable_of_modules_not_found=confirmed&lt;br /&gt;
*/install/repair.php?clean_perm_table=confirmed&lt;br /&gt;
*/install/repair.php?force_utf8_on_tables=confirmed for Mysql only, when &#039;&#039;Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf8_unicode_ci,IMPLICIT) for operation &#039;=&#039; &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=无法上传文件=&lt;br /&gt;
==文件尺寸太大==&lt;br /&gt;
上传文件时收到“文件太大”消息。可上传文件的最大尺寸限制有两处配置点：&lt;br /&gt;
&lt;br /&gt;
*第一个限制是在Dolibarr的菜单 &#039;&#039;&#039;主页-设置-安全-文件（上传）选项卡&#039;&#039;&#039; 中。增加该值。&lt;br /&gt;
*第二个限制位于PHP服务器配置。在这种情况下，您需要更改 php.ini 文件中的参数 &#039;&#039;&#039;upload_max_filesize&#039;&#039;&#039; 。这需要管理员去访问PHP服务器。&lt;br /&gt;
&lt;br /&gt;
==配置错误==&lt;br /&gt;
根据您的配置，如果您遇到错误：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
Warning: tempnam(): open_basedir restriction in effect. File(C:\WINDOWS\TEMP) is not within the allowed path(s): (c:/dolibarr) in C:\dolibarr\www\dolibarr\htdocs\core\modules\import\import_xlsx.modules.php on line 182&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
您必须编辑文件php.ini。&lt;br /&gt;
&lt;br /&gt;
查找指令 upload_tmp_dir ：取消注释该行并将其值更改为所需的路径。在本例中，它是“/var/tmp”：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
; Temporary directory for HTTP uploaded files (will use system default if not&lt;br /&gt;
; specified).&lt;br /&gt;
; http://php.net/upload-tmp-dir&lt;br /&gt;
upload_tmp_dir = /var/tmp&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
此外，对于PHP 5.5及更高版本，可以找到指令 sys_temp_dir ：取消对该行的注释，并将其值更改为所需的路径。在本例中，它是“/var/tmp”：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
; Directory where the temporary files should be placed.&lt;br /&gt;
; Defaults to the system default (see sys_get_temp_dir)&lt;br /&gt;
sys_temp_dir = &amp;quot;/var/tmp&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在Vhosts中：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
open_basedir = {WEBSPACEROOT}{/}{:}{TMP}{/}:/var/tmp&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=我的问题不在此前的清单中=&lt;br /&gt;
==获取调试信息==&lt;br /&gt;
Dolibarr有一个记录它所做的事情和遇到的错误的日志系统。您的web服务器也是。请参阅 [[Gestion d&#039;erreur|syslog模块]] 。&lt;br /&gt;
==获取调试信息==&lt;br /&gt;
如果您无法通过此列表找到问题的解决方案，请尝试收集尽可能多的详细信息（如Dolibarr日志、PHP版本、数据库类型和版本、Dolibarr版本、Apache日志…），并查看此页面以找到可以帮助您的组织：[[Dolibarr help and support|Dolibarr帮助与支持]]&lt;/div&gt;</summary>
		<author><name>ShengGang</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=%E6%95%85%E9%9A%9C%E6%8E%92%E9%99%A4&amp;diff=58391</id>
		<title>故障排除</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=%E6%95%85%E9%9A%9C%E6%8E%92%E9%99%A4&amp;diff=58391"/>
		<updated>2023-10-16T08:07:18Z</updated>

		<summary type="html">&lt;p&gt;ShengGang: /* 我遇到 DB_ERROR 消息 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- BEGIN interlang links --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Do NOT edit this section&lt;br /&gt;
     Links below are automatically managed by PolyglotBot&lt;br /&gt;
     You can edit links on the English source page : Troubleshooting --&amp;gt;&lt;br /&gt;
[[en:Troubleshooting]]&lt;br /&gt;
[[fr:Troubleshooting_FR]]&lt;br /&gt;
[[es:Troubleshooting_ES]]&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:FAQ_ZH]]&lt;br /&gt;
本页面列出了您在使用过程中可能遇到的常见技术问题。&lt;br /&gt;
&lt;br /&gt;
如果遇到问题，首先要激活 Syslog 模块，其次重复导致错误的操作，最后检查日志文件 &#039;&#039;&#039;/documents/dolibarr.log 。&#039;&#039;&#039;&lt;br /&gt;
=Dolibarr每次点击链接都会询问我的登录名/密码=&lt;br /&gt;
您的PHP sessions 存储系统可能有缺陷。&lt;br /&gt;
&lt;br /&gt;
前往菜单 &#039;&#039;&#039;主页 - 管理工具 - 用户会话&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
参数 “session.save_handler” 的值是多少？&lt;br /&gt;
&lt;br /&gt;
如果是&#039;&#039;&#039;files&#039;&#039;&#039;，请查看参数“session.save_path”。其值必须是一个目录路径。检查web服务器是否具有读取和写入此目录的权限。检查磁盘上是否有剩余空间。&lt;br /&gt;
&lt;br /&gt;
=我无法验证发票/报价单/订单/任何其他模块=&lt;br /&gt;
验证文档时，Dolibarr会将属于旧临时文档的文件夹和文件重命名为其最终名称。&lt;br /&gt;
&lt;br /&gt;
在大多数情况下，此重命名过程中会出现验证问题，可能由以下原因引起：&lt;br /&gt;
&lt;br /&gt;
*文件夹 /documents/ 的权限不正确，导致Dolibarr无法重命名子文件夹。如果是这种情况，您应该会在日志中看到以下内容：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
ERROR 127.0.0.1 user fiche Interfaces::run_triggers action=ORDER_SUPPLIER_VALIDATE Files found: 6, Files launched: 5, Done: 0, Failed: 1&lt;br /&gt;
ERROR 127.0.0.1 user fiche CommandeFournisseur::valid &lt;br /&gt;
DEBUG 127.0.0.1 user fiche ROLLBACK Transaction&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*错误的自定义编号掩码：如果您在掩码中对文件系统中的文件名使用非法字符（如“/”），则在尝试验证文档时会出现错误，因为Dolibarr无法使用您指定的非法字符。请尝试暂时禁用自定义掩码并重新启用默认编号系统，以查看是否修复了问题。&lt;br /&gt;
&lt;br /&gt;
=我遇到 DB_ERROR 消息=&lt;br /&gt;
运行 /install/repair.php 页面。运行此页面可能需要几分钟时间。不要忘记先运行 [[备份]] 。&lt;br /&gt;
&lt;br /&gt;
repair.php 可以做些什么：&lt;br /&gt;
&lt;br /&gt;
*运行 repair SQL 文件。&lt;br /&gt;
*搜索已声明的字段列表和已创建到数据库中的字段列表，然后创建缺少的字段&lt;br /&gt;
*将数据清除到表 ecm_directories 中&lt;br /&gt;
*将 logos 移动到正确的新目录&lt;br /&gt;
*重建产品文件的缩略图&lt;br /&gt;
*检查并清理链接的元素&lt;br /&gt;
*检查孤儿菜单&lt;br /&gt;
*运行目录 purge&lt;br /&gt;
*当模块的文件被删除而没有&lt;br /&gt;
*当模块文件被删除而不存在时，将数据清理为const&lt;br /&gt;
&lt;br /&gt;
要进行repair操作，应至少使用一个命令打开页面：&lt;br /&gt;
&lt;br /&gt;
*/install/repair.php?standard=confirmed&lt;br /&gt;
*/install/repair.php?clean_linked_elements=confirmed&lt;br /&gt;
*/install/repair.php?restore_thirdparties_logos=confirmed&lt;br /&gt;
*/install/repair.php?clean_menus=confirmed&lt;br /&gt;
*/install/repair.php?clean_orphelin_dir=confirmed&lt;br /&gt;
*/install/repair.php?clean_product_stock_batch=confirmed&lt;br /&gt;
*/install/repair.php?set_empty_time_spent_amount=confirmed&lt;br /&gt;
*/install/repair.php?rebuild_product_thumbs=confirmed&lt;br /&gt;
*/install/repair.php?force_disable_of_modules_not_found=confirmed&lt;br /&gt;
*/install/repair.php?clean_perm_table=confirmed&lt;br /&gt;
*/install/repair.php?force_utf8_on_tables=confirmed for Mysql only, when &#039;&#039;Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf8_unicode_ci,IMPLICIT) for operation &#039;=&#039; &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=无法上传文件=&lt;br /&gt;
==文件尺寸太大==&lt;br /&gt;
上传文件时收到“文件太大”消息。可上传文件的最大尺寸限制有两处配置点：&lt;br /&gt;
&lt;br /&gt;
*第一个限制是在Dolibarr的菜单 &#039;&#039;&#039;主页-设置-安全-文件（上传）选项卡&#039;&#039;&#039; 中。增加该值。&lt;br /&gt;
*第二个限制位于PHP服务器配置。在这种情况下，您需要更改 php.ini 文件中的参数 &#039;&#039;&#039;upload_max_filesize&#039;&#039;&#039; 。这需要管理员去访问PHP服务器。&lt;br /&gt;
&lt;br /&gt;
==信息==&lt;br /&gt;
Depending of your configuration, if you encounter the error&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
Warning: tempnam(): open_basedir restriction in effect. File(C:\WINDOWS\TEMP) is not within the allowed path(s): (c:/dolibarr) in C:\dolibarr\www\dolibarr\htdocs\core\modules\import\import_xlsx.modules.php on line 182&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You will have to edit the php.ini&lt;br /&gt;
Find the directive upload_tmp_dir: uncomment the line and change its value to a required path. In this example it is &amp;quot;/var/tmp&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
; Temporary directory for HTTP uploaded files (will use system default if not&lt;br /&gt;
; specified).&lt;br /&gt;
; http://php.net/upload-tmp-dir&lt;br /&gt;
upload_tmp_dir = /var/tmp&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Additionally for PHP versions 5.5 and greater, find the directive sys_temp_dir: uncomment the line and change its value to a required path. In this example, it is &amp;quot;/var/tmp&amp;quot;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
; Directory where the temporary files should be placed.&lt;br /&gt;
; Defaults to the system default (see sys_get_temp_dir)&lt;br /&gt;
sys_temp_dir = &amp;quot;/var/tmp&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And in Vhosts &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
open_basedir = {WEBSPACEROOT}{/}{:}{TMP}{/}:/var/tmp&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=我的问题不在此前的清单中=&lt;br /&gt;
==获取调试信息==&lt;br /&gt;
Dolibarr有一个记录它所做的事情和遇到的错误的日志系统。您的web服务器也是。请参阅 [[Gestion d&#039;erreur|syslog模块]] 。&lt;br /&gt;
==获取调试信息==&lt;br /&gt;
如果您无法通过此列表找到问题的解决方案，请尝试收集尽可能多的详细信息（如Dolibarr日志、PHP版本、数据库类型和版本、Dolibarr版本、Apache日志…），并查看此页面以找到可以帮助您的组织：[[Dolibarr help and support|Dolibarr帮助与支持]]&lt;/div&gt;</summary>
		<author><name>ShengGang</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=%E6%95%85%E9%9A%9C%E6%8E%92%E9%99%A4&amp;diff=58390</id>
		<title>故障排除</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=%E6%95%85%E9%9A%9C%E6%8E%92%E9%99%A4&amp;diff=58390"/>
		<updated>2023-10-16T07:50:06Z</updated>

		<summary type="html">&lt;p&gt;ShengGang: /* I encounter a DB_ERROR message */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- BEGIN interlang links --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Do NOT edit this section&lt;br /&gt;
     Links below are automatically managed by PolyglotBot&lt;br /&gt;
     You can edit links on the English source page : Troubleshooting --&amp;gt;&lt;br /&gt;
[[en:Troubleshooting]]&lt;br /&gt;
[[fr:Troubleshooting_FR]]&lt;br /&gt;
[[es:Troubleshooting_ES]]&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:FAQ_ZH]]&lt;br /&gt;
本页面列出了您在使用过程中可能遇到的常见技术问题。&lt;br /&gt;
&lt;br /&gt;
如果遇到问题，首先要激活 Syslog 模块，其次重复导致错误的操作，最后检查日志文件 &#039;&#039;&#039;/documents/dolibarr.log 。&#039;&#039;&#039;&lt;br /&gt;
=Dolibarr每次点击链接都会询问我的登录名/密码=&lt;br /&gt;
您的PHP sessions 存储系统可能有缺陷。&lt;br /&gt;
&lt;br /&gt;
前往菜单 &#039;&#039;&#039;主页 - 管理工具 - 用户会话&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
参数 “session.save_handler” 的值是多少？&lt;br /&gt;
&lt;br /&gt;
如果是&#039;&#039;&#039;files&#039;&#039;&#039;，请查看参数“session.save_path”。其值必须是一个目录路径。检查web服务器是否具有读取和写入此目录的权限。检查磁盘上是否有剩余空间。&lt;br /&gt;
&lt;br /&gt;
=我无法验证发票/报价单/订单/任何其他模块=&lt;br /&gt;
验证文档时，Dolibarr会将属于旧临时文档的文件夹和文件重命名为其最终名称。&lt;br /&gt;
&lt;br /&gt;
在大多数情况下，此重命名过程中会出现验证问题，可能由以下原因引起：&lt;br /&gt;
&lt;br /&gt;
*文件夹 /documents/ 的权限不正确，导致Dolibarr无法重命名子文件夹。如果是这种情况，您应该会在日志中看到以下内容：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
ERROR 127.0.0.1 user fiche Interfaces::run_triggers action=ORDER_SUPPLIER_VALIDATE Files found: 6, Files launched: 5, Done: 0, Failed: 1&lt;br /&gt;
ERROR 127.0.0.1 user fiche CommandeFournisseur::valid &lt;br /&gt;
DEBUG 127.0.0.1 user fiche ROLLBACK Transaction&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*错误的自定义编号掩码：如果您在掩码中对文件系统中的文件名使用非法字符（如“/”），则在尝试验证文档时会出现错误，因为Dolibarr无法使用您指定的非法字符。请尝试暂时禁用自定义掩码并重新启用默认编号系统，以查看是否修复了问题。&lt;br /&gt;
&lt;br /&gt;
=我遇到 DB_ERROR 消息=&lt;br /&gt;
运行 /install/repair.php 页面。此页面可能需要几分钟才能运行。不要忘记先运行. This page can takes several minutes to run. Don&#039;t forget to run a [[Backups|backup]] first.&lt;br /&gt;
&lt;br /&gt;
What repair can do :&lt;br /&gt;
&lt;br /&gt;
*Run repair SQL file.&lt;br /&gt;
*Search list of fields declared and list of fields created into databases, then create fields missing&lt;br /&gt;
*Clean data into ecm_directories table&lt;br /&gt;
*Move logos to correct new directory&lt;br /&gt;
*Rebuild thumbs for product files&lt;br /&gt;
*Check and clean linked elements&lt;br /&gt;
*Check orphelins menus&lt;br /&gt;
*Run purge of directory&lt;br /&gt;
*Check and clean linked elements&lt;br /&gt;
*Clean data into const when files of module were removed without being&lt;br /&gt;
&lt;br /&gt;
To operate, the page should be opened with at least one command:&lt;br /&gt;
&lt;br /&gt;
*/install/repair.php?standard=confirmed&lt;br /&gt;
*/install/repair.php?clean_linked_elements=confirmed&lt;br /&gt;
*/install/repair.php?restore_thirdparties_logos=confirmed&lt;br /&gt;
*/install/repair.php?clean_menus=confirmed&lt;br /&gt;
*/install/repair.php?clean_orphelin_dir=confirmed&lt;br /&gt;
*/install/repair.php?clean_product_stock_batch=confirmed&lt;br /&gt;
*/install/repair.php?set_empty_time_spent_amount=confirmed&lt;br /&gt;
*/install/repair.php?rebuild_product_thumbs=confirmed&lt;br /&gt;
*/install/repair.php?force_disable_of_modules_not_found=confirmed&lt;br /&gt;
*/install/repair.php?clean_perm_table=confirmed&lt;br /&gt;
*/install/repair.php?force_utf8_on_tables=confirmed for Mysql only, when &#039;&#039;Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf8_unicode_ci,IMPLICIT) for operation &#039;=&#039; &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=I can&#039;t upload files=&lt;br /&gt;
==文件尺寸太大==&lt;br /&gt;
上传文件时收到“文件太大”消息。可上传文件的最大尺寸限制有两处配置点：&lt;br /&gt;
&lt;br /&gt;
*第一个限制是在Dolibarr的菜单 &#039;&#039;&#039;主页-设置-安全-文件（上传）选项卡&#039;&#039;&#039; 中。增加该值。&lt;br /&gt;
*第二个限制位于PHP服务器配置。在这种情况下，您需要更改 php.ini 文件中的参数 &#039;&#039;&#039;upload_max_filesize&#039;&#039;&#039; 。这需要管理员去访问PHP服务器。&lt;br /&gt;
&lt;br /&gt;
==信息==&lt;br /&gt;
Depending of your configuration, if you encounter the error&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
Warning: tempnam(): open_basedir restriction in effect. File(C:\WINDOWS\TEMP) is not within the allowed path(s): (c:/dolibarr) in C:\dolibarr\www\dolibarr\htdocs\core\modules\import\import_xlsx.modules.php on line 182&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You will have to edit the php.ini&lt;br /&gt;
Find the directive upload_tmp_dir: uncomment the line and change its value to a required path. In this example it is &amp;quot;/var/tmp&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
; Temporary directory for HTTP uploaded files (will use system default if not&lt;br /&gt;
; specified).&lt;br /&gt;
; http://php.net/upload-tmp-dir&lt;br /&gt;
upload_tmp_dir = /var/tmp&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Additionally for PHP versions 5.5 and greater, find the directive sys_temp_dir: uncomment the line and change its value to a required path. In this example, it is &amp;quot;/var/tmp&amp;quot;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
; Directory where the temporary files should be placed.&lt;br /&gt;
; Defaults to the system default (see sys_get_temp_dir)&lt;br /&gt;
sys_temp_dir = &amp;quot;/var/tmp&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And in Vhosts &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
open_basedir = {WEBSPACEROOT}{/}{:}{TMP}{/}:/var/tmp&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=我的问题不在此前的清单中=&lt;br /&gt;
==获取调试信息==&lt;br /&gt;
Dolibarr有一个记录它所做的事情和遇到的错误的日志系统。您的web服务器也是。请参阅 [[Gestion d&#039;erreur|syslog模块]] 。&lt;br /&gt;
==获取调试信息==&lt;br /&gt;
如果您无法通过此列表找到问题的解决方案，请尝试收集尽可能多的详细信息（如Dolibarr日志、PHP版本、数据库类型和版本、Dolibarr版本、Apache日志…），并查看此页面以找到可以帮助您的组织：[[Dolibarr help and support|Dolibarr帮助与支持]]&lt;/div&gt;</summary>
		<author><name>ShengGang</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=%E6%95%85%E9%9A%9C%E6%8E%92%E9%99%A4&amp;diff=58389</id>
		<title>故障排除</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=%E6%95%85%E9%9A%9C%E6%8E%92%E9%99%A4&amp;diff=58389"/>
		<updated>2023-10-16T07:48:22Z</updated>

		<summary type="html">&lt;p&gt;ShengGang: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- BEGIN interlang links --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Do NOT edit this section&lt;br /&gt;
     Links below are automatically managed by PolyglotBot&lt;br /&gt;
     You can edit links on the English source page : Troubleshooting --&amp;gt;&lt;br /&gt;
[[en:Troubleshooting]]&lt;br /&gt;
[[fr:Troubleshooting_FR]]&lt;br /&gt;
[[es:Troubleshooting_ES]]&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:FAQ_ZH]]&lt;br /&gt;
本页面列出了您在使用过程中可能遇到的常见技术问题。&lt;br /&gt;
&lt;br /&gt;
如果遇到问题，首先要激活 Syslog 模块，其次重复导致错误的操作，最后检查日志文件 &#039;&#039;&#039;/documents/dolibarr.log 。&#039;&#039;&#039;&lt;br /&gt;
=Dolibarr每次点击链接都会询问我的登录名/密码=&lt;br /&gt;
您的PHP sessions 存储系统可能有缺陷。&lt;br /&gt;
&lt;br /&gt;
前往菜单 &#039;&#039;&#039;主页 - 管理工具 - 用户会话&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
参数 “session.save_handler” 的值是多少？&lt;br /&gt;
&lt;br /&gt;
如果是&#039;&#039;&#039;files&#039;&#039;&#039;，请查看参数“session.save_path”。其值必须是一个目录路径。检查web服务器是否具有读取和写入此目录的权限。检查磁盘上是否有剩余空间。&lt;br /&gt;
&lt;br /&gt;
=我无法验证发票/报价单/订单/任何其他模块=&lt;br /&gt;
验证文档时，Dolibarr会将属于旧临时文档的文件夹和文件重命名为其最终名称。&lt;br /&gt;
&lt;br /&gt;
在大多数情况下，此重命名过程中会出现验证问题，可能由以下原因引起：&lt;br /&gt;
&lt;br /&gt;
*文件夹 /documents/ 的权限不正确，导致Dolibarr无法重命名子文件夹。如果是这种情况，您应该会在日志中看到以下内容：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
ERROR 127.0.0.1 user fiche Interfaces::run_triggers action=ORDER_SUPPLIER_VALIDATE Files found: 6, Files launched: 5, Done: 0, Failed: 1&lt;br /&gt;
ERROR 127.0.0.1 user fiche CommandeFournisseur::valid &lt;br /&gt;
DEBUG 127.0.0.1 user fiche ROLLBACK Transaction&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*错误的自定义编号掩码：如果您在掩码中对文件系统中的文件名使用非法字符（如“/”），则在尝试验证文档时会出现错误，因为Dolibarr无法使用您指定的非法字符。请尝试暂时禁用自定义掩码并重新启用默认编号系统，以查看是否修复了问题。&lt;br /&gt;
&lt;br /&gt;
=I encounter a DB_ERROR message=&lt;br /&gt;
Run the /install/repair.php page. This page can takes several minutes to run. Don&#039;t forget to run a [[Backups|backup]] first.&lt;br /&gt;
&lt;br /&gt;
What repair can do :&lt;br /&gt;
* Run repair SQL file.&lt;br /&gt;
* Search list of fields declared and list of fields created into databases, then create fields missing&lt;br /&gt;
* Clean data into ecm_directories table&lt;br /&gt;
* Move logos to correct new directory&lt;br /&gt;
* Rebuild thumbs for product files&lt;br /&gt;
* Check and clean linked elements&lt;br /&gt;
* Check orphelins menus&lt;br /&gt;
* Run purge of directory&lt;br /&gt;
* Check and clean linked elements&lt;br /&gt;
* Clean data into const when files of module were removed without being&lt;br /&gt;
&lt;br /&gt;
To operate, the page should be opened with at least one command:&lt;br /&gt;
* /install/repair.php?standard=confirmed&lt;br /&gt;
* /install/repair.php?clean_linked_elements=confirmed&lt;br /&gt;
* /install/repair.php?restore_thirdparties_logos=confirmed&lt;br /&gt;
* /install/repair.php?clean_menus=confirmed&lt;br /&gt;
* /install/repair.php?clean_orphelin_dir=confirmed&lt;br /&gt;
* /install/repair.php?clean_product_stock_batch=confirmed&lt;br /&gt;
* /install/repair.php?set_empty_time_spent_amount=confirmed&lt;br /&gt;
* /install/repair.php?rebuild_product_thumbs=confirmed&lt;br /&gt;
* /install/repair.php?force_disable_of_modules_not_found=confirmed&lt;br /&gt;
* /install/repair.php?clean_perm_table=confirmed&lt;br /&gt;
* /install/repair.php?force_utf8_on_tables=confirmed for Mysql only, when &#039;&#039;Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf8_unicode_ci,IMPLICIT) for operation &#039;=&#039; &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=I can&#039;t upload files=&lt;br /&gt;
==文件尺寸太大==&lt;br /&gt;
上传文件时收到“文件太大”消息。可上传文件的最大尺寸限制有两处配置点：&lt;br /&gt;
&lt;br /&gt;
*第一个限制是在Dolibarr的菜单 &#039;&#039;&#039;主页-设置-安全-文件（上传）选项卡&#039;&#039;&#039; 中。增加该值。&lt;br /&gt;
*第二个限制位于PHP服务器配置。在这种情况下，您需要更改 php.ini 文件中的参数 &#039;&#039;&#039;upload_max_filesize&#039;&#039;&#039; 。这需要管理员去访问PHP服务器。&lt;br /&gt;
&lt;br /&gt;
==信息==&lt;br /&gt;
Depending of your configuration, if you encounter the error&lt;br /&gt;
&amp;lt;syntaxHighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Warning: tempnam(): open_basedir restriction in effect. File(C:\WINDOWS\TEMP) is not within the allowed path(s): (c:/dolibarr) in C:\dolibarr\www\dolibarr\htdocs\core\modules\import\import_xlsx.modules.php on line 182&lt;br /&gt;
&amp;lt;/syntaxHighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You will have to edit the php.ini&lt;br /&gt;
Find the directive upload_tmp_dir: uncomment the line and change its value to a required path. In this example it is &amp;quot;/var/tmp&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxHighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
; Temporary directory for HTTP uploaded files (will use system default if not&lt;br /&gt;
; specified).&lt;br /&gt;
; http://php.net/upload-tmp-dir&lt;br /&gt;
upload_tmp_dir = /var/tmp&lt;br /&gt;
&amp;lt;/syntaxHighlight&amp;gt;&lt;br /&gt;
Additionally for PHP versions 5.5 and greater, find the directive sys_temp_dir: uncomment the line and change its value to a required path. In this example, it is &amp;quot;/var/tmp&amp;quot;:&lt;br /&gt;
&amp;lt;syntaxHighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
; Directory where the temporary files should be placed.&lt;br /&gt;
; Defaults to the system default (see sys_get_temp_dir)&lt;br /&gt;
sys_temp_dir = &amp;quot;/var/tmp&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxHighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And in Vhosts &lt;br /&gt;
&amp;lt;syntaxHighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
open_basedir = {WEBSPACEROOT}{/}{:}{TMP}{/}:/var/tmp&lt;br /&gt;
&amp;lt;/syntaxHighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=我的问题不在此前的清单中=&lt;br /&gt;
==获取调试信息==&lt;br /&gt;
Dolibarr有一个记录它所做的事情和遇到的错误的日志系统。您的web服务器也是。请参阅 [[Gestion d&#039;erreur|syslog模块]] 。&lt;br /&gt;
==获取调试信息==&lt;br /&gt;
如果您无法通过此列表找到问题的解决方案，请尝试收集尽可能多的详细信息（如Dolibarr日志、PHP版本、数据库类型和版本、Dolibarr版本、Apache日志…），并查看此页面以找到可以帮助您的组织：[[Dolibarr help and support|Dolibarr帮助与支持]]&lt;/div&gt;</summary>
		<author><name>ShengGang</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=%E6%95%85%E9%9A%9C%E6%8E%92%E9%99%A4&amp;diff=58388</id>
		<title>故障排除</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=%E6%95%85%E9%9A%9C%E6%8E%92%E9%99%A4&amp;diff=58388"/>
		<updated>2023-10-16T07:43:38Z</updated>

		<summary type="html">&lt;p&gt;ShengGang: /* 获取调试信息 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- BEGIN interlang links --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Do NOT edit this section&lt;br /&gt;
     Links below are automatically managed by PolyglotBot&lt;br /&gt;
     You can edit links on the English source page : Troubleshooting --&amp;gt;&lt;br /&gt;
[[en:Troubleshooting]]&lt;br /&gt;
[[fr:Troubleshooting_FR]]&lt;br /&gt;
[[es:Troubleshooting_ES]]&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:FAQ_ZH]]&lt;br /&gt;
本页面列出了您在使用过程中可能遇到的常见技术问题。&lt;br /&gt;
&lt;br /&gt;
如果遇到问题，首先要激活 Syslog 模块，其次重复导致错误的操作，最后检查日志文件 &#039;&#039;&#039;/documents/dolibarr.log 。&#039;&#039;&#039;&lt;br /&gt;
=Dolibarr每次点击链接都会询问我的登录名/密码=&lt;br /&gt;
您的PHP sessions 存储系统可能有缺陷。&lt;br /&gt;
&lt;br /&gt;
前往菜单 &#039;&#039;&#039;主页 - 管理工具 - 用户会话&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
参数 “session.save_handler” 的值是多少？&lt;br /&gt;
&lt;br /&gt;
如果是&#039;&#039;&#039;files&#039;&#039;&#039;，请查看参数“session.save_path”。其值必须是一个目录路径。检查web服务器是否具有读取和写入此目录的权限。检查磁盘上是否有剩余空间。&lt;br /&gt;
&lt;br /&gt;
=我无法验证发票/报价单/订单/任何其他模块=&lt;br /&gt;
验证文档时，Dolibarr会将属于旧临时文档的文件夹和文件重命名为其最终名称。&lt;br /&gt;
&lt;br /&gt;
在大多数情况下，此重命名过程中会出现验证问题，可能由以下原因引起：&lt;br /&gt;
&lt;br /&gt;
*文件夹 /documents/ 的权限不正确，导致Dolibarr无法重命名子文件夹。如果是这种情况，您应该会在日志中看到以下内容：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
ERROR 127.0.0.1 user fiche Interfaces::run_triggers action=ORDER_SUPPLIER_VALIDATE Files found: 6, Files launched: 5, Done: 0, Failed: 1&lt;br /&gt;
ERROR 127.0.0.1 user fiche CommandeFournisseur::valid &lt;br /&gt;
DEBUG 127.0.0.1 user fiche ROLLBACK Transaction&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*错误的自定义编号掩码：如果您在掩码中对文件系统中的文件名使用非法字符（如“/”），则在尝试验证文档时会出现错误，因为Dolibarr无法使用您指定的非法字符。请尝试暂时禁用自定义掩码并重新启用默认编号系统，以查看是否修复了问题。&lt;br /&gt;
&lt;br /&gt;
=文件尺寸太大= &lt;br /&gt;
上传文件时收到“文件太大”消息。可上传文件的最大尺寸限制有两处配置点：&lt;br /&gt;
&lt;br /&gt;
*第一个限制是在Dolibarr的菜单 &#039;&#039;&#039;主页-设置-安全-文件（上传）选项卡&#039;&#039;&#039; 中。增加该值。&lt;br /&gt;
*第二个限制位于PHP服务器配置。在这种情况下，您需要更改 php.ini 文件中的参数 &#039;&#039;&#039;upload_max_filesize&#039;&#039;&#039; 。这需要管理员去访问PHP服务器。&lt;br /&gt;
&lt;br /&gt;
=我的问题不在此前的清单中=&lt;br /&gt;
==获取调试信息==&lt;br /&gt;
Dolibarr有一个记录它所做的事情和遇到的错误的日志系统。您的web服务器也是。请参阅 [[Gestion d&#039;erreur|syslog模块]] 。&lt;br /&gt;
==获取调试信息==&lt;br /&gt;
如果您无法通过此列表找到问题的解决方案，请尝试收集尽可能多的详细信息（如Dolibarr日志、PHP版本、数据库类型和版本、Dolibarr版本、Apache日志…），并查看此页面以找到可以帮助您的组织：[[Dolibarr help and support|Dolibarr帮助与支持]]&lt;/div&gt;</summary>
		<author><name>ShengGang</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=%E6%95%85%E9%9A%9C%E6%8E%92%E9%99%A4&amp;diff=58387</id>
		<title>故障排除</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=%E6%95%85%E9%9A%9C%E6%8E%92%E9%99%A4&amp;diff=58387"/>
		<updated>2023-10-16T07:41:58Z</updated>

		<summary type="html">&lt;p&gt;ShengGang: /* Mon problème n&amp;#039;est pas dans la liste */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- BEGIN interlang links --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Do NOT edit this section&lt;br /&gt;
     Links below are automatically managed by PolyglotBot&lt;br /&gt;
     You can edit links on the English source page : Troubleshooting --&amp;gt;&lt;br /&gt;
[[en:Troubleshooting]]&lt;br /&gt;
[[fr:Troubleshooting_FR]]&lt;br /&gt;
[[es:Troubleshooting_ES]]&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:FAQ_ZH]]&lt;br /&gt;
本页面列出了您在使用过程中可能遇到的常见技术问题。&lt;br /&gt;
&lt;br /&gt;
如果遇到问题，首先要激活 Syslog 模块，其次重复导致错误的操作，最后检查日志文件 &#039;&#039;&#039;/documents/dolibarr.log 。&#039;&#039;&#039;&lt;br /&gt;
=Dolibarr每次点击链接都会询问我的登录名/密码=&lt;br /&gt;
您的PHP sessions 存储系统可能有缺陷。&lt;br /&gt;
&lt;br /&gt;
前往菜单 &#039;&#039;&#039;主页 - 管理工具 - 用户会话&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
参数 “session.save_handler” 的值是多少？&lt;br /&gt;
&lt;br /&gt;
如果是&#039;&#039;&#039;files&#039;&#039;&#039;，请查看参数“session.save_path”。其值必须是一个目录路径。检查web服务器是否具有读取和写入此目录的权限。检查磁盘上是否有剩余空间。&lt;br /&gt;
&lt;br /&gt;
=我无法验证发票/报价单/订单/任何其他模块=&lt;br /&gt;
验证文档时，Dolibarr会将属于旧临时文档的文件夹和文件重命名为其最终名称。&lt;br /&gt;
&lt;br /&gt;
在大多数情况下，此重命名过程中会出现验证问题，可能由以下原因引起：&lt;br /&gt;
&lt;br /&gt;
*文件夹 /documents/ 的权限不正确，导致Dolibarr无法重命名子文件夹。如果是这种情况，您应该会在日志中看到以下内容：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
ERROR 127.0.0.1 user fiche Interfaces::run_triggers action=ORDER_SUPPLIER_VALIDATE Files found: 6, Files launched: 5, Done: 0, Failed: 1&lt;br /&gt;
ERROR 127.0.0.1 user fiche CommandeFournisseur::valid &lt;br /&gt;
DEBUG 127.0.0.1 user fiche ROLLBACK Transaction&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*错误的自定义编号掩码：如果您在掩码中对文件系统中的文件名使用非法字符（如“/”），则在尝试验证文档时会出现错误，因为Dolibarr无法使用您指定的非法字符。请尝试暂时禁用自定义掩码并重新启用默认编号系统，以查看是否修复了问题。&lt;br /&gt;
&lt;br /&gt;
=文件尺寸太大= &lt;br /&gt;
上传文件时收到“文件太大”消息。可上传文件的最大尺寸限制有两处配置点：&lt;br /&gt;
&lt;br /&gt;
*第一个限制是在Dolibarr的菜单 &#039;&#039;&#039;主页-设置-安全-文件（上传）选项卡&#039;&#039;&#039; 中。增加该值。&lt;br /&gt;
*第二个限制位于PHP服务器配置。在这种情况下，您需要更改 php.ini 文件中的参数 &#039;&#039;&#039;upload_max_filesize&#039;&#039;&#039; 。这需要管理员去访问PHP服务器。&lt;br /&gt;
&lt;br /&gt;
=我的问题不在此前的清单中=&lt;br /&gt;
==获取调试信息==&lt;br /&gt;
Dolibarr有一个记录它所做的事情和遇到的错误的日志系统。您的web服务器也是。请参阅 [[Gestion d&#039;erreur|syslog模块]] 。&lt;br /&gt;
==获取调试信息==&lt;br /&gt;
如果您无法通过此列表找到问题的解决方案，请尝试收集尽可能多的详细信息（如Dolibarr日志、PHP版本、数据库类型和版本、Dolibarr版本、Apache日志…），并查看此页面以找到可以帮助您的组织：&lt;br /&gt;
&lt;br /&gt;
[[Assistance Dolibarr]]&lt;/div&gt;</summary>
		<author><name>ShengGang</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=%E6%95%85%E9%9A%9C%E6%8E%92%E9%99%A4&amp;diff=58386</id>
		<title>故障排除</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=%E6%95%85%E9%9A%9C%E6%8E%92%E9%99%A4&amp;diff=58386"/>
		<updated>2023-10-16T07:34:28Z</updated>

		<summary type="html">&lt;p&gt;ShengGang: /* Je n&amp;#039;arrive pas à valider une facture/proposition commerciale/commande/aucun autre module */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- BEGIN interlang links --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Do NOT edit this section&lt;br /&gt;
     Links below are automatically managed by PolyglotBot&lt;br /&gt;
     You can edit links on the English source page : Troubleshooting --&amp;gt;&lt;br /&gt;
[[en:Troubleshooting]]&lt;br /&gt;
[[fr:Troubleshooting_FR]]&lt;br /&gt;
[[es:Troubleshooting_ES]]&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:FAQ_ZH]]&lt;br /&gt;
本页面列出了您在使用过程中可能遇到的常见技术问题。&lt;br /&gt;
&lt;br /&gt;
如果遇到问题，首先要激活 Syslog 模块，其次重复导致错误的操作，最后检查日志文件 &#039;&#039;&#039;/documents/dolibarr.log 。&#039;&#039;&#039;&lt;br /&gt;
=Dolibarr每次点击链接都会询问我的登录名/密码=&lt;br /&gt;
您的PHP sessions 存储系统可能有缺陷。&lt;br /&gt;
&lt;br /&gt;
前往菜单 &#039;&#039;&#039;主页 - 管理工具 - 用户会话&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
参数 “session.save_handler” 的值是多少？&lt;br /&gt;
&lt;br /&gt;
如果是&#039;&#039;&#039;files&#039;&#039;&#039;，请查看参数“session.save_path”。其值必须是一个目录路径。检查web服务器是否具有读取和写入此目录的权限。检查磁盘上是否有剩余空间。&lt;br /&gt;
&lt;br /&gt;
=我无法验证发票/报价单/订单/任何其他模块=&lt;br /&gt;
验证文档时，Dolibarr会将属于旧临时文档的文件夹和文件重命名为其最终名称。&lt;br /&gt;
&lt;br /&gt;
在大多数情况下，此重命名过程中会出现验证问题，可能由以下原因引起：&lt;br /&gt;
&lt;br /&gt;
*文件夹 /documents/ 的权限不正确，导致Dolibarr无法重命名子文件夹。如果是这种情况，您应该会在日志中看到以下内容：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
ERROR 127.0.0.1 user fiche Interfaces::run_triggers action=ORDER_SUPPLIER_VALIDATE Files found: 6, Files launched: 5, Done: 0, Failed: 1&lt;br /&gt;
ERROR 127.0.0.1 user fiche CommandeFournisseur::valid &lt;br /&gt;
DEBUG 127.0.0.1 user fiche ROLLBACK Transaction&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*错误的自定义编号掩码：如果您在掩码中对文件系统中的文件名使用非法字符（如“/”），则在尝试验证文档时会出现错误，因为Dolibarr无法使用您指定的非法字符。请尝试暂时禁用自定义掩码并重新启用默认编号系统，以查看是否修复了问题。&lt;br /&gt;
&lt;br /&gt;
=文件尺寸太大= &lt;br /&gt;
上传文件时收到“文件太大”消息。可上传文件的最大尺寸限制有两处配置点：&lt;br /&gt;
&lt;br /&gt;
*第一个限制是在Dolibarr的菜单 &#039;&#039;&#039;主页-设置-安全-文件（上传）选项卡&#039;&#039;&#039; 中。增加该值。&lt;br /&gt;
*第二个限制位于PHP服务器配置。在这种情况下，您需要更改 php.ini 文件中的参数 &#039;&#039;&#039;upload_max_filesize&#039;&#039;&#039; 。这需要管理员去访问PHP服务器。&lt;br /&gt;
&lt;br /&gt;
=Mon problème n&#039;est pas dans la liste=&lt;br /&gt;
==Obtenir des informations de débogage==&lt;br /&gt;
Dolibarr a un système d&#039;enregistrement de ce qu&#039;il fait et des erreurs qu&#039;il rencontre. Votre serveur web également. Voir [[Gestion d&#039;erreur|Module syslog]].&lt;br /&gt;
==Aide et support==&lt;br /&gt;
Si vous ne trouvez pas la solution à votre problème grâce cette liste, essayez de réunir un maximum d&#039;informations détaillées (comme le log Dolibarr, version php, type et version de la base de données, version de Dolibarr, le log Apache...), et regardez cette page pour trouver un organisme pour vous aider:&lt;br /&gt;
&lt;br /&gt;
[[Assistance Dolibarr]]&lt;/div&gt;</summary>
		<author><name>ShengGang</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=%E6%95%85%E9%9A%9C%E6%8E%92%E9%99%A4&amp;diff=58385</id>
		<title>故障排除</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=%E6%95%85%E9%9A%9C%E6%8E%92%E9%99%A4&amp;diff=58385"/>
		<updated>2023-10-16T07:14:50Z</updated>

		<summary type="html">&lt;p&gt;ShengGang: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- BEGIN interlang links --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Do NOT edit this section&lt;br /&gt;
     Links below are automatically managed by PolyglotBot&lt;br /&gt;
     You can edit links on the English source page : Troubleshooting --&amp;gt;&lt;br /&gt;
[[en:Troubleshooting]]&lt;br /&gt;
[[fr:Troubleshooting_FR]]&lt;br /&gt;
[[es:Troubleshooting_ES]]&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:FAQ_ZH]]&lt;br /&gt;
本页面列出了您在使用过程中可能遇到的常见技术问题。&lt;br /&gt;
&lt;br /&gt;
如果遇到问题，首先要激活 Syslog 模块，其次重复导致错误的操作，最后检查日志文件 &#039;&#039;&#039;/documents/dolibarr.log 。&#039;&#039;&#039;&lt;br /&gt;
=Dolibarr每次点击链接都会询问我的登录名/密码=&lt;br /&gt;
您的PHP sessions 存储系统可能有缺陷。&lt;br /&gt;
&lt;br /&gt;
前往菜单 &#039;&#039;&#039;主页 - 管理工具 - 用户会话&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
参数 “session.save_handler” 的值是多少？&lt;br /&gt;
&lt;br /&gt;
如果是&#039;&#039;&#039;files&#039;&#039;&#039;，请查看参数“session.save_path”。其值必须是一个目录路径。检查web服务器是否具有读取和写入此目录的权限。检查磁盘上是否有剩余空间。&lt;br /&gt;
&lt;br /&gt;
=Je n&#039;arrive pas à valider une facture/proposition commerciale/commande/aucun autre module=&lt;br /&gt;
Quand vous validez un document, Dolibarr renomme les dossiers et fichiers qui appartenaient à l&#039;ancien document temporaire en sa dénomination finale.&lt;br /&gt;
&lt;br /&gt;
Dans la plupart des cas, les problèmes de validations arrivent lors de ce renommage, et peuvent être causés par:&lt;br /&gt;
&lt;br /&gt;
*Une mauvaise permission du dossier /documents/, ce qui empêche Dolibarr de renommer les sous-dossiers. Si c&#039;est le cas, dans votre log vous devriez voir quelquechose du genre:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
ERROR 127.0.0.1 user fiche Interfaces::run_triggers action=ORDER_SUPPLIER_VALIDATE Files found: 6, Files launched: 5, Done: 0, Failed: 1&lt;br /&gt;
ERROR 127.0.0.1 user fiche CommandeFournisseur::valid &lt;br /&gt;
DEBUG 127.0.0.1 user fiche ROLLBACK Transaction&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Un mauvais masque de numérotation personnalisé: si vous utilisez dans votre masque des caractères illégaux pour les noms de fichiers dans votre système de fichiers (comme &amp;quot;/&amp;quot;), cela va faire bugguer lorsque vous essaierez de valider votre document puisqu&#039;il sera impossible à Dolibarr d&#039;utiliser le caractère illégal que vous avez spécifié. Essayez de temporairement désactiver les masques personnalisés et de réactiver le système de numérotation par défaut pour voir si cela corrige le problème.&lt;br /&gt;
&lt;br /&gt;
=La taille du fichier est trop grand= &lt;br /&gt;
J&#039;ai un message &amp;quot;La taille du fichier est trop grand&amp;quot; quand je téléverse un fichier.&lt;br /&gt;
La limitation de la taille maximale des fichiers pouvant être téléversé se trouvent à 2 niveaux.&lt;br /&gt;
&lt;br /&gt;
*Le premier est au niveau de Dolibarr dans accueil - configuration - sécurité - Onglet &amp;quot;Fichiers (envoyer fichiers)&amp;quot;. Augmenter cette valeur.&lt;br /&gt;
*Une deuxième limitation peut exister au niveau de la configuration du serveur PHP. Dans ce cas, il faut modifier le paramètre &#039;&#039;&#039;upload_max_filesize&#039;&#039;&#039; de votre fichier php.ini. Ceci requiert un accès administrateur au serveur PHP.&lt;br /&gt;
&lt;br /&gt;
=Mon problème n&#039;est pas dans la liste=&lt;br /&gt;
==Obtenir des informations de débogage==&lt;br /&gt;
Dolibarr a un système d&#039;enregistrement de ce qu&#039;il fait et des erreurs qu&#039;il rencontre. Votre serveur web également. Voir [[Gestion d&#039;erreur|Module syslog]].&lt;br /&gt;
==Aide et support==&lt;br /&gt;
Si vous ne trouvez pas la solution à votre problème grâce cette liste, essayez de réunir un maximum d&#039;informations détaillées (comme le log Dolibarr, version php, type et version de la base de données, version de Dolibarr, le log Apache...), et regardez cette page pour trouver un organisme pour vous aider:&lt;br /&gt;
&lt;br /&gt;
[[Assistance Dolibarr]]&lt;/div&gt;</summary>
		<author><name>ShengGang</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Troubleshooting&amp;diff=58381</id>
		<title>Troubleshooting</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Troubleshooting&amp;diff=58381"/>
		<updated>2023-10-16T07:00:46Z</updated>

		<summary type="html">&lt;p&gt;ShengGang: Add Chinese&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- BEGIN origin interlang links --&amp;gt;&lt;br /&gt;
&amp;lt;!-- You can edit this section but do NOT remove these comments&lt;br /&gt;
     Links below will be automatically replicated on translated pages by PolyglotBot --&amp;gt;&lt;br /&gt;
[[fr:Troubleshooting_FR]]&lt;br /&gt;
[[es:Troubleshooting_ES]]&lt;br /&gt;
[[zh:故障排除]]&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:FAQ_EN]]&lt;br /&gt;
This page will list all the common technical problems you can run into.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Dolibarr ask my login or password each time I click on a new link =&lt;br /&gt;
You PHP system to store Dolibarr session is probably no more working.&lt;br /&gt;
&lt;br /&gt;
Go into &#039;&#039;&#039;home - system info - php&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
What value do you have for parameter &amp;quot;session.save_handler&amp;quot; ?&lt;br /&gt;
&lt;br /&gt;
If it is &#039;&#039;&#039;files&#039;&#039;&#039;, take a look at parameter &amp;quot;session.save_path&amp;quot;. Its value is a directory path.&lt;br /&gt;
Check your web server can read and write into this directory. Check also there is enough free space onto disk.&lt;br /&gt;
&lt;br /&gt;
= I can&#039;t approve a proposal/invoice/order/any other module =&lt;br /&gt;
&lt;br /&gt;
When you approve a document, Dolibarr will rename the folders and all the documents that belonged to the temporary document into the final one.&lt;br /&gt;
&lt;br /&gt;
In most cases, the validation problems arise when Dolibarr tries to rename, and can be caused by:&lt;br /&gt;
&lt;br /&gt;
* A wrong permission for the /documents/ folder, so that Dolibarr can&#039;t rename the folder. If that&#039;s the case, you should have in your syslog something like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxHighlight lang=text&amp;gt;&lt;br /&gt;
ERROR 127.0.0.1 user fiche Interfaces::run_triggers action=ORDER_SUPPLIER_VALIDATE Files found: 6, Files launched: 5, Done: 0, Failed: 1&lt;br /&gt;
ERROR 127.0.0.1 user fiche CommandeFournisseur::valid &lt;br /&gt;
DEBUG 127.0.0.1 user fiche ROLLBACK Transaction&lt;br /&gt;
&amp;lt;/syntaxHighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* A wrong custom numerotation system: if you use illegal characters for the filesystem (like &amp;quot;/&amp;quot;), this will crash whenever you&#039;ll try to validate your document since it won&#039;t be able to use this illegal character in the renaming. Try to disable your current custom numerotation system and enable the default one temporarily to see if this fixes the issue.&lt;br /&gt;
&lt;br /&gt;
= I encounter a DB_ERROR message =&lt;br /&gt;
Run the /install/repair.php page. This page can takes several minutes to run. Don&#039;t forget to run a [[Backups|backup]] first.&lt;br /&gt;
&lt;br /&gt;
What repair can do :&lt;br /&gt;
* Run repair SQL file.&lt;br /&gt;
* Search list of fields declared and list of fields created into databases, then create fields missing&lt;br /&gt;
* Clean data into ecm_directories table&lt;br /&gt;
* Move logos to correct new directory&lt;br /&gt;
* Rebuild thumbs for product files&lt;br /&gt;
* Check and clean linked elements&lt;br /&gt;
* Check orphelins menus&lt;br /&gt;
* Run purge of directory&lt;br /&gt;
* Check and clean linked elements&lt;br /&gt;
* Clean data into const when files of module were removed without being&lt;br /&gt;
&lt;br /&gt;
To operate, the page should be opened with at least one command:&lt;br /&gt;
* /install/repair.php?standard=confirmed&lt;br /&gt;
* /install/repair.php?clean_linked_elements=confirmed&lt;br /&gt;
* /install/repair.php?restore_thirdparties_logos=confirmed&lt;br /&gt;
* /install/repair.php?clean_menus=confirmed&lt;br /&gt;
* /install/repair.php?clean_orphelin_dir=confirmed&lt;br /&gt;
* /install/repair.php?clean_product_stock_batch=confirmed&lt;br /&gt;
* /install/repair.php?set_empty_time_spent_amount=confirmed&lt;br /&gt;
* /install/repair.php?rebuild_product_thumbs=confirmed&lt;br /&gt;
* /install/repair.php?force_disable_of_modules_not_found=confirmed&lt;br /&gt;
* /install/repair.php?clean_perm_table=confirmed&lt;br /&gt;
* /install/repair.php?force_utf8_on_tables=confirmed for Mysql only, when &#039;&#039;Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf8_unicode_ci,IMPLICIT) for operation &#039;=&#039; &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= I can&#039;t upload files  = &lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color: #FF0000;&amp;quot;&amp;gt;This section needs more informations.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Depending of your configuration, if you encounter the error&lt;br /&gt;
&amp;lt;syntaxHighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
Warning: tempnam(): open_basedir restriction in effect. File(C:\WINDOWS\TEMP) is not within the allowed path(s): (c:/dolibarr) in C:\dolibarr\www\dolibarr\htdocs\core\modules\import\import_xlsx.modules.php on line 182&lt;br /&gt;
&amp;lt;/syntaxHighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You will have to edit the php.ini&lt;br /&gt;
Find the directive upload_tmp_dir: uncomment the line and change its value to a required path. In this example it is &amp;quot;/var/tmp&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxHighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
; Temporary directory for HTTP uploaded files (will use system default if not&lt;br /&gt;
; specified).&lt;br /&gt;
; http://php.net/upload-tmp-dir&lt;br /&gt;
upload_tmp_dir = /var/tmp&lt;br /&gt;
&amp;lt;/syntaxHighlight&amp;gt;&lt;br /&gt;
Additionally for PHP versions 5.5 and greater, find the directive sys_temp_dir: uncomment the line and change its value to a required path. In this example, it is &amp;quot;/var/tmp&amp;quot;:&lt;br /&gt;
&amp;lt;syntaxHighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
; Directory where the temporary files should be placed.&lt;br /&gt;
; Defaults to the system default (see sys_get_temp_dir)&lt;br /&gt;
sys_temp_dir = &amp;quot;/var/tmp&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxHighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And in Vhosts &lt;br /&gt;
&amp;lt;syntaxHighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
open_basedir = {WEBSPACEROOT}{/}{:}{TMP}{/}:/var/tmp&lt;br /&gt;
&amp;lt;/syntaxHighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= My problem is not in the list =&lt;br /&gt;
==Getting debug information==&lt;br /&gt;
Dolibarr has a system to record logs of what it does and which errors occur. If you run into a problem, the first step is to activate the Syslog module, then to redo the steps that leads you to a bug, and then check the log file residing at &#039;&#039;&#039;/documents/dolibarr.log&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Your web server has also error logging feature. See [[Error reporting|Module syslog]].&lt;br /&gt;
&lt;br /&gt;
==Help and support==&lt;br /&gt;
If the solution for your problem couldn&#039;t be found with tools in this page, please keep in a safe place a maximum of detailed informations (like the dolibarr log, php version, database type and version, dolibarr&#039;s version, Apache&#039;s log...), and seek help using one of those channels:&lt;br /&gt;
&lt;br /&gt;
http://wiki.dolibarr.org/index.php/Dolibarr_help_and_support&lt;/div&gt;</summary>
		<author><name>ShengGang</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=%E6%95%85%E9%9A%9C%E6%8E%92%E9%99%A4&amp;diff=58380</id>
		<title>故障排除</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=%E6%95%85%E9%9A%9C%E6%8E%92%E9%99%A4&amp;diff=58380"/>
		<updated>2023-10-16T07:00:16Z</updated>

		<summary type="html">&lt;p&gt;ShengGang: initialization&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:FAQ_ZH]]&lt;br /&gt;
Cette page recense les problèmes techniques courants que vous pouvez rencontrer à l&#039;usage.&lt;br /&gt;
&lt;br /&gt;
Si vous rencontrez un problème, la première étape est d&#039;activer le module Syslog, d&#039;ensuite refaire les manipulations qui vous conduisent au bug, puis de récupérer le fichier log résidant dans &#039;&#039;&#039;/documents/dolibarr.log&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
= Dolibarr me demande mon login/mot de passe à chaque click sur un lien =&lt;br /&gt;
Votre système de sauvegarde des sessions PHP est probablement défectueux.&lt;br /&gt;
&lt;br /&gt;
Aller dans &#039;&#039;&#039;Accueil - Info system - php&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Quelle valeur avez-vous pour le paramètre &amp;quot;session.save_handler&amp;quot; ?&lt;br /&gt;
&lt;br /&gt;
Si il s&#039;agit de &#039;&#039;&#039;files&#039;&#039;&#039; (&#039;&#039;&#039;fichier&#039;&#039;&#039;), regarder le paramètre &amp;quot;session.save_path&amp;quot;. Sa valeur doit être un chemin de répertoire. Vérifier que le serveur web a bien les droits de lire et d&#039;écrire dans ce répertoire. Vérifier qu&#039;il reste de l&#039;espace sur le disque.&lt;br /&gt;
&lt;br /&gt;
= Je n&#039;arrive pas à valider une facture/proposition commerciale/commande/aucun autre module =&lt;br /&gt;
Quand vous validez un document, Dolibarr renomme les dossiers et fichiers qui appartenaient à l&#039;ancien document temporaire en sa dénomination finale.&lt;br /&gt;
&lt;br /&gt;
Dans la plupart des cas, les problèmes de validations arrivent lors de ce renommage, et peuvent être causés par:&lt;br /&gt;
&lt;br /&gt;
* Une mauvaise permission du dossier /documents/, ce qui empêche Dolibarr de renommer les sous-dossiers. Si c&#039;est le cas, dans votre log vous devriez voir quelquechose du genre:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=text&amp;gt;&lt;br /&gt;
ERROR 127.0.0.1 user fiche Interfaces::run_triggers action=ORDER_SUPPLIER_VALIDATE Files found: 6, Files launched: 5, Done: 0, Failed: 1&lt;br /&gt;
ERROR 127.0.0.1 user fiche CommandeFournisseur::valid &lt;br /&gt;
DEBUG 127.0.0.1 user fiche ROLLBACK Transaction&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Un mauvais masque de numérotation personnalisé: si vous utilisez dans votre masque des caractères illégaux pour les noms de fichiers dans votre système de fichiers (comme &amp;quot;/&amp;quot;), cela va faire bugguer lorsque vous essaierez de valider votre document puisqu&#039;il sera impossible à Dolibarr d&#039;utiliser le caractère illégal que vous avez spécifié. Essayez de temporairement désactiver les masques personnalisés et de réactiver le système de numérotation par défaut pour voir si cela corrige le problème.&lt;br /&gt;
&lt;br /&gt;
= La taille du fichier est trop grand = &lt;br /&gt;
J&#039;ai un message &amp;quot;La taille du fichier est trop grand&amp;quot; quand je téléverse un fichier.&lt;br /&gt;
La limitation de la taille maximale des fichiers pouvant être téléversé se trouvent à 2 niveaux.&lt;br /&gt;
* Le premier est au niveau de Dolibarr dans accueil - configuration - sécurité - Onglet &amp;quot;Fichiers (envoyer fichiers)&amp;quot;. Augmenter cette valeur.&lt;br /&gt;
* Une deuxième limitation peut exister au niveau de la configuration du serveur PHP. Dans ce cas, il faut modifier le paramètre &#039;&#039;&#039;upload_max_filesize&#039;&#039;&#039; de votre fichier php.ini. Ceci requiert un accès administrateur au serveur PHP.&lt;br /&gt;
&lt;br /&gt;
= Mon problème n&#039;est pas dans la liste =&lt;br /&gt;
==Obtenir des informations de débogage==&lt;br /&gt;
Dolibarr a un système d&#039;enregistrement de ce qu&#039;il fait et des erreurs qu&#039;il rencontre. Votre serveur web également. Voir [[Gestion d&#039;erreur|Module syslog]].&lt;br /&gt;
==Aide et support==&lt;br /&gt;
Si vous ne trouvez pas la solution à votre problème grâce cette liste, essayez de réunir un maximum d&#039;informations détaillées (comme le log Dolibarr, version php, type et version de la base de données, version de Dolibarr, le log Apache...), et regardez cette page pour trouver un organisme pour vous aider:&lt;br /&gt;
&lt;br /&gt;
[[Assistance Dolibarr]]&lt;/div&gt;</summary>
		<author><name>ShengGang</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=%E7%94%A8%E6%88%B7%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98%E8%A7%A3%E7%AD%94&amp;diff=58379</id>
		<title>用户常见问题解答</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=%E7%94%A8%E6%88%B7%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98%E8%A7%A3%E7%AD%94&amp;diff=58379"/>
		<updated>2023-10-16T06:51:56Z</updated>

		<summary type="html">&lt;p&gt;ShengGang: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- BEGIN interlang links --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Do NOT edit this section&lt;br /&gt;
     Links below are automatically managed by PolyglotBot&lt;br /&gt;
     You can edit links on the English source page : User_FAQ --&amp;gt;&lt;br /&gt;
[[en:User_FAQ]]&lt;br /&gt;
[[fr:FAQ_Utilisateur]]&lt;br /&gt;
[[es:FAQ_Usuarios]]&lt;br /&gt;
[[el:FAQ_χρήστη]]&lt;br /&gt;
[[de:Benutzer_FAQ]]&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:FAQ ZH]]&lt;br /&gt;
{{Template用户手册}}&lt;br /&gt;
&lt;br /&gt;
所有常见问题（FAQ）可在以下索引页找到：[[:Category:FAQ ZH|Category:FAQ_ZH]]&lt;br /&gt;
&lt;br /&gt;
有关开发的问题和答案，请参阅页面 [[开发者常见问题解答]] 。&lt;br /&gt;
=常见问题=&lt;br /&gt;
&lt;br /&gt;
有关解决方案中发现的问题的其他常见问题解答，请参阅页面 [[Troubleshooting|故障排除]] 。&lt;br /&gt;
&lt;br /&gt;
另请参阅页面 [[Dolibarr help and support|Dolibarr帮助与支持]] 。&lt;br /&gt;
&lt;br /&gt;
=论坛=&lt;br /&gt;
Dolibarr论坛上也有许多问题和答案（使用搜索）。&lt;br /&gt;
&lt;br /&gt;
[https://www.dolibarr.org/forum/ Dolibarr 论坛]&lt;br /&gt;
&lt;br /&gt;
[[Category:Proofreading done]]&lt;/div&gt;</summary>
		<author><name>ShengGang</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=User_FAQ&amp;diff=58373</id>
		<title>User FAQ</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=User_FAQ&amp;diff=58373"/>
		<updated>2023-10-16T06:42:42Z</updated>

		<summary type="html">&lt;p&gt;ShengGang: Add Chinese&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- BEGIN origin interlang links --&amp;gt;&lt;br /&gt;
&amp;lt;!-- You can edit this section but do NOT remove these comments&lt;br /&gt;
     Links below will be automatically replicated on translated pages by PolyglotBot --&amp;gt;&lt;br /&gt;
[[fr:FAQ_Utilisateur]]&lt;br /&gt;
[[es:FAQ_Usuarios]]&lt;br /&gt;
[[el:FAQ_χρήστη]]&lt;br /&gt;
[[de:Benutzer_FAQ]]&lt;br /&gt;
[[zh:用户常见问题解答]]&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:FAQ EN]]&lt;br /&gt;
{{TemplateDocUser}}&lt;br /&gt;
&lt;br /&gt;
All FAQs (Frequently Asked Questions) about user documentation are available from the following index page: [[:Category:FAQ_EN]]&lt;br /&gt;
&lt;br /&gt;
For Frequently Asked Questions on Dolibarr development, read the page [[Developer FAQ]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= TroubleShooting =&lt;br /&gt;
&lt;br /&gt;
Other FAQs about troubles experienced and solutions are available on the page [[Troubleshooting]].&lt;br /&gt;
&lt;br /&gt;
See also the page [[Dolibarr help and support]].&lt;br /&gt;
&lt;br /&gt;
= Forum =&lt;br /&gt;
A lot of Questions (and Answers) are also available on the Dolibarr forum.&lt;br /&gt;
&lt;br /&gt;
[https://www.dolibarr.org/forum/ Dolibarr Forum]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Proofreading done]]&lt;/div&gt;</summary>
		<author><name>ShengGang</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=%E7%94%A8%E6%88%B7%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98%E8%A7%A3%E7%AD%94&amp;diff=58372</id>
		<title>用户常见问题解答</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=%E7%94%A8%E6%88%B7%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98%E8%A7%A3%E7%AD%94&amp;diff=58372"/>
		<updated>2023-10-16T06:42:18Z</updated>

		<summary type="html">&lt;p&gt;ShengGang: initialization&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:FAQ ZH]]&lt;br /&gt;
{{Template用户手册}}&lt;br /&gt;
&lt;br /&gt;
All FAQs (Frequently Asked Questions) about user documentation are available from the following index page: [[:Category:FAQ_EN]]&lt;br /&gt;
&lt;br /&gt;
For Frequently Asked Questions on Dolibarr development, read the page [[Developer FAQ]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= TroubleShooting =&lt;br /&gt;
&lt;br /&gt;
Other FAQs about troubles experienced and solutions are available on the page [[Troubleshooting]].&lt;br /&gt;
&lt;br /&gt;
See also the page [[Dolibarr help and support]].&lt;br /&gt;
&lt;br /&gt;
= Forum =&lt;br /&gt;
A lot of Questions (and Answers) are also available on the Dolibarr forum.&lt;br /&gt;
&lt;br /&gt;
[https://www.dolibarr.org/forum/ Dolibarr Forum]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Proofreading done]]&lt;/div&gt;</summary>
		<author><name>ShengGang</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87%E5%AE%98%E6%96%B9%E6%96%87%E6%A1%A3&amp;diff=58355</id>
		<title>简体中文官方文档</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87%E5%AE%98%E6%96%B9%E6%96%87%E6%A1%A3&amp;diff=58355"/>
		<updated>2023-10-13T10:52:03Z</updated>

		<summary type="html">&lt;p&gt;ShengGang: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- BEGIN interlang links --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Do NOT edit this section&lt;br /&gt;
     Links below are automatically managed by PolyglotBot&lt;br /&gt;
     You can edit links on the English source page : Home --&amp;gt;&lt;br /&gt;
[[en:Home]]&lt;br /&gt;
[[fr:Accueil]]&lt;br /&gt;
[[es:Portada]]&lt;br /&gt;
[[de:Hauptseite]]&lt;br /&gt;
[[el:Αρχική]]&lt;br /&gt;
[[pt:Página Principal]]&lt;br /&gt;
[[ja:ホームページ]]&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
&amp;lt;seo metak=&amp;quot;简体中文,documentation, help, information, development, user, guide, tutorial&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{DISPLAYTITLE:易于使用的企业开源软件}}&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
[[File:Dolibarr logo.png|180px|link=]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;自由管理您的中小型公司，自由职业者或基金会活动&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
本wiki包含有关 Dolibarr ERP/CRM 的所有文档（&#039;&#039;&#039;用户文档&#039;&#039;&#039;、&#039;&#039;&#039;开发者文档&#039;&#039;&#039; 和 &#039;&#039;&#039;翻译员文档&#039;&#039;&#039; ）和资源。可从 Dolibarr 官方网站下载到 (官网： https://www.dolibarr.org).&lt;br /&gt;
&lt;br /&gt;
简体中文翻译可到Dolibarr爱好者交流Q群技术交流：206239089&lt;br /&gt;
&lt;br /&gt;
{{Info}}{{InfoZh}}&lt;br /&gt;
&lt;br /&gt;
=[[File:art.png|link=]] Dolibarr简介=&lt;br /&gt;
&lt;br /&gt;
*[[Dolibarr是什么？|Dolibarr是什么？]] - [[谁使用Dolibarr|谁在使用Dolibarr?]]&lt;br /&gt;
*[[Dolibarr项目|资源、历史和项目组织架构]]&lt;br /&gt;
*[[Dolibarr foundation|Dolibarr 基金会]]&lt;br /&gt;
*[https://www.dolibarr.org/onlinedemo 在线demo演示]&lt;br /&gt;
*[https://www.dolibarr.org/downloads/ 下载地址]&lt;br /&gt;
&lt;br /&gt;
=[[File:File_Doc_user.png|link=]] 用户手册=&lt;br /&gt;
&lt;br /&gt;
*[[用户手册|用户手册]] 和 [[User FAQ|用户常见问题及解答]]&lt;br /&gt;
*[https://www.youtube.com/playlist?list=PL317BA167DF5A1D3E 视频教程]&lt;br /&gt;
*[[Dolibarr help and support|帮助和支持中心]]（社区论坛、商业支持...）&lt;br /&gt;
*[https://courses.dolibarr.org/ Dolibarr学院]（学习Dolibarr的平台）&lt;br /&gt;
*[[截图|截图]]&lt;br /&gt;
*[[安全信息]]&lt;br /&gt;
&lt;br /&gt;
=[[File:File_Doc_dev.png|link=]] 开发指南=&lt;br /&gt;
&lt;br /&gt;
*[[开发文档|开发文档]]&lt;br /&gt;
*[[开发者常见问题解答|开发常见问题及解答]]&lt;br /&gt;
*[[Dolibarr项目|资源和项目组织架构]]&lt;br /&gt;
&lt;br /&gt;
=[[File:File_Doc_trans.png|link=]] 翻译人员帮助文档=&lt;br /&gt;
&lt;br /&gt;
*[[翻译文档|翻译人员帮助文档]]&lt;br /&gt;
&lt;br /&gt;
=[[File:File_Doc_tester.png|link=]] 测试人员指南=&lt;br /&gt;
&lt;br /&gt;
*[[Tester documentation|测试人员指南]]&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;br /&gt;
__NOEDITSECTION__&lt;/div&gt;</summary>
		<author><name>ShengGang</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98-%E5%A6%82%E4%BD%95%E5%BE%97%E7%9F%A5Dolibarr%E6%96%B0%E9%97%BB&amp;diff=58354</id>
		<title>常见问题-如何得知Dolibarr新闻</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98-%E5%A6%82%E4%BD%95%E5%BE%97%E7%9F%A5Dolibarr%E6%96%B0%E9%97%BB&amp;diff=58354"/>
		<updated>2023-10-13T10:48:20Z</updated>

		<summary type="html">&lt;p&gt;ShengGang: /* The Forums */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- BEGIN interlang links --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Do NOT edit this section&lt;br /&gt;
     Links below are automatically managed by PolyglotBot&lt;br /&gt;
     You can edit links on the English source page : FAQ_How_to_be_informed_on_news_about_Dolibarr_project --&amp;gt;&lt;br /&gt;
[[en:FAQ_How_to_be_informed_on_news_about_Dolibarr_project]]&lt;br /&gt;
[[fr:FAQ_Comment_être_informé_de_l&#039;actualité_de_Dolibarr_?]]&lt;br /&gt;
[[es:FAQ_Cómo_puedo_estar_informado_de_lo_que_sucede_en_Dolibarr_?]]&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:FAQ ZH]]&lt;br /&gt;
[[Category:News]]&lt;br /&gt;
要了解开源的Dolibarr ERP CRM项目的最新情况，了解新版本，或接收各种信息，您可以注册社交网络、信息源或Dolibarr邮件列表...&lt;br /&gt;
&lt;br /&gt;
=RSS 订阅=&lt;br /&gt;
您可以订阅Dolibarr的RSS源： https://www.dolibarr.org/rss&lt;br /&gt;
&lt;br /&gt;
=Dolibarr项目的社交网络=&lt;br /&gt;
您还可以在以下社交网络上注册加入Dolibarr专用群组。这是Dolibarr项目的推荐模式。&lt;br /&gt;
&lt;br /&gt;
这些社交网络上的帖子是由相关国家的不同Dolibarr社区的负责人发布。但是，&#039;&#039;&#039;基金会会员&#039;&#039;&#039;可以建议这些消息，前提是这些新闻符合 [[To_promote_Dolibarr#Using_Dolibarr_Channels_by_Dolibarr_members]] 页面上的&#039;&#039;&#039;定义规则&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
{{ListOfSourcesSocialNetworks}}&lt;br /&gt;
&lt;br /&gt;
=论坛=&lt;br /&gt;
您还可以在Dolibarr官方网站（dolibarr.org, dolibarr.fr, dolibarr.de, dolibarr.es, dolibarr.it...）上找到论坛。&lt;br /&gt;
&lt;br /&gt;
https://www.dolibarr.org&lt;br /&gt;
&lt;br /&gt;
=IRC=&lt;br /&gt;
Freenode上还有一个非官方渠道“#dolibarr”用于支持和开发，“#dolibarr-offtopic”用于off-topic。[http://webchat.freenode.net 此处] 提供web客户端。&lt;br /&gt;
&lt;br /&gt;
对于公共IRC：&lt;br /&gt;
 irc://freenode.net:6667/dolibarr&lt;br /&gt;
&lt;br /&gt;
该频道现已废弃。&lt;/div&gt;</summary>
		<author><name>ShengGang</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98-%E5%A6%82%E4%BD%95%E5%BE%97%E7%9F%A5Dolibarr%E6%96%B0%E9%97%BB&amp;diff=58353</id>
		<title>常见问题-如何得知Dolibarr新闻</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98-%E5%A6%82%E4%BD%95%E5%BE%97%E7%9F%A5Dolibarr%E6%96%B0%E9%97%BB&amp;diff=58353"/>
		<updated>2023-10-13T10:42:25Z</updated>

		<summary type="html">&lt;p&gt;ShengGang: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- BEGIN interlang links --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Do NOT edit this section&lt;br /&gt;
     Links below are automatically managed by PolyglotBot&lt;br /&gt;
     You can edit links on the English source page : FAQ_How_to_be_informed_on_news_about_Dolibarr_project --&amp;gt;&lt;br /&gt;
[[en:FAQ_How_to_be_informed_on_news_about_Dolibarr_project]]&lt;br /&gt;
[[fr:FAQ_Comment_être_informé_de_l&#039;actualité_de_Dolibarr_?]]&lt;br /&gt;
[[es:FAQ_Cómo_puedo_estar_informado_de_lo_que_sucede_en_Dolibarr_?]]&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:FAQ ZH]]&lt;br /&gt;
[[Category:News]]&lt;br /&gt;
要了解开源的Dolibarr ERP CRM项目的最新情况，了解新版本，或接收各种信息，您可以注册社交网络、信息源或Dolibarr邮件列表...&lt;br /&gt;
&lt;br /&gt;
=RSS 订阅=&lt;br /&gt;
您可以订阅Dolibarr的RSS源： https://www.dolibarr.org/rss&lt;br /&gt;
&lt;br /&gt;
=Dolibarr项目的社交网络=&lt;br /&gt;
您还可以在以下社交网络上注册加入Dolibarr专用群组。这是Dolibarr项目的推荐模式。&lt;br /&gt;
&lt;br /&gt;
这些社交网络上的帖子是由相关国家的不同Dolibarr社区的负责人发布。但是，&#039;&#039;&#039;基金会会员&#039;&#039;&#039;可以建议这些消息，前提是这些新闻符合 [[To_promote_Dolibarr#Using_Dolibarr_Channels_by_Dolibarr_members]] 页面上的&#039;&#039;&#039;定义规则&#039;&#039;&#039;。&lt;br /&gt;
&lt;br /&gt;
{{ListOfSourcesSocialNetworks}}&lt;br /&gt;
&lt;br /&gt;
=The Forums=&lt;br /&gt;
You can find forums on dolibarr web site https://www.dolibarr.org&lt;br /&gt;
&lt;br /&gt;
=IRC=&lt;br /&gt;
There was also a non official channel #dolibarr for support and development and #dolibarr-offtopic for off-topic on Freenode. A web client is available [http://webchat.freenode.net here].&lt;br /&gt;
&lt;br /&gt;
For public IRC:&lt;br /&gt;
 irc://freenode.net:6667/dolibarr&lt;br /&gt;
&lt;br /&gt;
This channel is now abandonned.&lt;/div&gt;</summary>
		<author><name>ShengGang</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=FAQ_How_to_be_informed_on_news_about_Dolibarr_project&amp;diff=58349</id>
		<title>FAQ How to be informed on news about Dolibarr project</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=FAQ_How_to_be_informed_on_news_about_Dolibarr_project&amp;diff=58349"/>
		<updated>2023-10-13T10:26:41Z</updated>

		<summary type="html">&lt;p&gt;ShengGang: Add Chinese&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- BEGIN origin interlang links --&amp;gt;&lt;br /&gt;
&amp;lt;!-- You can edit this section but do NOT remove these comments&lt;br /&gt;
     Links below will be automatically replicated on translated pages by PolyglotBot --&amp;gt;&lt;br /&gt;
[[fr:FAQ_Comment_être_informé_de_l&#039;actualité_de_Dolibarr_?]]&lt;br /&gt;
[[es:FAQ_Cómo_puedo_estar_informado_de_lo_que_sucede_en_Dolibarr_?]]&lt;br /&gt;
[[zh:常见问题-如何得知Dolibarr新闻]]&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:FAQ EN]]&lt;br /&gt;
[[Category:News]]&lt;br /&gt;
To be informed on what happen on Dolibarr project, you can subscribe to Dolibarr mailing-lists or to social networks groups...&lt;br /&gt;
&lt;br /&gt;
= RSS Feeds =&lt;br /&gt;
You can subscribe to the Dolibarr RSS feed (english): https://www.dolibarr.org/rss&lt;br /&gt;
&lt;br /&gt;
= The Social Networks of Dolibarr project =&lt;br /&gt;
You can also subscribe on social networks groups dedicated to Dolibarr news. It is the recommended mode to be informed on Dolibarr project.&lt;br /&gt;
&lt;br /&gt;
Publishing on such social networks are done by community leaders of Dolibarr project. &lt;br /&gt;
Request can also be done by &#039;&#039;&#039;foundation members&#039;&#039;&#039; if news &#039;&#039;&#039;match requirements&#039;&#039;&#039; described onto page [[To_promote_Dolibarr#Using_Dolibarr_Channels_by_Dolibarr_members]].&lt;br /&gt;
&lt;br /&gt;
{{ListOfSourcesSocialNetworks}}&lt;br /&gt;
&lt;br /&gt;
= The Forums =&lt;br /&gt;
You can find forums on dolibarr web site https://www.dolibarr.org&lt;br /&gt;
&lt;br /&gt;
= IRC =&lt;br /&gt;
There was also a non official channel #dolibarr for support and development and #dolibarr-offtopic for off-topic on Freenode. A web client is available [http://webchat.freenode.net here].&lt;br /&gt;
&lt;br /&gt;
For public IRC:&lt;br /&gt;
 irc://freenode.net:6667/dolibarr&lt;br /&gt;
&lt;br /&gt;
This channel is now abandonned.&lt;/div&gt;</summary>
		<author><name>ShengGang</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98-%E5%A6%82%E4%BD%95%E5%BE%97%E7%9F%A5Dolibarr%E6%96%B0%E9%97%BB&amp;diff=58348</id>
		<title>常见问题-如何得知Dolibarr新闻</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98-%E5%A6%82%E4%BD%95%E5%BE%97%E7%9F%A5Dolibarr%E6%96%B0%E9%97%BB&amp;diff=58348"/>
		<updated>2023-10-13T10:26:13Z</updated>

		<summary type="html">&lt;p&gt;ShengGang: initialization&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:FAQ ZH]]&lt;br /&gt;
[[Category:News]]&lt;br /&gt;
To be informed on what happen on Dolibarr project, you can subscribe to Dolibarr mailing-lists or to social networks groups...&lt;br /&gt;
&lt;br /&gt;
= RSS Feeds =&lt;br /&gt;
You can subscribe to the Dolibarr RSS feed (english): https://www.dolibarr.org/rss&lt;br /&gt;
&lt;br /&gt;
= The Social Networks of Dolibarr project =&lt;br /&gt;
You can also subscribe on social networks groups dedicated to Dolibarr news. It is the recommended mode to be informed on Dolibarr project.&lt;br /&gt;
&lt;br /&gt;
Publishing on such social networks are done by community leaders of Dolibarr project. &lt;br /&gt;
Request can also be done by &#039;&#039;&#039;foundation members&#039;&#039;&#039; if news &#039;&#039;&#039;match requirements&#039;&#039;&#039; described onto page [[To_promote_Dolibarr#Using_Dolibarr_Channels_by_Dolibarr_members]].&lt;br /&gt;
&lt;br /&gt;
{{ListOfSourcesSocialNetworks}}&lt;br /&gt;
&lt;br /&gt;
= The Forums =&lt;br /&gt;
You can find forums on dolibarr web site https://www.dolibarr.org&lt;br /&gt;
&lt;br /&gt;
= IRC =&lt;br /&gt;
There was also a non official channel #dolibarr for support and development and #dolibarr-offtopic for off-topic on Freenode. A web client is available [http://webchat.freenode.net here].&lt;br /&gt;
&lt;br /&gt;
For public IRC:&lt;br /&gt;
 irc://freenode.net:6667/dolibarr&lt;br /&gt;
&lt;br /&gt;
This channel is now abandonned.&lt;/div&gt;</summary>
		<author><name>ShengGang</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98-%E5%8F%91%E5%B8%83%E6%B5%81%E7%A8%8B&amp;diff=58344</id>
		<title>常见问题-发布流程</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98-%E5%8F%91%E5%B8%83%E6%B5%81%E7%A8%8B&amp;diff=58344"/>
		<updated>2023-10-13T03:50:51Z</updated>

		<summary type="html">&lt;p&gt;ShengGang: /* 打包最终版本 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- BEGIN interlang links --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Do NOT edit this section&lt;br /&gt;
     Links below are automatically managed by PolyglotBot&lt;br /&gt;
     You can edit links on the English source page : FAQ_Release_process --&amp;gt;&lt;br /&gt;
[[en:FAQ_Release_process]]&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:FAQ ZH]]&lt;br /&gt;
[[Category:RoadMap]]&lt;br /&gt;
&lt;br /&gt;
=简介=&lt;br /&gt;
本页描述了Dolibarr ERP CRM（法语中的制造流程或供应链）的最新稳定版本的构建与发布流程。&lt;br /&gt;
&lt;br /&gt;
按照不同的时期构建新版本：&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;开发期 -&amp;gt; 冻结/测试期 -&amp;gt; 最终稳定版本&#039;&#039;&#039; （有关冻结/测试版本的定义参见页面 [[:Category:RoadMap]] ）&lt;br /&gt;
&lt;br /&gt;
以下这是对这三个时期的描述。&lt;br /&gt;
&lt;br /&gt;
=开发期=&lt;br /&gt;
&lt;br /&gt;
==开发==&lt;br /&gt;
&lt;br /&gt;
第一步是软件开发。可以从 GitHub 下载源代码，GitHub网址为 https://github.com/Dolibarr/dolibarr&lt;br /&gt;
&lt;br /&gt;
任何开发者都可以下载源代码和使用 git 为自己工作，并可以提交请求以要求将自己的变更包含在官方源代码中。&lt;br /&gt;
&lt;br /&gt;
有关如何执行这些操作的详细信息，请参见 [[FAQ_Get,update_GIT_project_sources|FAQ Get or update project with GIT]] 。&lt;br /&gt;
&lt;br /&gt;
==持续交流==&lt;br /&gt;
&lt;br /&gt;
每次提交包含变更的新请求时，都会在验证变更之前完成持续集成测试。&lt;br /&gt;
&lt;br /&gt;
持续集成测试被包含在目录*tests*下的官方源代码中。它们在Travis平台上运行，可以在此处进行分析： https://travis-ci.org/Dolibarr/dolibarr/&lt;br /&gt;
&lt;br /&gt;
如果测试失败，将不会对其进行验证（请参阅下一步）。&lt;br /&gt;
&lt;br /&gt;
==验证新变更==&lt;br /&gt;
&lt;br /&gt;
只有&#039;&#039;&#039;Dolibarr Yoda&#039;&#039;&#039;级别的人才能接收并将变更纳入官方开发源代码。此权限在GitHub上授予 &lt;br /&gt;
&lt;br /&gt;
有关拥有此级别的人员列表，请参阅 [[Dolibarr_Project#Developers_roles|Dolibarr roles]] 。&lt;br /&gt;
&lt;br /&gt;
=测试期=&lt;br /&gt;
&lt;br /&gt;
当版本中包含了足够多的变更后，根据计划，由Dolibarr Yoda决定开始测试。&lt;br /&gt;
&lt;br /&gt;
从这一刻开始，不会再添加任何新功能。&lt;br /&gt;
&lt;br /&gt;
请参见页面 [[:Category:RoadMap]] ，了解新版本和规则的标准规划，这些版本和规则定义了在测试期间可以修改或不可以修改的代码类型。&lt;br /&gt;
&lt;br /&gt;
生成 packages 是使用打包工具 &#039;&#039;&#039;makepack_dolibarr.pl&#039;&#039;&#039; 完成的。有关该工具的详细操作，请参阅下一章。&lt;br /&gt;
&lt;br /&gt;
=打包最终版本=&lt;br /&gt;
当测试期结束（没有严重bugs的报告和打开），由Dolibarr Yoda决定开始冻结最终版本。版本的名称定义为值X.Y.Z。&lt;br /&gt;
&lt;br /&gt;
注意：只有Dolibarr Yoda才能执行此操作。&lt;br /&gt;
&lt;br /&gt;
*首先，运行最后的单元测试。若发现有1个测试错误，停止后续操作并返回测试阶段。 &amp;lt;br /&amp;gt;所有测试都正常后，将使用打包工具 &#039;&#039;&#039;makepack_dolibarr.pl&#039;&#039;&#039; 自动执行以下步骤：&lt;br /&gt;
&lt;br /&gt;
*该工具生成（或建议生成） &#039;&#039;&#039;ChangeLog&#039;&#039;&#039; 文件。此文件是与源代码一起被提交的。&lt;br /&gt;
*该工具生成文件&#039;&#039;&#039;filelist-X.Y.Z.xml&#039;&#039;&#039;，其中包含具有MD5签名和版本值的版本文件清单。此文件是与源代码一起被提交的。&lt;br /&gt;
*该工具在官方源代码存储库的所有文件上添加一个&#039;&#039;&#039;Tag&#039;&#039;&#039;，该&#039;&#039;&#039;Tag&#039;&#039;&#039;是版本的名称（即X.Y.Z）。因此，从现在开始，专用版本的所有文件都是已知的，并且不会再更改。&lt;br /&gt;
*该工具构建所有的&#039;&#039;&#039;官方分发包&#039;&#039;&#039;。此类包的内容和签名文件的内容相匹配，因为签名文件是在同一过程中生成的。其构建了以下程序包：&lt;br /&gt;
**Package &#039;&#039;&#039;.zip&#039;&#039;&#039; (主包）&lt;br /&gt;
**Package &#039;&#039;&#039;.tgz&#039;&#039;&#039;&lt;br /&gt;
**自动安装程序 Doliwamp &#039;&#039;&#039;.exe&#039;&#039;&#039;&lt;br /&gt;
**基于 Debian/Ubuntu 平台的自动安装程序 DoliDeb &#039;&#039;&#039;.deb&#039;&#039;&#039;&lt;br /&gt;
**基于 Redhat、linuxmint、mandriva 平台的自动安装程序 DoliRpm &#039;&#039;&#039;.rpm&#039;&#039;&#039;&lt;br /&gt;
*该工具将生成的签名文件 &#039;&#039;&#039;filelist-X.Y.Z.xml&#039;&#039;&#039; 上传到官方的Dolibarr服务器上。任何已安装的应用程序都可以读取此文件，以检查版本的完整性（即使修改了一个字节也会使签名改变）。&lt;br /&gt;
*该工具将生成的包上传到&#039;&#039;&#039;官方的Dolibarr存档服务器&#039;&#039;&#039;，以二进制形式进行存档。读取该存档的页面是&amp;lt;nowiki/&amp;gt;https://www.dolibarr.org/files/stable/&lt;br /&gt;
*该工具将生成的包上传到托管在 https://www.sourceforge.net 的&#039;&#039;&#039;镜像存档服务器&#039;&#039;&#039;中。这是一个镜像托管，官方参考资料仍然保留在Dolibarr存档区，由Dolibarr团队托管，位于 https://www.dolibarr.org/files/stable/.&lt;br /&gt;
*该版本也被创建到 https://GitHub.com/Dolibarr/dolibarr&lt;br /&gt;
*然后，Dolibarr社区的人们在不同的渠道（www.dolibarr.org、论坛、社交网络…）上发布公告。&lt;br /&gt;
*从此刻开始，一个新的周期可以开始了。从这个版本的源代码开始一个新的开发期。&lt;br /&gt;
&lt;br /&gt;
然后 Dolibarr Yoda 将在  https://wiki.dolibarr.org 上新增一个页面（每个版本一个页面），用于描述新版本的内容。这是版本发布公告。您可以在 [[:Category:RoadMap]] 页面上查看过去的公告清单。&lt;br /&gt;
&lt;br /&gt;
在任何时候，通过菜单“主页-管理工具-关于Dolibarr-文件集完整性检查”，管理员用户都可以检查并验证其安装版本相比与官方参考版本的完整性。该工具计算每个文件的签名，并将其与官方签名进行比较。将报告所有被删除和被修改的文件。&lt;br /&gt;
&lt;br /&gt;
在任何时候，开发人员都可以在Github上使用发布流程第一步创建的 &#039;&#039;&#039;Tag&#039;&#039;&#039; 来获取任何稳定版本的所有文件。&lt;/div&gt;</summary>
		<author><name>ShengGang</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98-%E5%8F%91%E5%B8%83%E6%B5%81%E7%A8%8B&amp;diff=58343</id>
		<title>常见问题-发布流程</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98-%E5%8F%91%E5%B8%83%E6%B5%81%E7%A8%8B&amp;diff=58343"/>
		<updated>2023-10-13T03:36:33Z</updated>

		<summary type="html">&lt;p&gt;ShengGang: /* Continuous interation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- BEGIN interlang links --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Do NOT edit this section&lt;br /&gt;
     Links below are automatically managed by PolyglotBot&lt;br /&gt;
     You can edit links on the English source page : FAQ_Release_process --&amp;gt;&lt;br /&gt;
[[en:FAQ_Release_process]]&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:FAQ ZH]]&lt;br /&gt;
[[Category:RoadMap]]&lt;br /&gt;
&lt;br /&gt;
=简介=&lt;br /&gt;
本页描述了Dolibarr ERP CRM（法语中的制造流程或供应链）的最新稳定版本的构建与发布流程。&lt;br /&gt;
&lt;br /&gt;
按照不同的时期构建新版本：&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;开发期 -&amp;gt; 冻结/测试期 -&amp;gt; 最终稳定版本&#039;&#039;&#039; （有关冻结/测试版本的定义参见页面 [[:Category:RoadMap]] ）&lt;br /&gt;
&lt;br /&gt;
以下这是对这三个时期的描述。&lt;br /&gt;
&lt;br /&gt;
=开发期=&lt;br /&gt;
&lt;br /&gt;
==开发==&lt;br /&gt;
&lt;br /&gt;
第一步是软件开发。可以从 GitHub 下载源代码，GitHub网址为 https://github.com/Dolibarr/dolibarr&lt;br /&gt;
&lt;br /&gt;
任何开发者都可以下载源代码和使用 git 为自己工作，并可以提交请求以要求将自己的变更包含在官方源代码中。&lt;br /&gt;
&lt;br /&gt;
有关如何执行这些操作的详细信息，请参见 [[FAQ_Get,update_GIT_project_sources|FAQ Get or update project with GIT]] 。&lt;br /&gt;
&lt;br /&gt;
==持续交流==&lt;br /&gt;
&lt;br /&gt;
每次提交包含变更的新请求时，都会在验证变更之前完成持续集成测试。&lt;br /&gt;
&lt;br /&gt;
持续集成测试被包含在目录*tests*下的官方源代码中。它们在Travis平台上运行，可以在此处进行分析： https://travis-ci.org/Dolibarr/dolibarr/&lt;br /&gt;
&lt;br /&gt;
如果测试失败，将不会对其进行验证（请参阅下一步）。&lt;br /&gt;
&lt;br /&gt;
==验证新变更==&lt;br /&gt;
&lt;br /&gt;
只有&#039;&#039;&#039;Dolibarr Yoda&#039;&#039;&#039;级别的人才能接收并将变更纳入官方开发源代码。此权限在GitHub上授予 &lt;br /&gt;
&lt;br /&gt;
有关拥有此级别的人员列表，请参阅 [[Dolibarr_Project#Developers_roles|Dolibarr roles]] 。&lt;br /&gt;
&lt;br /&gt;
=测试期=&lt;br /&gt;
&lt;br /&gt;
当版本中包含了足够多的变更后，根据计划，由Dolibarr Yoda决定开始测试。&lt;br /&gt;
&lt;br /&gt;
从这一刻开始，不会再添加任何新功能。&lt;br /&gt;
&lt;br /&gt;
请参见页面 [[:Category:RoadMap]] ，了解新版本和规则的标准规划，这些版本和规则定义了在测试期间可以修改或不可以修改的代码类型。&lt;br /&gt;
&lt;br /&gt;
生成 packages 是使用打包工具 &#039;&#039;&#039;makepack_dolibarr.pl&#039;&#039;&#039; 完成的。有关该工具的详细操作，请参阅下一章。&lt;br /&gt;
&lt;br /&gt;
=打包最终版本=&lt;br /&gt;
当测试期结束（没有严重bugs的报告和打开），由Dolibarr Yoda决定开始冻结最终版本。版本的名称定义为值X.Y.Z。&lt;br /&gt;
&lt;br /&gt;
注意：只有Dolibarr Yoda才能执行此操作。&lt;br /&gt;
&lt;br /&gt;
*首先，运行最后的单元测试。若发现有1个测试错误，停止后续操作并返回测试阶段。 &amp;lt;br /&amp;gt;所有测试都正常后，将使用打包工具 &#039;&#039;&#039;makepack_dolibarr.pl&#039;&#039;&#039; 自动执行以下步骤：&lt;br /&gt;
&lt;br /&gt;
*该工具生成（或建议生成） &#039;&#039;&#039;ChangeLog&#039;&#039;&#039; 文件。此文件是与源代码一起被提交的。&lt;br /&gt;
*该工具生成文件&#039;&#039;&#039;filelist-X.Y.Z.xml&#039;&#039;&#039;，其中包含具有MD5签名和版本值的版本文件清单。此文件是与源代码一起被提交的。&lt;br /&gt;
*该工具在官方源代码存储库的所有文件上添加一个&#039;&#039;&#039;Tag&#039;&#039;&#039;，该&#039;&#039;&#039;Tag&#039;&#039;&#039;是版本的名称（即X.Y.Z）。因此，从现在开始，专用版本的所有文件都是已知的，并且不会再更改。&lt;br /&gt;
*该工具构建所有的&#039;&#039;&#039;官方分发包&#039;&#039;&#039;。此类包的内容和签名文件的内容相匹配，因为签名文件是在同一过程中生成的。其构建了以下程序包：&lt;br /&gt;
**Package &#039;&#039;&#039;.zip&#039;&#039;&#039; (主包）&lt;br /&gt;
**Package &#039;&#039;&#039;.tgz&#039;&#039;&#039;&lt;br /&gt;
**自动安装程序 Doliwamp &#039;&#039;&#039;.exe&#039;&#039;&#039;&lt;br /&gt;
**基于 Debian/Ubuntu 平台的自动安装程序 DoliDeb &#039;&#039;&#039;.deb&#039;&#039;&#039;&lt;br /&gt;
**基于 Redhat、linuxmint、mandriva 平台的自动安装程序 DoliRpm &#039;&#039;&#039;.rpm&#039;&#039;&#039;&lt;br /&gt;
*该工具将生成的签名文件 &#039;&#039;&#039;filelist-X.Y.Z.xml&#039;&#039;&#039; 上传到官方的Dolibarr服务器上。任何已安装的应用程序都可以读取此文件，以检查版本的完整性（即使修改了一个字节也会使签名改变）。&lt;br /&gt;
*该工具将生成的包上传到&#039;&#039;&#039;官方的Dolibarr存档服务器&#039;&#039;&#039;，以二进制形式进行存档。读取该存档的页面是&amp;lt;nowiki/&amp;gt;https://www.dolibarr.org/files/stable/&lt;br /&gt;
*该工具将生成的包上传到托管在 https://www.sourceforge.net 的&#039;&#039;&#039;镜像存档服务器&#039;&#039;&#039;中。这是一个镜像托管，官方参考资料仍然保留在Dolibarr存档区，由Dolibarr团队托管，位于 https://www.dolibarr.org/files/stable/.&lt;br /&gt;
*该版本也被创建到 https://GitHub.com/Dolibarr/dolibarr&lt;br /&gt;
*然后，Dolibarr社区的人们在不同的渠道（www.dolibarr.org、论坛、社交网络…）上发布公告。&lt;br /&gt;
*从此刻开始，一个新的周期可以开始了。从这个版本的源代码开始一个新的开发期。&lt;br /&gt;
&lt;br /&gt;
Then a Dolibarr Yoda add 1 page (one page per version) onto the https://wiki.dolibarr.org to describe content of new version. This is the Release announcement. You can look at the page [[:Category:RoadMap]] for list of past announcements.&lt;br /&gt;
&lt;br /&gt;
At any time, from the menu &#039;&#039;&#039;System Tools / About Dolibarr / Check integrity&#039;&#039;&#039;, an admin user can check and validate integrity of its installed version compared to official reference. The tool calculate signature of each file and compare it with official signature. All removed and modified files are reported.&lt;br /&gt;
&lt;br /&gt;
At any time, a developer can, from Github and using the &#039;&#039;&#039;Tag&#039;&#039;&#039; created at first step of release process, get all files of any stable version.&lt;/div&gt;</summary>
		<author><name>ShengGang</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98-%E5%8F%91%E5%B8%83%E6%B5%81%E7%A8%8B&amp;diff=58342</id>
		<title>常见问题-发布流程</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98-%E5%8F%91%E5%B8%83%E6%B5%81%E7%A8%8B&amp;diff=58342"/>
		<updated>2023-10-13T02:41:35Z</updated>

		<summary type="html">&lt;p&gt;ShengGang: /* Introduction */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- BEGIN interlang links --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Do NOT edit this section&lt;br /&gt;
     Links below are automatically managed by PolyglotBot&lt;br /&gt;
     You can edit links on the English source page : FAQ_Release_process --&amp;gt;&lt;br /&gt;
[[en:FAQ_Release_process]]&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:FAQ ZH]]&lt;br /&gt;
[[Category:RoadMap]]&lt;br /&gt;
&lt;br /&gt;
=简介=&lt;br /&gt;
本页描述了Dolibarr ERP CRM（法语中的制造流程或供应链）的最新稳定版本的构建与发布流程。&lt;br /&gt;
&lt;br /&gt;
按照不同的时期构建新版本：&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;开发期 -&amp;gt; 冻结/测试期 -&amp;gt; 最终稳定版本&#039;&#039;&#039; （有关冻结/测试版本的定义参见页面 [[:Category:RoadMap]] ）&lt;br /&gt;
&lt;br /&gt;
以下这是对这三个时期的描述。&lt;br /&gt;
&lt;br /&gt;
=开发=&lt;br /&gt;
&lt;br /&gt;
==开发==&lt;br /&gt;
&lt;br /&gt;
第一步是软件开发。可以从 GitHub 下载源代码，GitHub网址为 https://github.com/Dolibarr/dolibarr&lt;br /&gt;
&lt;br /&gt;
任何开发者都可以下载源代码和使用 git 为自己工作，并可以提交请求以要求将自己的变更包含在官方源代码中。&lt;br /&gt;
&lt;br /&gt;
有关如何执行这些操作的详细信息，请参见 [[FAQ_Get,update_GIT_project_sources|FAQ Get or update project with GIT]] 。&lt;br /&gt;
&lt;br /&gt;
==Continuous interation==&lt;br /&gt;
&lt;br /&gt;
Each time a new request to include a change is submitted, Continuous Integration Tests are done before the change is validated.&lt;br /&gt;
&lt;br /&gt;
Continuous integration Test are included into official sources into directory *tests*. They are run on the Travis platform and can be analyzed here: https://travis-ci.org/Dolibarr/dolibarr/&lt;br /&gt;
&lt;br /&gt;
If a test fails, it will not be validated (see next step).&lt;br /&gt;
&lt;br /&gt;
==Validation of new changes==&lt;br /&gt;
&lt;br /&gt;
Only people with the grade &#039;&#039;&#039;Dolibarr Yoda&#039;&#039;&#039; can accept to include changes into official development sources. Permissions for this are granted on GitHub &lt;br /&gt;
&lt;br /&gt;
See [[Dolibarr_Project#Developers_roles|Dolibarr roles]] for the list of people with this grade.&lt;br /&gt;
&lt;br /&gt;
=Beta period=&lt;br /&gt;
&lt;br /&gt;
When enough changes are included into version, and according to planning, the Dolibarr Yoda decide to start the beta.&lt;br /&gt;
Starting from this point, no new features are added.&lt;br /&gt;
&lt;br /&gt;
See page [[:Category:RoadMap]] for standard planning of new versions and rules that define what kind of code can be modified or not during a beta period.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Generating the packages is done using the packaging tool &#039;&#039;&#039;makepack_dolibarr.pl&#039;&#039;&#039;. See next chapter for detailed operation done by this tool.&lt;br /&gt;
&lt;br /&gt;
=The packaging of final releases=&lt;br /&gt;
When beta period end (no more serious bugs are reported and opened), the Dolibarr Yoda decide to start the freeze of final version. The name of the version is define to a value X.Y.Z.&lt;br /&gt;
&lt;br /&gt;
Note: Only a Dolibarr Yoda can make this process.&lt;br /&gt;
&lt;br /&gt;
*Firstly, final Unit Tests are run. If 1 test is wrong, process is stopped here and go back to beta phase.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Once all tests are ok, the following steps are done automatically using the packaging tool &#039;&#039;&#039;makepack_dolibarr.pl&#039;&#039;&#039; :&lt;br /&gt;
&lt;br /&gt;
*The tool generate (or suggest the command to generate) the &#039;&#039;&#039;ChangeLog&#039;&#039;&#039; file. This file is commited with sources.&lt;br /&gt;
*The tool generates the file &#039;&#039;&#039;filelist-X.Y.Z.xml&#039;&#039;&#039; than contains the list of files of the version with a MD5 signature and value of version. This file is commited with sources.&lt;br /&gt;
*The tool add a &#039;&#039;&#039;Tag&#039;&#039;&#039; that is the name of version (so X.Y.Z) on all files of the official source repository. So starting from now, all files for the dedicated version are known and won&#039;t change anymore.&lt;br /&gt;
*The tool build all &#039;&#039;&#039;official distribution packages&#039;&#039;&#039;. Content of such packages match the content of the signature file since it is build during same process. The following packages are built:&lt;br /&gt;
**Package &#039;&#039;&#039;.zip&#039;&#039;&#039; (the main package)&lt;br /&gt;
**Package &#039;&#039;&#039;.tgz&#039;&#039;&#039;&lt;br /&gt;
**Autoinstaller Doliwamp &#039;&#039;&#039;.exe&#039;&#039;&#039;&lt;br /&gt;
**Autoinstaller for Debian/Ubuntu DoliDeb &#039;&#039;&#039;.deb&#039;&#039;&#039;&lt;br /&gt;
**Autoinstaller for Redhat, linuxmint, mandriva DoliRpm &#039;&#039;&#039;.rpm&#039;&#039;&#039;&lt;br /&gt;
*The tool upload the generated signature file &#039;&#039;&#039;filelist-X.Y.Z.xml&#039;&#039;&#039; on the official Dolibarr server. This file can be read by any installed application to check the integrity of the version (even one byte modified will change the signature).&lt;br /&gt;
*The tool upload the generated packaged into the &#039;&#039;&#039;official Dolibarr archive server&#039;&#039;&#039; to have them archived also in a binary form. This archives can be read from page https://www.dolibarr.org/files/stable/&lt;br /&gt;
*The tool upload the generated packaged into the &#039;&#039;&#039;mirror archive servers&#039;&#039;&#039; hosted at https://www.sourceforge.net. This is a mirror hosting, official references remain the Dolibarr archive area and are hosted by the Dolibarr team so at https://www.dolibarr.org/files/stable/.&lt;br /&gt;
*The release is also created on https://GitHub.com/Dolibarr/dolibarr&lt;br /&gt;
*Then people of the Dolibarr community send announcements on different channels (www.dolibarr.org, forums, social networks...).&lt;br /&gt;
*Starting from now, a new cycle can start. A new development period start from sources of the version.&lt;br /&gt;
&lt;br /&gt;
Then a Dolibarr Yoda add 1 page (one page per version) onto the https://wiki.dolibarr.org to describe content of new version. This is the Release announcement. You can look at the page [[:Category:RoadMap]] for list of past announcements.&lt;br /&gt;
&lt;br /&gt;
At any time, from the menu &#039;&#039;&#039;System Tools / About Dolibarr / Check integrity&#039;&#039;&#039;, an admin user can check and validate integrity of its installed version compared to official reference. The tool calculate signature of each file and compare it with official signature. All removed and modified files are reported.&lt;br /&gt;
&lt;br /&gt;
At any time, a developer can, from Github and using the &#039;&#039;&#039;Tag&#039;&#039;&#039; created at first step of release process, get all files of any stable version.&lt;/div&gt;</summary>
		<author><name>ShengGang</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=FAQ_Release_process&amp;diff=58340</id>
		<title>FAQ Release process</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=FAQ_Release_process&amp;diff=58340"/>
		<updated>2023-10-13T02:25:37Z</updated>

		<summary type="html">&lt;p&gt;ShengGang: Add Chinese&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- BEGIN origin interlang links --&amp;gt;&lt;br /&gt;
&amp;lt;!-- You can edit this section but do NOT remove these comments&lt;br /&gt;
     Links below will be automatically replicated on translated pages by PolyglotBot --&amp;gt;&lt;br /&gt;
[[zh:常见问题-发布流程]]&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:FAQ EN]]&lt;br /&gt;
[[Category:RoadMap]]&lt;br /&gt;
&lt;br /&gt;
= Introduction=&lt;br /&gt;
This page describe what is the build and release process of a new stable version of Dolibarr ERP CRM (manufacturing process or chaine de fabrication in french).&lt;br /&gt;
&lt;br /&gt;
A new version is build following different steps:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A development period -&amp;gt; A freeze / beta period -&amp;gt; A final stable version&#039;&#039;&#039; (See page [[:Category:RoadMap]] for definition of a Freeze / Beta version)&lt;br /&gt;
&lt;br /&gt;
This is description of the 3 steps.&lt;br /&gt;
&lt;br /&gt;
= Development =&lt;br /&gt;
&lt;br /&gt;
== Development ==&lt;br /&gt;
&lt;br /&gt;
First step is development of software. Sources can be download from GitHub at https://github.com/Dolibarr/dolibarr&lt;br /&gt;
&lt;br /&gt;
Any developer can download sources and work on his side using git and submit a request to ask to include his changes to the official sources.&lt;br /&gt;
&lt;br /&gt;
See the [[FAQ_Get,update_GIT_project_sources|FAQ Get or update project with GIT]] for more information on how to do this.&lt;br /&gt;
&lt;br /&gt;
== Continuous interation ==&lt;br /&gt;
&lt;br /&gt;
Each time a new request to include a change is submitted, Continuous Integration Tests are done before the change is validated.&lt;br /&gt;
&lt;br /&gt;
Continuous integration Test are included into official sources into directory *tests*. They are run on the Travis platform and can be analyzed here: https://travis-ci.org/Dolibarr/dolibarr/&lt;br /&gt;
&lt;br /&gt;
If a test fails, it will not be validated (see next step).&lt;br /&gt;
&lt;br /&gt;
== Validation of new changes ==&lt;br /&gt;
&lt;br /&gt;
Only people with the grade &#039;&#039;&#039;Dolibarr Yoda&#039;&#039;&#039; can accept to include changes into official development sources. Permissions for this are granted on GitHub &lt;br /&gt;
&lt;br /&gt;
See [[Dolibarr_Project#Developers_roles|Dolibarr roles]] for the list of people with this grade.&lt;br /&gt;
&lt;br /&gt;
= Beta period =&lt;br /&gt;
&lt;br /&gt;
When enough changes are included into version, and according to planning, the Dolibarr Yoda decide to start the beta.&lt;br /&gt;
Starting from this point, no new features are added.&lt;br /&gt;
&lt;br /&gt;
See page [[:Category:RoadMap]] for standard planning of new versions and rules that define what kind of code can be modified or not during a beta period.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Generating the packages is done using the packaging tool &#039;&#039;&#039;makepack_dolibarr.pl&#039;&#039;&#039;. See next chapter for detailed operation done by this tool.&lt;br /&gt;
&lt;br /&gt;
= The packaging of final releases =&lt;br /&gt;
When beta period end (no more serious bugs are reported and opened), the Dolibarr Yoda decide to start the freeze of final version. The name of the version is define to a value X.Y.Z.&lt;br /&gt;
&lt;br /&gt;
Note: Only a Dolibarr Yoda can make this process.&lt;br /&gt;
&lt;br /&gt;
* Firstly, final Unit Tests are run. If 1 test is wrong, process is stopped here and go back to beta phase.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Once all tests are ok, the following steps are done automatically using the packaging tool &#039;&#039;&#039;makepack_dolibarr.pl&#039;&#039;&#039; :&lt;br /&gt;
&lt;br /&gt;
* The tool generate (or suggest the command to generate) the &#039;&#039;&#039;ChangeLog&#039;&#039;&#039; file. This file is commited with sources.&lt;br /&gt;
* The tool generates the file &#039;&#039;&#039;filelist-X.Y.Z.xml&#039;&#039;&#039; than contains the list of files of the version with a MD5 signature and value of version. This file is commited with sources.&lt;br /&gt;
* The tool add a &#039;&#039;&#039;Tag&#039;&#039;&#039; that is the name of version (so X.Y.Z) on all files of the official source repository. So starting from now, all files for the dedicated version are known and won&#039;t change anymore.&lt;br /&gt;
* The tool build all &#039;&#039;&#039;official distribution packages&#039;&#039;&#039;. Content of such packages match the content of the signature file since it is build during same process. The following packages are built:&lt;br /&gt;
** Package &#039;&#039;&#039;.zip&#039;&#039;&#039; (the main package)&lt;br /&gt;
** Package &#039;&#039;&#039;.tgz&#039;&#039;&#039;&lt;br /&gt;
** Autoinstaller Doliwamp &#039;&#039;&#039;.exe&#039;&#039;&#039;&lt;br /&gt;
** Autoinstaller for Debian/Ubuntu DoliDeb &#039;&#039;&#039;.deb&#039;&#039;&#039;&lt;br /&gt;
** Autoinstaller for Redhat, linuxmint, mandriva DoliRpm &#039;&#039;&#039;.rpm&#039;&#039;&#039;&lt;br /&gt;
* The tool upload the generated signature file &#039;&#039;&#039;filelist-X.Y.Z.xml&#039;&#039;&#039; on the official Dolibarr server. This file can be read by any installed application to check the integrity of the version (even one byte modified will change the signature).&lt;br /&gt;
* The tool upload the generated packaged into the &#039;&#039;&#039;official Dolibarr archive server&#039;&#039;&#039; to have them archived also in a binary form. This archives can be read from page https://www.dolibarr.org/files/stable/&lt;br /&gt;
* The tool upload the generated packaged into the &#039;&#039;&#039;mirror archive servers&#039;&#039;&#039; hosted at https://www.sourceforge.net. This is a mirror hosting, official references remain the Dolibarr archive area and are hosted by the Dolibarr team so at https://www.dolibarr.org/files/stable/.&lt;br /&gt;
* The release is also created on https://GitHub.com/Dolibarr/dolibarr&lt;br /&gt;
* Then people of the Dolibarr community send announcements on different channels (www.dolibarr.org, forums, social networks...).&lt;br /&gt;
* Starting from now, a new cycle can start. A new development period start from sources of the version.&lt;br /&gt;
&lt;br /&gt;
Then a Dolibarr Yoda add 1 page (one page per version) onto the https://wiki.dolibarr.org to describe content of new version. This is the Release announcement. You can look at the page [[:Category:RoadMap]] for list of past announcements.&lt;br /&gt;
&lt;br /&gt;
At any time, from the menu &#039;&#039;&#039;System Tools / About Dolibarr / Check integrity&#039;&#039;&#039;, an admin user can check and validate integrity of its installed version compared to official reference. The tool calculate signature of each file and compare it with official signature. All removed and modified files are reported.&lt;br /&gt;
&lt;br /&gt;
At any time, a developer can, from Github and using the &#039;&#039;&#039;Tag&#039;&#039;&#039; created at first step of release process, get all files of any stable version.&lt;/div&gt;</summary>
		<author><name>ShengGang</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98-%E5%8F%91%E5%B8%83%E6%B5%81%E7%A8%8B&amp;diff=58339</id>
		<title>常见问题-发布流程</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98-%E5%8F%91%E5%B8%83%E6%B5%81%E7%A8%8B&amp;diff=58339"/>
		<updated>2023-10-13T02:24:12Z</updated>

		<summary type="html">&lt;p&gt;ShengGang: initialization&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:FAQ ZH]]&lt;br /&gt;
[[Category:RoadMap]]&lt;br /&gt;
&lt;br /&gt;
= Introduction=&lt;br /&gt;
This page describe what is the build and release process of a new stable version of Dolibarr ERP CRM (manufacturing process or chaine de fabrication in french).&lt;br /&gt;
&lt;br /&gt;
A new version is build following different steps:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A development period -&amp;gt; A freeze / beta period -&amp;gt; A final stable version&#039;&#039;&#039; (See page [[:Category:RoadMap]] for definition of a Freeze / Beta version)&lt;br /&gt;
&lt;br /&gt;
This is description of the 3 steps.&lt;br /&gt;
&lt;br /&gt;
= Development =&lt;br /&gt;
&lt;br /&gt;
== Development ==&lt;br /&gt;
&lt;br /&gt;
First step is development of software. Sources can be download from GitHub at https://github.com/Dolibarr/dolibarr&lt;br /&gt;
&lt;br /&gt;
Any developer can download sources and work on his side using git and submit a request to ask to include his changes to the official sources.&lt;br /&gt;
&lt;br /&gt;
See the [[FAQ_Get,update_GIT_project_sources|FAQ Get or update project with GIT]] for more information on how to do this.&lt;br /&gt;
&lt;br /&gt;
== Continuous interation ==&lt;br /&gt;
&lt;br /&gt;
Each time a new request to include a change is submitted, Continuous Integration Tests are done before the change is validated.&lt;br /&gt;
&lt;br /&gt;
Continuous integration Test are included into official sources into directory *tests*. They are run on the Travis platform and can be analyzed here: https://travis-ci.org/Dolibarr/dolibarr/&lt;br /&gt;
&lt;br /&gt;
If a test fails, it will not be validated (see next step).&lt;br /&gt;
&lt;br /&gt;
== Validation of new changes ==&lt;br /&gt;
&lt;br /&gt;
Only people with the grade &#039;&#039;&#039;Dolibarr Yoda&#039;&#039;&#039; can accept to include changes into official development sources. Permissions for this are granted on GitHub &lt;br /&gt;
&lt;br /&gt;
See [[Dolibarr_Project#Developers_roles|Dolibarr roles]] for the list of people with this grade.&lt;br /&gt;
&lt;br /&gt;
= Beta period =&lt;br /&gt;
&lt;br /&gt;
When enough changes are included into version, and according to planning, the Dolibarr Yoda decide to start the beta.&lt;br /&gt;
Starting from this point, no new features are added.&lt;br /&gt;
&lt;br /&gt;
See page [[:Category:RoadMap]] for standard planning of new versions and rules that define what kind of code can be modified or not during a beta period.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Generating the packages is done using the packaging tool &#039;&#039;&#039;makepack_dolibarr.pl&#039;&#039;&#039;. See next chapter for detailed operation done by this tool.&lt;br /&gt;
&lt;br /&gt;
= The packaging of final releases =&lt;br /&gt;
When beta period end (no more serious bugs are reported and opened), the Dolibarr Yoda decide to start the freeze of final version. The name of the version is define to a value X.Y.Z.&lt;br /&gt;
&lt;br /&gt;
Note: Only a Dolibarr Yoda can make this process.&lt;br /&gt;
&lt;br /&gt;
* Firstly, final Unit Tests are run. If 1 test is wrong, process is stopped here and go back to beta phase.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Once all tests are ok, the following steps are done automatically using the packaging tool &#039;&#039;&#039;makepack_dolibarr.pl&#039;&#039;&#039; :&lt;br /&gt;
&lt;br /&gt;
* The tool generate (or suggest the command to generate) the &#039;&#039;&#039;ChangeLog&#039;&#039;&#039; file. This file is commited with sources.&lt;br /&gt;
* The tool generates the file &#039;&#039;&#039;filelist-X.Y.Z.xml&#039;&#039;&#039; than contains the list of files of the version with a MD5 signature and value of version. This file is commited with sources.&lt;br /&gt;
* The tool add a &#039;&#039;&#039;Tag&#039;&#039;&#039; that is the name of version (so X.Y.Z) on all files of the official source repository. So starting from now, all files for the dedicated version are known and won&#039;t change anymore.&lt;br /&gt;
* The tool build all &#039;&#039;&#039;official distribution packages&#039;&#039;&#039;. Content of such packages match the content of the signature file since it is build during same process. The following packages are built:&lt;br /&gt;
** Package &#039;&#039;&#039;.zip&#039;&#039;&#039; (the main package)&lt;br /&gt;
** Package &#039;&#039;&#039;.tgz&#039;&#039;&#039;&lt;br /&gt;
** Autoinstaller Doliwamp &#039;&#039;&#039;.exe&#039;&#039;&#039;&lt;br /&gt;
** Autoinstaller for Debian/Ubuntu DoliDeb &#039;&#039;&#039;.deb&#039;&#039;&#039;&lt;br /&gt;
** Autoinstaller for Redhat, linuxmint, mandriva DoliRpm &#039;&#039;&#039;.rpm&#039;&#039;&#039;&lt;br /&gt;
* The tool upload the generated signature file &#039;&#039;&#039;filelist-X.Y.Z.xml&#039;&#039;&#039; on the official Dolibarr server. This file can be read by any installed application to check the integrity of the version (even one byte modified will change the signature).&lt;br /&gt;
* The tool upload the generated packaged into the &#039;&#039;&#039;official Dolibarr archive server&#039;&#039;&#039; to have them archived also in a binary form. This archives can be read from page https://www.dolibarr.org/files/stable/&lt;br /&gt;
* The tool upload the generated packaged into the &#039;&#039;&#039;mirror archive servers&#039;&#039;&#039; hosted at https://www.sourceforge.net. This is a mirror hosting, official references remain the Dolibarr archive area and are hosted by the Dolibarr team so at https://www.dolibarr.org/files/stable/.&lt;br /&gt;
* The release is also created on https://GitHub.com/Dolibarr/dolibarr&lt;br /&gt;
* Then people of the Dolibarr community send announcements on different channels (www.dolibarr.org, forums, social networks...).&lt;br /&gt;
* Starting from now, a new cycle can start. A new development period start from sources of the version.&lt;br /&gt;
&lt;br /&gt;
Then a Dolibarr Yoda add 1 page (one page per version) onto the https://wiki.dolibarr.org to describe content of new version. This is the Release announcement. You can look at the page [[:Category:RoadMap]] for list of past announcements.&lt;br /&gt;
&lt;br /&gt;
At any time, from the menu &#039;&#039;&#039;System Tools / About Dolibarr / Check integrity&#039;&#039;&#039;, an admin user can check and validate integrity of its installed version compared to official reference. The tool calculate signature of each file and compare it with official signature. All removed and modified files are reported.&lt;br /&gt;
&lt;br /&gt;
At any time, a developer can, from Github and using the &#039;&#039;&#039;Tag&#039;&#039;&#039; created at first step of release process, get all files of any stable version.&lt;/div&gt;</summary>
		<author><name>ShengGang</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=%E5%BC%80%E5%8F%91%E8%80%85%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98%E8%A7%A3%E7%AD%94&amp;diff=58338</id>
		<title>开发者常见问题解答</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=%E5%BC%80%E5%8F%91%E8%80%85%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98%E8%A7%A3%E7%AD%94&amp;diff=58338"/>
		<updated>2023-10-13T01:55:05Z</updated>

		<summary type="html">&lt;p&gt;ShengGang: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- BEGIN interlang links --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Do NOT edit this section&lt;br /&gt;
     Links below are automatically managed by PolyglotBot&lt;br /&gt;
     You can edit links on the English source page : Developer_FAQ --&amp;gt;&lt;br /&gt;
[[en:Developer_FAQ]]&lt;br /&gt;
[[fr:FAQ_Développeur]]&lt;br /&gt;
[[de:Entwickler_FAQ]]&lt;br /&gt;
[[es:FAQ_Desarrolladores]]&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:FAQ ZH]]&lt;br /&gt;
{{TemplateDocDevZh}}&lt;br /&gt;
本页包含一些与Dolibarr开发相关的问题和解答。有关使用的问题和解答，请参见页面 [[FAQ Utilisateur]] 。&lt;br /&gt;
&lt;br /&gt;
=如何成为官方开发者=&lt;br /&gt;
&lt;br /&gt;
在Dolibarr项目星系中，有几个不同级别/等级的参与者。&lt;br /&gt;
&lt;br /&gt;
开发人员和贡献的数量很重要，但任何想要达到一定质量水平的项目都必须在功能需求和编码方面对开发进行受控管理和验证修改。因此，对源代码（Git服务器）的写访问受到限制，并由下面几行所描述的组织管理。每个开发人员都有一个&#039;&#039;&#039;grade&#039;&#039;&#039;（等级），这取决于他们的资历和过去的贡献。一个人在项目中的授权水平随着等级晋升阶段的增加而提高。&lt;br /&gt;
&lt;br /&gt;
因此，Dolibarr开发者的职业生涯经历了这些阶段，这些阶段是根据科幻小说爱好者熟悉的标题进行分类。以下是这些步骤。重要的是要理解，该组织的唯一目的是提高Dolibarr的质量，为了实现这一目标，必须严格遵守该组织规定。&lt;br /&gt;
&lt;br /&gt;
Dolibarr项目贡献者的等级以及达到该等级所需的条件，在以下页面中定义：[[Dolibarr项目#开发人员角色|Dolibarr项目的开发人员角色]] 一节。&lt;br /&gt;
&lt;br /&gt;
=Dolibarr的开发者=&lt;br /&gt;
请参阅 [[Dolibarr项目]] 页面，了解目前参与Dolibarr项目的每个级别的人员列表。&lt;br /&gt;
&lt;br /&gt;
=开始开发=&lt;br /&gt;
先完整阅读 [[开发文档]] ，以了解开发人员必须遵守的所有规则和原则。 您还可以参阅下面的常见问题解答。&lt;br /&gt;
&lt;br /&gt;
=检索/更新项目源代码=&lt;br /&gt;
请参阅页面 [[常见问题-获取与更新项目的GIT源代码|获取与更新项目的GIT源代码]] 。&lt;br /&gt;
&lt;br /&gt;
=如何创建新主题=&lt;br /&gt;
请参阅页面 [[主题]] 。&lt;br /&gt;
&lt;br /&gt;
=如何开发自己的模块=&lt;br /&gt;
要开发自己的编号模块，请参阅 [[自动编号模块|创建编号模块]] 。&lt;br /&gt;
&lt;br /&gt;
要开发自己的文档模板（PDF或其他格式），请参阅 [[创建PDF模板|创建PDF文档模板]] 或 [[Créer un modèle de document ODT|创建ODT文档模板]] 。&lt;br /&gt;
&lt;br /&gt;
要开发完整的功能模块（可视界面、表单），请参阅页面 [[模块开发]] 。&lt;br /&gt;
&lt;br /&gt;
=如何添加或完成翻译=&lt;br /&gt;
为此，请参阅页面 [[翻译文档]] 。&lt;br /&gt;
&lt;br /&gt;
=在使用中更改发票自动编号规则=&lt;br /&gt;
如果新的编号系统与旧的编号系统不冲突，只需前往菜单“主页-设置-模块/应用-发票-设置”，并从列表中获取新的编号规则。&lt;br /&gt;
&lt;br /&gt;
如果新旧编号系统之间规则冲突，则需要对现有引用（references）进行重新编号。这可以通过SQL请求完成。&lt;br /&gt;
&lt;br /&gt;
例如，要从编号规则 Jupiter(FYYYMM99) 迁移到 Terre(FAYYMM-999) ，可以执行以下请求：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
update llx_facture set facnumber=concat(&#039;FA&#039;,substr(facnumber,4,4),&#039;-&#039;,substr(facnumber,8))&lt;br /&gt;
where facnumber like &#039;F%&#039; and facnumber not like &#039;FA%&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
例如，要从编号规则模式 FAYYMM999 迁移到 Terre(FAYYMM-999)  ，可以执行以下请求：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
update llx_facture set facnumber=concat(&#039;FA&#039;,substr(facnumber,3,4),&#039;-&#039;,substr(CONCAT(&#039;0000&#039;,substr(facnumber,7)),-4))&lt;br /&gt;
where facnumber like &#039;FA%&#039; and facnumber not like &#039;%-%&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=提交补丁、改进或参与开发=&lt;br /&gt;
如果您正在寻求如何开始Dolibarr开发或为Dolibarr开发做出贡献，请阅读章节 [[开发者常见问题解答#如何成为官方开发者]] 。&lt;br /&gt;
&lt;br /&gt;
如果您的补丁已经准备好并希望发布，那么本章适合您。&lt;br /&gt;
&lt;br /&gt;
*如果您是Yoda级别（有关不同等级的信息，请参阅 [https://wiki.dolibarr.org/Dolibarr_Project#Developers_roles Dolibarr_Project#Developers_roles] ），则拥有直接写入的 GIT 访问权限。因此，只需使用它来提交更改即可。&lt;br /&gt;
&lt;br /&gt;
*如果您不是Yoda级别（您的级别是 [https://wiki.dolibarr.org/Dolibarr_Project#Developers_roles Jedi] 或 [https://wiki.dolibarr.org/Dolibarr_Project#Developers_roles Admiral] 或 [https://wiki.dolibarr.org/Dolibarr_Project#Developers_roles Soldier]），则必须先使用 GitHub 的“Fork”功能。之后，您可以从 GitHub 发出“Pull Request”，要求将您的补丁合并到develop分支中。 更多信息请参阅 [https://wiki.dolibarr.org/FAQ_Get,update_GIT_project_sources FAQ_Get,update_GIT_project_sources] 和 https://github.com/Dolibarr/dolibarr/blob/develop/.github/CONTRIBUTING.md&lt;br /&gt;
&lt;br /&gt;
==使用GitHub帐户==&lt;br /&gt;
Les accès au dépot des sources en lecture est publique. La soumission de contributions dépend toutefois de votre niveau dans le projet.&lt;br /&gt;
&lt;br /&gt;
*Si vous bénéficiez d&#039;un grade Yoda (rarissime), et donc un accès en écriture direct au dépôt de référence, utilisez-le (Voir [[FAQ_D%C3%A9veloppeur#Comment_devenir_d.C3.A9veloppeur_officiel|FAQ Développeur - Devenir développeur officiel]] pour les différents grades).&lt;br /&gt;
&lt;br /&gt;
*Si vous n&#039;avez pas d&#039;accès en écriture direct au dépôt de référence (votre grade est donc [[Developer FAQ#Soldier|Jedi]] ou [[Developer FAQ#Soldier|Admiral]] ou [[Developer FAQ#Soldier|Soldier]]), vous devez alors utiliser GitHub en « Forkant » le dépôt sur votre compte, puis en faisant une demande de « Pull Request » de votre branche sur le dépôt principal. C&#039;est la méthode recommandée la plus propre et la plus performante. Voir pour plus d&#039;info la page https://wiki.dolibarr.org/index.php/FAQ_Get,update_GIT_project_sources&lt;br /&gt;
&lt;br /&gt;
 Note:  Si vous ne savez pas bien utiliser l&#039;outil GIT et si votre modification est petite (porte sur un ou deux fichiers), sachez qu&#039;il est possible simplement, en allant sur votre compte GitHub et sur votre repository &amp;quot;Forké&amp;quot; depuis l&#039;interface Web de GitHub, de modifier le fichier en ligne. Une fois la modification faite, vous pouvez utiliser la fonction soumettre Pull Request pour la suggérer au projet. Un valideur l&#039;intégrera alors sans effort si elle est valide.&lt;br /&gt;
&lt;br /&gt;
*La procédure qui suit reste un alternative techniquement possible mais n&#039;est plus pratiquée que pour les toutes petites modifications...&lt;br /&gt;
&lt;br /&gt;
==没有GitHub帐户==&lt;br /&gt;
Sans compte GitHub, il est nécessaire de générer et fournir par mail, sur la mailing-list développeur &#039;&#039;&#039;dolibarr-dev&#039;&#039;&#039; votre fichier patch (Voir ici pour cela {{TemplateURLMLDev}}). Voici la procédure pour générer un fichier patch:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Sous tout OS:&#039;&#039; [[Image:Logo_windows.png|20px]] [[Image:Logo_ubuntu.png|20px]] [[Image:Logo_apple.png|20px]]&lt;br /&gt;
&lt;br /&gt;
Voici la &#039;&#039;méthode Pro&#039;&#039; selon laquelle travailler pour pouvoir générer un tel fichier patch:&lt;br /&gt;
&lt;br /&gt;
- Avoir un répertoire qui contient la version de Dolibarr de référence (résultat de la mise à jour GIT ou bien tout simplement l&#039;arborescence résultant de la décompression d&#039;un snapshot tgz de Dolibarr). On appellera ce répertoire &#039;&#039;&#039;ancien_rep&#039;&#039;&#039;. Vous pouvez récupérer le snapshot de la version de dev en cours sur le  [http://www.dolibarr.org/downloads/ site officiel de Dolibarr - espace téléchargement - version développement].&lt;br /&gt;
&lt;br /&gt;
- Avoir un autre répertoire qui contient l&#039;arborescence de Dolibarr mais dans laquelle vous faites ou avez fait vos modifications. On appellera ce répertoire &#039;&#039;&#039;nouveau_rep&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Pour générer le fichier patch, il suffit alors de lancer la commande &#039;&#039;&#039;diff&#039;&#039;&#039; (en standard sous Linux, fourni dans [http://www.cygwin.org/cygwin cygwin] sous Windows) de la manière suivante:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
diff -BNaur --exclude=CVS --exclude=&amp;quot;*.patch&amp;quot; --exclude=&amp;quot;.#*&amp;quot; --exclude=&amp;quot;*~&amp;quot; --exclude=&amp;quot;*.rej&amp;quot; \&lt;br /&gt;
     --exclude=&amp;quot;*.orig&amp;quot; --exclude=&amp;quot;*.bak&amp;quot; --exclude=conf.php --exclude=documents  \&lt;br /&gt;
     ancien_rep nouveau_rep  &amp;gt; mypatch.patch&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Un script ksh réalisant cette commande est disponible dans le répertoire &#039;&#039;&#039;build/patch&#039;&#039;&#039;.&lt;br /&gt;
Envoyer votre patch sur la ML à l&#039;adresse &#039;&#039;&#039;dolibarr-dev@nongnu.org&#039;&#039;&#039;.&lt;br /&gt;
L&#039;intégration de votre patch n&#039;est toutefois pas garantie, pas plus que le délai, mais si le patch est réalisé en suivant rigoureusement cette procédure, il a de forte chance d&#039;être au moins testé (dans le cas contraire les chances sont proches de 0).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Sous Windows:&#039;&#039; [[Image:Logo_windows.png|20px]]&lt;br /&gt;
&lt;br /&gt;
Si vous êtes sous Windows, une &#039;&#039;méthode moins Pro&#039;&#039; mais qui donne le même résultat est la suivante. Installer l&#039;excellent outil open source de comparaison Winmerge qui sait fabriquer des patchs au format &#039;&#039;diff -Naur&#039;&#039;. Pour cela, comparer avec Winmerge le fichier référence et le fichier modifié et choisir dans le menu &#039;&#039;&amp;quot;Tools - Generate patch&amp;quot;&#039;&#039; (&#039;&#039;Générer des retouches&#039;&#039; en version française). Saisir un nom de fichier comme &#039;&#039;&amp;quot;resultat.patch&amp;quot;&#039;&#039;, cocher la case &#039;&#039;&amp;quot;Append&amp;quot;&#039;&#039; et choisir l&#039;option &#039;&#039;&amp;quot;Format Unified&amp;quot;&#039;&#039; (&#039;&#039;Style : unifié&#039;&#039; en version française). Cliquer sur &#039;&#039;&amp;quot;Ok&amp;quot;&#039;&#039;.&lt;br /&gt;
Éventuellement recommencer pour chaque fichier modifié.&lt;br /&gt;
Au final, on obtient un beau fichier &#039;&#039;resultat.patch&#039;&#039; qui contient toutes les modifications au bon format.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Tester/Appliquer un patch&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Pour appliquer un fichier patch sur une version non modifié afin d&#039;intégrer les modifications décrites dans le fichier patch, vous pouvez utiliser l&#039;utilitaire &#039;&#039;&#039;patch&#039;&#039;&#039;.&lt;br /&gt;
Imaginons que vous avez un répertoire des sources d&#039;une version non modifiée de Dolibarr sur un serveur. Pour appliquer le patch, placer dans le répertoire racine de Dolibarr et lancez la commande:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
patch -u -p0 -d . &amp;lt; monfichier.patch&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;Pour information: -p0 permet d&#039;utiliser le chemin entier tel que mentionné dans le fichier de patch pour retrouver les fichiers à modifier dans votre arborescence source (-pn en retire les n premiers niveau de l&#039;arborescence)&lt;br /&gt;
-d permet de préciser le chemin relatif vers le dossier à patcher.&lt;br /&gt;
&amp;lt; permet de donner le chemin vers le fichier source à utiliser (le patch doit être au format unifié)&lt;br /&gt;
-u permet de préciser que le patch est en mode unifié&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Envoyer le patch par mail&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Une fois votre fichier patch généré et testé avec succès, vous pouvez l&#039;envoyer sur la mailing-list de développement &#039;&#039;&#039;dolibarr-dev&#039;&#039;&#039; de Dolibarr (Voir ici pour cela {{TemplateURLMLDev}}).&lt;br /&gt;
Cette mailing-list est lu de tous les développeurs principaux mais nous ne pouvons garantir que le patch sera inclus, cela dépend de sa qualité et des autres priorités de développement du moment.&lt;br /&gt;
&lt;br /&gt;
=如何打包/交付模块=&lt;br /&gt;
请参阅页面 [[模块开发#创建一个安装包来分发和安装您的模块]] 。&lt;br /&gt;
&lt;br /&gt;
该流程也适用于生成要在 https://www.dolistore.com 市场上提交的包。&lt;br /&gt;
&lt;br /&gt;
=如何了解Dolibarr的最新状况？=&lt;br /&gt;
请参阅页面 [[FAQ Comment être informé de l&#039;actualité de Dolibarr ?]]&lt;br /&gt;
&lt;br /&gt;
=将我的数据库从Mysql迁移到PostgreSQL=&lt;br /&gt;
请参阅页面 [[FAQ Migrer ma base Mysql vers PostgreSQL]]&lt;br /&gt;
&lt;br /&gt;
=什么是发布流程以及其是如何进行的=&lt;br /&gt;
请参阅页面 [[FAQ Release process]]&lt;br /&gt;
[[Category:开发]]&lt;/div&gt;</summary>
		<author><name>ShengGang</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=%E5%BC%80%E5%8F%91%E8%80%85%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98%E8%A7%A3%E7%AD%94&amp;diff=58337</id>
		<title>开发者常见问题解答</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=%E5%BC%80%E5%8F%91%E8%80%85%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98%E8%A7%A3%E7%AD%94&amp;diff=58337"/>
		<updated>2023-10-13T01:51:34Z</updated>

		<summary type="html">&lt;p&gt;ShengGang: /* 如何打包/交付模块 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- BEGIN interlang links --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Do NOT edit this section&lt;br /&gt;
     Links below are automatically managed by PolyglotBot&lt;br /&gt;
     You can edit links on the English source page : Developer_FAQ --&amp;gt;&lt;br /&gt;
[[en:Developer_FAQ]]&lt;br /&gt;
[[fr:FAQ_Développeur]]&lt;br /&gt;
[[de:Entwickler_FAQ]]&lt;br /&gt;
[[es:FAQ_Desarrolladores]]&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:FAQ ZH]]&lt;br /&gt;
{{TemplateDocDevZh}}&lt;br /&gt;
本页包含一些与Dolibarr开发相关的问题和解答。有关使用的问题和解答，请参见页面 [[FAQ Utilisateur]] 。&lt;br /&gt;
&lt;br /&gt;
=如何成为官方开发者=&lt;br /&gt;
&lt;br /&gt;
在Dolibarr项目星系中，有几个不同级别/等级的参与者。&lt;br /&gt;
&lt;br /&gt;
开发人员和贡献的数量很重要，但任何想要达到一定质量水平的项目都必须在功能需求和编码方面对开发进行受控管理和验证修改。因此，对源代码（Git服务器）的写访问受到限制，并由下面几行所描述的组织管理。每个开发人员都有一个&#039;&#039;&#039;grade&#039;&#039;&#039;（等级），这取决于他们的资历和过去的贡献。一个人在项目中的授权水平随着等级晋升阶段的增加而提高。&lt;br /&gt;
&lt;br /&gt;
因此，Dolibarr开发者的职业生涯经历了这些阶段，这些阶段是根据科幻小说爱好者熟悉的标题进行分类。以下是这些步骤。重要的是要理解，该组织的唯一目的是提高Dolibarr的质量，为了实现这一目标，必须严格遵守该组织规定。&lt;br /&gt;
&lt;br /&gt;
Dolibarr项目贡献者的等级以及达到该等级所需的条件，在以下页面中定义：[[Dolibarr项目#开发人员角色|Dolibarr项目的开发人员角色]] 一节。&lt;br /&gt;
&lt;br /&gt;
=Dolibarr的开发者=&lt;br /&gt;
请参阅 [[Dolibarr项目]] 页面，了解目前参与Dolibarr项目的每个级别的人员列表。&lt;br /&gt;
&lt;br /&gt;
=开始开发=&lt;br /&gt;
先完整阅读 [[开发文档]] ，以了解开发人员必须遵守的所有规则和原则。 您还可以参阅下面的常见问题解答。&lt;br /&gt;
&lt;br /&gt;
=检索/更新项目源代码=&lt;br /&gt;
请参阅页面 [[常见问题-获取与更新项目的GIT源代码|获取与更新项目的GIT源代码]] 。&lt;br /&gt;
&lt;br /&gt;
=如何创建新主题=&lt;br /&gt;
请参阅页面 [[主题]] 。&lt;br /&gt;
&lt;br /&gt;
=如何开发自己的模块=&lt;br /&gt;
要开发自己的编号模块，请参阅 [[自动编号模块|创建编号模块]] 。&lt;br /&gt;
&lt;br /&gt;
要开发自己的文档模板（PDF或其他格式），请参阅 [[创建PDF模板|创建PDF文档模板]] 或 [[Créer un modèle de document ODT|创建ODT文档模板]] 。&lt;br /&gt;
&lt;br /&gt;
要开发完整的功能模块（可视界面、表单），请参阅页面 [[模块开发]] 。&lt;br /&gt;
&lt;br /&gt;
=如何添加或完成翻译=&lt;br /&gt;
为此，请参阅页面 [[翻译文档]] 。&lt;br /&gt;
&lt;br /&gt;
=在使用中更改发票自动编号规则=&lt;br /&gt;
如果新的编号系统与旧的编号系统不冲突，只需前往菜单“主页-设置-模块/应用-发票-设置”，并从列表中获取新的编号规则。&lt;br /&gt;
&lt;br /&gt;
如果新旧编号系统之间规则冲突，则需要对现有引用（references）进行重新编号。这可以通过SQL请求完成。&lt;br /&gt;
&lt;br /&gt;
例如，要从编号规则 Jupiter(FYYYMM99) 迁移到 Terre(FAYYMM-999) ，可以执行以下请求：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
update llx_facture set facnumber=concat(&#039;FA&#039;,substr(facnumber,4,4),&#039;-&#039;,substr(facnumber,8))&lt;br /&gt;
where facnumber like &#039;F%&#039; and facnumber not like &#039;FA%&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
例如，要从编号规则模式 FAYYMM999 迁移到 Terre(FAYYMM-999)  ，可以执行以下请求：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
update llx_facture set facnumber=concat(&#039;FA&#039;,substr(facnumber,3,4),&#039;-&#039;,substr(CONCAT(&#039;0000&#039;,substr(facnumber,7)),-4))&lt;br /&gt;
where facnumber like &#039;FA%&#039; and facnumber not like &#039;%-%&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=提交补丁、改进或参与开发=&lt;br /&gt;
如果您正在寻求如何开始Dolibarr开发或为Dolibarr开发做出贡献，请阅读章节 [[开发者常见问题解答#如何成为官方开发者]] 。&lt;br /&gt;
&lt;br /&gt;
如果您的补丁已经准备好并希望发布，那么本章适合您。&lt;br /&gt;
&lt;br /&gt;
*如果您是Yoda级别（有关不同等级的信息，请参阅 [https://wiki.dolibarr.org/Dolibarr_Project#Developers_roles Dolibarr_Project#Developers_roles] ），则拥有直接写入的 GIT 访问权限。因此，只需使用它来提交更改即可。&lt;br /&gt;
&lt;br /&gt;
*如果您不是Yoda级别（您的级别是 [https://wiki.dolibarr.org/Dolibarr_Project#Developers_roles Jedi] 或 [https://wiki.dolibarr.org/Dolibarr_Project#Developers_roles Admiral] 或 [https://wiki.dolibarr.org/Dolibarr_Project#Developers_roles Soldier]），则必须先使用 GitHub 的“Fork”功能。之后，您可以从 GitHub 发出“Pull Request”，要求将您的补丁合并到develop分支中。 更多信息请参阅 [https://wiki.dolibarr.org/FAQ_Get,update_GIT_project_sources FAQ_Get,update_GIT_project_sources] 和 https://github.com/Dolibarr/dolibarr/blob/develop/.github/CONTRIBUTING.md&lt;br /&gt;
&lt;br /&gt;
==使用GitHub帐户==&lt;br /&gt;
Les accès au dépot des sources en lecture est publique. La soumission de contributions dépend toutefois de votre niveau dans le projet.&lt;br /&gt;
&lt;br /&gt;
*Si vous bénéficiez d&#039;un grade Yoda (rarissime), et donc un accès en écriture direct au dépôt de référence, utilisez-le (Voir [[FAQ_D%C3%A9veloppeur#Comment_devenir_d.C3.A9veloppeur_officiel|FAQ Développeur - Devenir développeur officiel]] pour les différents grades).&lt;br /&gt;
&lt;br /&gt;
*Si vous n&#039;avez pas d&#039;accès en écriture direct au dépôt de référence (votre grade est donc [[Developer FAQ#Soldier|Jedi]] ou [[Developer FAQ#Soldier|Admiral]] ou [[Developer FAQ#Soldier|Soldier]]), vous devez alors utiliser GitHub en « Forkant » le dépôt sur votre compte, puis en faisant une demande de « Pull Request » de votre branche sur le dépôt principal. C&#039;est la méthode recommandée la plus propre et la plus performante. Voir pour plus d&#039;info la page https://wiki.dolibarr.org/index.php/FAQ_Get,update_GIT_project_sources&lt;br /&gt;
&lt;br /&gt;
 Note:  Si vous ne savez pas bien utiliser l&#039;outil GIT et si votre modification est petite (porte sur un ou deux fichiers), sachez qu&#039;il est possible simplement, en allant sur votre compte GitHub et sur votre repository &amp;quot;Forké&amp;quot; depuis l&#039;interface Web de GitHub, de modifier le fichier en ligne. Une fois la modification faite, vous pouvez utiliser la fonction soumettre Pull Request pour la suggérer au projet. Un valideur l&#039;intégrera alors sans effort si elle est valide.&lt;br /&gt;
&lt;br /&gt;
*La procédure qui suit reste un alternative techniquement possible mais n&#039;est plus pratiquée que pour les toutes petites modifications...&lt;br /&gt;
&lt;br /&gt;
==没有GitHub帐户==&lt;br /&gt;
Sans compte GitHub, il est nécessaire de générer et fournir par mail, sur la mailing-list développeur &#039;&#039;&#039;dolibarr-dev&#039;&#039;&#039; votre fichier patch (Voir ici pour cela {{TemplateURLMLDev}}). Voici la procédure pour générer un fichier patch:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Sous tout OS:&#039;&#039; [[Image:Logo_windows.png|20px]] [[Image:Logo_ubuntu.png|20px]] [[Image:Logo_apple.png|20px]]&lt;br /&gt;
&lt;br /&gt;
Voici la &#039;&#039;méthode Pro&#039;&#039; selon laquelle travailler pour pouvoir générer un tel fichier patch:&lt;br /&gt;
&lt;br /&gt;
- Avoir un répertoire qui contient la version de Dolibarr de référence (résultat de la mise à jour GIT ou bien tout simplement l&#039;arborescence résultant de la décompression d&#039;un snapshot tgz de Dolibarr). On appellera ce répertoire &#039;&#039;&#039;ancien_rep&#039;&#039;&#039;. Vous pouvez récupérer le snapshot de la version de dev en cours sur le  [http://www.dolibarr.org/downloads/ site officiel de Dolibarr - espace téléchargement - version développement].&lt;br /&gt;
&lt;br /&gt;
- Avoir un autre répertoire qui contient l&#039;arborescence de Dolibarr mais dans laquelle vous faites ou avez fait vos modifications. On appellera ce répertoire &#039;&#039;&#039;nouveau_rep&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Pour générer le fichier patch, il suffit alors de lancer la commande &#039;&#039;&#039;diff&#039;&#039;&#039; (en standard sous Linux, fourni dans [http://www.cygwin.org/cygwin cygwin] sous Windows) de la manière suivante:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
diff -BNaur --exclude=CVS --exclude=&amp;quot;*.patch&amp;quot; --exclude=&amp;quot;.#*&amp;quot; --exclude=&amp;quot;*~&amp;quot; --exclude=&amp;quot;*.rej&amp;quot; \&lt;br /&gt;
     --exclude=&amp;quot;*.orig&amp;quot; --exclude=&amp;quot;*.bak&amp;quot; --exclude=conf.php --exclude=documents  \&lt;br /&gt;
     ancien_rep nouveau_rep  &amp;gt; mypatch.patch&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Un script ksh réalisant cette commande est disponible dans le répertoire &#039;&#039;&#039;build/patch&#039;&#039;&#039;.&lt;br /&gt;
Envoyer votre patch sur la ML à l&#039;adresse &#039;&#039;&#039;dolibarr-dev@nongnu.org&#039;&#039;&#039;.&lt;br /&gt;
L&#039;intégration de votre patch n&#039;est toutefois pas garantie, pas plus que le délai, mais si le patch est réalisé en suivant rigoureusement cette procédure, il a de forte chance d&#039;être au moins testé (dans le cas contraire les chances sont proches de 0).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Sous Windows:&#039;&#039; [[Image:Logo_windows.png|20px]]&lt;br /&gt;
&lt;br /&gt;
Si vous êtes sous Windows, une &#039;&#039;méthode moins Pro&#039;&#039; mais qui donne le même résultat est la suivante. Installer l&#039;excellent outil open source de comparaison Winmerge qui sait fabriquer des patchs au format &#039;&#039;diff -Naur&#039;&#039;. Pour cela, comparer avec Winmerge le fichier référence et le fichier modifié et choisir dans le menu &#039;&#039;&amp;quot;Tools - Generate patch&amp;quot;&#039;&#039; (&#039;&#039;Générer des retouches&#039;&#039; en version française). Saisir un nom de fichier comme &#039;&#039;&amp;quot;resultat.patch&amp;quot;&#039;&#039;, cocher la case &#039;&#039;&amp;quot;Append&amp;quot;&#039;&#039; et choisir l&#039;option &#039;&#039;&amp;quot;Format Unified&amp;quot;&#039;&#039; (&#039;&#039;Style : unifié&#039;&#039; en version française). Cliquer sur &#039;&#039;&amp;quot;Ok&amp;quot;&#039;&#039;.&lt;br /&gt;
Éventuellement recommencer pour chaque fichier modifié.&lt;br /&gt;
Au final, on obtient un beau fichier &#039;&#039;resultat.patch&#039;&#039; qui contient toutes les modifications au bon format.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Tester/Appliquer un patch&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Pour appliquer un fichier patch sur une version non modifié afin d&#039;intégrer les modifications décrites dans le fichier patch, vous pouvez utiliser l&#039;utilitaire &#039;&#039;&#039;patch&#039;&#039;&#039;.&lt;br /&gt;
Imaginons que vous avez un répertoire des sources d&#039;une version non modifiée de Dolibarr sur un serveur. Pour appliquer le patch, placer dans le répertoire racine de Dolibarr et lancez la commande:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
patch -u -p0 -d . &amp;lt; monfichier.patch&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;Pour information: -p0 permet d&#039;utiliser le chemin entier tel que mentionné dans le fichier de patch pour retrouver les fichiers à modifier dans votre arborescence source (-pn en retire les n premiers niveau de l&#039;arborescence)&lt;br /&gt;
-d permet de préciser le chemin relatif vers le dossier à patcher.&lt;br /&gt;
&amp;lt; permet de donner le chemin vers le fichier source à utiliser (le patch doit être au format unifié)&lt;br /&gt;
-u permet de préciser que le patch est en mode unifié&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Envoyer le patch par mail&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Une fois votre fichier patch généré et testé avec succès, vous pouvez l&#039;envoyer sur la mailing-list de développement &#039;&#039;&#039;dolibarr-dev&#039;&#039;&#039; de Dolibarr (Voir ici pour cela {{TemplateURLMLDev}}).&lt;br /&gt;
Cette mailing-list est lu de tous les développeurs principaux mais nous ne pouvons garantir que le patch sera inclus, cela dépend de sa qualité et des autres priorités de développement du moment.&lt;br /&gt;
&lt;br /&gt;
=如何打包/交付模块=&lt;br /&gt;
请参阅页面 [[模块开发#创建一个安装包来分发和安装您的模块]] 。&lt;br /&gt;
&lt;br /&gt;
该流程也适用于生成要在 https://www.dolistore.com 市场上提交的包。&lt;br /&gt;
&lt;br /&gt;
=如何了解Dolibarr的最新状况？=&lt;br /&gt;
请参阅页面 [[FAQ Comment être informé de l&#039;actualité de Dolibarr ?]]&lt;br /&gt;
&lt;br /&gt;
=将我的数据库从Mysql迁移到PostgreSQL=&lt;br /&gt;
请参阅页面 [[FAQ Migrer ma base Mysql vers PostgreSQL]]&lt;/div&gt;</summary>
		<author><name>ShengGang</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=%E5%BC%80%E5%8F%91%E8%80%85%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98%E8%A7%A3%E7%AD%94&amp;diff=58336</id>
		<title>开发者常见问题解答</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=%E5%BC%80%E5%8F%91%E8%80%85%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98%E8%A7%A3%E7%AD%94&amp;diff=58336"/>
		<updated>2023-10-13T01:44:11Z</updated>

		<summary type="html">&lt;p&gt;ShengGang: /* Avec un compte GitHub */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- BEGIN interlang links --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Do NOT edit this section&lt;br /&gt;
     Links below are automatically managed by PolyglotBot&lt;br /&gt;
     You can edit links on the English source page : Developer_FAQ --&amp;gt;&lt;br /&gt;
[[en:Developer_FAQ]]&lt;br /&gt;
[[fr:FAQ_Développeur]]&lt;br /&gt;
[[de:Entwickler_FAQ]]&lt;br /&gt;
[[es:FAQ_Desarrolladores]]&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:FAQ ZH]]&lt;br /&gt;
{{TemplateDocDevZh}}&lt;br /&gt;
本页包含一些与Dolibarr开发相关的问题和解答。有关使用的问题和解答，请参见页面 [[FAQ Utilisateur]] 。&lt;br /&gt;
&lt;br /&gt;
=如何成为官方开发者=&lt;br /&gt;
&lt;br /&gt;
在Dolibarr项目星系中，有几个不同级别/等级的参与者。&lt;br /&gt;
&lt;br /&gt;
开发人员和贡献的数量很重要，但任何想要达到一定质量水平的项目都必须在功能需求和编码方面对开发进行受控管理和验证修改。因此，对源代码（Git服务器）的写访问受到限制，并由下面几行所描述的组织管理。每个开发人员都有一个&#039;&#039;&#039;grade&#039;&#039;&#039;（等级），这取决于他们的资历和过去的贡献。一个人在项目中的授权水平随着等级晋升阶段的增加而提高。&lt;br /&gt;
&lt;br /&gt;
因此，Dolibarr开发者的职业生涯经历了这些阶段，这些阶段是根据科幻小说爱好者熟悉的标题进行分类。以下是这些步骤。重要的是要理解，该组织的唯一目的是提高Dolibarr的质量，为了实现这一目标，必须严格遵守该组织规定。&lt;br /&gt;
&lt;br /&gt;
Dolibarr项目贡献者的等级以及达到该等级所需的条件，在以下页面中定义：[[Dolibarr项目#开发人员角色|Dolibarr项目的开发人员角色]] 一节。&lt;br /&gt;
&lt;br /&gt;
=Dolibarr的开发者=&lt;br /&gt;
请参阅 [[Dolibarr项目]] 页面，了解目前参与Dolibarr项目的每个级别的人员列表。&lt;br /&gt;
&lt;br /&gt;
=开始开发=&lt;br /&gt;
先完整阅读 [[开发文档]] ，以了解开发人员必须遵守的所有规则和原则。 您还可以参阅下面的常见问题解答。&lt;br /&gt;
&lt;br /&gt;
=检索/更新项目源代码=&lt;br /&gt;
请参阅页面 [[常见问题-获取与更新项目的GIT源代码|获取与更新项目的GIT源代码]] 。&lt;br /&gt;
&lt;br /&gt;
=如何创建新主题=&lt;br /&gt;
请参阅页面 [[主题]] 。&lt;br /&gt;
&lt;br /&gt;
=如何开发自己的模块=&lt;br /&gt;
要开发自己的编号模块，请参阅 [[自动编号模块|创建编号模块]] 。&lt;br /&gt;
&lt;br /&gt;
要开发自己的文档模板（PDF或其他格式），请参阅 [[创建PDF模板|创建PDF文档模板]] 或 [[Créer un modèle de document ODT|创建ODT文档模板]] 。&lt;br /&gt;
&lt;br /&gt;
要开发完整的功能模块（可视界面、表单），请参阅页面 [[模块开发]] 。&lt;br /&gt;
&lt;br /&gt;
=如何添加或完成翻译=&lt;br /&gt;
为此，请参阅页面 [[翻译文档]] 。&lt;br /&gt;
&lt;br /&gt;
=在使用中更改发票自动编号规则=&lt;br /&gt;
如果新的编号系统与旧的编号系统不冲突，只需前往菜单“主页-设置-模块/应用-发票-设置”，并从列表中获取新的编号规则。&lt;br /&gt;
&lt;br /&gt;
如果新旧编号系统之间规则冲突，则需要对现有引用（references）进行重新编号。这可以通过SQL请求完成。&lt;br /&gt;
&lt;br /&gt;
例如，要从编号规则 Jupiter(FYYYMM99) 迁移到 Terre(FAYYMM-999) ，可以执行以下请求：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
update llx_facture set facnumber=concat(&#039;FA&#039;,substr(facnumber,4,4),&#039;-&#039;,substr(facnumber,8))&lt;br /&gt;
where facnumber like &#039;F%&#039; and facnumber not like &#039;FA%&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
例如，要从编号规则模式 FAYYMM999 迁移到 Terre(FAYYMM-999)  ，可以执行以下请求：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
update llx_facture set facnumber=concat(&#039;FA&#039;,substr(facnumber,3,4),&#039;-&#039;,substr(CONCAT(&#039;0000&#039;,substr(facnumber,7)),-4))&lt;br /&gt;
where facnumber like &#039;FA%&#039; and facnumber not like &#039;%-%&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=提交补丁、改进或参与开发=&lt;br /&gt;
如果您正在寻求如何开始Dolibarr开发或为Dolibarr开发做出贡献，请阅读章节 [[开发者常见问题解答#如何成为官方开发者]] 。&lt;br /&gt;
&lt;br /&gt;
如果您的补丁已经准备好并希望发布，那么本章适合您。&lt;br /&gt;
&lt;br /&gt;
*如果您是Yoda级别（有关不同等级的信息，请参阅 [https://wiki.dolibarr.org/Dolibarr_Project#Developers_roles Dolibarr_Project#Developers_roles] ），则拥有直接写入的 GIT 访问权限。因此，只需使用它来提交更改即可。&lt;br /&gt;
&lt;br /&gt;
*如果您不是Yoda级别（您的级别是 [https://wiki.dolibarr.org/Dolibarr_Project#Developers_roles Jedi] 或 [https://wiki.dolibarr.org/Dolibarr_Project#Developers_roles Admiral] 或 [https://wiki.dolibarr.org/Dolibarr_Project#Developers_roles Soldier]），则必须先使用 GitHub 的“Fork”功能。之后，您可以从 GitHub 发出“Pull Request”，要求将您的补丁合并到develop分支中。 更多信息请参阅 [https://wiki.dolibarr.org/FAQ_Get,update_GIT_project_sources FAQ_Get,update_GIT_project_sources] 和 https://github.com/Dolibarr/dolibarr/blob/develop/.github/CONTRIBUTING.md&lt;br /&gt;
&lt;br /&gt;
==使用GitHub帐户==&lt;br /&gt;
Les accès au dépot des sources en lecture est publique. La soumission de contributions dépend toutefois de votre niveau dans le projet.&lt;br /&gt;
&lt;br /&gt;
*Si vous bénéficiez d&#039;un grade Yoda (rarissime), et donc un accès en écriture direct au dépôt de référence, utilisez-le (Voir [[FAQ_D%C3%A9veloppeur#Comment_devenir_d.C3.A9veloppeur_officiel|FAQ Développeur - Devenir développeur officiel]] pour les différents grades).&lt;br /&gt;
&lt;br /&gt;
*Si vous n&#039;avez pas d&#039;accès en écriture direct au dépôt de référence (votre grade est donc [[Developer FAQ#Soldier|Jedi]] ou [[Developer FAQ#Soldier|Admiral]] ou [[Developer FAQ#Soldier|Soldier]]), vous devez alors utiliser GitHub en « Forkant » le dépôt sur votre compte, puis en faisant une demande de « Pull Request » de votre branche sur le dépôt principal. C&#039;est la méthode recommandée la plus propre et la plus performante. Voir pour plus d&#039;info la page https://wiki.dolibarr.org/index.php/FAQ_Get,update_GIT_project_sources&lt;br /&gt;
&lt;br /&gt;
 Note:  Si vous ne savez pas bien utiliser l&#039;outil GIT et si votre modification est petite (porte sur un ou deux fichiers), sachez qu&#039;il est possible simplement, en allant sur votre compte GitHub et sur votre repository &amp;quot;Forké&amp;quot; depuis l&#039;interface Web de GitHub, de modifier le fichier en ligne. Une fois la modification faite, vous pouvez utiliser la fonction soumettre Pull Request pour la suggérer au projet. Un valideur l&#039;intégrera alors sans effort si elle est valide.&lt;br /&gt;
&lt;br /&gt;
*La procédure qui suit reste un alternative techniquement possible mais n&#039;est plus pratiquée que pour les toutes petites modifications...&lt;br /&gt;
&lt;br /&gt;
==没有GitHub帐户==&lt;br /&gt;
Sans compte GitHub, il est nécessaire de générer et fournir par mail, sur la mailing-list développeur &#039;&#039;&#039;dolibarr-dev&#039;&#039;&#039; votre fichier patch (Voir ici pour cela {{TemplateURLMLDev}}). Voici la procédure pour générer un fichier patch:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Sous tout OS:&#039;&#039; [[Image:Logo_windows.png|20px]] [[Image:Logo_ubuntu.png|20px]] [[Image:Logo_apple.png|20px]]&lt;br /&gt;
&lt;br /&gt;
Voici la &#039;&#039;méthode Pro&#039;&#039; selon laquelle travailler pour pouvoir générer un tel fichier patch:&lt;br /&gt;
&lt;br /&gt;
- Avoir un répertoire qui contient la version de Dolibarr de référence (résultat de la mise à jour GIT ou bien tout simplement l&#039;arborescence résultant de la décompression d&#039;un snapshot tgz de Dolibarr). On appellera ce répertoire &#039;&#039;&#039;ancien_rep&#039;&#039;&#039;. Vous pouvez récupérer le snapshot de la version de dev en cours sur le  [http://www.dolibarr.org/downloads/ site officiel de Dolibarr - espace téléchargement - version développement].&lt;br /&gt;
&lt;br /&gt;
- Avoir un autre répertoire qui contient l&#039;arborescence de Dolibarr mais dans laquelle vous faites ou avez fait vos modifications. On appellera ce répertoire &#039;&#039;&#039;nouveau_rep&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Pour générer le fichier patch, il suffit alors de lancer la commande &#039;&#039;&#039;diff&#039;&#039;&#039; (en standard sous Linux, fourni dans [http://www.cygwin.org/cygwin cygwin] sous Windows) de la manière suivante:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
diff -BNaur --exclude=CVS --exclude=&amp;quot;*.patch&amp;quot; --exclude=&amp;quot;.#*&amp;quot; --exclude=&amp;quot;*~&amp;quot; --exclude=&amp;quot;*.rej&amp;quot; \&lt;br /&gt;
     --exclude=&amp;quot;*.orig&amp;quot; --exclude=&amp;quot;*.bak&amp;quot; --exclude=conf.php --exclude=documents  \&lt;br /&gt;
     ancien_rep nouveau_rep  &amp;gt; mypatch.patch&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Un script ksh réalisant cette commande est disponible dans le répertoire &#039;&#039;&#039;build/patch&#039;&#039;&#039;.&lt;br /&gt;
Envoyer votre patch sur la ML à l&#039;adresse &#039;&#039;&#039;dolibarr-dev@nongnu.org&#039;&#039;&#039;.&lt;br /&gt;
L&#039;intégration de votre patch n&#039;est toutefois pas garantie, pas plus que le délai, mais si le patch est réalisé en suivant rigoureusement cette procédure, il a de forte chance d&#039;être au moins testé (dans le cas contraire les chances sont proches de 0).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Sous Windows:&#039;&#039; [[Image:Logo_windows.png|20px]]&lt;br /&gt;
&lt;br /&gt;
Si vous êtes sous Windows, une &#039;&#039;méthode moins Pro&#039;&#039; mais qui donne le même résultat est la suivante. Installer l&#039;excellent outil open source de comparaison Winmerge qui sait fabriquer des patchs au format &#039;&#039;diff -Naur&#039;&#039;. Pour cela, comparer avec Winmerge le fichier référence et le fichier modifié et choisir dans le menu &#039;&#039;&amp;quot;Tools - Generate patch&amp;quot;&#039;&#039; (&#039;&#039;Générer des retouches&#039;&#039; en version française). Saisir un nom de fichier comme &#039;&#039;&amp;quot;resultat.patch&amp;quot;&#039;&#039;, cocher la case &#039;&#039;&amp;quot;Append&amp;quot;&#039;&#039; et choisir l&#039;option &#039;&#039;&amp;quot;Format Unified&amp;quot;&#039;&#039; (&#039;&#039;Style : unifié&#039;&#039; en version française). Cliquer sur &#039;&#039;&amp;quot;Ok&amp;quot;&#039;&#039;.&lt;br /&gt;
Éventuellement recommencer pour chaque fichier modifié.&lt;br /&gt;
Au final, on obtient un beau fichier &#039;&#039;resultat.patch&#039;&#039; qui contient toutes les modifications au bon format.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Tester/Appliquer un patch&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Pour appliquer un fichier patch sur une version non modifié afin d&#039;intégrer les modifications décrites dans le fichier patch, vous pouvez utiliser l&#039;utilitaire &#039;&#039;&#039;patch&#039;&#039;&#039;.&lt;br /&gt;
Imaginons que vous avez un répertoire des sources d&#039;une version non modifiée de Dolibarr sur un serveur. Pour appliquer le patch, placer dans le répertoire racine de Dolibarr et lancez la commande:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
patch -u -p0 -d . &amp;lt; monfichier.patch&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;Pour information: -p0 permet d&#039;utiliser le chemin entier tel que mentionné dans le fichier de patch pour retrouver les fichiers à modifier dans votre arborescence source (-pn en retire les n premiers niveau de l&#039;arborescence)&lt;br /&gt;
-d permet de préciser le chemin relatif vers le dossier à patcher.&lt;br /&gt;
&amp;lt; permet de donner le chemin vers le fichier source à utiliser (le patch doit être au format unifié)&lt;br /&gt;
-u permet de préciser que le patch est en mode unifié&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Envoyer le patch par mail&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Une fois votre fichier patch généré et testé avec succès, vous pouvez l&#039;envoyer sur la mailing-list de développement &#039;&#039;&#039;dolibarr-dev&#039;&#039;&#039; de Dolibarr (Voir ici pour cela {{TemplateURLMLDev}}).&lt;br /&gt;
Cette mailing-list est lu de tous les développeurs principaux mais nous ne pouvons garantir que le patch sera inclus, cela dépend de sa qualité et des autres priorités de développement du moment.&lt;br /&gt;
&lt;br /&gt;
=如何打包/交付模块=&lt;br /&gt;
Voir la page [[Développement_module#Cr.C3.A9er_un_package_pour_livrer_et_installer_votre_module|Developpement module - Créer un package pour livrer et installer votre module]]&lt;br /&gt;
&lt;br /&gt;
La procédure est également valide pour générer un package pour le soumettre sur la place de marché https://www.dolistore.com&lt;br /&gt;
&lt;br /&gt;
=Comment être informé de ce qui se passe sur Dolibarr ?=&lt;br /&gt;
Voir la page [[FAQ Comment être informé de l&#039;actualité de Dolibarr ?]]&lt;br /&gt;
&lt;br /&gt;
=Migrer ma base de Mysql vers PostgreSQL=&lt;br /&gt;
Voir la page [[FAQ Migrer ma base Mysql vers PostgreSQL]]&lt;/div&gt;</summary>
		<author><name>ShengGang</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=%E5%BC%80%E5%8F%91%E8%80%85%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98%E8%A7%A3%E7%AD%94&amp;diff=58335</id>
		<title>开发者常见问题解答</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=%E5%BC%80%E5%8F%91%E8%80%85%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98%E8%A7%A3%E7%AD%94&amp;diff=58335"/>
		<updated>2023-10-13T01:37:30Z</updated>

		<summary type="html">&lt;p&gt;ShengGang: /* Comment packager/livrer un module */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- BEGIN interlang links --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Do NOT edit this section&lt;br /&gt;
     Links below are automatically managed by PolyglotBot&lt;br /&gt;
     You can edit links on the English source page : Developer_FAQ --&amp;gt;&lt;br /&gt;
[[en:Developer_FAQ]]&lt;br /&gt;
[[fr:FAQ_Développeur]]&lt;br /&gt;
[[de:Entwickler_FAQ]]&lt;br /&gt;
[[es:FAQ_Desarrolladores]]&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:FAQ ZH]]&lt;br /&gt;
{{TemplateDocDevZh}}&lt;br /&gt;
本页包含一些与Dolibarr开发相关的问题和解答。有关使用的问题和解答，请参见页面 [[FAQ Utilisateur]] 。&lt;br /&gt;
&lt;br /&gt;
=如何成为官方开发者=&lt;br /&gt;
&lt;br /&gt;
在Dolibarr项目星系中，有几个不同级别/等级的参与者。&lt;br /&gt;
&lt;br /&gt;
开发人员和贡献的数量很重要，但任何想要达到一定质量水平的项目都必须在功能需求和编码方面对开发进行受控管理和验证修改。因此，对源代码（Git服务器）的写访问受到限制，并由下面几行所描述的组织管理。每个开发人员都有一个&#039;&#039;&#039;grade&#039;&#039;&#039;（等级），这取决于他们的资历和过去的贡献。一个人在项目中的授权水平随着等级晋升阶段的增加而提高。&lt;br /&gt;
&lt;br /&gt;
因此，Dolibarr开发者的职业生涯经历了这些阶段，这些阶段是根据科幻小说爱好者熟悉的标题进行分类。以下是这些步骤。重要的是要理解，该组织的唯一目的是提高Dolibarr的质量，为了实现这一目标，必须严格遵守该组织规定。&lt;br /&gt;
&lt;br /&gt;
Dolibarr项目贡献者的等级以及达到该等级所需的条件，在以下页面中定义：[[Dolibarr项目#开发人员角色|Dolibarr项目的开发人员角色]] 一节。&lt;br /&gt;
&lt;br /&gt;
=Dolibarr的开发者=&lt;br /&gt;
请参阅 [[Dolibarr项目]] 页面，了解目前参与Dolibarr项目的每个级别的人员列表。&lt;br /&gt;
&lt;br /&gt;
=开始开发=&lt;br /&gt;
先完整阅读 [[开发文档]] ，以了解开发人员必须遵守的所有规则和原则。 您还可以参阅下面的常见问题解答。&lt;br /&gt;
&lt;br /&gt;
=检索/更新项目源代码=&lt;br /&gt;
请参阅页面 [[常见问题-获取与更新项目的GIT源代码|获取与更新项目的GIT源代码]] 。&lt;br /&gt;
&lt;br /&gt;
=如何创建新主题=&lt;br /&gt;
请参阅页面 [[主题]] 。&lt;br /&gt;
&lt;br /&gt;
=如何开发自己的模块=&lt;br /&gt;
要开发自己的编号模块，请参阅 [[自动编号模块|创建编号模块]] 。&lt;br /&gt;
&lt;br /&gt;
要开发自己的文档模板（PDF或其他格式），请参阅 [[创建PDF模板|创建PDF文档模板]] 或 [[Créer un modèle de document ODT|创建ODT文档模板]] 。&lt;br /&gt;
&lt;br /&gt;
要开发完整的功能模块（可视界面、表单），请参阅页面 [[模块开发]] 。&lt;br /&gt;
&lt;br /&gt;
=如何添加或完成翻译=&lt;br /&gt;
为此，请参阅页面 [[翻译文档]] 。&lt;br /&gt;
&lt;br /&gt;
=在使用中更改发票自动编号规则=&lt;br /&gt;
如果新的编号系统与旧的编号系统不冲突，只需前往菜单“主页-设置-模块/应用-发票-设置”，并从列表中获取新的编号规则。&lt;br /&gt;
&lt;br /&gt;
如果新旧编号系统之间规则冲突，则需要对现有引用（references）进行重新编号。这可以通过SQL请求完成。&lt;br /&gt;
&lt;br /&gt;
例如，要从编号规则 Jupiter(FYYYMM99) 迁移到 Terre(FAYYMM-999) ，可以执行以下请求：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
update llx_facture set facnumber=concat(&#039;FA&#039;,substr(facnumber,4,4),&#039;-&#039;,substr(facnumber,8))&lt;br /&gt;
where facnumber like &#039;F%&#039; and facnumber not like &#039;FA%&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
例如，要从编号规则模式 FAYYMM999 迁移到 Terre(FAYYMM-999)  ，可以执行以下请求：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
update llx_facture set facnumber=concat(&#039;FA&#039;,substr(facnumber,3,4),&#039;-&#039;,substr(CONCAT(&#039;0000&#039;,substr(facnumber,7)),-4))&lt;br /&gt;
where facnumber like &#039;FA%&#039; and facnumber not like &#039;%-%&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=提交补丁、改进或参与开发=&lt;br /&gt;
如果您正在寻求如何开始Dolibarr开发或为Dolibarr开发做出贡献，请阅读章节 [[开发者常见问题解答#如何成为官方开发者]] 。&lt;br /&gt;
&lt;br /&gt;
如果您的补丁已经准备好并希望发布，那么本章适合您。&lt;br /&gt;
&lt;br /&gt;
*如果您是Yoda级别（有关不同等级的信息，请参阅 [https://wiki.dolibarr.org/Dolibarr_Project#Developers_roles Dolibarr_Project#Developers_roles] ），则拥有直接写入的 GIT 访问权限。因此，只需使用它来提交更改即可。&lt;br /&gt;
&lt;br /&gt;
*如果您不是Yoda级别（您的级别是 [https://wiki.dolibarr.org/Dolibarr_Project#Developers_roles Jedi] 或 [https://wiki.dolibarr.org/Dolibarr_Project#Developers_roles Admiral] 或 [https://wiki.dolibarr.org/Dolibarr_Project#Developers_roles Soldier]），则必须先使用 GitHub 的“Fork”功能。之后，您可以从 GitHub 发出“Pull Request”，要求将您的补丁合并到develop分支中。 更多信息请参阅 [https://wiki.dolibarr.org/FAQ_Get,update_GIT_project_sources FAQ_Get,update_GIT_project_sources] 和 https://github.com/Dolibarr/dolibarr/blob/develop/.github/CONTRIBUTING.md&lt;br /&gt;
&lt;br /&gt;
==Avec un compte GitHub==&lt;br /&gt;
Les accès au dépot des sources en lecture est publique. La soumission de contributions dépend toutefois de votre niveau dans le projet.&lt;br /&gt;
&lt;br /&gt;
*Si vous bénéficiez d&#039;un grade Yoda (rarissime), et donc un accès en écriture direct au dépôt de référence, utilisez-le (Voir [[FAQ_D%C3%A9veloppeur#Comment_devenir_d.C3.A9veloppeur_officiel|FAQ Développeur - Devenir développeur officiel]] pour les différents grades).&lt;br /&gt;
&lt;br /&gt;
*Si vous n&#039;avez pas d&#039;accès en écriture direct au dépôt de référence (votre grade est donc [[Developer FAQ#Soldier|Jedi]] ou [[Developer FAQ#Soldier|Admiral]] ou [[Developer FAQ#Soldier|Soldier]]), vous devez alors utiliser GitHub en « Forkant » le dépôt sur votre compte, puis en faisant une demande de « Pull Request » de votre branche sur le dépôt principal. C&#039;est la méthode recommandée la plus propre et la plus performante. Voir pour plus d&#039;info la page https://wiki.dolibarr.org/index.php/FAQ_Get,update_GIT_project_sources&lt;br /&gt;
&lt;br /&gt;
 Note:  Si vous ne savez pas bien utiliser l&#039;outil GIT et si votre modification est petite (porte sur un ou deux fichiers), sachez qu&#039;il est possible simplement, en allant sur votre compte GitHub et sur votre repository &amp;quot;Forké&amp;quot; depuis l&#039;interface Web de GitHub, de modifier le fichier en ligne. Une fois la modification faite, vous pouvez utiliser la fonction soumettre Pull Request pour la suggérer au projet. Un valideur l&#039;intégrera alors sans effort si elle est valide.&lt;br /&gt;
&lt;br /&gt;
*La procédure qui suit reste un alternative techniquement possible mais n&#039;est plus pratiquée que pour les toutes petites modifications...&lt;br /&gt;
&lt;br /&gt;
==Sans compte GitHub==&lt;br /&gt;
Sans compte GitHub, il est nécessaire de générer et fournir par mail, sur la mailing-list développeur &#039;&#039;&#039;dolibarr-dev&#039;&#039;&#039; votre fichier patch (Voir ici pour cela {{TemplateURLMLDev}}). Voici la procédure pour générer un fichier patch:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Sous tout OS:&#039;&#039; [[Image:Logo_windows.png|20px]] [[Image:Logo_ubuntu.png|20px]] [[Image:Logo_apple.png|20px]]&lt;br /&gt;
&lt;br /&gt;
Voici la &#039;&#039;méthode Pro&#039;&#039; selon laquelle travailler pour pouvoir générer un tel fichier patch:&lt;br /&gt;
&lt;br /&gt;
- Avoir un répertoire qui contient la version de Dolibarr de référence (résultat de la mise à jour GIT ou bien tout simplement l&#039;arborescence résultant de la décompression d&#039;un snapshot tgz de Dolibarr). On appellera ce répertoire &#039;&#039;&#039;ancien_rep&#039;&#039;&#039;. Vous pouvez récupérer le snapshot de la version de dev en cours sur le  [http://www.dolibarr.org/downloads/ site officiel de Dolibarr - espace téléchargement - version développement].&lt;br /&gt;
&lt;br /&gt;
- Avoir un autre répertoire qui contient l&#039;arborescence de Dolibarr mais dans laquelle vous faites ou avez fait vos modifications. On appellera ce répertoire &#039;&#039;&#039;nouveau_rep&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Pour générer le fichier patch, il suffit alors de lancer la commande &#039;&#039;&#039;diff&#039;&#039;&#039; (en standard sous Linux, fourni dans [http://www.cygwin.org/cygwin cygwin] sous Windows) de la manière suivante:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
diff -BNaur --exclude=CVS --exclude=&amp;quot;*.patch&amp;quot; --exclude=&amp;quot;.#*&amp;quot; --exclude=&amp;quot;*~&amp;quot; --exclude=&amp;quot;*.rej&amp;quot; \&lt;br /&gt;
     --exclude=&amp;quot;*.orig&amp;quot; --exclude=&amp;quot;*.bak&amp;quot; --exclude=conf.php --exclude=documents  \&lt;br /&gt;
     ancien_rep nouveau_rep  &amp;gt; mypatch.patch&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Un script ksh réalisant cette commande est disponible dans le répertoire &#039;&#039;&#039;build/patch&#039;&#039;&#039;.&lt;br /&gt;
Envoyer votre patch sur la ML à l&#039;adresse &#039;&#039;&#039;dolibarr-dev@nongnu.org&#039;&#039;&#039;.&lt;br /&gt;
L&#039;intégration de votre patch n&#039;est toutefois pas garantie, pas plus que le délai, mais si le patch est réalisé en suivant rigoureusement cette procédure, il a de forte chance d&#039;être au moins testé (dans le cas contraire les chances sont proches de 0).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Sous Windows:&#039;&#039; [[Image:Logo_windows.png|20px]]&lt;br /&gt;
&lt;br /&gt;
Si vous êtes sous Windows, une &#039;&#039;méthode moins Pro&#039;&#039; mais qui donne le même résultat est la suivante. Installer l&#039;excellent outil open source de comparaison Winmerge qui sait fabriquer des patchs au format &#039;&#039;diff -Naur&#039;&#039;. Pour cela, comparer avec Winmerge le fichier référence et le fichier modifié et choisir dans le menu &#039;&#039;&amp;quot;Tools - Generate patch&amp;quot;&#039;&#039; (&#039;&#039;Générer des retouches&#039;&#039; en version française). Saisir un nom de fichier comme &#039;&#039;&amp;quot;resultat.patch&amp;quot;&#039;&#039;, cocher la case &#039;&#039;&amp;quot;Append&amp;quot;&#039;&#039; et choisir l&#039;option &#039;&#039;&amp;quot;Format Unified&amp;quot;&#039;&#039; (&#039;&#039;Style : unifié&#039;&#039; en version française). Cliquer sur &#039;&#039;&amp;quot;Ok&amp;quot;&#039;&#039;.&lt;br /&gt;
Éventuellement recommencer pour chaque fichier modifié.&lt;br /&gt;
Au final, on obtient un beau fichier &#039;&#039;resultat.patch&#039;&#039; qui contient toutes les modifications au bon format.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Tester/Appliquer un patch&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Pour appliquer un fichier patch sur une version non modifié afin d&#039;intégrer les modifications décrites dans le fichier patch, vous pouvez utiliser l&#039;utilitaire &#039;&#039;&#039;patch&#039;&#039;&#039;.&lt;br /&gt;
Imaginons que vous avez un répertoire des sources d&#039;une version non modifiée de Dolibarr sur un serveur. Pour appliquer le patch, placer dans le répertoire racine de Dolibarr et lancez la commande:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
patch -u -p0 -d . &amp;lt; monfichier.patch&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;Pour information: -p0 permet d&#039;utiliser le chemin entier tel que mentionné dans le fichier de patch pour retrouver les fichiers à modifier dans votre arborescence source (-pn en retire les n premiers niveau de l&#039;arborescence)&lt;br /&gt;
-d permet de préciser le chemin relatif vers le dossier à patcher.&lt;br /&gt;
&amp;lt; permet de donner le chemin vers le fichier source à utiliser (le patch doit être au format unifié)&lt;br /&gt;
-u permet de préciser que le patch est en mode unifié&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Envoyer le patch par mail&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Une fois votre fichier patch généré et testé avec succès, vous pouvez l&#039;envoyer sur la mailing-list de développement &#039;&#039;&#039;dolibarr-dev&#039;&#039;&#039; de Dolibarr (Voir ici pour cela {{TemplateURLMLDev}}).&lt;br /&gt;
Cette mailing-list est lu de tous les développeurs principaux mais nous ne pouvons garantir que le patch sera inclus, cela dépend de sa qualité et des autres priorités de développement du moment.&lt;br /&gt;
&lt;br /&gt;
=如何打包/交付模块=&lt;br /&gt;
Voir la page [[Développement_module#Cr.C3.A9er_un_package_pour_livrer_et_installer_votre_module|Developpement module - Créer un package pour livrer et installer votre module]]&lt;br /&gt;
&lt;br /&gt;
La procédure est également valide pour générer un package pour le soumettre sur la place de marché https://www.dolistore.com&lt;br /&gt;
&lt;br /&gt;
=Comment être informé de ce qui se passe sur Dolibarr ?=&lt;br /&gt;
Voir la page [[FAQ Comment être informé de l&#039;actualité de Dolibarr ?]]&lt;br /&gt;
&lt;br /&gt;
=Migrer ma base de Mysql vers PostgreSQL=&lt;br /&gt;
Voir la page [[FAQ Migrer ma base Mysql vers PostgreSQL]]&lt;/div&gt;</summary>
		<author><name>ShengGang</name></author>
	</entry>
</feed>