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


Controller loading different views (URL/Routing?)

问题/简介

我目前正在制作的是一个简单的注册/登录系统(显然稍后会扩展到更多)。我有一个名为 Users 的控制器,它主要具有两个功能。一个是show_register(),一个是send_register().这与模型配对 User_Model ,一个所谓的工厂UserFactory,目前(主要用于测试,这些稍后将组合)三个视图register_successregister_failshow_register。它们基本上是一种说"嘿,恭喜,你设法注册了"的观点,一种说"哦,不,没有注册!",另一种是显示实际的注册表。

进入 http://url.com/register 后,会自动向您显示注册表本身(通过带有$route['register'] = 'users/show_register';的路由完成)。

因此,一旦您在show_register中填写表单,表单操作就会指向Users控制器中的send_register函数。检查输入,如果全部有效,则将其发送到UsersFactory进行数据库输入。如果一切正常,控制器将收到"true"结果,并显示相应的视图。这就是我们的问题开始的地方!

如果我设法注册,我的网址现在是:http://url.com/public/users/send_register。公用文件夹是我保存文件的地方,我已经意识到需要通过htaccess从URL中删除,我会找到我的方法。问题是我不希望我的URL由用户控制器及其send_register功能组成。我希望它保持 http://url.com/register/,但表现出不同的看法。

我尝试过/研究过什么

我首先研究了路由。我意识到(希望我是对的,否则我需要学习如何阅读)它不适用于我所描述的问题。这样做的主要原因是因为它接受我指定的任何内容并将其发送到特定的类/函数。在这种情况下,我们正在做的已经转到正确的类/函数,但向用户显示"错误"的URL。这也很困难,因为我在这个控制器中有不同的方法,这意味着我无法静态映射所有操作以导致单个函数。

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

.htaccess 文件

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* index.php/$0 [PT,L]

如果您有任何其他文件希望我展示,我很乐意这样做。目前,我能想到的可能相关的就是控制器本身。

<?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。

希望对您有所帮助!