Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 控制器加载不同的视图(URL/路由?)_Php_Codeigniter_Codeigniter 2 - Fatal编程技术网

Php 控制器加载不同的视图(URL/路由?)

Php 控制器加载不同的视图(URL/路由?),php,codeigniter,codeigniter-2,Php,Codeigniter,Codeigniter 2,问题/简介 我目前正在制作的是一个简单的注册/登录系统,它显然将在以后扩展到更多。我有一个名为Users的控制器,它主要有两个功能。一个是显示寄存器,一个是发送寄存器。这与模型用户模型(即所谓的Factory UserFactory)配对,目前主要用于测试,稍后将结合三个视图register\u success、register\u fail和show\u register。他们基本上是一种观点,说嘿,恭喜,你成功注册了,一种观点说哦,不,不注册!还有一个用来显示实际的登记表 进入后,您将自动看

问题/简介

我目前正在制作的是一个简单的注册/登录系统,它显然将在以后扩展到更多。我有一个名为Users的控制器,它主要有两个功能。一个是显示寄存器,一个是发送寄存器。这与模型用户模型(即所谓的Factory UserFactory)配对,目前主要用于测试,稍后将结合三个视图register\u success、register\u fail和show\u register。他们基本上是一种观点,说嘿,恭喜,你成功注册了,一种观点说哦,不,不注册!还有一个用来显示实际的登记表

进入后,您将自动看到通过$route['register']='users/show_register';路由完成的注册表

因此,一旦您在show_寄存器中填写表单,表单操作将导致用户控制器中的send_register函数。检查输入,如果所有输入都有效,则将其发送到UsersFactory进行数据库输入。如果一切正常,控制器将收到返回的true结果,并显示相应的视图。这就是我们的问题所在

如果我成功注册,我的URL现在是:。公共文件夹是我保存文件的地方,我意识到需要通过htaccess从URL中删除这些文件,我会找到我的方法。问题是我不希望我的URL由用户控制器和该控制器的send_register函数组成。我希望它保持原样,但表现出不同的观点

我尝试/调查的内容

我首先调查了路线。我希望我在这方面是对的,否则我需要学习如何理解它对我描述的问题不起作用。主要原因是它接受我指定的任何内容并将其发送到特定的类/函数。在这种情况下,我们所做的已经转到了正确的类/函数,但是向用户显示了错误的URL。这也很困难,因为我在这个控制器中有不同的方法,这意味着我不能静态地将所有动作映射到单个函数

我也研究了.htaccess,但我还没有找到一种实际编写它的方法。为了更好地衡量,我将在底部打印我的.htaccess文件,以防它有所帮助。我所做的只是修改,以便从URL中删除index.php文件

.htaccess文件

如果有任何其他文件你想让我看,我很乐意这样做。现在,我所能想到的可能是控制器本身

<?php
if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Users extends CI_Controller {

    public function show_register()
    {
        $this->load->view("show_register");
    }

    public function send_register()
    {
        // Populate the model with the information we got from the form.
        $data = array(
            'user_name' => $this->input->post('username'),
            'user_pass' => $this->input->post('password'),
            'user_email' => $this->input->post('email'),
            'user_level' => 1
            );

        // Then pass that on to the User Factory, which will insert that into the database.
         $this->load->library("UserFactory");

         if($this->userfactory->registerUser($data))
         {
            $this->load->view("register_success");
         }
         else
         {
            $this->load->view("register_fail");
         }
    }
}
?>

很抱歉,我花了这么长时间才给出答案

为什么不直接调用ajax呢

在您的视图中,表单位于:

<div id="message_box" class="hidden"></div>
<form  id="theForm" method="post" action="submitForm()"></form>

<script>
function submitForm() {
    $.post("<?= site_url('Users/send_register');?>", $("#theForm").serialize(), function(data) {
        success: $("#message_box").html(data).show();
        error: $("#message_box").html("<p>There was an error with your request</p>").show();
    });
}
</script>
当然,有一百万种不同的方法可以做到这一点。但我假设这些视图只是消息视图,正如您在上面所说的,它们只是简短的html成功/失败。ajax的优点是用户可以留在页面上,而您可以隐藏您的url


希望有帮助

那绝对是一种方法!然而,我有点好奇如何做,否则。我希望尽可能避免视图中的逻辑,并且我感觉随着我的前进,会出现更高级的场景,而不会像成功/错误消息那么简单。不过谢谢你,我一定会考虑到这一点的!好的,另一种方法是使用重定向方法。您可以在控制器中为register_success(注册成功)和register_fail(注册失败)设置单独的功能,执行重定向用户/register_success(注册成功),然后将这两个功能添加到路由中,就像您之前解释的那样谢谢!我不知道为什么我没有想到这一点。我决定不使用重定向,而是让该类的register函数处理多个场景。谢谢你让我重回正轨!
<div id="message_box" class="hidden"></div>
<form  id="theForm" method="post" action="submitForm()"></form>

<script>
function submitForm() {
    $.post("<?= site_url('Users/send_register');?>", $("#theForm").serialize(), function(data) {
        success: $("#message_box").html(data).show();
        error: $("#message_box").html("<p>There was an error with your request</p>").show();
    });
}
</script>