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



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

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

让我困惑的是组件mvc结构,以及我如何设置关于joomlamvc的"我的思考方式",以joomla的方式做事。

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

所以我的所有网络应用程序url的最终列表将是

controller1/action1
controller1/action2
controller1/action3
controller2/action1
controller2/action2

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

所以我可以有一个用户列表的视图,我可以把这个视图放在移动布局或桌面布局中,或者为移动构建一个视图,只放在手机布局中,等等

关于我的网络应用程序中目录结构的最终结果类似于以下内容:

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中的路由略有不同。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将调用传递给我们的组件(通常带有params?option=com_componentname),我们可以随心所欲地接管和解释URL。这有点难上手,但确实提供了最大的灵活性和力量。对于这个简单的例子,我们根本不需要实现它:所以现在回到我们的注册。

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

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

控件被传递给view/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上使用<input或params其实并不重要,您通常可以将它们混合使用。

表单交互

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

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

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

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

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

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

保存数据

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

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

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

更多控制

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

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

小型洞察,

1) 目录结构

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

2) 查看和布局以及任务

检查这个答案

3) SEF的更多路由技术。

希望能有所帮助。

使用此解决方案。我不能删除这个问题,因为已经有其他答案了。是否有主持人可以关闭或删除此内容?谢谢

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

最新更新