Ошибка раскрывающегося списка формы Codeigniter после проверки

Я пытаюсь адаптировать form_dropdown к своей форме в codeigniter. Когда я добавляю новую страницу, она не показывает никаких ошибок в родительском раскрывающемся разделе, но после проверки формы, например, если пользователь забывает ввести метку заголовка, если она пуста или после проверки выдает ошибку foreach в выпадающий раздел.

Я читал, что вторая переменная должна быть массивом и так далее для form_dropdown. Но мой массив и не дает никаких ошибок на странице перед проверкой. Так что не могу разобраться в проблеме.

A PHP Error was encountered
Severity: Warning
Message: Invalid argument supplied for foreach()
Filename: helpers/form_helper.php
Line Number: 331

МОЙ_Контроллер:

class MY_Controller extends CI_Controller{
public $data =  array();

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

Административный контроллер:

class Admin_Controller extends MY_Controller{
function __construct(){
    parent::__construct();
    $this->data['meta_title'] = 'My Website Control Panel';
    $this->load->helper('form');
    $this->load->library('form_validation');
    $this->form_validation->set_error_delimiters(' <div class=" alert alert-danger alert-block" ><span class="glyphicon glyphicon glyphicon-minus-sign"></span> ', '<span class="close" data-dismiss="alert">&times;</span></div>');
    $this->load->library('session');
    $this->load->model('user_m');

    $exceptions = array('admin/user/login', 'admin/user/logout');
    if(in_array(uri_string(),$exceptions) == FALSE){
    if($this->user_m->loggedin() == FALSE){
        redirect('admin/user/login');
    }
}
}
}

Контроллер:

class Page extends Admin_Controller{
public function __construct(){
    parent::__construct();
    $this->load->model('page_m');
}

public function index(){
    $this->data['pages'] = $this->page_m->get_with_parent();
    $this->data['subview'] = "admin/page/index";
    $this->load->view('admin/_layout_main',$this->data);
}

public function edit ($id = NULL)
{
    // Fetch a page or set a new one
    if ($id) {
        $this->data['page'] = $this->page_m->get($id);
        count($this->data['page']) || $this->data['errors'][] = 'Not found.';
    }
    else {
        $this->data['page'] = $this->page_m->get_new();
    }

    // Pages for dropdown
    $this->data['pages_no_parents'] = $this->page_m->get_no_parents();
    // Set up the form
    $rules = $this->page_m->rules;
    $this->form_validation->set_rules($rules);


    // Process the form
    if ($this->form_validation->run() == TRUE) {
        $data = $this->page_m->array_from_post(array('title', 'slug', 'body','keywords','description','parent_id'));
        $this->page_m->save($data, $id);
        redirect('admin/page');
    }
    // Load the view
    $this->data['subview'] = 'admin/page/edit';
    $this->load->view('admin/_layout_main', $this->data);
}
}

Модель:

public function get_no_parents ()
{
    // Fetch pages without parents
    $this->db->select('id, title');
    $this->db->where('parent_id', 0);
    $pages = parent::get();

    // Return key => value pair array
    $array = array(
        0 => ''
    );
    if (count($pages)) {
        foreach ($pages as $page) {
            $array[$page->id] = $page->title;
        }
    }

    return $array;
}

Вид :

<?=form_dropdown('parent_id', $pages_no_parents, set_value('parent_id', $pages_no_parents, $this->input->post('parent_id') ? $this->input->post('parent_id') : $page->parent_id);?>

person Community    schedule 07.08.2013    source источник
comment
Я предполагаю, что ваш код проверки не передает массив pages_no_parents обратно, проверка вызывает полное обновление страницы, поэтому любые переменные, необходимые для запуска страницы, должны быть перегенерированы в коде if validation == false. Также было бы полезно увидеть ваш код проверки.   -  person Rick Calder    schedule 07.08.2013
comment
Вы что-то перезаписываете, это неясно, так как вы не показали полную функцию в своем контроллере. Что касается части просмотра, set_value автоматически позаботится о публикации, и, насколько я помню, она не принимает третий аргумент.   -  person ahmad    schedule 08.08.2013
comment
ты был прав ахмад. Спасибо.   -  person    schedule 09.08.2013


Ответы (3)


В условии if $this->form_validation->run == false напишите:

$this->data['pages_no_parents'] = $this->page_m->get_no_parents();
person Nil'z    schedule 07.08.2013
comment
Поместите этот $this->data['pages_no_parents'] = $this->page_m->get_no_parents(); в page функцию admin контроллера - person Nil'z; 07.08.2013
comment
Обновите свой ответ с вашим контроллером, пожалуйста. Это тоже нужно. @КастиэльМартин - person Nil'z; 08.08.2013
comment
Нужно admin controller page function. Если я правильно понимаю, после проверки вы перенаправляетесь на page function из admin controller, и именно здесь генерируется ошибка. Обновите с помощью admin controller в вашей функции. @CastielMartin - person Nil'z; 09.08.2013
comment
я обновил, добавил контроллер администратора, но они разделены, наследуя их друг от друга. - person ; 09.08.2013

вы можете попробовать что-то вроде этого

if($this->form_validation->run() == FALSE)
{ 
    redirect('your_controller/function','refresh');
}

ОБНОВЛЕНИЕ

поэтому вместо перенаправления загрузите представление, например

$this->load->view('admin/_layout_main', $this->data);

и на странице просмотра сделать одну вещь

<?php echo validation_errors(); ?>

пожалуйста, дайте мне знать, если у вас возникнут какие-либо проблемы.

person ABorty    schedule 07.08.2013
comment
это делает бесконечный цикл. - person ; 09.08.2013

Как упомянул Ахмад, я думаю, что что-то перезаписывал, и после удаления установленного значения и изменения представления на это теперь все в порядке.

<?php echo form_dropdown('parent_id', $pages_no_parents, $this->input->post('parent_id') ? $this->input->post('parent_id') : $page->parent_id);  ?>

Всем спасибо за комментарии и ответы.

person Community    schedule 09.08.2013