当前位置: 首页 > 知识库问答 >
问题:

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

轩辕鸿祯
2023-03-14

我正在为Joomla2.5创建一个MVC组件,作为我构建的另一个PHP数据库系统的前端。我正在构建一个本机Joomla组件,它在其他系统的类中调用方法,而不是将另一个系统的web接口包装在包装器组件中。

因此,我在我的一个视图中实现了一种超文本标记语言形式,它显然接受一些输入,但也接受文件上传。从这里开始,组件应该将这个输入发送到我的类的方法来处理它,然后响应将被馈送到第二个Joomla组件视图。

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

我已经完成了html" target="_blank">开发MVC组件的教程,但它并没有给我太多关于这应该如何工作的想法。有人能给我一个粗略的psuedocode的想法,这应该如何组合在一起,或者给我指一个适当的教程或另一个组件的例子,做类似的事情?

共有2个答案

秦才良
2023-03-14

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

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

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();
}
连晟
2023-03-14

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

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

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

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

此请求如下所示:

>

  • 索引。php接收请求并

    com\u内容/内容。当需要组件(即com_内容入口点)时,会调用php

    内容。php通过JController类创建控制器。

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

    content.php然后告诉$控制器对象调用具有相关任务的执行(),使用此$控制器-

    GET请求可以看出,在这种情况下没有设置task,因此使用\u默认的任务($doTask=$this)-

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

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

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

    然后加载模型

    在进行了更多的设置之后,调用了视图ContentViewFormdisplay()方法,在该方法中加载模型数据(如果我们正在编辑一篇文章,对模型的相同调用将基于GET中包含文章ida_id=99的额外参数加载现有文章)
    此时,它还会加载文章表单com\u content/models/forms/Article.xml),以便在tmpl文件编辑中使用。php

    因此,为了设置输入端,内容字段来自模型(尽管新文章的模型是空的),字段的属性以模型匹配的形式定义。

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

    >

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

    POST部分包含作为数组的表单(jform),正在执行的任务(task=article.save)和一些其他内务管理参数。

    因此,这次由JController实例化的控制器类型是一个ContentControlller文章,它扩展了JControlllerForm(用于处理表单提交等)。请记住,点符号任务值是表单[sub]的controller.method.

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

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

    这有用吗?

  •  类似资料:
    • 我需要帮助插入以下数据到数据库我有两个表employee和employee_skills(1个employee可以有很多技能) mapper.xml

    • 开发Web的一个原则就是,不能信任用户输入的任何信息,所以验证和过滤用户的输入信息就变得非常重要,我们经常会在微博、新闻中听到某某网站被入侵了,存在什么漏洞,这些大多是因为网站对于用户输入的信息没有做严格的验证引起的,所以为了编写出安全可靠的Web程序,验证表单输入的意义重大。 我们平常编写Web应用主要有两方面的数据验证,一个是在页面端的js验证(目前在这方面有很多的插件库,比如Validati

    • 先来看一个表单递交的例子,我们有如下的表单内容,命名成文件login.gtpl(放入当前新建项目的目录里面) <html> <head> <title></title> </head> <body> <form action="/login" method="post"> 用户名:<input type="text" name="username"> 密码:<input type=

    • 问题内容: 我创建了一个文件,创建变量时出现错误。但是在我的其他.java文件中,这些错误都没有出现。在枚举Foo中,唯一不会引起错误的是Foo构造函数不带参数并且枚举内没有其他变量。 错误的范围从字符串(无效的修饰符)到要删除的布尔值。 问题答案: 您缺少枚举中最重要的元素:枚举实例。 射击,仅添加分号即可解决编译错误,但是如果没有枚举实例,则枚举是无用的。 例如,

    • 主要内容:jQuery Mobile 文本输入框,实例,文本域,实例,搜索输入框,实例,单选按钮,实例,复选框,实例,更多实例,实例,实例,实例,实例jQuery Mobile 文本输入框 输入字段是通过标准的 HTML 元素编码的,jQuery Mobile 将为它们添加样式使其看起来更具吸引力,在移动设备上更易使用。您也能使用新的 HTML5 的 <input> 类型: 实例 <form method="post" action="demo_form.php"> <div class="ui

    • 我有一个谷歌表单,我要求用户包含他们的“全名”,以保持表单简短甜蜜(没有名字/姓氏的两个输入)。您可以使用正则表达式验证谷歌表单中的答案,但我不确定从哪里开始。 我希望在输入中至少有两个单词,每个单词至少有2个字符,并且我不想屏蔽任何特殊字符(以便像O'Leary这样名字的人仍然可以编写它)。基本上,我只想确保一个字段中包含两个单词,每个单词至少有2个字母。 我没有使用正则表达式或模式的经验,因此