Как сделать переменную доступной в 2 методах в CodeIgniter? - PullRequest
0 голосов
/ 26 октября 2011

У меня в контроллере 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 ().

Каково лучшее решение для этого, я не хочу повторяться и копировать эти 2 объявления переменных внутри метода регистрации.Есть ли способ заставить его работать в представлениях обоих методов?

Ответы [ 3 ]

1 голос
/ 26 октября 2011

Почему бы не назначить переменные класса? до построения:

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

тогда внутри ваших методов получите к ним доступ с помощью $ this-> title и $ this-> months

Кроме того, почему бы просто не отправить сообщение обратно в ваш индексный метод и не выполнить его перед обработкой чего-либо еще? поэтому ваш метод индекса начинается примерно так:

if(!empty($_POST))
{
    // do some kind of validation here
    // or call a private method in this class and set your class vars accordingly
}
0 голосов
/ 26 октября 2011

Как насчет хранения данных в статическом массиве, если он остается прежним (то есть статическим)?

<?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?
        }
    }
}

В качестве альтернативы может иметь смысл перенаправить пользователя обратно в индекс. К сожалению, я мало знаю о КИ, поэтому я не тот человек, который может дать совет по этому вопросу.

Еще одна вещь, которая приходит на ум: зачем вам нужно несколько месяцев в контроллере? Я уверен, что есть лучший способ сделать это. Можно было бы подумать, чтобы это было в шаблоне. В конце концов, месяцы не меняются, или я что-то упускаю?

0 голосов
/ 26 октября 2011

Вы можете сохранить validation_errors(); в некоторой переменной, например, сессии flashdata , например:

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

и затем отобразите их над вашей формой (например). Думаю, лучше практиковаться.

КСТАТИ. Вы должны загрузить модуль сессий для этого

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...