开发新脚本
目录结构
组成系统的脚本被分成几个目录，然而，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 表，以找到有效的交易类型代码列表。