`
swingline
  • 浏览: 19265 次
  • 来自: ...
社区版块
存档分类
最新评论

joomla源码点滴:JController、JModel、JView的子类名称

阅读更多
     近来研究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! 3: Beginner’s Guide

    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开源网站源码

    【标题】:“JOOMLA开源网站源码” 【正文】: JOOMLA是一个深受全球开发者喜爱的开源内容管理系统(CMS),它基于PHP编程语言和MySQL数据库,为构建各种类型的网站提供了一个强大且灵活的平台。这个开源项目允许...

    joomla-cms:Joomla的家! 内容管理系统

    Joomla! CMS:trade_mark: 建立状态 无人机CI AppVeyor 这是什么? 这是Joomla! 3.x安装/升级包。 Joomla的。 Joomla! 3.9。 详细的更改在。 什么是Joomla? 是一个内容管理系统(CMS),使您可以构建网站和...

    Joomla! 3 Beginne's Guide

    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-Tutorial:这是针对Joomla初学者定制的初学者使用教程

    百度地图毕业设计源码 Joomla使用教程 这是针对国内Joomla用户/爱好者/开发者定制的用户使用教程,这个教程旨在为Joomla学员了解Joomla的产品整体及管理使用,帮助开发者了解Joomla的结构逻辑,从而能够介入开发。...

    Visitors Table (joomla module):https://sourceforge.net/projects/visitors-table/-开源

    **Visitors Table (Joomla 模块):深入了解开源网站统计** Visito

    joomla-override:覆盖 Joomla 扩展的插件(模块和组件)

    1. **复制源码**:找到要覆盖的插件,将其 PHP 文件复制到 `plugins/system/yourcustomplugin` 目录下,其中 `yourcustomplugin` 是你创建的新插件名称。 2. **重命名类名**:在复制的 PHP 文件中,修改原插件的类名...

    Joomla模板:Steam,YooTheme团队出品

    **Joomla模板:Steam——YooTheme团队的创新之作** Joomla是一款开源的内容管理系统(CMS),广泛用于构建网站。在Joomla的世界里,模板扮演着至关重要的角色,它们决定了网站的外观和布局。"Steam"是YooTheme团队...

    Joomla Live Chat:Joomla聊天模块-开源

    它允许您使用单个joomla聊天模块和joomla iphone应用程序以及桌面应用程序为所有网站提供实时支持,以便您可以通过台式机或移动设备的便利性来控制网站。 它还使您可以实时监视网站活动以及大量其他功能。

    Joomla_API:适用于移动应用的Joomla API(Android,iPhoneiPad和外部网站)

    适用于移动应用的Joomla API(Android,Iphone / Ipad和外部网站) 此扩展程序将帮助您轻松地从Joomla网站检索移动设备或其他外部网站的数据。 如果要在另一个PHP站点中发布Joomla文章,K2项,easyblog帖子或...

    如何用XAMPP搭建Joomla本地测试服务器

    ### 如何用XAMPP搭建Joomla本地测试服务器 #### XAMPP的安装与简介 XAMPP是一款非常实用的工具包,集成了Apache、MySQL、PHP和Perl等多种Web开发环境所需的核心组件,使得开发者可以在本地计算机上轻松构建一套...

    joomla组件翻译篇

    ### Joomla组件翻译篇知识点解析 #### 一、MVC组件开发概述 - **MVC(Model-View-Controller)架构**:这是一种常见的软件设计模式,主要用于简化开发过程并提高代码可维护性。在Joomla中,它被广泛应用于组件开发...

    joomla-payments:适用于Joomla的通用支付API插件,通过简单的3步集成过程即可支持多个支付网关!

    Joomla Common Payments API插件和示例开发扩展Joomla Common Payments API插件是在Joomla扩展中添加“付款”支持的最简单方法。 集成通用支付API可以为所有CPG插件提供支持。 集成过程是一个简单的三步集成,可以在...

    joomla组件开发

    oomla组件开发-49JController以及其子类 zmax程序人开发

    developer.joomla.org:存储库,其中包含Joomla上正在使用的自定义扩展! 开发者网络

    在压缩包"developer.joomla.org-master"中,我们可以预期找到的是该存储库的源码主分支,它可能包含以下内容: 1. **Components**:Joomla组件是大型、独立的模块,可以处理整个网站的特定功能,如用户管理、电子...

    Joomla插件:K2 Framework v2.6.6

    **Joomla插件:K2 Framework v2.6.6** K2 Framework 是一个非常流行的扩展,用于增强Joomla CMS(内容管理系统)的功能。它不仅仅是一个插件,更是一个全面的内容管理解决方案,提供了丰富的功能和灵活性,使得网站...

    Joomla模板:Master Framework,YooTheme团队出品

    **Joomla模板:Master Framework深度解析** Joomla是一款流行的开源内容管理系统(CMS),它提供了丰富的功能,用于构建和管理网站。在Joomla的世界里,模板是决定网站外观和布局的关键元素。Master Framework是由...

    joomla_install:在PBF会话中收集技巧以快速设置Joomla测试站点

    自动化的Joomla安装 在PBF(Pizza-Bug-Fun)会议期间,许多人都在努力建立新的Joomla环境,以进行测试。 为了简化此过程,该项目尝试按照所需的需求推出新的Joomla新站点。 当前状态 Beta。 要求 有权创建新数据库...

Global site tag (gtag.js) - Google Analytics