近来研究joomla的源码,很多地方很迷惑。可能是以前没有用过PHP,很多东西一时半会还不能做到很清晰,故在这里记录一些点滴,也算是作个笔记吧。
在自定义一个component时,可能使用MVC的方式来做,这时就很自然地从JController、JModel、JView派生自己定义的类。这里说的“名称”包括两种:(1)自定义类的类名称 (2)定义类的文件名称和路径
(1)
自定义类的类名称
首先看
JController:
function getName()
{
$name = $this->_name;
if (empty( $name ))
{
$r = null;
if ( !preg_match( '/(.*)Controller/i', get_class( $this ), $r ) ) {
JError::raiseError(500, "JController::getName() : Cannot get or parse class name.");
}
$name = strtolower( $r[1] );
}
return $name;
}
由正则表达式/(.*)Controller/i可以看出:自己定义Controller派生类时,需要包含
Controller,用getName()得到的Controller名是整个类名的前缀(即
Controller前面的部分)。这个名称的对取Model和View都是有影响的:
function &getModel( $name = '', $prefix = '', $config = array() )
{
if ( empty( $name ) ) {
$name = $this->getName();
}
if ( empty( $prefix ) ) {
$prefix = $this->getName() . 'Model';
}
/*其它代码*/
function &getView( $name = '', $type = '', $prefix = '', $config = array() )
{
static $views;
if ( !isset( $views ) ) {
$views = array();
}
if ( empty( $name ) ) {
$name = $this->getName();
}
if ( empty( $prefix ) ) {
$prefix = $this->getName() . 'View';
}
/*其它代码*/
由上面可以看出,如果取Model或View时,如果$name或者$prefix不指名时,Controller的类名称前缀会成为Model、View类名称的一部分。
再看
JModel:
function getName()
{
$name = $this->_name;
if (empty( $name ))
{
$r = null;
if (!preg_match('/Model(.*)/i', get_class($this), $r)) {
JError::raiseError (500, "JModel::getName() : Can't get or parse class name.");
}
$name = strtolower( $r[1] );
}
return $name;
}
从正则表达式/Model(.*)/i看出:Model名需要包含
Model,此时geName()得到的Model名是整个类名的后缀(即
Model后面的部分)。
接着看
JView:
function getName()
{
$name = $this->_name;
if (empty( $name ))
{
$r = null;
if (!preg_match('/View((view)*(.*(view)?.*))$/i', get_class($this), $r)) {
JError::raiseError (500, "JView::getName() : Cannot get or parse class name.");
}
if (strpos($r[3], "view"))
{
JError::raiseWarning('SOME_ERROR_CODE',"JView::getName() : Your classname contains the substring 'view'. ".
"This causes problems when extracting the classname from the name of your objects view. " .
"Avoid Object names with the substring 'view'.");
}
$name = strtolower( $r[3] );
}
return $name;
}
JView中取名字的正则表达式为:/View((view)*(.*(view)?.*))$/i,比Controller和Model的都复杂一些。即类名必须包含
View(注意第一个字母是大写的),如果在
View后面还带"view"时,可以有0个到多个"view"。用getName()取得的名称是
(.*(view)?.*)中取得匹配的部分,即
View后面如果不直接带"view"时,取得的是
View后面的所有字符串;如果
View后面直接带"view"(一个或多个)时,取得的是除去所连接"view"后面的所有字符串(不包含"view")。
之前就试过自定义View类中不带
View,结果找不到这个类。
例子:
/*下面是摘自《Learning Joomla! 1.5 Extension Development》的例子*/
//Controller名带前缀"Review"
class ReviewController extends JController
{
function display()
{
$document =& JFactory::getDocument();
$viewName = JRequest::getVar('view', 'all'); //此时$viewName="all"
$viewType = $document->getType(); //此时$viewType="html"
//由于getView()只给了两个参数,故$preffix使用默认:Controller名前缀加$viewName
//即"Review"."View"."All"
$view = &$this->getView($viewName, $viewType);
//getModel()中"ModelReviews"为前缀,加上$viewName
$model =& $this->getModel( $viewName, 'ModelReviews' );
if (!JError::isError( $model )) {
$view->setModel( $model, true );
}
$view->setLayout('default');
$view->display();
}
}
//Model名带"Model"
class ModelReviewsAll extends JModel
{}
//View名带View
class ReviewViewAll extends JView
{}
小结
(1) Controoler类名可以先指定一个前缀如:CtrlName
(2) Model类名的指定分情况:getModel( $name = '', $prefix = '', $config = array() )
a.如果指定$name,不指定$prefix,则Model类名为:CtrlName.'Model'.$name
b.如果$name和$prefix都指定,则Model类名为:$prefix.$name
(3) View类名的指定也分情况:getView( $name = '', $type = '', $prefix = '', $config = array() ) ($type主要是在找文件路径中用到)
a.如果指定$name,不指定$prefix,则View类名为:CtrlName.'View'.$name
b.如果$name和$prefix都指定,则View类名为:$prefix.$name
此外,定义这些类的时候,可以在Controller::__construct()中指定名字$this->_name,这时Controller的类名前缀就可以与Model、View没有关系,而是与$this->_name有关系。如果不是在构造函数中给$this->_name,则Model类名中必须带"Model",View类名中必须带"View",否则在getName()方法中会抛异常。
(2)
定义类的文件名称和路径
这个留到下篇写吧。
分享到:
相关推荐
Joomla! is one of the most popular open source Content Management Systems, actively developed and supported by a world-wide user community. It’s a free, fun, and feature-rich tool for anyone who ...
【标题】"JOOMLA源码"涉及到的是开源内容管理系统Joomla的核心代码,这使得开发者可以深入了解其工作原理,进行自定义开发或者优化网站功能。 【描述】"JOOMLA源码"指的是Joomla框架的原始编程代码,它提供了一个...
【标题】:“JOOMLA开源网站源码” 【正文】: JOOMLA是一个深受全球开发者喜爱的开源内容管理系统(CMS),它基于PHP编程语言和MySQL数据库,为构建各种类型的网站提供了一个强大且灵活的平台。这个开源项目允许...
Joomla! CMS:trade_mark: 建立状态 无人机CI AppVeyor 这是什么? 这是Joomla! 3.x安装/升级包。 Joomla的。 Joomla! 3.9。 详细的更改在。 什么是Joomla? 是一个内容管理系统(CMS),使您可以构建网站和...
Joomla! 3 Beginne's Guide 一本适合Joomla初学者的书。 主要内容: Chapter 1: Introduction: A New and Easy Way to Build Websites Chapter 2: Installation: Getting Joomla Up and Running Chapter 3: First ...
百度地图毕业设计源码 Joomla使用教程 这是针对国内Joomla用户/爱好者/开发者定制的用户使用教程,这个教程旨在为Joomla学员了解Joomla的产品整体及管理使用,帮助开发者了解Joomla的结构逻辑,从而能够介入开发。...
**Visitors Table (Joomla 模块):深入了解开源网站统计** Visito
1. **复制源码**:找到要覆盖的插件,将其 PHP 文件复制到 `plugins/system/yourcustomplugin` 目录下,其中 `yourcustomplugin` 是你创建的新插件名称。 2. **重命名类名**:在复制的 PHP 文件中,修改原插件的类名...
**Joomla模板:Steam——YooTheme团队的创新之作** Joomla是一款开源的内容管理系统(CMS),广泛用于构建网站。在Joomla的世界里,模板扮演着至关重要的角色,它们决定了网站的外观和布局。"Steam"是YooTheme团队...
它允许您使用单个joomla聊天模块和joomla iphone应用程序以及桌面应用程序为所有网站提供实时支持,以便您可以通过台式机或移动设备的便利性来控制网站。 它还使您可以实时监视网站活动以及大量其他功能。
适用于移动应用的Joomla API(Android,Iphone / Ipad和外部网站) 此扩展程序将帮助您轻松地从Joomla网站检索移动设备或其他外部网站的数据。 如果要在另一个PHP站点中发布Joomla文章,K2项,easyblog帖子或...
### 如何用XAMPP搭建Joomla本地测试服务器 #### XAMPP的安装与简介 XAMPP是一款非常实用的工具包,集成了Apache、MySQL、PHP和Perl等多种Web开发环境所需的核心组件,使得开发者可以在本地计算机上轻松构建一套...
### Joomla组件翻译篇知识点解析 #### 一、MVC组件开发概述 - **MVC(Model-View-Controller)架构**:这是一种常见的软件设计模式,主要用于简化开发过程并提高代码可维护性。在Joomla中,它被广泛应用于组件开发...
Joomla Common Payments API插件和示例开发扩展Joomla Common Payments API插件是在Joomla扩展中添加“付款”支持的最简单方法。 集成通用支付API可以为所有CPG插件提供支持。 集成过程是一个简单的三步集成,可以在...
oomla组件开发-49JController以及其子类 zmax程序人开发
在压缩包"developer.joomla.org-master"中,我们可以预期找到的是该存储库的源码主分支,它可能包含以下内容: 1. **Components**:Joomla组件是大型、独立的模块,可以处理整个网站的特定功能,如用户管理、电子...
**Joomla插件:K2 Framework v2.6.6** K2 Framework 是一个非常流行的扩展,用于增强Joomla CMS(内容管理系统)的功能。它不仅仅是一个插件,更是一个全面的内容管理解决方案,提供了丰富的功能和灵活性,使得网站...
**Joomla模板:Master Framework深度解析** Joomla是一款流行的开源内容管理系统(CMS),它提供了丰富的功能,用于构建和管理网站。在Joomla的世界里,模板是决定网站外观和布局的关键元素。Master Framework是由...
自动化的Joomla安装 在PBF(Pizza-Bug-Fun)会议期间,许多人都在努力建立新的Joomla环境,以进行测试。 为了简化此过程,该项目尝试按照所需的需求推出新的Joomla新站点。 当前状态 Beta。 要求 有权创建新数据库...