如何在CodeIgniter中从控制器重定向到视图?

时间:2016-10-29 23:13:22

标签: javascript php jquery ajax codeigniter

制定这个问题的标题真的很难。我将从代码片段开始:

[..]
<a href="#" id="register-link">register</a>
[..]
<script>
$(document).ready(function(){
    $('#register-link').on('click',function(){
        $.get(baseurl + 'index.php/auth/register', function(response){
            $('#popup-div').html(response);
        });
    });
});
</script>

控制器方法auth / register结束于:

$this->load->view('auth/register_form', $data);

基本思想是当用户点击&#34;注册&#34;在菜单中弹出窗口而不是加载新页面。注册工作。

但是,auth / register方法有两种结束方式:

function register()
    {
        // a bunch of $this->form_validation->set_rules();
        // and other server side logic
        if ($this->form_validation->run()) {    
        // server side logic
            redirect('auth');
        } else{
        //getting same $data
            $this->load->view('auth/register_form', $data)
        }
    }

所以问题是如果我得到验证错误(表单验证没有运行并且我得到html响应),新页面会加载表单显示错误,而不是在弹出窗口中执行此操作。如果注册成功,我会重新加载新页面,以便向用户显示注册成功,这很烦人。所以我想检查控制器是否重定向并将该重定向url传递到同一个div。

我查了同样类似的问题,但无法让它发挥作用。到目前为止,我有这个:

$(document).ready(function(){
    $('#register-link').on('click',function(){
        $.get(baseurl + 'index.php/auth/register', function(response){
            if (response.redirect) {
                //alert(response.redirect);
                $.get(response.redirect, function(response2){
                    $('#popup-div').html(response2);                    
                });
            }
            else {
                $('#popup-div').html(response);
            }
        });
    });
});

但没有任何变化,我也没有任何错误。如果我正确地理解了这个问题,那么只需要调用一次,这样我就可以得到视图了。我试图移除$(document).ready(function(){ ... });部分,但仍然没有。如果我尝试将ajax呼叫附加到每个&#34;提交&#34;我(想)会弄乱验证。

更新 从下面的评论我得到了坦克auth控制器内部工作可能更容易。首先,我将展示Tank auth如何重定向的完整序列。在auth / register内部实际上是

$this->_show_message($this->lang->line('auth_message_registration_completed_1'));

其中:

function _show_message($message)
    {
        $this->session->set_flashdata('message', $message);
        redirect('/auth/');
    }

function index()
    {
        if ($message = $this->session->flashdata('message')) {
            $this->load->view('auth/general_message', array('message' => $message));
        } else {
            redirect('/auth/login/');
        }
    }

它背后的想法是在不同的情况下调用_show_message,并显示不同的消息。我想在我的popup div中处理所有这些情况。我试图改变:

$this->_show_message_JSON($this->lang->line('auth_message_registration_completed_1'));

其中:

function _show_message_JSON($message)
    {
        $this->session->set_flashdata('message', $message);
        $data['redirect'] = '1';
        header('Cache-Control: no-cache, must-revalidate');
        header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
        header('Content-Type: application/json');
        echo json_encode($data);
    }

并在JS中处理逻辑:

$(document).ready(function(){
    $('#register-link').on('click',function(){
        $.get(baseurl + 'index.php/auth/register', function(response){
            if(typeof response == 'object'){
                //alert(response);
                $.get(baseurl + 'index.php/auth', function(response2){
                    $('#popup-div').html(response2);                    
                });
            }
            else {
                $('#popup-div').html(response);
            }
        });
    });
});

然而,如果验证成功,我得到的是:

{"redirect":"1"}
<form action="http://localhost/test4/index.php/auth/register" method="post" accept-charset="utf-8">
<table>
        <tr>
        <td><label for="username">Username</label></td>
        <td><input type="text" name="username" value="user21" id="username" maxlength="20" size="30"  />
</td>
        <td style="color: red;"></td>
    </tr>
[...]

基本上是源代码,除了附加第一行。

0 个答案:

没有答案