首页 > 其他分享 >修改 Joomla! 1.5 的 HTML 输出而不动核心文件 (附api文档)

修改 Joomla! 1.5 的 HTML 输出而不动核心文件 (附api文档)

时间:2023-07-24 17:03:53浏览次数:47  
标签:1.5 输出 布局 视图 Joomla api 组件 php 模板


现在到了 Joomla! 1.5 平台,前面这个方法不灵了。不过,Joomla! 开发团队早就给出了更好的方案,总结起来就是3个字母:MVC。

 

 




MVC in php Programming


 

MVC 等几个概念

      MVC 是Model-View-Controller (模型-视图-控制器)的缩写。这是 Joomla! 1.5 采纳的一种新型的 Web 程序编写模式。MVC 这三个字同时也蕴含了一种理念:更加灵活的外观设计。其中的 V 字母就是完美解决外观布局问题的答案。

 

      长期以来,Joomla! 就因为其外观布局无法自由设计而遭诟病。现在,得益于MVC的帮助,彻底控制网页外观风格的力量重新回到了模板设计人员的手中。

 

      首先弄清楚两个概念:CSS 只能改变页面“样式”,例如颜色、字体、背景等等,它不能改变“布局”,也就是页面上各种组成部分的结 构 。这是由 HTML 的输出来控制的,例如文章展示为博客形式还是列表形式,就无法通过 CSS 来调整。以前如果要改变页面的布局,就必须手动修改Joomla! 核心文件的 HTML 代码。这样会引发一个潜在风险:当你网站核心升级时,新的文件可能会覆盖掉旧版本,从而使你的 Hack 结果消失。而 MVC 的出现,使得这个烦恼一去不复返。设计人员再也不需要修改 Joomla! 的核心文件了,也不必担心网站升级会抹杀个性化设计。

 

      我们姑且称 MVC 中的 View 为“视图”,扩展套件在前台呈现各种不同类型数据的方式就是它的视图。但是它的外观表现不止一种,我们称之为不同的“布局”。举例来 说,com_content 这个组件控制着文章系统,它能够呈现不同的数据:文章,或者类别,或者单元。前台形式可以是单篇文章展示,可以是多篇文章的标题列表,可以是多篇文章的 Blog 形式排列。这就是说,com_content 组件的视图有多种布局 。也就是说,真正在前台展示的是布局。

 

      那么,我们如果要改变前台的 HTML 输出,就只需修改布局。在进行这个操作之前,我们必须记住:一个组件可以有多种视图,每个视图又可以有多种布局。视图包含了一系列固定的信息,而布局可以 通过不同的形式来展示这些信息。例如:文章组件(com_content)的“类别”视图包含很多文章,这些文章可以用列表来显示,也可以用表格来显示 (可能还有其它形式),这就是说,类别视图既有“列表”这种布局,也有“表格”这种布局。

 

      模块就相对简单多了。模块一般都是以一种方式展示一种信息。因此模块没有视图,它们只有布局。有些模块作者甚至可以在后台参数中为他的模块提供几种布局来 供选择。例如:登录模块的“姓名”和“密码”输入框是垂直排列,还是水平排列,这就无法通过 CSS 来实现,只能是不同的“布局”。

 

模板与布局

      接下来还要区分一下“模板”与“布局”的关系。模板主要是为网页设定一个结构框架。在这个框架之内,指定了组件和模块的显示位置。而在这些位置上,具体如 何展示信息,是由布局(模块)或者视图与布局的组合(组件)来决定的。

 

 



Frontpage Template Positions of Joomla! 1.5


 

 

      上图是 Joomla! 默认模板 rhuk_milkyway 的结构外观(通过访问 http://域名/index.php?tp=1 就能看到这些模块位置)。你可以清楚地看到哪些模块在哪个位置,以及组件在什么位置输出。然而,“实 际上”这些位置将来输出什么内容,不是模板决定的,而是由“布局”决定的。

 

组件的输出类型及布局的优先性

      要理解布局的优先性,我们先要理解组件的文件结构。尽管一个组件有多个部分,分别负责不同的功能,我们只需要看看 /views 目录下的文件。下面是 com_content 组件视图目录的一部分:

 

 

/components
      /com_content
          /views
             /articles
                  /tmpl
                       default.php    (这是一个布局)
                       form.php     (这是一个布局)
                    view.html.php (这是输出HTML的视图)
                    view.pdf.php  (这是输出PDF的视图)
           /category
                /tmpl
                       blog.php    (布局)
                       blog_items.php (子布局)
                      default.php (布局)
                   view.html.php (HTML 视图)
                   view.feed.php (RSS feed 视图)

 

 

      在 /views 目录中,每一种视图都有自己的目录。com_content 组件还有另外三个视图我们没有列出来,它们是存档(archive)、首页(frontpage)和单元(section)。

输出类型

      继续上面的例子。在 /articles 目录中有很多文件。与 /category 视图目录比较一下,就会发现都有一个共同文件就是 view.html.php。这就是我们所说的视图文件。由于输出类型不同,可以有多个不同的视图文件。这些视图文件的命名规律 是:view.output_type.php,这里 output_type 就是输出类型,可以是 html、feed、pdf、raw 或者 error。当我们需要该视图的HTML输出时,就会调用 view.html.php 文件;当我们需要该视图的 RSS 输出时,就会调用 view.feed.php 文件。

 

      如果将全局设置中的SEF启用、同时启用Apache的 mod_rewrite 、启用给URL添加后缀,那么这些不同输出类型的影响就能从 URL 中看出来:

 

 

http://domain/sports.html 
http://domain/sports.feed 
http://domain/sports/rowing.html 
http://domain/sports/rowing.pdf

 

 

你网站上实际的 URL 可能与这些稍有不同,不过我们的重点是想说明:sports.html 结尾的URL 将调用 category 视图的 view.html.php 文件来展示;sports.feed 结尾的URL 将调用 category 视图的 view.feed.php 文件来展示 RSS 供稿内容。提醒一下:目前还不能自定义 feed 和 pdf 输出类型。但是你可以自定义 HTML 输出类型,这正是布局起效的地方。

布局

      在每一个视图目录中,都有一个 /tmpl 目录,这里面就是布局文件。这个目录中的每一个 php 文件都代表一种布局。例如, article/tmpl/default.php 就代表文章的默认布局; article/tmpl/form.php 就代表文章的编辑表单布局;category/tmpl/default.php 代表类别的默认布局;category/tmpl/blog.php 代表该类别中的文章以博客形式展示的布局。

 

      当添加新的菜单项目时,就能明显看出组件的视图与布局的关系。还用文章组件来举例,当我们创建新菜单项目时,点击“文章”(其实就是 com_content 组件),就会看到如下的画面。树形分支显示了每一种视图以及该视图的若干布局:

 

 




Menu Item Type of Articles


 

 

      你可能注意到了,尽管 /tmpl 目录中还有其它文件,但是没有在这个列表上出现,例如 article 视图的 pagebreak.php 文件。这是因为该布局的 XML 文件(本例中是 pagebreak.xml)中的命令隐藏了该布局(甚至可以是该视图),不在这个列表中出现。关于这种隐藏命令另有教程介绍,此处不赘述。

 

      在理解并掌握了上述知识后,我们现在来实战一下:创建自定义的优先输出的布局。

复制或者创建布局文件

      布局的优先性只在当前模板有效,而且想要优先输出的布局文件必须位于该模板的 /html 目录中。例如,对于 rhuk_milkyway 模板来说,就位于 /templates/rhuk_milkyway/html/ 目录中;对于 JA Purity 模板来说,就位于 /templates/ja_purity/html/ 目录中;对于 Beez 模板来说,就位于 /templates/beez/html/ 目录中。

 

      (译者注:本文所谓的“优先输出”是指,对于某个符合 MVC 设计结构的组件来说,它已经自带若干布局;如果我们在当前模板中重新设计了该组件的某些布局,则 Joomla! 1.5 会优先使用模板文件夹中定义的布局,忽略组件自带的布局。这就是“优先输出”。)

 

      再次强调:当你为某个模板创建了“优先输出”,该优先性只在这个模板上有效,对其它模板就无效。例如,rhuk_milkyway 模板没有任何组件的优先输出,当你使用此模板时,所看到的前台是各个组件的原样输出(组件作者所设定的);当你使用 Beez 模板时,前台几乎每一个组件的外观都已被该模板中定义的优先输出所控制(模板设计者个性化了);JA Purity 模板介于上述两者之间,只有部分组件被创建了优先输出,而且也只是这些组件的部分视图。

 

      布局优先性的实现要求布局文件必须按照特定的方式来上传。以 Beez 模板为例,我们可以在它目录中看到下面的文件结构:

 

 

/templates
      /beez
           /html
             /com_content         (此目录与组件目录名称相同)
                  /articles                (此目录与视图目录名称相同)
                       default.php          (此文件与布局文件名称相同)
                       form.php

 

 

从这里可以看出组件“优先输出”的文件结构很简单:/模板名称//html/com_组件_名称/视图_名称/布局_文件_名称.php 。我们来看一个例子:

 

      rhuk_milkyway 模板没有任何组件的优先输出,如果我们想要对文章的默认布局进行优先输出设计,就这样做:

      首先将 /components/com_content/views/article/tmpl/default.php 这个文件复制到这个模板的目录中(需要创建 html 目录因为原来没有),最后实现 /templates/rhuk_milkyway/html/com_content/article/default.php 这个结构。

 

      如果我们还想要对类别视图的博客布局进行优先输出设计,就需要将 /components/com_content/views/category/tmpl/blog.php 这个文件复制到 /templates/rhuk_milkyway/html/com_content/category/blog.php 这个位置。

 

      在完成了文件复制之后,你就可以按照需求来修改这些文件,以实现你的个性化设计方案。

子布局的优先输出

      在某些视图目录中,可以看到某些布局拥有一些文件名前半部分相同的文件。以 category 视图为例,其 blog 布局实际上由三部分组成:一个主布局 blog.php ,两个子布局 blog_item.php 和 blog_links.php。研究一下 blog.php 文件的代码,就能发现它是如何通过 loadTemplate 方法来调用这两种子布局的:

 

echo $this->loadTemplate('item');
 // or
echo $this->loadTemplate('links');

 

 

      在加载子布局时,视图已经知道你所处的上层布局是什么,因此无需写全前缀(在本例中,你只需在代码中写 item,而不用写 blog_item)。

 

      我们在这里专门讨论子布局是想说明:当你只想对某个子布局实现优先输出时,无需完全复制那一系列文件。例如,你对 Joomla! 本身的 blog 布局很满意,但是想自定义 item 这个子布局的输出样式,那么就只需复制 /components/com_content/views/category/tmpl/blog_item.php 这个文件到 /templates/rhuk_milkyway/html/com_content/category/blog_item.php 这里即可。当 Joomla! 1.5 处理该视图时,会自动从组件本身的目录(com_content)中读取 blog 布局定义,同时从当前模板的目录中读取 blog_item.php  定义的子布局。

 

      本文基本上是官方文档《理解 Joomla! 1.5 的 模板输出优先性 》(作者:Andrew Eddie)的翻译,如果你喜欢看英文原版,可以点击这个链接去阅读。该文档中还提到对模块的布局进行“优先输出”处理的方法,本文未转载。有兴趣的用户 可以去看原版。

用优先输出来解决我们的问题

      本文开始提到的 szyyw08 在论坛的那个问题 ,就可以通过对 com_content 组件的 frontpage 视图进行“优先输出”设计来解决。

 

      另外,我还想起来很多人在论坛都寻找一种“中国式风格”的首页布局:新闻按照类别列出标题,头条新闻标题的左侧有缩略图(或者每一个标题左侧都有);在同 一个类别中列出指定数量的标题之后,显示“更多……”链接;首页上按分栏排列多个这样的新闻列表模块,或者通过“标签页”的形式组合属于相同大类别的小类 别;等等……

 

      这样的问题,同样可以通过自己设计 frontpage 视图来实现。采用“优先输出”的方法,我们可以设计好自己喜欢的视图布局,然后可以上传到任何一个 Joomla! 1.5 网站去实现同样的风格,也不用担心核心升级会影响这种个性化风格。

 

MVC

 

附上api文档

标签:1.5,输出,布局,视图,Joomla,api,组件,php,模板
From: https://blog.51cto.com/u_8895844/6836795

相关文章

  • 实现在Vue应用中播放实时视频,使用WebRTC技术和Canvas API来完成
    要实现在Vue应用中播放实时视频,您需要使用WebRTC技术和CanvasAPI来完成。下面是基本的实现步骤:1.使用getUserMediaAPI获取用户的摄像头和麦克风访问权限;javascript复制代码navigator.mediaDevices.getUserMedia({video:true,audio:true}).then(function(stream){//......
  • 探讨 GraphQL API 最新技术及其影响
    自2015年Facebook推出GraphQL以来,它迅速成为向应用程序和其他服务提供数据的强大又灵活的替代方案。最近一份Gartner报告预测,尽管仅有10%的企业在2021年将GraphQL作为其内部数据层实施,但到2025年这个数字将增加到全球企业的50%以上。随着技术不断发展,新趋势和技......
  • Kafka核心API -- Connect
    Connect基本概念KafkaConnect是Kafka流式计算的一部分KafkaConnect主要用来与其他中间件建立流式通道KafkaConnect支持流式和批量处理集成 环境准备创建两个表createtableusers_bak(`uuid`intprimarykeyauto_increment,`name`VARCHAR(20),`ag......
  • 无法注册程序集“D:\JAVA学习之路\jni4netTest\FanucDataCollectionAPI\FanucData
    无法注册程序集"D:\JAVA学习之路\jni4netTest\FanucDataCollectionAPI\FanucData"在Java开发中,我们经常需要与其他语言进行集成,以实现更复杂的功能或访问底层资源。JNI(JavaNativeInterface)是一种机制,允许Java代码调用本地代码(通常是C或C++编写的)。然而,在使用JNI时,有时会遇到无......
  • 如何使用 Swagger 和 ReDoc 制作 ASP.NET Core API 文档 (.NET 6)
    使用Swagger和ReDoc的API文档当您开发WebAPI时,其他开发人员能够了解他们在与您的API交谈时必须发布、放置、删除或获取的内容非常重要。当开发人员完成编码后,为他们构建良好的文档可能具有挑战性。由于有了Swagger(称为OpenAPI),您现在可以在编码时使用Swagger轻松......
  • Java 调用gdal API(二)——栅格裁剪
    gdal可以说是GIS数据处理比较好的工具之一,虽然也提供了JavaAPI,但是官方文档确实太过简单,用起来确实太难受,每次都需要去参考对应的C++api,然后在对应使用。因此小编决定从这篇文章开始,将自己以前以及今后用到的API,都记录下,以帮助更多从事javaGIS服务开发者。今天主要来记录栅格......
  • solidworks api ch04
    用默认模板新建零件,并修改用户偏爱:letnewPart(swApp:ISldWorks)=//GetthefilepathofthedefaultparttemplateletpartTemplate=swApp.GetUserPreferenceStringValue(intswUserPreferenceStringValue_e.swDefaultTemplatePart)letswModel=......
  • .net webapi导出excel
    publicIActionResultdownloadWeeklyTemplate(){stringbasePath=AppDomain.CurrentDomain.BaseDirectory;stringpath=basePath+"/excel.xlsx";varf=newFileInfo(path);if(!f.Exists......
  • python 调用 c api 怎么 传入 指针
    Python调用CAPI如何传入指针Python是一种高级编程语言,但有时需要使用底层的C语言来进行更高性能的操作。Python提供了CAPI,允许我们编写C代码并在Python程序中调用。在这种情况下,我们可能需要将指针传递给C函数,以便在C代码中进行操作。本文将介绍如何在Python中调用CAPI时传递指......
  • python 使用django 快速搭建API接口
    Python使用Django快速搭建API接口介绍在Web开发中,API(ApplicationProgrammingInterface)接口是用于不同系统之间进行数据交换的重要手段。Django是一个功能强大的PythonWeb框架,可以快速搭建高效的API接口。本文将介绍如何使用Django快速搭建API接口,并提供代码示例。准备工作在......