1

问题/简要介绍笨 - 控制器加载不同的意见(URL /路由?)

我最近开始使用笨,我也很新,整个MVC架构,所以我我会请你在这里陪我。

我目前正在制作的过程是一个简单的注册/登录系统(这将显然扩展到更晚的时间)。我有一个名为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用于数据库输入。如果一切正常,则控制器接收“真”回来,并显示相应的视图。 这就是我们的问题所在!

如果我设法注册,我的网址现在是: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"); 
     } 
    } 
} 
?> 

回答

0

道歉为此花了这么长时间的答案!

为什么不只是做一个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的好处是用户会留在网页上,并且你会隐藏你的网址。

希望有帮助!

+0

这绝对是一种方式来做到这一点!然而,我有点好奇如何去做。我想避免在视图中尽可能多的逻辑,并且我有一种感觉,随着我的发展,将会出现更高级的场景,它不会像成功/错误消息那样简单。不过谢谢,我肯定会考虑这一点! – CmdrSharp

+0

好吧,另一种方法是使用'redirect()'方法。你可以在你的控制器中为'register_success()'和'register_fail()'做一个单独的函数,做一个'redirect(Users/register_success)',然后把这两个函数加入到你之前解释过的路线中 – acupajoe

+1

谢谢!我不知道为什么我没有想到这一点。我决定不使用重定向,而是简单地让该类的注册函数处理多个场景。感谢您让我回到正轨! – CmdrSharp