接受Joomla前端的表单输入到单独的系统


Accepting form input in Joomla front end to separate system

我正在为Joomla 2.5创建一个MVC组件,作为我构建的另一个PHP数据库系统的前端。我正在构建一个本地Joomla组件,该组件可以在其他系统的类中调用方法,而不是仅仅在包装器组件中包装其他系统的web接口。

因此,我在我的一个视图中实现了一个HTML表单,它显然是为了接受一些输入,但也可以上传文件。从这里开始,组件应该将此输入发送到我的类的方法进行处理,然后将响应馈送到第二个Joomla组件视图。

在我看来,输入的处理应该在模型中完成,可能接收处理后的输出也应该由模型完成。控制器然后将模型数据馈送到第二个视图?

我已经学习了"开发MVC组件"教程,但它并没有真正让我了解它应该如何工作。有人能给我一个大致的伪代码概念,告诉我应该如何将其组合在一起吗?或者给我指一个合适的教程或另一个做类似事情的组件的例子吗?

简言之,您的模型应该处理项目详细信息的所有检索和保存,即它在数据库或物理文件中的行。

因此,对于更长的答案,以com_content的工作方式为例。

在前端,您可以创建一篇新文章(例如,通过"用户菜单"的"提交文章"项目)。这是作为GET请求发送的,其值类似于:

format="html"
itemid="999"
option="com_content"
view="form"
layout="edit"

此请求的发送方式如下:

  1. index.php接收请求和

  2. 当需要组件时(即com_content入口点)调用com_content/content.php

  3. content.php通过JController类创建控制器。

  4. JController查看输入(即原始GET请求中发送的参数),找出它在哪个组件中,并尝试首先在扩展文件夹中加载一个名为controller.php的文件,然后在该文件中查找合适的类。(在这种情况下为ContentController

  5. content.php然后告诉$controller对象使用该$controller->execute(JRequest::getCmd('task')); 调用具有相关任务的execute()

  6. GET请求中可以看出,在这种情况下没有设置task,因此使用__default任务($doTask = $this->taskMap['__default'];在JController中,默认任务默认为display,除非您覆盖它。

  7. 这导致调用ContentController类(com_content/controller.php)中的display()方法。

  8. 在一些基本检查之后,display()然后调用其自身的parent版本,即parent::display($cachable, $safeurlparams);

  9. display()JContoller版本完成了所有的基本工作,如获取视图名称(form)和布局(edit),并使用它们加载右视图对象(ContentViewForm)。

  10. 然后加载模型&将其作为默认模型添加到视图中。(在这种情况下,模型为contentModelForm它根据视图名称(form)和组件的model_prefix加载右侧模型。model_prefix是由JController在其__construct()方法期间通过采用组件名称"Content"&附加"模型"。

  11. 经过更多设置后,将调用视图ContentViewFormdisplay()方法,即加载模型数据的位置(如果我们正在编辑一篇文章,则对模型的相同调用将基于包含文章id a_id=99GET中的额外参数加载现有文章)
    此时,它还加载文章formcom_content/models/forms/article.xml),以便在tmpl文件edit.php中使用

因此,为了设置输入端,content字段来自模型(尽管是新文章的空模型),并且字段的属性在模型匹配表单中定义

保存对条款形式的更改采用了非常相似的路径。

  1. 请求的GET部分包含您的文章id(a_id=99)和将Joomla指向您的组件(option="com_content")的选项参数

  2. POST部分包含作为数组的形式(jform、正在执行的任务(task=article.save)和一些其他内务参数。

  3. 因此,JController这次实例化的控制器类型是扩展JControllerForm(用于处理表单提交等)的ContentControllerArticle
    请记住,点号任务值的形式为[sub]控制器。方法.

  4. ContentControllerArticle对象的save()方法在JControllerForm中调用其父save()方法之前会被短暂调用。

  5. 此时,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();
}