我是一名开发人员,我对MVC模式很有信心,并且已经从零开始开发了很多webapp,使用了php框架,比如symfony或yii。
我对joomla和术语有点困惑,在谷歌了很多之后,阅读joomla图书扩展指南,在joomla网站上阅读我的怀疑仍然存在。
让我困惑的是组件mvc结构,以及我如何设置joomla的“我的思考方式”,以便以joomla的方式完成工作。
特别是,我习惯于从控制器/行动的角度进行推理(如symfony和yii框架)。
因此,我所有url应用程序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对我来说很清楚。
最后,我的问题是:
我需要澄清的是,我不需要解释MVC的一般工作,但如果我要取得与以前相同的结果,我必须如何组织我的代码和我的工作?
假设我想用下面的"url“构建一个组件
userController/addUser
userController/editUser
userController/listUsers
userController/viewUserDetail
anotherController/addOperation
anotherController/editOperation
anotherController/myNonCrudOperation非常感谢
发布于 2017-01-08 18:11:59
用这个解决了。我不能删除这个问题,因为已经有其他答案了。任何版主可以关闭或删除这一点吗?谢谢
发布于 2017-01-06 09:18:08
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;/views/useradd/tmpl/default.xml包含布局的定义,因此它在菜单管理器中可用。很多时候,每个视图只有一个布局。
控件传递给view / view /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中的方法/controllers/user.php
对此类功能进行索引是没有意义的,因此我们将直接使用非SEF url调用该方法:
index.php?option=com_ourcomponent&task=user.emailAvailable 后面跟着任何其他参数。这将在get和post中都有效。
控制器/controllers/user.php的emailAvailable()方法将返回json结构,然后调用exit(),因为我们根本不希望CMS启动。另一种解决方案是在调用中添加param &format=json。
{"email":"johndoe@example.com", "available":true}保存数据
当用户提交表单时,处理首先由控制器处理,因为指定了任务。(见上文task=user.save)。Joomla将在控制器save()中调用/controllers/user.php方法。
然而,这一次,我们的控制器负责向用户返回信息。在处理数据之后,它可以选择重新呈现显示错误的注册表单或感谢页面。在任何一种情况下,控制器只是设置重定向,让Joomla在适当的时候处理呈现。
$this->setRedirect(JRoute::_('index.php?option=com_yourcomponent&view=useradd', false));更多控制
每次没有指定控制器任务时,都会调用主控制器的display()方法。您可以在那里添加自定义逻辑。
Joomla在视图呈现过程中触发几个事件;这些事件可以被系统插件拦截,或者--如果添加调用--其他类型的插件也可以拦截。您甚至可以创建自己的插件类型。不要尝试从控制器手动实例化视图,因为这可能会抑制插件的触发。
https://stackoverflow.com/questions/41484864
复制相似问题