使用CodeIgniter处理标头中的登录表单

时间:2015-02-02 16:48:47

标签: php codeigniter

对于我所有的"公众"面向页面/路由我正在使用我创建的名为Public_controller的控制器,它扩展了CI_Controller。目前,Public_controller是一个只有构造函数的空文件。

在我的路线中,我已将Application_controller定义为我的默认控制器。它是mysite.com/about-us之类的路由指向的地方:

PHP

class Application_controller extends Public_Controller {

public function about() {
        $data['page_title'] = 'About';
        $data['page_description'] = '';
        $data['page_keywords'] = '';
        $data['main_content'] = 'public/about';

        $this->load->view('public/templates/default', $data);
    }
}

我在每个面向公众的页面的标题中都有一个登录表单。我熟悉如何处理/处理CI中的表单。我正在努力的是如何全局检查而不是一次性页面。

例如,如果我的表单位于我的页面的<body>,通常我会这样做:

PHP

$this->load->library('form_validation');
$this->form_validation->set_rules('name', 'Name', 'trim|required|xss_clean');

if ($this->form_validation->run() == FALSE) {
        $data['main_content'] = 'public/forms/my_form';
    } else {
        // Handle the form.
    }
}

$this->load->view('public/templates/default', $data);

一切都很好。我显然不能在每个控制器方法上都有这种语法。用户可以登录任何页面 - 所以我需要能够在他们登录时收听/处理表单。否则,我需要显示用户请求的页面。

也许我需要另一个扩展Public_controller的控制器?

感谢您的建议。

1 个答案:

答案 0 :(得分:1)

如果我已正确理解您的问题,您希望您的用户能够从您的应用程序的任何页面登录。

有多种方法可以做到这一点,这里有两个:

I / Ajax解决方案

1 /创建一个负责Ajax调用的控制器并在那里写你的登录功能

<强> Ajax.php

class Ajax extends CI_Controller 
{
    $email          = $this->input->post("mail_login"); 
    $password       = $this->input->post("pass_login");

    $user = $this->somemodel->get_user_by_mail_and_pass($email, $password);

    if($user)
    {
        //stuff if success
    }
    else
    {
        //Stuff if failed
    }
}

2 /创建一个将在任何地方加载的js文件。

<强> myjsfile.js (我想你正在使用jQuery)

$("#theform").on("submit", function(event)
{
    event.preventDefault();
    var post_array =
    {
        "mail_login"    : $("#txt_mail_login").val(),
        "pass_login"    : $("#txt_pass_login").val()
    }

    $.ajaxSetup({async:false});
    $.post(baseUrl + "/Ajax/ajax_login", post_array,
        function(data)
        {
            //Stuff here (redirect, change form into user info....)
        });
)};

瞧!


II /“经典”表格提交

在标题中,登录表单为

<form method="post" action="<?= site_url("My_controller/my_login_function/" . $_ci_view); ?>">

在这里,我们假设您有一个名为my_login_function的函数负责日志记录。该函数位于控制器中,这里是my_controller(糟糕的名字:))。

$ _ ci_view是一个包含当前视图名称的var。我们将使用它在表单提交之前将用户重定向到他所在的位置。

例如,如果您的用户已加载了视图主页,您将在表单中获得以下内容:

<form method="post" action="http://www.example.com/My_controller/my_login_function/home">

<强> My_controller.php

class My_Controller extends CI_Controller
{
    public function user_login($view_name)
    {
        $this->load->library('form_validation');
        $this->form_validation->set_rules('name', 'Name', 'trim|required|xss_clean');

        if ($this->form_validation->run() == FALSE) 
        {
            //Your stuff here

            $this->load->view($view_name);
        } 
        else 
        {
            //Your stuff here

            $this->load->view($view_name);
        }


        $this->load->view('public/templates/default', $data);

    }
}

我们可以想象,如果成功,您可以使用用户的数据设置会话。然后,在标题中,构建一个条件,在设置会话时显示或不显示登录表单。

相关问题