Joomla 术语:视图、布局、任务和组件开发

Posted

技术标签:

【中文标题】Joomla 术语:视图、布局、任务和组件开发【英文标题】:Joomla Terminology: view, layout, task and component development 【发布时间】:2017-05-19 23:40:14 【问题描述】:

我是一名开发人员,我对 MVC 模式非常有信心,并且已经使用 symfony 或 yii 等 php 框架从头开发了很多 webapp。

我对 joomla mvc 和术语有点困惑,在谷歌搜索了很多之后,阅读 joomla 书籍扩展指南,在 joomla 网站上阅读我的疑问仍然存在。

让我感到困惑的是组件 mvc 结构以及我必须如何设置关于 joomla mvc 的“我的思维方式”,以便以 joomla 方式做事。

特别是我习惯于根据控制器/动作进行推理(如在 symfony 和 yii 框架中)

所以我所有的 webapp url 的最终列表将是

 controller1/action1
 controller1/action2
 controller1/action3

 controller2/action1
 controller2/action2

每个控制器的操作将决定要渲染的视图以及用于显示视图的布局。 特别是在这些框架中,布局的定义正是布局的意思。而视图是页面的“核心部分”。

所以我可以有一个包含用户列表的视图,我可以将此视图放在移动布局或桌面布局中,或者为移动构建一个视图并将其仅放在移动布局中等等。

关于我的 webapp 中目录结构的最终结果类似于以下内容:

 controllers/
    controller1
    controller2
    controller3
models/
    modelForTableA
    modelForTableB
views/
   controller1/
     viewForAction1
     viewForAction2
layouts/
    mobileLayout.php
    desktopLayout.php

对我来说很清楚明白。

所以最后我的问题是:

joomla 中的目录结构如何? joomla 中视图、布局和任务的定义是什么?

我需要澄清一下,我通常不需要解释 MVC 的工作原理,但如果我能达到与以前相同的结果,我必须如何组织我的代码和工作?

假设我想用下面的“url”构建一个组件

userController/addUser
userController/editUser
userController/listUsers
userController/viewUserDetail

anotherController/addOperation
anotherController/editOperation
anotherController/myNonCrudOperation

非常感谢

【问题讨论】:

同样的问题也被问到了:joomla.stackexchange.com/q/18774/120 我已经在joomla.stackexchange.com/a/18799/8261重复回答了这个问题 请查看joomla.stackexchange.com/a/18799/8261 以获得解释 【参考方案1】:

Joomla 中的路由略有不同。 SEF URL 是从菜单项构建的,这些菜单项又指向视图/布局组合。 这扭转了局面:控制器未绑定到特定的视图/布局。

让我们以您提到的addUser 功能为例来做一个流程示例;我将参考这些文件(但你会有更多):

/controllers/user.php
/models/user.php
/views/useradd/view.html.php
/views/useradd/tmpl/default.php
/views/useradd/tmpl/default.xml
/controller.php
/router.php

如您所见,布局位于每个视图的 tmpl 文件夹内。

router.php

让我们从最后一个文件开始:router.php 定义了我们的自定义 SEF 规则,因此,在 Joomla 将调用传递给我们的组件之后(通常使用参数 ?option=com_componentname) 我们可以根据需要接管和解释 URL。入门有点困难,但确实提供了最大的灵活性和功能。对于这个简单的示例,我们根本不需要实现它:现在回到我们的注册。

第一步:显示“新用户”表单。

您通常会将其绑定到菜单项,指向/views/useradd/tmpl/default.php/views/useradd/tmpl/default.xml 包含布局的定义,因此它在菜单管理器中可用。很多时候,每个视图只有一个布局。

控制权传递给视图 /views/useradd/view.html.php ,然后视图会加载自己模型的实例(根据视图名称自动选择,当然你也可以加载其他模型)收集任何初始化数据。

视图然后呈现布局,并将其呈现给用户。 布局的职责包括生成带有适当action(端点)和安全令牌(如果适当)的表单:

<form action="index.php?option=com_mycomponent">
<input type="hidden" task="user.save">
<?php echo JHtml::_('form.token');?>

如您所见,是否要在 url 上使用 &lt;input 或参数并不重要,您通常可以混合使用它们。

表单交互

对于自动完成,表单可能需要调用一些后端控制器方法,即/controllers/user.php 中的方法emailAvailable()

对这样的功能进行索引是没有意义的,所以我们将直接使用非 SEF url 调用该方法:

index.php?option=com_ourcomponent&task=user.emailAvailable 

后跟任何其他参数。这在 get 和 post 中都有效。

控制器/controllers/user.phpemailAvailable() 方法将返回json 结构,然后调用exit(),因为我们根本不希望CMS 启动。另一种解决方案是在调用中添加参数&amp;format=json

"email":"johndoe@example.com", "available":true

保存数据

当用户提交表单时,处理首先由控制器处理,因为指定了任务。 (见上文task=user.save)。 Joomla 将调用控制器/controllers/user.php 中的方法save()

不过,这一次,我们的控制器负责将信息返回给用户。处理完数据后,它可能会选择重新呈现显示错误的注册表单或感谢页面。在任何一种情况下,控制器都会简单地设置重定向,让 Joomla 在适当的时候处理渲染。

$this->setRedirect(JRoute::_('index.php?option=com_yourcomponent&view=useradd', false));

更多控制

每次未指定控制器任务时,都会调用主控制器的display() 方法。您可以在那里添加自定义逻辑。

Joomla 在视图渲染期间触发几个事件;这些可以被系统插件拦截,或者 - 如果您添加调用 - 其他类型的插件也是如此。您甚至可以创建自己的插件类型。不要尝试从控制器手动实例化视图,因为这可能会阻止插件触发。

【讨论】:

【参考方案2】:

小见解,

1) 目录结构

  controllers/
        controller1
        controller2
        controller3
    models/
        modelForTableA
        modelForTableB
    views/
       layout1

2) 视图和布局和任务

检查这个answer

3) 更多路由techniques 与 SEF。

希望对你有帮助。

【讨论】:

看来,参考url是如何写的:option=COMPONENT_NAME&view=CONTROLLER_NAME&layout=IS_MY_ACTION?对吗? 虽然有用,但没有回答我的问题 No like this index.php?option=com_users&amp;task=registration.register here is task is registartion.register 表示控制器名称 registration 和方法名称 register。布局是视图子项【参考方案3】:

解决了这个问题。我无法删除此问题,因为已经存在其他答案。 版主可以关闭或删除这个吗?谢谢

https://joomla.stackexchange.com/questions/18774/joomla-terminology-view-layout-task-and-component-development/18799#18799

【讨论】:

以上是关于Joomla 术语:视图、布局、任务和组件开发的主要内容,如果未能解决你的问题,请参考以下文章

Joomla 自定义组件需要创建菜单

在 Joomla 2.5 中更改视图布局

试图在 Joomla 的新组件中添加第二个视图! 3.x

Joomla 后端 - 执行任务后重定向到不同的视图

如何在自定义组件视图中添加 joomla 编辑器但不使用 XML 表单字段?

Joomla 组件多视图