【问题标题】:Controller loading different views (URL/Routing?)控制器加载不同的视图(URL/路由?)
【发布时间】:2014-12-21 22:39:43
【问题描述】:

问题/简介

我目前正在制作的是一个简单的注册/登录系统(稍后显然会扩展到更多)。我有一个名为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”作为结果,并显示相应的视图。 这就是我们的问题所在!

如果我成功注册,我的 URL 现在是:http://url.com/public/users/send_register。公共文件夹是我保存文件的地方,我意识到需要通过 htaccess 从 URL 中删除,我会找到我的方法来做。问题是我不希望我的 URL 由用户控制器和 send_register 函数组成。我希望它保持为http://url.com/register/,但显示不同的视图。

我尝试过/调查过的内容

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

我也研究了 .htaccess,但我还没有找到实际编写它的方法。为了更好地衡量,我将在底部打印我的 .htaccess 文件以防万一。我所做的只是修改,以便从 URL 中删除 index.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");
         }
    }
}
?>

【问题讨论】:

    标签: php codeigniter codeigniter-2


    【解决方案1】:

    抱歉这么久才给出答案!

    为什么不直接进行 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。

    希望有帮助!

    【讨论】:

    • 这绝对是一种方法!然而,我对如何做到这一点有点好奇。我想在视图中避免尽可能多的逻辑,并且我感觉随着我的进展会出现更高级的场景,它不会像成功/错误消息那么简单。不过谢谢你,我肯定会考虑到这一点!
    • 好吧,另一种方法是使用redirect() 方法。您可以在控制器中为 register_success()register_fail() 创建单独的函数,执行 redirect(Users/register_success),然后将这两个添加到您之前解释过的路由中
    • 谢谢!我不知道为什么我没有想到这一点。我决定不使用重定向,而是简单地让该类的注册函数处理多个场景。感谢您让我重回正轨!
    猜你喜欢
    • 2013-05-14
    • 1970-01-01
    • 1970-01-01
    • 2017-04-05
    • 1970-01-01
    • 2013-11-04
    • 1970-01-01
    • 2019-06-21
    • 1970-01-01
    相关资源
    最近更新 更多