prestashop 1.4代码解析:弱水三千的那一瓢

代码就不止三千了,但是在prestashop 1.4中最重要的那一瓢,就是FrontController.php。

解析

先来看看prestashop 1.4的文件加载方式,如果你new了一个类,代码首先会在controller中寻找同名的类文件,这点和之前的版本差不多。如果找不到,就去 override这个用户可以自定义类的文件夹去寻找,如果还是找不到,会用exec新建一个请求名称的类文件,然后加载classes下面的类 名+core类。所以说,真正的FrontController.php,你需要在classes下面寻找到,而且类的名称也是 FrontControllerCore。

如果说之前最重要的就是init.php,在prestashop 1.4中的FrontController.php,接管了init的全部工作,并且还替代了之前header.php,index.php和 footer.php的全部工作,甚至包括了分页和商品排序。简而言之,FrontController.php有点像zend framework的dispatch,是开始全部工作的一个信号。

public function run()
	{
		$this->init();
		$this->preProcess();
		$this->setMedia();
		$this->displayHeader();
		$this->process();
		$this->displayContent();
		$this->displayFooter();
	}
if ($this->ssl AND !(isset($_SERVER[‘HTTPS‘]) AND strtolower($_SERVER[‘HTTPS‘]) == ‘on‘) AND Configuration::get(‘PS_SSL_ENABLED‘))
		{
			header(‘HTTP/1.1 301 Moved Permanently‘);
			header(‘Location: ‘.Tools::getShopDomainSsl(true).$_SERVER[‘REQUEST_URI‘]);
			exit();
		}

function init中的自动301,这就是prestashop 1.4新增的功能,我写的那个模块maindomin算是废了。

$page_name = (preg_match(‘/^[0-9]/‘, $page_name)) ? ‘page_‘.$page_name : $page_name;

function init中的$page_name变量,很方便的实现了不同页面不同模板的一个判断。要知道以前的版本里面我还是直接在header.tpl中做判断的。

Tools::addCSS(_THEME_CSS_DIR_.‘global.css‘, ‘all‘);
Tools::addJS(array(_PS_JS_DIR_.‘tools.js‘, _PS_JS_DIR_.‘jquery/jquery-1.4.4.min.js‘, _PS_JS_DIR_.‘jquery/jquery.easing.1.3.js‘));

function setMedia中的,这样的好处是统一管理了css和js,就可以做prestashop的“CCC”了。Combine, Compress and Cache
function productSort和pagination,接管了以前的sort和pagination的工作。
其他没有太大变化,主要的功能还是复制了过去的init.php。甚至变量的命名都还是全局变量,而不是面向对象中该有全局类。

定制

在override/classes文件夹下大家可以发现一个_FrontController.php,这其实就是一个定制 FrontController.php的例子,把”_”删掉再访问页面,就可以看到debug信息了。要注意的是,同文件夹下还有mysql和 module2个文件,如果仅改了FrontController.php,会造成因为报错不能运行下去的问题。需要将 _FrontController.php的148行

error_reporting(E_ALL | E_STRICT);

改成

error_reporting(7);

这个7的意思,如果有不明白的,可以看下手册学习。
要定制FrontController.php,还是在override/classes文件夹下新建一个文件命名为FrontController.php,然后写一个类extends FrontControllerCore就可以了,方法可以覆盖core中的方法。
一个例子:

class FrontController extends FrontControllerCore{
	function setMedia()
	{
		parent::setMedia();
		Tools::addCSS(_THEME_CSS_DIR_.‘addition.css‘);
	} 	public function displayFooter()
	{
		global $cookie, $smarty;
		if (!self::$initialized)
			$this->init(); 		self::$smarty->assign(array(
			‘HOOK_RIGHT_COLUMN‘ => (($smarty->get_template_vars(‘page_name‘) == ‘category‘) ? ‘‘ : Module::hookExec(‘rightColumn‘, array(‘cart‘ => self::$cart))),
			‘HOOK_FOOTER‘ => Module::hookExec(‘footer‘),
			‘content_only‘ => (int)(Tools::getValue(‘content_only‘))));
		self::$smarty->display(_PS_THEME_DIR_.‘footer.tpl‘);
		//live edit
		if ($cookie->live_edit AND $ad = Tools::getValue(‘ad‘))
		{
			self::$smarty->assign(array(‘ad‘ => $ad, ‘live_edit‘ => true));
			self::$smarty->display(_PS_ALL_THEMES_DIR_.‘live_edit.tpl‘);
		}
		else
			Tools::displayError();
	}}

这个例子中,重写了setMedia和displayFooter方法。
重写setMedia的时候,执行了原始FrontController的这个方法,并且在css中加载了一个新的css。
重写displayFooter的时候,是复制原始的代码过来,唯一的改动就是加了一个判断,如果pagename是category,就不输出右边的column。这是为了让category list的空间更大。

时间: 2024-11-03 22:07:36

prestashop 1.4代码解析:弱水三千的那一瓢的相关文章

ffmpeg代码解析

void avdevice_register_all(void){    static int initialized;    if (initialized)        return;    initialized = 1;    /* devices */    REGISTER_INOUTDEV(ALSA,             alsa);    REGISTER_INDEV   (AVFOUNDATION,     avfoundation);    REGISTER_INDEV

[nRF51822] 10、基础实验代码解析大全 · 实验15 - RTC

一.实验内容: 配置NRF51822 的RTC0 的TICK 频率为8Hz,COMPARE0 匹配事件触发周期为3 秒,并使能了TICK 和COMPARE0 中断. TICK 中断中驱动指示灯D1 翻转状态, 即指示灯D1 以8Hz 的速率翻转状态 COMPARE0 中断中点亮指示灯D2 二.nRF51822的内部RTC结构: NRF51822 有两个RTC 时钟:RTC0,RTC1.两个RTC 均为24 位,使用LFCLK 低频时钟,并带有12 位分频器,可产生TICK.compare 和溢出

(转)Java二进制指令代码解析

转自http://www.blogjava.net/DLevin/archive/2011/09/13/358497.html Java二进制指令代码解析 Java源码在运行之前都要编译成为字节码格式(如.class文件),然后由ClassLoader将字节码载入运行.在字节码文件中,指令代码只是其中的一部分,里面还记录了字节码文件的编译版本.常量池.访问权限.所有成员变量和成员方法等信息(详见Java字节码格式详解).本文主要简单介绍不同Java指令的功能以及在代码中如何解析二进制指令. Ja

Storm中的LocalState 代码解析

官方的解释这个类为: /** * A simple, durable, atomic K/V database. *Very inefficient*, should only be * used for occasional reads/writes. Every read/write hits disk. */ 简单来理解就是这个类每次读写都会将一个Map<Object, Object>的对象序列化存储到磁盘中,读的时候将其反序列化. 构造函数指定的参数就是你在磁盘中存储的目录,同时也作为

Java二进制指令代码解析

http://www.blogjava.net/DLevin/archive/2011/09/13/358497.html http://blog.csdn.net/sum_rain/article/details/39892219 http://www.blogjava.net/DLevin/archive/2011/09/13/358497.html Java二进制指令代码解析 小注:去年在看<深入解析JVM>书的时候做的一些记录,同时参考了<Java虚拟机规范>.只是对指令的

[nRF51822] 12、基础实验代码解析大全 &#183; 实验19 - PWM

一.PWM概述: PWM(Pulse Width Modulation):脉冲宽度调制技术,通过对一系列脉冲的宽度进行调制,来等效地获得所需要波形. PWM 的几个基本概念: 1) 占空比:占空比是指在一个周期内,信号处于高电平的时间占整个信号周期的百分比,方波的占空比是50%. 2) 调制频率:周期的倒数. 3) 脉冲宽度:信号处于高电平的时间. 二.nRF51822的PWM产生: NRF51822 通过Timer.PPI 和GPIOTE 的配合实现PWM 的功能,由Timer 产生一个事件,

[nRF51822] 11、基础实验代码解析大全 &#183; 实验16 - 内部FLASH读写

 一.实验内容: 通过串口发送单个字符到NRF51822,NRF51822 接收到字符后将其写入到FLASH 的最后一页,之后将其读出并通过串口打印出数据. 二.nRF51822芯片内部flash知识: EN-nRF51D 开发板使用NRF51822 芯片为nRF51822-QFAA,如下图所示,共有256KBFLASH,256 页,页大小为1024 字节. NRF51822 内部FLASH 写流程如下: 三.代码解析: main: 1 int main(void) 2 { 3 ... 4 5

java集合框架之java HashMap代码解析

 java集合框架之java HashMap代码解析 文章Java集合框架综述后,具体集合类的代码,首先以既熟悉又陌生的HashMap开始. 源自http://www.codeceo.com/article/java-hashmap-java-collection.html 签名(signature) public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Se

KTV播放重要代码解析

KTV播放重要代码解析 第一步: 搭建好KTV点歌界面,然后要实现的是歌星点歌,点击窗体的Load事件写如下代码: private void FrmZhu_Load(object sender, EventArgs e) { //读取MyResource表中的图片路径,放入到imagePath变量中 string sql = "select resource_path from resource_path  where resource_id=1"; SqlConnection con