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

时间:2013-09-04 21:46:02

标签: php joomla joomla2.5 joomla-component

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

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

在我看来,输入的处理应该在模型中完成,并且可能接收处理的输出也应该由模型完成。然后,Controller会将模型数据提供给第二个视图?

我已经完成了开发MVC组件教程,但它并没有真正让我对这应该如何工作有很多想法。任何人都可以给我一个粗略的psuedocode想法,它应该如何组合在一起,或者指向一个适当的教程或另一个做类似事情的组件的例子?

2 个答案:

答案 0 :(得分:2)

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

因此,为了获得更长的答案,请以com_content的方式为例。

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

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

此请求的行程如下:

  1. index.php收到请求并

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

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

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

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

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

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

  8. 经过一些基本检查display()然后调用自己的parent版本,即parent::display($cachable, $safeurlparams);

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

  10. 然后加载模型&将其作为默认模型添加到视图中。 (在这种情况下,模型为contentModelForm它根据视图名称(form)和组件的model_prefix加载模型。 model_prefix JController在其__construct()方法中设置display(),方法是使用“内容”组件的名称。将“模型”附加到其上。

  11. 经过多次设置后,将调用视图ContentViewForm的{​​{1}}方法,这是模型数据加载的位置(如果我们正在编辑文章,则调用相同的model会根据包含文章标识GET的{​​{1}}中的额外参数加载现有文章。
    此时还会加载文章a_id=99 form ),以便在com_content/models/forms/article.xml文件tmpl中使用。

  12. 因此,要设置输入端,edit.php字段来自模型(虽然是新文章的空模型),字段的属性在匹配表单的模型中定义。

    保存对Article表单的更改采用了非常相似的路径。

      请求的
    1. content部分包含您的文章ID(GET)以及指向您组件中的Joomla的选项参数(a_id=99

    2. option="com_content"部分包含表单(POST作为数组,正在执行的任务(jform)和其他一些内务处理参数

    3. 因此,task=article.save此次实例化的控制器类型为JController,其扩展ContentControllerArticle(用于处理表单提交等)。
      请记住,点符号任务值的格式为 [sub] controller.method

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

    5. 此时,JControllerForm方法执行诸如检查访问权限,根据表单中定义的任何验证验证数据,然后加载模型并将表单数据传递给模型save()之类的操作。方法

    6. 这有帮助吗?

答案 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();
}