我正在为Joomla 2.5创建一个MVC组件,作为我构建的另一个PHP数据库系统的前端。我正在构建一个本地Joomla组件,该组件可以在其他系统的类中调用方法,而不是仅仅在包装器组件中包装其他系统的web接口。
因此,我在我的一个视图中实现了一个HTML表单,它显然是为了接受一些输入,但也可以上传文件。从这里开始,组件应该将此输入发送到我的类的方法进行处理,然后将响应馈送到第二个Joomla组件视图。
在我看来,输入的处理应该在模型中完成,可能接收处理后的输出也应该由模型完成。控制器然后将模型数据馈送到第二个视图?
我已经学习了"开发MVC组件"教程,但它并没有真正让我了解它应该如何工作。有人能给我一个大致的伪代码概念,告诉我应该如何将其组合在一起吗?或者给我指一个合适的教程或另一个做类似事情的组件的例子吗?
简言之,是您的模型应该处理项目详细信息的所有检索和保存,即它在数据库或物理文件中的行。
因此,对于更长的答案,以com_content
的工作方式为例。
在前端,您可以创建一篇新文章(例如,通过"用户菜单"的"提交文章"项目)。这是作为GET
请求发送的,其值类似于:
format="html"
itemid="999"
option="com_content"
view="form"
layout="edit"
此请求的发送方式如下:
index.php
接收请求和当需要组件时(即com_content入口点)调用
com_content/content.php
。content.php
通过JController
类创建控制器。JController
查看输入(即原始GET
请求中发送的参数),找出它在哪个组件中,并尝试首先在扩展文件夹中加载一个名为controller.php
的文件,然后在该文件中查找合适的类。(在这种情况下为ContentController
)content.php
然后告诉$controller
对象使用该$controller->execute(JRequest::getCmd('task'));
调用具有相关任务的execute()
从
GET
请求中可以看出,在这种情况下没有设置task
,因此使用__default
任务($doTask = $this->taskMap['__default'];
)在JController中,默认任务默认为display
,除非您覆盖它。这导致调用
ContentController
类(com_content/controller.php
)中的display()
方法。在一些基本检查之后,
display()
然后调用其自身的parent
版本,即parent::display($cachable, $safeurlparams);
display()
的JContoller
版本完成了所有的基本工作,如获取视图名称(form
)和布局(edit
),并使用它们加载右视图对象(ContentViewForm
)。然后加载模型&将其作为默认模型添加到视图中。(在这种情况下,模型为
contentModelForm
)它根据视图名称(form
)和组件的model_prefix
加载右侧模型。model_prefix
是由JController
在其__construct()
方法期间通过采用组件名称"Content"&附加"模型"。经过更多设置后,将调用视图
ContentViewForm
的display()
方法,即加载模型数据的位置(如果我们正在编辑一篇文章,则对模型的相同调用将基于包含文章ida_id=99
的GET
中的额外参数加载现有文章)
此时,它还加载文章form
(com_content/models/forms/article.xml
),以便在tmpl
文件edit.php
中使用
因此,为了设置输入端,content
字段来自模型(尽管是新文章的空模型),并且字段的属性在模型匹配表单中定义
保存对条款形式的更改采用了非常相似的路径。
请求的
GET
部分包含您的文章id(a_id=99
)和将Joomla指向您的组件(option="com_content"
)的选项参数POST
部分包含作为数组的形式(jform
)、正在执行的任务(task=article.save
)和一些其他内务参数。因此,
JController
这次实例化的控制器类型是扩展JControllerForm
(用于处理表单提交等)的ContentControllerArticle
请记住,点号任务值的形式为[sub]控制器。方法.ContentControllerArticle
对象的save()
方法在JControllerForm
中调用其父save()
方法之前会被短暂调用。此时,
save()
方法执行一些操作,如检查访问权限、根据表单中定义的任何验证验证数据,然后加载模型并将表单数据传递给模型save()
方法。
这有帮助吗?
我认为您不需要使用该模型来检索数据。这应该在控制器部分完成。
假设以下是一个函数是一个控制器(您可以将此函数作为任务调用)。
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();
}