Model view controller Joomla术语:视图、布局、任务和组件开发
我是一名开发人员,我对MVC模式非常有信心,并且已经使用php框架(如symfony或yii)从头开发了很多webapp 我对joomla mvc和术语有点困惑,在谷歌搜索了很多之后,阅读了joomla图书扩展指南,在joomla网站上阅读了我的疑问仍然存在 让我困惑的是组件mvc结构,以及我必须如何建立关于joomla mvc的“我的思维方式”,以便以joomla的方式做事 特别是,我习惯于根据控制器/动作进行推理(如symfony和yii框架) 因此,我的所有webapp url的最终列表将是Model view controller Joomla术语:视图、布局、任务和组件开发,model-view-controller,joomla,components,Model View Controller,Joomla,Components,我是一名开发人员,我对MVC模式非常有信心,并且已经使用php框架(如symfony或yii)从头开发了很多webapp 我对joomla mvc和术语有点困惑,在谷歌搜索了很多之后,阅读了joomla图书扩展指南,在joomla网站上阅读了我的疑问仍然存在 让我困惑的是组件mvc结构,以及我必须如何建立关于joomla mvc的“我的思维方式”,以便以joomla的方式做事 特别是,我习惯于根据控制器/动作进行推理(如symfony和yii框架) 因此,我的所有webapp url的最终列表将
controller1/action1
controller1/action2
controller1/action3
controller2/action1
controller2/action2
每个控制器的操作将决定要渲染的视图以及用于显示视图的布局。
特别是在这些框架中,布局的定义正是布局的平均值。视图是页面的“核心部分”
因此,我可以拥有一个包含用户列表的视图,我可以将此视图放在移动布局或桌面布局中,或者为移动构建一个视图,并仅将其放在移动布局中,等等
关于my webapp中目录结构的最终结果类似于以下内容:
controllers/
controller1
controller2
controller3
models/
modelForTableA
modelForTableB
views/
controller1/
viewForAction1
viewForAction2
layouts/
mobileLayout.php
desktopLayout.php
对我来说,这是非常清楚的理解
最后,我的问题是:
- joomla中的目录结构如何
- joomla对视图、布局和任务的定义是什么
controllers/
controller1
controller2
controller3
models/
modelForTableA
modelForTableB
views/
layout1
2) 视图、布局和任务
检查这个
3) 更多的路由与SEF
希望有帮助。小洞察
1) 目录结构
controllers/
controller1
controller2
controller3
models/
modelForTableA
modelForTableB
views/
layout1
2) 视图、布局和任务
检查这个
3) 更多的路由与SEF
希望有帮助。若姆拉的路线略有不同。SEF URL是从菜单项构建的,菜单项依次指向视图/布局组合。
这就扭转了局面:控制器没有绑定到特定的视图/布局 让我们以您提到的
addUser
功能为例来说明流程;我将参考这些文件(但您将有更多):
如您所见,布局位于每个视图的tmpl
文件夹中
router.php
让我们从最后一个文件开始:router.php
定义了我们的自定义SEF规则,因此,在Joomla将调用传递给我们的组件(通常使用参数
?option=com\u componentname
)我们可以根据需要接管和解释URL。这是一个有点难开始,但确实提供了最大的灵活性和力量。对于这个简单的例子,我们根本不需要实现它:现在回到我们的注册
第一步:显示“新用户”表单。
您通常会将其绑定到一个菜单项,指向/views/useradd/tmpl/default.php
;/views/useradd/tmpl/default.xml
包含布局的定义,因此它在菜单管理器中可用。通常每个视图只有一个布局
控件传递给view/views/useradd/view.html.php,然后视图将加载自己模型的实例(根据视图名称自动选择,当然可以加载其他模型)以收集任何初始化数据
然后视图呈现布局,并将其呈现给用户。
布局的职责包括生成具有适当的操作(端点)和安全令牌(如果适用)的表单:
<form action="index.php?option=com_mycomponent">
<input type="hidden" task="user.save">
<?php echo JHtml::_('form.token');?>
后跟任何其他参数。这将在get和post中都起作用
controller/controllers/user.php
的emailAvailable()
方法将返回一个json
结构,然后调用exit()
,因为我们根本不希望CMS启动。另一种解决方案是在调用中添加param&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在视图渲染期间激发多个事件;这些可以被一个系统插件截获,或者——如果你添加了调用——其他类型的插件也可以截获。您甚至可以创建自己类型的插件。不要试图从控制器手动实例化视图,因为这可能会抑制插件启动。Joomla中的路由略有不同。SEF URL是从菜单项构建的,菜单项依次指向视图/布局组合。
这就扭转了局面:控制器没有绑定到特定的视图/布局
让我们以您提到的addUser
功能为例来说明流程;我将参考这些文件(但您将有更多):
如您所见,布局位于每个视图的tmpl
文件夹中
router.php
让我们从最后一个文件开始:router.php
定义了我们的自定义SEF规则,所以在Jooml之后
{"email":"johndoe@example.com", "available":true}
$this->setRedirect(JRoute::_('index.php?option=com_yourcomponent&view=useradd', false));