在文件index中,require(_PS_ADMIN_DIR_.'/../config/config.inc.php');
首先载入了配置文件(config.inc.php)。
在配置文件(config.inc.php)中,
第一, 载入了require_once(dirname(__FILE__).'/defines.inc.php');
平台定义文件。主要是系统目录路径及一些配置常量(defines.inc.php)。
第二,检查平台是否已经安装。
未安装,则进行安装流程;
已安装,则调用设置的各项参数,执行平台运行流程。
第三, 设置平台的各项参数配置
require_once(_PS_ROOT_DIR_.'/config/settings.inc.php');
数据库,密钥,缓存等参数
第四,执行平台的自动载入流程require_once(_PS_CONFIG_DIR_.'autoload.php');
( 这个文件可以考虑增加多店铺,多平台的一些功能配置。?????
现在虽然是多店铺,但只是连锁性质的平台,
业务核心可以扩展成 阿里+京东 或者 京东+美团这样的电商平台,
还可以2次开发为总平台,分平台,工厂供应商,分销商这样的4级平台
也就是b2b2b2c, o2o,外贸电商平台,批发等类似的运行模式)
这个流程会载入一些相关的文档:
require_once(_PS_CONFIG_DIR_.'alias.php');
//经常使用的一些工具方法的别名,
如:function ppp($var){
return (Tools::p($var));
}
其实,在这里 Tools::p($var)并不能执行,不然的话index文档中的Configuration 类也可以执行了
require_once(_PS_CLASS_DIR_.'PrestaShopAutoload.php');
PrestaShopAutoload.php是一个自动加载类
spl_autoload_register(array(PrestaShopAutoload::getInstance(), 'load'));
这个就是在prestashop中,类文件不用手动包含进来,而能够直接使用的关键。
在这句代码之后,类似Tools::p($var)这样的语句就可以正常的执行了。
这个就是presta的类加载机制。
首先,PrestaShopAutoload::getInstance()是类自身的单例模式,
其中的方法load作为自动加载类的处理函数。
如: Tools::p($var)中的类Tools还没有加载就使用了,
则PrestaShopAutoload的方法load会自动包含类Tools所在的文件。
然而,要加载的这个文件在哪个目录里面,文件名是什么呢?
其次, PrestaShopAutoload::getInstance()在初始化的时候,
执行自身的构造器__construct
const INDEX_FILE = 'cache/class_index.php';
其一是判断有没有cache/class_index.php这个文件,有就include
没有则初始化这个文件,这个文件是所有类的一个索引,供load方法使用,结构如下:
'Dispatcher' =>
array (
'path' => '',
'type' => 'class',
'override' => false,
),
'DispatcherCore' =>
array (
'path' => 'classes/Dispatcher.php',
'type' => 'class',
'override' => false,
),
初始化读取了classes,controllers,Adapter,Core
override/classes,override/controllers下的所有的php文件。
最后,是load方法要加载的这个类文件在哪个目录里面,文件名是什么。
如:Dispatcher::getInstance()->dispatch();
load()收到的$classname是Dispatcher,
那么他会首先判断这个类名是不是以Core结尾的,
如果是,那么加载Core所指向的文件。
如果不是,先判断索引里面该类下有没有path,
如果有,则把这个自定义的类和core类一起加载。
从这里看,这个自定义类应该需要继承core类。
如果没有则只加载core类,
并自动添加一个继承core类的名为Dispatcher的类,方便调用。
第五,require_once dirname(__FILE__) . DIRECTORY_SEPARATOR . 'bootstrap.php';
支持 bootstrap前端框架,通过适配器定位服务
Adapter_ServiceLocator::setServiceContainerInstance($container);
为了适配各种移动设备
支持sass的css框架,js的jquery框架.
prestashop1.6.1.0默认主题模板为jquery1.11
第六,/* Initialize the current Shop */
/* Include all defines related to base uri and theme name */
require_once(dirname(__FILE__).'/defines_uri.inc.php');
/* Load all languages */
/* Loading default country */
/* Set locales */
/* Instantiate cookie */
/* Create employee if in BO, customer else */
/* if the language stored in the cookie is not available language, use default language */
/* Get smarty */
require_once(dirname(__FILE__).'/smarty.config.inc.php');
$context->smarty = $smarty;