首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Joomla术语:视图、布局、任务和组件开发

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

Stack Overflow用户
提问于 2017-01-05 12:14:01
回答 3查看 640关注 0票数 0

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

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

让我困惑的是组件mvc结构,以及我如何设置joomla的“我的思考方式”,以便以joomla的方式完成工作。

特别是,我习惯于从控制器/行动的角度进行推理(如symfony和yii框架)。

因此,我所有url应用程序url的最终列表将是

代码语言:javascript
复制
 controller1/action1
 controller1/action2
 controller1/action3

 controller2/action1
 controller2/action2

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

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

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

代码语言:javascript
复制
 controllers/
    controller1
    controller2
    controller3
models/
    modelForTableA
    modelForTableB
views/
   controller1/
     viewForAction1
     viewForAction2
layouts/
    mobileLayout.php
    desktopLayout.php

对我来说很清楚。

最后,我的问题是:

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

我需要澄清的是,我不需要解释MVC的一般工作,但如果我要取得与以前相同的结果,我必须如何组织我的代码和我的工作?

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

代码语言:javascript
复制
userController/addUser
userController/editUser
userController/listUsers
userController/viewUserDetail

anotherController/addOperation
anotherController/editOperation
anotherController/myNonCrudOperation

非常感谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-01-08 18:11:59

用这个解决了。我不能删除这个问题,因为已经有其他答案了。任何版主可以关闭或删除这一点吗?谢谢

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

票数 0
EN

Stack Overflow用户

发布于 2017-01-06 09:18:08

Joomla中的路由略有不同。SEF URL是从菜单项构建的,菜单项依次指向视图/布局组合。

这改变了情况:控制器不绑定到特定的视图/布局。

让我们以您提到的addUser功能为例,给出一个流的例子;我将引用这些文件(但您将有更多的文件):

代码语言:javascript
复制
/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 (端点)和安全令牌(如果适当的话)的表单:

代码语言:javascript
复制
<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调用该方法:

代码语言:javascript
复制
index.php?option=com_ourcomponent&task=user.emailAvailable 

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

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

代码语言:javascript
复制
{"email":"johndoe@example.com", "available":true}

保存数据

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

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

代码语言:javascript
复制
$this->setRedirect(JRoute::_('index.php?option=com_yourcomponent&view=useradd', false));

更多控制

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

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

票数 2
EN

Stack Overflow用户

发布于 2017-01-05 12:30:42

小小的洞察力

1)目录结构

代码语言:javascript
复制
  controllers/
        controller1
        controller2
        controller3
    models/
        modelForTableA
        modelForTableB
    views/
       layout1

2)视图、布局和任务

检查这个回答

3)更多的采用标准SEF的技法路由。

希望能帮上忙。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41484864

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档