如何在CodeIgniter中使用2个方法访问变量?

时间:2011-10-25 21:13:35

标签: php codeigniter scope

我的控制器中有2个方法,一个负责生成注册页面,另一个负责处理注册表单提交。

<?php

class Signup_c extends CI_Controller {

    function __construct() {
        parent::__construct();
    }

    function index() {
        $data['title'] = 'Sign Up';

        $data['months'] = array(
            '1' => 'January',
            '2' => 'February',
            '3' => 'March',
            '4' => 'April',
            '5' => 'May',
            '6' => 'June',
            '7' => 'July',
            '8' => 'August',
            '9' => 'September',
            '10' => 'October',
            '11' => 'November',
            '12' => 'December'
        );      

        $this->load->view('signup_v', $data);
    }

    function submit() {

            // validation rules here...

        // validate
        if ($this->form_validation->run() === FALSE) {
            $this->load->view('www/signup_v');
        }
        else {
                    // add info to database here...

            $this->load->view('www/signup_success_v');
        }

    }

}

现在的问题是,如果存在验证错误,则用户返回到注册页面并显示验证错误。但是没有显示标题或日期,因为这些变量是在index()方法内定义的,而不是submit()方法。

对此最好的解决办法是什么,我不想重复我的自我并复制注册方法中的那两个变量声明。有没有办法让它在两种方法的视图中都有效?

3 个答案:

答案 0 :(得分:1)

为什么不分配类变量?在构造之前:

$title = 'Whatever';
$months = array('january', 'february');

然后在你的方法中使用$ this-&gt; title和$ this-&gt; months

访问它们

此外,为什么不回发到您的索引方法并让它在其他任何事情之前进行后处理?所以你的索引方法开头是这样的:

if(!empty($_POST))
{
    // do some kind of validation here
    // or call a private method in this class and set your class vars accordingly
}

答案 1 :(得分:0)

您可以将validation_errors();保存在某个变量中,例如sessions flashdata,如:

$this->session->set_flashdata('errors', validation_errors());

然后在表单上方回显它们(例如)。我认为这是更好的做法。

顺便说一句。您必须为此

加载会话模块

答案 2 :(得分:0)

如果数据保持不变(即静态),如何将数据存储在静态数组中?

<?php
class Signup_c extends CI_Controller {
    // private because no one else needs to access this
    private static $data = array('title' => 'Sign Up', 'months' => array(...));

    function __construct() {
        parent::__construct();
    }

    function index() {
        $this->load->view('signup_v', Signup_c::$data);
    }

    function submit() {
        // validation rules here...
        // validate
        if ($this->form_validation->run() === FALSE) {
            $this->load->view('www/signup_v', Signup_c::$data);
        }
        else {
            // add info to database here...
            $this->load->view('www/signup_success_v'); // maybe add it here, too?
        }
    }
}

或者,将用户重定向回索引可能是有意义的。不幸的是,我对CI知之甚少,所以我不适合就此提出建议。

另一件令人想到的事情是:为什么你需要在你的控制器中安排几个月?我相信有更好的方法可以做到这一点。人们可以考虑在模板中使用它。毕竟,几个月不会改变,或者我忽略了什么?