开发新脚本
目录结构
组成系统的脚本被分成几个目录，然而，webERP脚本的主要部分在第一级目录。

- 第一级目录包含系统中的链接直接调用的脚本。最基本的设计准则是避免偶尔或者新手PHP程序员不得不在不同的文件中检视代码以理解系统逻辑。研发人员将很少需要查看主要的根路径和includs以外的其他路径中的文件。

- 在主脚本中引起的其他或者部分脚本包含在includes/次级目录下。大量的引用使用方法与函数的方法相似。

- 在includes路径下的大量的次级目录值得一看，特别是php-plot路径包含php-plot类（由Miguel de Benito Delgado 和其他人—作为一个分开的项目维护）, webERP使用此类来创建销售分析查询图表。Php-gettext类（由 Danilo Segan创建），被webERP用来翻译。它使用locale路径下的文件，当php二进制gettext库没有安装时，可以使用这个类。在实践上，当webERP运行在多语言环境时，最好安装php的gettext库。同时，TCPDF类是Olivier Plathey的FPDF类的衍生，它由Nicola Asuni开发，使得webERP创建的pdf文件可以使用utf8编码和CID字体—这使得webERP可以创建轻量级的pdf文件，而文件所用的字符均由adobe acrobat reader 提供。尽管这个类作为独立的项目维护， Javier de Lorenzo-CÃ¡ceres 做了一些修改以使CID字体被正确映射。这个类是一个非常大的文件集，webERP做了极大精简，去掉了文件和例子。

- 创建数据库的脚本位于sql路径。此路径下目前只有mysql路径，这是因为当下仅仅支持mysql RDBMS。以前有个pg路径,存放postgre sql脚本.在sql目录下的mysql路径,是由mysqldump生成的sql脚本。有一个脚本用来新建系统，它仅仅包含最少的数据来启动系统，这就是weberp-new.sql.同时还有一个脚本用来创建演示系统—weberp-demo.sql.

- Local路径包含所安装的不同的语言翻译包。默认只安装了en_GB.utf8. 有很多其他语言包可以下载，然后安装在这个路径。在locale路径下，每种语言必须安装在服务器上的与该语言名称相同的路径下。在这个路径下，路径LC_MESSAGES包含两个文件，一个是messages.po – 包含所有翻译和messages.mo文件，它被编译成二进制数索引文件，使用gettext功能查找翻译的内容，以实现国际化。

- 文件在路径doc/次级路径下，而此手册是包含在doc/Manual路径下的。特定语言的手册在locale/该语言的路径下。

- api 路径包含所有的api脚本

- xmlrpc包含api需要的XML-RPC的客户端和服务器代码。WebERP使用G. Giunta创建了类来达成此目的--它是XML-RPC类的整个目录树。

- Numbers目录包含PEAR类以用来将数字转化为字。--这些代码被webERP用来写支票。此类不需要安装PEAR，因为PEAR给PHP增加了大量的开销，它对于webERP不是必须的，因此这些代码和webERP一起绑定发行。

- install目录是保存最小安装脚本的地方—如果需要，安装完后可以删除。仅仅在config.php不存在的情况下--也就是在新的安装时，这些脚本才会被使用。

- Flags目录包含ISO 4217货币代码缩写对应的国旗小图片—每个文件都是用ISO代码.jpg命名。这些显示在webERP的货币界面上。

- FPDI路径是TCPDF的扩展，它允许将其他pdf文件与系统产生的PDF文件合并在一起---这个类是由Setasign – Jan Slabon创建和维护。webERP允许用户选择文件附在发票后面--这个功能需要这个类并且所选文件需要存放在这个路径。

- 样式表位于css路径--请参照手册初始部分关于主题部分。在css路径，每个主题都有一个目录树。要创建一个新的主题，仅仅需要复制一个已经存在的路径到一个新的css目录--它将被webERP自动选择为一个新的主题。

- javascripts路径仅仅包含一个文件，它会被每一个webERP脚本的头部引用，并且包含webERP使用的所有javascript.

- Reportwriter目录包含webERP使用的报告生成工具—它由Dave Premo贡献，Dave是Phreebooks的作者。这个部分没有遵照webERP的任何惯例，但是为webERP提供了非常重要的功能。报告生成工具下面有一个完整的其他路径，这些代码非常难以理解。让人高兴的是Dave编写了一些很好的指南以帮助人们使用。

  在编写新的脚本时需要使用下列在整个系统中使用的代码块。
  session.php
  此页面在为变量$PageSecurity赋予一个适当的整数值（参考安全计划部分）之后必须被引用， session.php有下列功能：

- 如果没有的话，会设置一个session,并且检查登录的是一个合法用户 – 如果是这样，那么它会检查用户对于调用的特定页面是否有权限，依据是$PageSecurity值。

- 它依序引用下列脚本：

- config.php - 这个脚本包含要连接数据库的细节。

- GetConfig.php脚本确保所有已经定义并且保存在数据库的系统变量被取出并且可以由系统作为SESSION变量访问。GetConfig.php读取数据库中的company表，它包含单个公司的记录。它也读取数据库的config表—它包含了所有的系统参数--他们被保存在session变量里以避免每页都要重复访问数据库。开发人员需要研究这些参数，他们在SystemParameters.php页面，可以通过设置-->系统访问。

- ConnectDB.inc – 这个脚本（它也依序包含了includes/ConnectDB-mysqli.inc或者includes/ConnectDB_mysqli.inc—历史上，还有一个includes/ConnectDB_Postgres.inc选项）启动了一个到数据库的链接并且包含所有的数据库抽象函数。当与数据库交互时，只有在这里定义的函数才会被使用，而非mysql的特定函数，否则的话，改变数据库将是一个非常困难的事情。通过使用这个文件，要使用其他的数据库的话，仅仅需要修改这个脚本中的函数。

- LanguageSetup.php - 这个设置了locale并且负责处理使用php-gettext，如果web服务器上没有本地的gettext库的话。

header.php
当$Title被设置为页面名称后，需要引用这个文件。这个文件依赖已经上传的config.php，因此session.php(它依序包含了config.php)必须在header.php之前引用。这个脚本的代码有以下作用：

- 引用脚本中使用的javascript函数，他们存在于文件javascripts/MisFunctions.js中。

- 设置正常的系统标识，连同到主菜单，商品，顾客和供应商页面的链接。

- 设置整个系统使用的样式表--通过指向所使用的css路径。

footer.php

这个文件包含小的logo,公司名称和版权信息，使用双引号标签。
config.php

config.php中的变量可以由所有引用了session.php的脚本访问。现在已经没有那么多变量了，大多配置使用config表保存在数据库中。然而，让软件连接数据库信息的变量，例如数据库用户，密码和主机连同数据库类型—dbtype—实际上仅仅支持mysql,但是有两个库可以使用，一个是mysqli和旧的mysql函数。还有一些其他的变量包括时区timezone，$RootPath—指web服务器存放系统文件的地方。还有error_reporting代码。

在使用了session.php和header.php开始了页面之后 – 然后使用footer.php结束，这些保证页面看起来和可以感觉到的一致性工作大部分完成了。
PDFStarter.php

不适于引用session.php或者header.php的唯一场合是要创建pdf脚本。PDFStarter.php包含启用session和检查适当的用户权限以及使用$PageSecurity（它必须在包含PDFStarter.php前定义）检查指定页面的访问权限。正常情况下，config.php和ConnnectDB.inc在PDFStarter.php脚本中被分开引用（并且在PDF_starter_ros.inc)之前。PDF报告脚本全部使用FPDF类，它由Oliver Plathey创建，但是在此之前使用了另一类，因此有个扩展来将调用旧的pdf类翻译到FPDF类。可能最好用FPDF语法写新的脚本。
Database Abstraction - ConnectDB.inc

当系统使用MySql开发的时候，有一个事情一定要记住，就是用户不应该被强制使用Mysql—以与开源的原则保持一致。因此所有对于数据库的请求都通过ConnectDB.inc中的抽象函数进行。这个政策被严格执行，不符合这个原则而研发的扩展将破坏目前数据库之间的可移植性。不用PHP数据库特定的函数，而是要用定义在ConnectDB_mysql.inc里的函数

- $DB_result_handle = DB_query($sql,$db,$ErrorMessage='',$DebugMesage='',$InsideATransaction=0)

- $NumberOfRowsReturned = DB_num_rows($DB_result_handle)

- $QueryResultNamedElementArray = DB_fetch_array($DB_result_handle)

- $QueryResultArray = DB_fetch_row($DB_result_handle)

函数的完整列表需要从includes/ConnectDB_mysql.inc取得—它包含mysql指定的抽象函数。仅仅这些函数可以在其他脚本中使用。研发过程中，已经极为谨慎地确保全部使用标准的SQL规范，以保证数据库转换的问题最小。任何关系型数据库RDBMS的特定SQL都要避免（mysql也不例外），以支持通用的SQL标准。有过使用mysql特定SQL的例子，例如INTERVAL和SHOW TABLES--但这些都已是历史。

DateFunctions.inc

这脚本包含很多在整个系统中用来处理日期的函数—这些函数依靠系统的配置 SESSION['DefaultDateFormat']. 最常见的是：

- DateDiff - 计算日期之间的差异，它有参数以表示天数，周数和月数。

- FormatDateForSQL 转换日期的格式为config.php中$DefaultDateFormat指定的格式以符合SQL的要求—yyyy-mm-dd.

- ConvertSQLDate – 将SQL格式的日期yyyy-mm-dd转换为config.php中定义的$DefaultDateFormate格式。

- GetPeriodNo - 通过查询period表得到指定日期所属的会计期间--需要时会创建一个新的期间以保证返回一个有效的期间。

SQL_CommonFuctions.inc

这个脚本有些在整个系统中使用的共同函数--特别是：

- GetNextTransNo - 对于一个指定的交易类型找出下一个交易编号--参考systypes表，以找到有效的交易类型代码列表。