阅读时间:10分钟 (1917字)

Joomla 3. 为开发者带来什么新变化。实践部分。

Joomla 3是一个过渡版本,在LTS版本3.5之前,因此它有一些特殊性。正如我一样,它追求两个目标:向开发者展示系统的发展方向,并在实践中测试新的方法。这些方法如此新颖,以至于它们目前在内置组件中尚未使用。因此,本文分为两部分。在第一部分,我将介绍为Joomla 3创建和适应扩展的实践方面。第二部分是理论性的,我将介绍新的MVC概念。

让我们从现实问题和特性开始,这些问题和特性是在适应现有扩展或为Joomla 3创建新扩展时开发者面临的。

新的系统要求

  • PHP 5.3.1
  • MySQL 5.1
  • register_globals关闭
  • magic_quotes_gpc关闭

Twitter Bootstrap

为了简化Joomla 3中版式设计师的生活,引入了框架Twitter Bootstrap,以及它所带的jQuery和jQuery UI。现在Mootools不再是主要的js库,更不用说,在当前版本中,它只保留为与旧版本兼容,并且很可能在下一个版本中将其从组成中删除。目前,Joomla本身的某些js脚本仍然需要Mootools,但在下一个版本中,它们将被移植。

Twitter Bootstrap是一个html/css/js框架,它简化并加快了版式。它还包括用于许多常用任务的js脚本,例如:下拉菜单、书签、手风琴等。框架使用less——动态样式语言。它扩展了常见的css变量、嵌套块、混合、运算符和函数。这使得编写样式更加方便,最重要的是,更加灵活。Less文件可以在服务器端或客户端编译成css。然而,在成品网站上,建议向客户交付已编译的文件。

此外,Joomla CMS本身现在包含一系列用于使用框架组件而无需编写JavaScript或其他任何东西的功能。

模板

正如您所理解的,Joomla 现在有一个内置的框架用于布局,因此不需要使用第三方扩展来简化布局。仍然可以使用旧模板。在版本 3 中,可以安装 2.5 版本的模板。甚至正式上可以安装 1.6 版本的模板。可能需要进行一些适配,主要是由于新 Joomla 使用了不同的类和标识符,但总体来说,它们是可以工作的。此外,还可以使用旧方法创建新模板。然而,推荐使用 Bootstrap 构建模板。除了简化开发并降低成本之外,还将更好地与第三方扩展互动并获得 CMS 的支持。例如,模块设置中有一个特殊的选项“Bootstrap 模块宽度”。

那么,在新的版本中,对于基于 Twitter Bootstrap 的模板设计有什么新的?当然是 Bootstrap 本身。它位于 media/jui 目录中。JUI 简称 Joomla User Interface。其中扩展用于与 Joomla 的 Twitter Bootstrap 一起工作,它有两种变体

  • 编译后的 CSS 在 css 目录中
  • less 文件在 less 目录中

此外,系统中还包含一个名为 JHtmlBootstrap 的类,它有助于使用 Twitter Bootstrap 组件。

内置的组件和模块已经针对 Twitter Bootstrap 进行了适配。这意味着,如果以前在基于 Twitter Bootstrap 的模板上创建模板时需要创建自己的内置组件模板,那么现在相反,如果模板不是基于 Bootstrap,则需要创建它们。新的第三方组件将使用 JUI,而其基础是 Bootstrap。

总的来说,Joomla 正在朝着接口标准化方向发展,在其框架内,有一个名为 JUX 的项目,其目标是改进和标准化接口。

作为如何基于 Twitter Bootstrap 创建模板的示例,可以参考 CMS 中包含的新模板 Protostar。然而,需要注意的是,不是目录 css,它包含编译后的 CSS,而是 less 目录。正是在这里包含着可以控制模板样式的文件。variables.less 包含对 Twitter Bootstrap 的设置,例如背景颜色和文本颜色、字体、某些元素的大小等。Icomoon.less 包含图标设置。而 template.less 包含对 JUI 所需组件的连接(包括 Bootstrap)以及模板样式。这种方法允许仅使用 JUI 的必要部分,并为 Twitter Bootstrap 设置必要的配置,这是在编译后的 CSS 文件中无法做到的。这种结构不是强制性的,也可以使用任何其他结构,例如将模板样式移至单独的文件中。

作为缺点,Joomla 中没有内置的实时编译 less 文件的功能。实际上,它没有用于 less 的任何编译器。这是开发者的责任。可以在 less 的官方网站上找到用于编译 less 到 css 的工具。但是,每次修改后编译 less 文件相当困难,因此建议在开发过程中使用插件 Less Compiler 或官方脚本 less.js,它可以在浏览器中编译 less。使用它非常简单

<link rel="stylesheet/less" type="text/css" href="/styles.less">
<script src="/less.js" type="text/javascript"></script>

在开发完成后,不要忘记编译 less 文件并将得到的 css 文件替换。

模板文件 index.php 中的更改与转向 Twitter Bootstrap 有关。需要注意的是

JHtml::_('bootstrap.framework');

它将框架连接到模板。

请注意这个片段

<!--[if lt IE 9]>
<script src="/<?php echo $this->baseurl ?>/media/jui/js/html5.js"> </script>
<![endif]-->

它是必需的,以便旧的 IE 版本可以理解新的 html5 标签。

共同层(布局)

有时需要相同的页面片段在扩展的不同视图中显示,或者在多个扩展中显示。例如,在管理员和网站上显示相同的片段,或者在多个模块中显示。在 3.0 之前,这是一个复杂的任务。现在,JLayout 包可以帮助解决这个问题。它用于在大多数组件的管理部分显示子菜单和过滤器。

该包由以下部分组成

  • JLayout 接口
  • JLayoutBase 基类
  • 类JLayoutFile,这是最常使用的。

简单示例

$layout = new JLayoutFile('joomla.sidebars.submenu', $basePath = null);
$sidebarHtml = $layout->render($data);

此代码将加载层,向其传递数据并执行渲染。
第一个参数'joomla.sidebars.submenu'指定需要加载的层,而不是必须的参数$basePath,表示从哪里加载。默认情况下从站点根目录的layout目录加载。

如果需要从组件加载层,可以这样操作

$layout = new JLayoutFile('my_layout', JPATH_ROOT .'/components/com_something/layouts');
$html = $layout->render($data);

此外,可以在模板中替换层。render方法会检查当前模板、layout目录中是否存在层,如果存在则使用它。例如,可以在文件中替换子菜单层 /administrator/templates/<模板>/html/layouts/joomla/sidebars/submenu.php

需要指出的是,在管理部分和用户部分使用不同的模板。

模板可以存储在任何地方,因为可以在使用时指定位置。然而,推荐的是将扩展存储在layout目录中

  • /administrator/components/com_example/layouts
  • /components/com_example/layouts
  • /plugins/content/example/layouts
  • /modules/mod_example/layouts

根目录的layout目录是Joomla本身预留的。

为了在模板中替换层,建议在layout目录内创建一个以扩展名命名的子目录,例如
/components/com_example/layouts/com_example

将层文件放置在此目录中(如果需要,可以在此目录内创建子目录并放置文件)。这样,层路径可以设置为com_example.my_layout,系统在模板替换时不会与另一个my_layout混淆。

自适应设计

由于使用了Twitter Bootstrap,现在可以比较简单地创建自适应设计模板,这些模板便于在各种设备上使用:台式计算机、平板电脑、智能手机等。为此,只需连接Twitter Bootstrap响应式组件。除了放置块,它还包含一个专门用于移动设备的导航菜单版本。

顺便说一下,新的Joomla管理面板已经适应了移动设备的使用,现在可以使用手机管理网站。

模块和插件

至于模块和插件,这里没有发生任何重大变化。但这并不意味着所有旧的插件和模块都会适用。可能会出现问题,但原因将是框架的变化。

在开发(或遇到旧插件问题)时需要注意的,是在事件onContentBeforeSave和onContentAfterSave中,参数$article现在按值传递,而不是按引用传递。这可能导致难以追踪的错误。

组件

关于组件的情况有些复杂。所有内置组件以及我审查的所有第三方组件都使用与Joomla 2.5兼容的模式。也就是说,在Joomla 3中有一个新的框架和新的MVC,但没有组件使用它(我找到了一个实验性的,实际上就是在这个新MVC上进行的实验,但它还处于初级阶段)。Joomla的开发者承诺在一年到两年内过渡到使用新的框架。因此,我将对讲座进行实践和理论两部分的划分。在这里,我将介绍Joomla 3组件的实践区别。

兼容性

尽管有人抱怨Joomla对旧版本的支持不足,但Joomla不仅支持旧版本,还支持后续版本。正是对旧版本的隐藏支持导致某些扩展从一个版本到另一个版本工作,发展,但突然停止工作,发现需要为当前版本的Joomla重写所有内容。

为了使2.5版本的组件能够在3.0版本下运行,需要进行的更改之一是将JController、JModel和JView类替换为JControllerLegacy、JModelLegacy和JViewLegacy。如果查看2.5版本的内置组件,它们已经使用了这些类。这就是向前兼容性。在2.5版本中,带Legacy后缀的类与普通类重复,只是为了开发人员能够创建可以在Joomla 3下以最小更改运行的扩展。

在内置组件中,这些更改非常小。主要变化包括

  • JRequest被替换为jFactory::getApplication()->input
    (控制器中的 $this->input).
  • JRequest仍然支持,但已被宣布为过时。
  • 在视图部分,使用的是直接赋值给属性 $this,而不是使用$thist->assignRef(模板现在在视图上下文中运行,因此视图的所有属性和方法都对其可用)。
  • 使用的是JEventDispatcher代替JDispatcher。
  • 扩展的内部模板已经重写,以使用Twitter Bootstrap。

在管理部分,子菜单现在显示在左侧,而不是顶部,需要自行处理显示。

$this->sidebar = JHtmlSidebar::render();

在其余代码中,需要使用JHtmlSidebar代替JSubMenuHelper。

在组件模板中插入

<?php if (!empty($this->sidebar)): ?>
    <div id="j-sidebar-container" class="span2">
        <?php echo $this->sidebar; ?>
    </div>
    <div id="j-main-container" class="span10">
<?php else : ?>
    <div id="j-main-container">
<?php endif;?>

组件的管理部分模板现在应该使用JUI和Twitter Bootstrap。

Joomla Platform 12.1

最大的兼容性问题将来自框架的变化。这里我只列出最显著的变化。

删除了常量DS

可以使用DIRECTORY_SEPARATOR

if(!defined('DS')){
        define('DS',DIRECTORY_SEPARATOR);
}

还将一些全局常量移动到了与之逻辑相关的类中。

从JObject继承

在前一个版本中,几乎所有类都从JObject继承。这是为了能够以PHP5风格处理这些类的对象。由于3.0版本的最小要求是PHP 5.3,因此这种需求已经不存在。

JObject

在JObject中删除了toString()方法,现在使用__toString()。

名称排序

一些类被重命名。例如,JFTP现在称为JClientFtp。
许多属性和方法之前以“_”开头。这种做法来自PHP4,用于表示“私有性”。现在这种需求已经不存在。

由大写字母组成的类名现在按照驼峰命名法重命名。然而,自动加载器仍然可以理解大写字母的书写。

从MooTools迁移到jQuery

现在使用JHtmlBehavior::framework()代替JHtmlBehavior::mootools()。

数据库可能不是仅限于MySQL

现在使用Jdate::toSql()代替JDate::toMysql()。

SendMail

删除了JUtility::sendMail()。请使用JMail::sendMail(),并使用JUtility::sendAdminMail()代替JMail::sendAdminMail()。

错误处理

在发生错误时,大多数方法现在不会返回false、JError对象或JException对象,而是抛出异常。JError和JException类已被宣布为过时。建议使用异常。

许多方法的参数已更改

Joomla 3.1和标签

在撰写本文时,已经发布了Joomla 3.1b3。

最显著的变化是引入了标签。这是一个期待已久的功能。标签在Joomla中是多功能性的,支持嵌套和多语言。它们不仅可以在内置组件中使用,还可以在自定义组件中使用。为此,只需使用类型为tag的字段即可。
标签选择可以工作在两种模式下:选择现有列表或自动选择——作者输入几个首字母,然后才会出现可以选择的列表,或者可以输入自己的。除了标签本身之外,还有一个单独的插件用于自动选择值,可以单独使用。

在这个版本中,首次应用了新的MVC,目前仅在安装程序中使用,它是一个独立的程序,因此无法基于它来研究扩展的创建。但可以查看如何创建单独的Web应用程序。

在 Joomla 社区杂志上发表的一些文章代表作者对特定主题的个人观点或经验,可能并不与 Joomla 项目官方立场一致。

0
你是 Joomla 用户吗?
 

评论

已经注册? 在此登录
尚未发表评论。成为第一个发表评论的人

通过接受,您将访问 https://magazine.joomla.net.cn/ 外部第三方提供的服务的链接