Joomla 3. 开发者新功能。理论部分。
在第一部分中,我讲述了创建和适配Joomla 3扩展的实用方面。你可能已经注意到,其中没有什么是根本性的新东西。原因在于Joomla 3如此之新,以至于甚至其虚构的扩展也是以兼容模式工作的。这一次,我们将讨论真正的新内容。如此之新,以至于目前还没有实际应用的示例。
新的MVC概念
MVC概念的变化如此之大,以至于在前面部分中提到,没有任何内置组件使用它。
有两个原因
- 将框架与CMS分离
- 拒绝所有数据都存储在数据库中,输出为HTML的约定
第一个意味着框架可以独立使用,无需CMS,并且可以用来创建其他应用程序。第二个意味着Joomla不仅可以用作创建网站,还可以用于创建各种服务,这些服务可以以不同格式输出数据。
在新的Joomla 3中,JController、JModel和JView不再是类,现在只是接口。基本类是JModelBase、JViewBase和JControllerBase。并且它们变得简单得多。现在其中没有任何魔法,所有需要执行的操作都必须明确指定。
但是增加了另一种魔法——现在不需要在所有地方插入jimport函数。在Joomla 3中实现了类的自动加载,并且在大多数情况下,它会自动加载所需的类,当需要时。
新的控制器成为单任务的。也就是说,一个控制器只执行一个任务,而多任务的控制器执行多个不同的任务。在视图中不再有魔法方法——与模型的工作是通过直接调用模型来完成的。而基本模型只能保持状态。
JModelAdmin、JModelForm、JModelItem和JModelList扩展类是兼容包的一部分。在文档中提到,大多数功能在新API中可用,但我无法找到它们。可能它们还没有实现,我们应该期待在后续版本中实现。
控制器
控制器的基本类是JControllerBase(尽管在需要时也可以仅继承JController接口)。
每个控制器只执行一个任务,例如:保存、删除、显示等。为此,在控制器中实现了execute方法。控制器名称按照其执行的任务命名。然而,每个控制器甚至模型都可以调用其他控制器的执行,从而实现HMVC的概念。实际上,开发者正是通过这种方式来解释单任务性——轻量级的控制器通过相互调用而无需额外功能来形成所需的功能。
如果您仍然偏好多任务控制器,则可以在execute方法中实现它。但这种方法不建议使用。
此外,现在控制器中不再存在重定向或与视图关联的display方法的魔法启动。也就是说,所有操作都必须明确指定。一方面,这要求编写更多的代码,但另一方面,它使代码更易于理解,并且对于处理AJAX请求,现在不需要在应用结束时强制关闭应用以避免添加更多代码。
class MyController extends JControllerBase
{
public function execute()
{
$model = new MyModel();
$paths = new SplPriorityQueue;
$paths->insert(JPATH_BASE.'/view/item/tmpl', 1);
$view = new MyView($model, $paths);
return $view->render();
// Для AJAX останній рядок можна замінити на:
// return json_encode($model->getItems());
}
}
模型
JModel接口要求类实现getState和setState方法。模型的基本类是JModelBase。在创建该类的实例时,可以通过JRegistry对象传递其状态,否则将调用loadState方法来加载状态。
正如您所看到的,基本模型也非常简单。没有数据库操作或其他方法。它只能保存状态和提供状态。这允许创建可以保存和获取数据的模型,这些数据不仅来自数据库,还可以来自任何其他来源,例如外部服务。
/**
* Модель без використання бази даних
*/
class MyModel extends JModelBase
{
public function getTime()
{
return time();
}
}
当然,如果框架不提供与数据库的工作,那么它就不会完整。因此,它包含扩展的基本模型JModelDatabase。与基本类唯一的区别是它包含一个属性db,该属性包含JDatabaseDriver对象。它可以与数据库进行操作。实际上,这就是同一个JDatabase。现在它支持多种数据库。
与表的操作没有变化。JTable及其派生类从先前版本迁移过来,没有重大变化。
/**
* Модель що використовує базу даних
*/
class MyModel extends JModelDatabase
{
public function getItems()
{
$q = $this->db->getQuery(true);
$q->select('*')->from($q->qn('#__mytable'));
$this->db->setQuery($q);
return $this->db->loadResult();
}
}
视图
JView接口要求存在escape和render方法。基本类在初始化时包含一个模型,该模型必须传递。也就是说,这里没有模板化或其他类似功能。开发者必须自行决定数据如何以及以何种形式显示。这在进行AJAX请求处理和其他服务实现时非常方便。
/**
* Вид для виводу JSON
*/
class MyJsonView extends JViewBase
{
public function render()
{
$data = array(
'items' => $this->model->getItems()
);
return json_encode($data);
}
}
如果输出需要是经典的html,则存在JViewHtml类。该类实现了render方法,其中实现了模板处理。实际上,实现非常简单,模板文件在视图上下文中被调用。因此,在视图中传递数据到模板不需要做任何事情——视图中的所有内容在模板中都是可用的。也就是说,在模板中可以访问视图的所有方法和属性。
根据新标准,视图文件应该命名为html.php、xml.php等。
不幸的是,在视图中需要自行传递搜索模板的路径列表。
新MVC的应用
如上所述,Joomla CMS目前还没有使用新版本的框架和MVC。开发者承诺在一年到两年内完全过渡到它。很可能会在CMS中描述上述类将被扩展到更强大的功能。
我找到了一个使用新MVC的唯一的教程-实验性项目 - Lendr(英文)
新有用的库
在有趣的新功能中,包括Google API的Google库。可以轻松创建新的Google日历、新的Picasa相册或组织与Google+的交互。当然,还有用于Google Maps操作的类。
还添加了OAuth2协议的客户。这意味着您可以与大多数现代服务进行交互。其中包括VKontakte、Одноклассники、Facebook。目前没有对这些服务的支持,但协议允许组织支持。
未来期待什么
目前正在进行Joomla框架的开发工作——这在某种程度上是Joomla平台的下一代。主要区别在于命名空间和通过Composer进行安装。这些框架的名称很好地反映了其本质。Joomla平台是Joomla的底层平台,是Joomla CMS的基础。从理论上讲,它允许创建其他应用程序,但实际上只有3个,即Joomla安装程序和两个CMS组件:Joomla管理员和Joomla站点。Joomla框架是将框架进一步独立为独立项目的举措。它意味着从单体结构中分离出来,并在独立组件上构建框架。
但这并不意味着Joomla平台将消失。今年计划发布Joomla平台13版本。更重要的是,在最近的Joomla CMS版本中,我们将看不到Joomla框架,其当前的架构尚未准备好进行迁移。它仍然会使用和发展Joomla平台。
这样的调整看起来有些奇怪,但实际上很有逻辑——同时发布框架和基于该框架的产品是很困难的。因此,框架将先发布,然后才是基于框架构建的CMS。
本社区杂志上发表的一些文章代表了作者对特定主题的个人观点或经验,可能并不符合Joomla项目的官方立场。
通过接受,您将访问https://magazine.joomla.net.cn/之外的第三方外部服务
评论