我正在为Joomla 2.5创建一个MVC组件作为我构建的另一个PHP数据库系统的前端。我不是仅仅将其他系统的Web界面包装在包装器组件中,而是构建一个本地Joomla组件,用于在其他系统的类中调用方法。
因此我在我的一个视图中实现了一个HTML表单,它显然可以接受一些输入,但也可以上传文件。从这里开始,组件应该将此输入发送到我的类处理它的方法,然后响应将被提供给第二个Joomla组件视图。
在我看来,输入的处理应该在模型中完成,并且可能接收处理的输出也应该由模型完成。然后,Controller会将模型数据提供给第二个视图?
我已经完成了开发MVC组件教程,但它并没有真正让我对这应该如何工作有很多想法。任何人都可以给我一个粗略的psuedocode想法,它应该如何组合在一起,或者指向一个适当的教程或另一个做类似事情的组件的例子?
答案 0 :(得分:2)
简短回答,是您的模型应处理所有检索和保存项目详细信息,即数据库中的行或物理文件。
因此,为了获得更长的答案,请以com_content
的方式为例。
在前端,您可以创建一篇新文章(例如,通过“用户菜单”中的“提交文章”项目)。这是作为GET
请求发送的,其值类似于:
format="html"
itemid="999"
option="com_content"
view="form"
layout="edit"
此请求的行程如下:
index.php
收到请求并
com_content/content.php
在需要组件时调用(即com_content入口点)。
content.php
通过JController
课程创建控制器。
JController
查看输入(即原始GET
请求中发送的params),找出它所在的组件并尝试首先加载名为controller.php
的文件extensions文件夹然后在该文件中查找合适的类。 (在这种情况下为ContentController
)
content.php
然后告诉$controller
对象使用相关任务调用execute()
,使用此$controller->execute(JRequest::getCmd('task'));
从GET
请求中可以看出,在这种情况下没有设置task
,因此使用__default
任务($doTask = $this->taskMap['__default'];
)在JController中,默认任务默认为display
,除非您覆盖它。
这会导致调用display()
类(ContentController
)中的com_content/controller.php
方法。
经过一些基本检查display()
然后调用自己的parent
版本,即parent::display($cachable, $safeurlparams);
JContoller
版本的display()
执行所有基本工作,例如获取视图名称(form
)和布局(edit
)并使用它们加载右视图对象(ContentViewForm
)。
然后加载模型&将其作为默认模型添加到视图中。 (在这种情况下,模型为contentModelForm
)它根据视图名称(form
)和组件的model_prefix
加载右模型。 model_prefix
JController
在其__construct()
方法中设置display()
,方法是使用“内容”组件的名称。将“模型”附加到其上。
经过多次设置后,将调用视图ContentViewForm
的{{1}}方法,这是模型数据加载的位置(如果我们正在编辑文章,则调用相同的model会根据包含文章标识GET
的{{1}}中的额外参数加载现有文章。
此时还会加载文章a_id=99
( form
),以便在com_content/models/forms/article.xml
文件tmpl
中使用。
因此,要设置输入端,edit.php
字段来自模型(虽然是新文章的空模型),字段的属性在匹配表单的模型中定义。
保存对Article表单的更改采用了非常相似的路径。
content
部分包含您的文章ID(GET
)以及指向您组件中的Joomla的选项参数(a_id=99
)
option="com_content"
部分包含表单(POST
)作为数组,正在执行的任务(jform
)和其他一些内务处理参数
因此,task=article.save
此次实例化的控制器类型为JController
,其扩展ContentControllerArticle
(用于处理表单提交等)。
请记住,点符号任务值的格式为 [sub] controller.method 。
JControllerForm
对象的save()
方法在调用ContentControllerArticle
中的父save()
方法之前会被短暂调用。
此时,JControllerForm
方法执行诸如检查访问权限,根据表单中定义的任何验证验证数据,然后加载模型并将表单数据传递给模型save()
之类的操作。方法
这有帮助吗?
答案 1 :(得分:1)
我认为您不需要使用该模型来检索数据。它应该在控制器部分完成。
假设以下是一个函数是一个控制器(你可以将此函数称为任务)。
public function someFunction(){
// retrive data from the form coming via $_POST (and consider sanitizing it)
$data = JFactory::getApplication()->input->get('id', null, 'post');
/*get model. You can call any model you want.
You can even call multiple models using this function
*/such as $model2 = getModel('SecondModel'); $model3 = getModel('ThirdModel');
$model = $this->getModel('FirstModel'); //FirstModel should be an existing model
$model->save($data);
$formatted_data = $model->getData();
$view=& $this->getView('OtherView','html'); //call any view you like
$layout=JRequest::getVar('tmpl','default'); //instead of default you can use other template you prepared (such as edit...)
$view->setLayout($layout); //bind the layout to the view
//Pass the value to view. You can access this value in view as $this->formatted_data; later
$view->set('formatted_data',$formatted_data);
/*Call the view's display.
If you prepare other function in your view other than display,
you can use this function too. e.g. $view->display_report();
But make sure you call parent::display() inside the function.
*/
$view->display();
}