你现在的位置:首页 > PHP网站建设知识库 > PrestaShop > 正文

prestashop二次开发代码分析之init.php

\

从事prestashop二次开发多年,今天把代码分析的东西整理出来。

inti.php这个文件,是由head.php每次引入的,所以在分析inti.php之前,先来分析一下head.php吧

第一行是一个p3p的声明,作用是cookie的跨域使用,比如你iframe一个页面,这个页面是其他网站,这时候iframe里面的页面的cookie是不能随着头部发送回去的,所以cookie也无效,但是加了这个就可以了。原因是什么?当然是为了安全。

header('P3P: CP="IDC DSP COR CURa ADMa OUR IND PHY ONL COM STA"');
接下来就引入init.php文件了
接下来就是初始化hook在头部、左边和的所有module
‘HOOK_HEADER’ => Module::hookExec(‘header’),
‘HOOK_LEFT_COLUMN’ => Module::hookExec(‘leftColumn’),
‘HOOK_TOP’ => Module::hookExec(‘top’),
css和js文件
如果网店关闭就给503状态码

现在来分析init.php
确定模板是否存在,网店是否关闭

if (!is_dir(dirname(__FILE__).'/themes/'._THEME_NAME_))   die(Tools::displayError('Current theme unavailable. Please check your theme directory name and permissions.'));  elseif (basename($_SERVER['PHP_SELF']) != 'disabled.php' AND !intval(Configuration::get('PS_SHOP_ENABLE')))   $maintenance = true;
缓存控制打开了,所有的输出都会被缓存,直到页面结束或者给与明确输出指令。prestashop没有用gzip压缩

ob_start();
页面信息,这些东西php没有准备好,总是要写一些东西来自己准备,虽然都不是很难,但是总是很烦

$pathinfo = pathinfo(__FILE__);  $page_name = basename($_SERVER['PHP_SELF'], '.'.$pathinfo['extension']);  $page_name = (preg_match('/^[0-9]/', $page_name)) ? 'page_'.$page_name : $page_name;//这个的值自己echo看看
设定语言

Tools::switchLanguage();  Tools::setCookieLanguage();
每一页都可能会有的登出

if (isset($_GET['logout']) OR ($cookie->logged AND Customer::isBanned(intval($cookie->id_customer))))  {   $cookie->logout();   Tools::redirect(isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : NULL);  }  elseif (isset($_GET['mylogout']))  {    $cookie->mylogout();   Tools::redirect(isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : NULL);  }
设定货币
$iso = strtolower(Language::getIsoById($cookie->id_lang ? intval($cookie->id_lang) : 1));//如果cookie中没有语言id,语言id默认就是1  @include(_PS_TRANSLATIONS_DIR_.$iso.'/fields.php');  @include(_PS_TRANSLATIONS_DIR_.$iso.'/errors.php');  $_MODULES = array();     $currency = Tools::setCurrency();
检查购物车

if (is_numeric($cookie->id_cart))  {   $cart = new Cart(intval($cookie->id_cart));//初始化购物车,传cookie中的购物车id进去   $cart->id_lang = intval($cookie->id_lang);//当前使用的语言id   if ($cart->OrderExists())//这个购物车在数据库中真的存在吗?    unset($cookie->id_cart, $cart);//不存在就把cookie中存的也删了   else   {     if ($cookie->id_customer)        $cart->id_customer = intval($cookie->id_customer);//赋值购物车的用户id       $cart->id_currency = intval($cookie->id_currency);//赋值购物车的货币id       $cart->update();//存一下,再执行hook在购物车上的module      }  }
如果没有购物车,新建一个,写入语言、客户等信息

if (!isset($cart) OR !$cart->id)  {   $cart = new Cart();   $cart->id_lang = intval($cookie->id_lang);      $cart->id_currency = intval($cookie->id_currency);   $cart->id_guest = intval($cookie->id_guest);      if ($cookie->id_customer)       $cart->id_customer = intval($cookie->id_customer);  }  if (!$cart->nbProducts())//购物车里面所有产品的数量   $cart->id_carrier = NULL;
设定各种本地化信息

$ps_language = new Language(intval($cookie->id_lang));  setlocale(LC_COLLATE, strtolower($ps_language->iso_code).'_'.strtoupper($ps_language->iso_code).'.UTF-8');//等同于strcoll()  setlocale(LC_CTYPE, strtolower($ps_language->iso_code).'_'.strtoupper($ps_language->iso_code).'.UTF-8'); //设定文字的显示方式  setlocale(LC_NUMERIC, 'en_EN.UTF-8');//数字间隔的方式
语言和货币,写在smarty里面

if (is_object($currency))   $smarty->ps_currency = $currency;  if (is_object($ps_language))   $smarty->ps_language = $ps_language;  $smarty->register_function('dateFormat', array('Tools', 'dateFormat'));//注册Tools::dateFormat成为一个smarty的函数  ......
这些是为了兼容prestashop1.1版本的theme,因为1.2和1.1版本(主要是图片链接部分)有较大差异,在1.2beta测试的时候,很多人发现了这个问题,官方为了平稳的过渡,所以才有了这些部分

if (!Configuration::get('PS_THEME_V11'))  {   define('_PS_BASE_URL_SSL_', $protocol_ssl.$server_host);  ...
在1.0正式版之前的时候,是没有这个init文件的,所有的这些都是写在config里面的。但是现在由于功能的增加,细化了这2个部分的分工,config主要是一些基础工作,常量、路径之类的,inti主要是prestashop特殊的一些工作,购物车、语言、货币等。