【问题标题】:Accepting form input in Joomla front end to separate system在 Joomla 前端接受表单输入以分离系统
【发布时间】:2013-09-08 13:54:05
【问题描述】:

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

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

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

我已经阅读了开发 MVC 组件教程,但它并没有真正让我了解它应该如何工作。谁能给我一个粗略的伪代码想法,告诉我这应该如何组合在一起,或者指出一个适当的教程或另一个做类似事情的组件的示例?

【问题讨论】:

  • 我的印象是控制器盲目地处理数据,而模型处理要传递回视图的数据的逻辑/处理。据我了解,您的过程通过将数据直接传递给模型而完全丢失了控制器

标签: php joomla joomla2.5 joomla-component


【解决方案1】:

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

因此,对于更长的答案,以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 请求中发送的参数),找出它所在的组件并尝试首先在扩展文件夹中加载一个名为controller.php 的文件,然后查看在该文件中找到合适的类。 (在这种情况下ContentController

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

  6. 1234563到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 加载 right 模型。 model_prefixJController 在其 __construct() 方法期间设置,通过获取组件“内容”的名称并将“模型”附加到它。

  11. 经过更多设置后,视图 ContentViewFormdisplay() 方法被调用,这是加载模型数据的地方(如果我们正在编辑文章,对模型的相同调用将加载基于 GET 中包含文章 ID a_id=99 的额外参数的现有文章。
    此时它还会加载文章 form (com_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 实例化的控制器类型是 ContentControllerArticle,它扩展了 JControllerForm(用于处理表单提交等)。
    请记住点符号任务值的格式为 [sub]controller.method

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

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

这有帮助吗?

【讨论】:

    【解决方案2】:

    我认为您不需要使用模型来检索数据。应该在控制器部分完成。

    假设下面是一个函数是一个控制器(你可以把这个函数称为任务)。

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

    【讨论】:

      猜你喜欢
      • 2016-12-26
      • 1970-01-01
      • 1970-01-01
      • 2014-11-08
      • 1970-01-01
      • 1970-01-01
      • 2016-10-05
      • 1970-01-01
      • 2018-11-05
      相关资源
      最近更新 更多