打zZ~瞌睡 Menu

写写基于CMS做二次开发的经验之谈

关于闭包最牛B的解释

引用:http://www.cnblogs.com/xiaotie/archive/2011/08/03/2126145.html

Your host needs to disable magic_quotes_gpc to run this version of Joomla!

直接修改php.ini和通过.htaccess的修改方法就不说了,万网的主机是不允许自行修改php.ini的参数的。以下是通过代码修改,不过注意,这样修改:

  1. 可能会有风险
  2. 会增加Joomla升级的维护成本

找到libraries/joomla/filter/input.php

public function clean($source, $type = 'string')
{
   // Handle the type constraint
   switch (strtoupper($type))
   {...
   }
   // -- ADD THIS CODE HERE
   // Handle magic quotes compatibility
   if(get_magic_quotes_gpc()) $result = self::_stripSlashesRecursive($result);
}

在文件775行左右添加

/**
 * Strips slashes recursively on an array.
 *
 * @param   array  $value  Array or (nested arrays) of strings.
 *
 * @return  array  The input array with stripslashes applied to it.
 *
 * @deprecated  12.1 - Sanctioned on 2012-10-09 thanks to Anton Wintergerst
 * @since       11.1
 */
protected static function _stripSlashesRecursive($value)
{
    $value = is_array($value) ? array_map(array('JFilterInput', '_stripSlashesRecursive'), $value) : stripslashes($value);
    return $value;
}

WordPress中禁止后台更新提示

在wp-admin/include/update.php最后加入以下几行代码

add_filter('pre_site_transient_update_core',    create_function('$a', "return null;")); // 关闭核心提示

add_filter('pre_site_transient_update_plugins', create_function('$a', "return null;")); // 关闭插件提示

add_filter('pre_site_transient_update_themes',  create_function('$a', "return null;")); // 关闭主题提示

remove_action('admin_init', '_maybe_update_core');    // 禁止 WordPress 检查更新

remove_action('admin_init', '_maybe_update_plugins'); // 禁止 WordPress 更新插件

remove_action('admin_init', '_maybe_update_themes');  // 禁止 WordPress 更新主题

Joomla教程(三)—— 组件和模块

1. Joomla组件渲染流程
在Joomla中,组件可以说是最大的功能模块。一个组件分为两部分:前台和后台。后台主要用于对对应内容的管理,前台主要用于前台页面的呈现和响应各种操作。其文件目录分别对应于JOOMLAROOT/administrator/components和JOOMLAROOT/components。组件有自己的命名规则,文件夹名须命名为com_组件名,组件的访问也是单文件入口,入口文件为com_组件名/组件名.php,如components/com_content/content.php。上次讲到的URL中的option参数就是定义当前页面使用的是哪个组件,如option=com_content&view=category&id=64,它会先调用content.php,再由router.php路由到category视图,再调用相应的Model层取出ID=64的分类的信息,渲染之后呈现在模板中的jdoc:include type=”component”的位置上。

本教程主要讲Joomla的工作流程,让大家对Joomla是如何工作的有大概的了解,有了这些概念,再进行代码编写就会得心应手了。

2. Joomla模块
与组件(Component)不同的是,模块(Module)是不能通过URL直接访问的,而是通过后台对模块的设置,根据菜单ID(URL中的Itemid)来判断当前页面应该加载哪些模块。所以它主要用于显示内容,而一些表单提交后的处理动作一般是放在组件中去处理的。因此,模块通常都是比较简单的程序,文件结构也很清晰易懂,如modules/mod_login模块中的文件结构如下

mod_login.xml            # 模块配置及安装使用的文件
mod_login.php            # 模块入口文件,以mod_模块名.php命名,可以看作Controller层
helper.php               # 辅助文件,通常数据操作会放在这里,可以看作Model层
tmpl/                    # 模板文件夹,View层
|_ default.php           # 默认模板
|_ default_logout.php    # 退出登录模板

3. 模块在后台的设置
进入后台,打开Extensions > Module Manager,可以看到网站的模块列表。我们打开一个,看一下相关配置项,如Login Form(ID: 16)

  • `Module`页签中显示的是该模块的配置项,如Pre-text/Show Greeting/Show Title等,这里我们主要先看Position的信息,这个字段定义了该模块要在页面中的哪个位置显示,如position-7对应着模板首页里的
  • `Menu Assignment`页签中可以设置该模块要在哪些页面显示,是根据菜单来定义的,有4个选项:所有页面显示、所有页面都不显示、只在选中的页面显示、在选中的页面之外的页面显示
  • `Module Permissions`页签中可以设置访问权限
  • `Advanced`页签中有更多的设置项
Joomla会根据URL中的Itemid(菜单ID)参数,来判断当前页面需要显示哪些模块,再把各个模块渲染到正确的位置上。

4. 模块调用的另外一个参数
在模板的首页文件中,我们会看到调用模块时有如下代码

jdoc:include type="modules" name="position-7" style="well"

这里多了一个style参数,这个其实是一个显示前的预处理动作,在当前模板文件夹中的html/modules.php中定义,打开这个文件我们就能看到有一个modChrome_well的函数,程序不是很复杂,只是在显示前对html做了下预处理,大家了解一下即可。用到的时候不是很多,但是关键时候你会觉得它非常方便。

5. 模块的另外一种调用方法
有时候会需要在程序里调用一个模块来显示,可以用以下程序来调用

# 该程序会显示所有设置在position位置上的模块,当然也会根据菜单ID来判断是否加载
$modules = & JModuleHelper::getModules('position');
foreach($modules as $module){
	echo JModuleHelper::renderModule($module, array('style' => 'well'))
}

6. 不推荐使用的模块调用方法
如果你看其他教程,还有另外一种调用模块的方法,就是在文章里使用如下代码

{loadposition myposition}   # myposition为位置
{loadmodule moduletype}     # moduletype为模块类型

该方法会绕过菜单ID的限制,加载对应的模块,另外此种写法对不熟悉Joomla的内容管理人员来说相对陌生,因为不推荐使用。作为使用Joomla建站的开发人员,我们应该规划出更好的页面结构,尽可能将一些配置项转为图形界面管理,而非代码方式管理。

7. 各部分的View覆写
HTML的输出其实是依赖于当前模板的,通过刚才的讲解我们可以看到每个组件、每个模块都有自己的View层,这样其实就脱离了Joomla的模板,在更换模板时就可能会出现问题。因此推荐将各部分的View层放到Joomla的模板中覆写,这样有利于

  1. 如果有需要,升级时只升级Module本身,不会影响到View的输出
  2. 改版时我们只需要新建一套模板,测试成功后使用新的模板即可,降低了代码的耦合性

具体方法请参照JOOMLAROOT > templates > beez3 > html

Joomla教程(二)—— Joomla模板

前言:了解本节及以后的内容之前,最好先了解一下MVC架构。

现在我们来介绍一下Joomla的模板结构,介绍之前我们先将Joomla的友好URL关掉,有助于我们理解Joomla的渲染逻辑。

1. 关闭友好URL
进入后台 > System > Global Configuration,修改SEO Settings > Search Engine Friendly URLs为No,到前台检查页面,我们发现URL变成了参数的形式。

http://joomla.liubing/index.php?option=com_content&view=category&id=64&Itemid=411

2. 模板文件结构
我们先来看一下Joomla的模板结构,再来讲上面URL中各个参数的意思。Joomla启用的模板可以在后台Extension > Template Manager中管理,打开这个管理界面我们可以看到Joomla的模板列表,Location表示是前台(site)和后台(Administrator)模板,Default代表当前使用的是哪个模板。如现在后台使用的是isis – Default,前台使用的是protostar – Default模板,其他参数我们后续讲解。

打开文件目录JOOMLAROOT > templates > protostar,可以看到如下文件

# 目录
css/                           # 模板使用的css文件
html/                          # 各部分(包括组件、模块、分页)使用的模板
images/                        # 模板使用的图片文件
img/                           # 模板使用的图片文件(逻辑上看,这两个图片文件夹没有什么区别,暂不深究)
js/                            # 模板使用的javascript文件
language/                      # 模板使用的语言文件
less/                          # less文件夹,供css使用

# 文件
index.php                      # 模板首页文件,保存模板的结构
error.php                      # 错误文件,用于程序错误时显示
favicon.ico                    # favicon文件
component.php                  # 这个文件与index.php功能类似,只是只显示组件内容,而不包括其他模块
templateDetails.xml            # 模板配置文件,调整模板参数或安装模板时用到
template_preview.png           # 模板预览图
template_thumbnail.png         # 模板预览缩略图

3. 模板架构
在Joomla中,一个页面内只能有一个主要内容(组件:component),其他均属于模块(module),如下图所示

Joomla模板架构

Joomla模板架构

4. 从代码分析模板架构
打开index.php,除了简单的HTML和php外,我们还能看到以下几类语句

jdoc:include type="head"
jdoc:include type="modules" name="position-1" style="none"
jdoc:include type="message"
jdoc:include type="component"

这些是Joomla引入内容的方式,Joomla模板引擎会解析这些语句,抓取对应的内容渲染到模板中,组成一个页面。type指明要包含的内容的类型

head        # 页面头文件(包括css/javascript/meta标签),注意这里不是指网站内容的头部
modules     # 模块
message     # 提示消息
component   # 组件

从代码中也可以看出,页面里只有一个component,同时有许多个modules。事实上message也是一个module,只是是一个比较特殊的module。

5. 从URL分析模板内容
在Joomla的URL中,重要的信息通常包含两部分:组件信息、菜单ID(当然以后会遇到更多的情况,这里我们只重点介绍组件和菜单),如第一点我们看到的URL

option=com_content  # 该页面内要使用的组件,后台对应到Components中,文件使用JOOMLAROOT > components中的文件
view=category       # 组件内要使用的view
id=64               # view对应的ID
Itemid=411          # 该页面对应的菜单ID

所以第一点提到的URl的意思是告诉Joomla:当前页面是要显示一个文章分类页面,分类ID是64,对应的菜单ID是411,打开后台Menus > All Modules,就可以看到菜单ID为411的菜单Content Modules。

6. 模板架构、代码结构和URL之间的关系
下面我们用一张图把模板架构、代码结构和URL之间的关系表示出来,帮助大家理解。

模板架构、代码结构和URL之间的关系

模板架构、代码结构和URL之间的关系

7. 菜单ID非常重要
可能你会有疑问:每个页面要显示什么模块是怎么定义的呢?
在Joomla的每个URL中,都应该有菜单ID,它不仅仅只是一个菜单信息,而且,哪个页面要显示哪些模块就是通过这个菜单ID来判断的。下次我们准备讲一下各部分的渲染方法。

Nginx中WordPress、Joomla、Drupal的URL重写配置

Drupal

location / {
	if (!-e $request_filename) {
		rewrite ^/(.*)$ /index.php?q=$1 last;
	}
}

 

Joomla

location / {
	if ( $args ~ "mosConfig_[a-zA-Z_]{1,21}(=|\%3d)" ) {
		set $args "";
		rewrite ^.*$ http://$host/index.php last;
		return 403;
	}
 
	if ( $args ~ "base64_encode.*\(.*\)") {
		set $args "";
		rewrite ^.*$ http://$host/index.php last;
		return 403;
	}
 
	if ( $args ~ "(\<|%3C).*script.*(\>|%3E)") {
		set $args "";
		rewrite ^.*$ http://$host/index.php last;
		return 403;
	}
	
	if ( $args ~ "GLOBALS(=|\[|\%[0-9A-Z]{0,2})") {
		set $args "";
		rewrite ^.*$ http://$host/index.php last;
		return 403;
	}
	
	if ( $args ~ "_REQUEST(=|\[|\%[0-9A-Z]{0,2})") {
		set $args "";
		rewrite ^.*$ http://$host/index.php last;
		return 403;
	}
	
	if (!-e $request_filename) {
		rewrite (/|\.php|\.html|\.htm|\.feed|\.pdf|\.raw|/[^.]*)$ /index.php last;
		break;
	}
 
}

 

WordPress

location / {
	if (-f $request_filename/index.html) {
		rewrite (.*) $1/index.html break;
	}
	if (-f $request_filename/index.php) {
		rewrite (.*) $1/index.php;
	}
	if (!-f $request_filename) {
		rewrite (.*) /index.php;
	}
}

Joomla教程(一)—— 初识Joomla

使用Joomla做二次开发至今也有6年了,经历了Joomla1.5 > 2.x,到现在的3.x,大大小小的项目也开发过不少,但是由于工作原因,没有系统地整理过。觉得还是把平时积累的东西写一写,供喜欢Joomla的朋友们参考吧,也欢迎大家多交流。

简单地说,Joomla是一个CMS。但是这个CMS有相当完善的内核机制,把各种第三方开发的组件、模块和插件无缝得衔接在一起,如果举一个形象点的例子,那它更像是一个操作系统,可以安装各种不同的功能(当然功能强大的CMS理当如此,Drupal和Wordpress其实也如此)。丰富的第三方扩展,使得它处理更种功能变得游刃有余。如果你想搭建一个企业网站,甚至改改模板就可以满足你的需求;如果你想定制复杂的功能,标准的MVC架构也使开发变得相当简单。

先介绍一下Joomla的基本知识,初识一下Joomla吧。

1. 下载Joomla
我使用的版本:https://github.com/joomla/joomla-cms/releases/download/3.4.3/Joomla_3.4.3-Stable-Full_Package.zip
最新版本请至:http://www.joomla.org/download.html

2. 安装
安装步骤就不多说了,基本就是一路“下一步”。注意安装示范数据时安装“帮助测试示范数据”,便于跟我以后的文章有更好的对照。

3. 文件目录介绍

# 目录
administrator/   # 管理后台目录
bin/             # 该文件夹存放一些基于Joomla框架开发的一些实用的脚本
cache/           # 文件缓存目录
cli/             # 该文件夹存放一些终端使用的命令,用于操作当前的站点
components/      # Joomla组件目录
images/          # 网站内容使用的媒体文件目录,后台有对此文件夹进行管理的功能
includes/        # 运行Joomla需要包含的基础文件
language/        # 语言目录,多语言的翻译都存放在这里
layouts/         # 应该是控制布局的,没有注意过是哪个版本加上的,也没研究过,等有时间了研究一下再写
libraries/       # Joomla使用的库文件
logs/            # 日志目录,一些异常处理都会存放在这个文件夹里,例如后台登录时输入错误的用户名和密码
media/           # Joomla使用到的媒体文件,主要是页面渲染会用到的,存放的内容跟images目录有区别,而且后台是没有对其进行管理的功能的
modules/         # Joomla模块目录
plugins/         # Joomla插件目录
templates/       # Joomla站点模板目录
tmp/             # 临时目录,如安装组件或模块时残留的解压文件等

# 文件
configuration.php   # Joomla配置文件
htaccess.txt        # 帮助我们生成.htaccess
index.php           # Joomla单入口文件
LICENSE.txt         # 不多叙述
README.txt          # 不多叙述
robots.txt          # 搜索引擎爬行使用的文件
web.config.txt      # 据说是IIS使用的文件

 

4. 后台功能简介

System                        # 系统相关
|_ Control panel              # 控制面板
|_ Global Configration        # 配置管理(对configuration.php文件的管理)
|_ Global Check-in            # 没找到很对应的中文翻译,功能介绍请往下看
|_ Clear Cache                # 清除缓存
|_ Purge Expired Cache        # 清除过期的缓存
|_ System information         # 系统信息
Users                         # 用户相关
|_ User Manager               # 用户管理
|_ Groups                     # 用户组管理
|_ Access Levels              # 权限管理
|_ User Notes                 # 用户备注
|_ User Note Categories       # 备注分组(用到的不多,不会多讲)
|_ Mass Mail Users            # 批量发送邮件管理
Menus                         # 菜单相关
|_ Menu Manager               # 菜单管理(跟下边的菜单列表容易混淆,以后讲菜单的时候会讲解)
|_ Menus                      # 菜单列表
Content                       # 内容相关
|_ Article Manager            # 文章管理
|_ Category Manager           # 分类管理
|_ Featured Articles          # 推荐文章
|_ Media Manager              # 媒体管理(对images文件夹的管理)
Components                    # Joomla启用的组件列表
Extensions                    # 扩展相关
|_ Extension Manager          # 扩展管理(包括扩展组件、模块、插件、语言等的安装/卸载、启/禁用等)
|_ Module Manager             # 模块管理
|_ Plugin Manager             # 插件管理
|_ Template Manager           # 模板管理
|_ Language Manager           # 语言管理
Help                          # 帮助

 

5. 重要概念:Check in
在Joomla中,为防止不同的人对相同内容同时操作而引起的冲突,在编辑内容(如菜单、文章、模块等)时,Joomla都会将其锁定。保存或取消之后才会将其解锁(如果查看编辑页面,会发现有一个cancel按钮,推荐使用此按钮退出编辑,否则编辑锁不会解除)。但也有例外情况,比如编辑人员没有使用取消编辑功能,而是使用了后退,或者由于某些原因编辑时被中断了,编辑锁不会解除。Check in就是解除编辑锁的功能。System > Global Check-in就是对网站内所有加锁的内容进行管理的。

本节内容非常简单,实际操作下来应该比较轻松,今天写到这儿先,待后续吧!