Codeigniter form_helper将数据库行作为选择菜单中的值

时间:2009-12-14 15:51:26

标签: php codeigniter

我正在写一个表单,其中有一个选择菜单,我希望从数据库中提取值,所以我认为这将是这样的:

我的观点

<?php
   echo form_open('admin/save_content');
   echo form_fieldset();
   echo form_dropdown('categories', $select_options);
   echo form_submit('category_submit', 'Submit');
   echo form_fieldset_close();
   echo form_close();
?>

我的控制器

function add_content() {
    $data = array();
    $this->is_logged_in();
    $this->load->model('category_model');
    $data['select_options'] = $this->category_model->get_all_online();
    $this->load->view('admin/content/add_content', $data);
}

我的模特

public function get_all_online() {
    $this->db->select('*');
    $this->db->from('category');
    $this->db->where('category_online', 1);
    $query = $this->db->get();

    return $query->result();

}

现在当我将$selected_options放在表单下拉列表中时,我收到此错误,

  

遇到PHP错误

     

严重程度:4096

     

消息:类stdClass的对象   无法转换为字符串

     

文件名:helpers / form_helper.php

     

行号:331

6 个答案:

答案 0 :(得分:7)

您需要将数组传递到下拉列表,其中数组键将是POST的值,值将显示为文本。

要实现此目的,请更改您的控制器:

function add_content() {
        $data = array();
        $this->is_logged_in();
        $this->load->model('category_model');
        $data['select_options'] = $this->category_model->get_all_online_select();
        $this->load->view('admin/content/add_content', $data);
}

并将此功能添加到您的模型

public function get_all_online_select() {
        $this->db->select('id, name'); //change this to the two main values you want to use
        $this->db->from('category');
        $this->db->where('category_online', 1);
        $query = $this->db->get();
        foreach($query->result_array() as $row){
            $data[$row['id']]=$row['name'];
        }
        return $data;
}

应该做的伎俩

答案 1 :(得分:3)

我个人不喜欢在我的模型中做出关于如何使用我的数据的假设,因为这是控制器的工作。如果您添加MY_array_helper.php并将其粘贴到:

function array_to_select() {

$args = func_get_args();

$return = array();

switch(count($args)):

    case 3:
        foreach ($args[0] as $itteration):
            if(is_object($itteration)) $itteration = (array) $itteration;
            $return[$itteration[$args[1]]] = $itteration[$args[2]];
        endforeach;
    break;

    case 2:
        foreach ($args[0] as $key => $itteration):
            if(is_object($itteration)) $itteration = (array) $itteration;
            $return[$key] = $itteration[$args[1]];
        endforeach;
    break;

    case 1:
        foreach ($args[0] as $itteration):
            $return[$itteration] = $itteration;
        endforeach;
    break;

    default:
        return FALSE;
    break;

endswitch;

return $return;

}

然后你可以这样做:

function add_content() {
    $data = array();
    $this->is_logged_in();
    $this->load->model('category_model');
    $this->load->helper('array');
    $data['select_options'] = array_to_select($this->category_model->get_all_online(), 'id', 'title');
    $this->load->view('admin/content/add_content', $data);

}

通过使用值作为值和键传入一个或两个键或单维数组来支持多维数组。

例如:array_to_select(array('value1','value2'))给出数组('value1'=&gt;'value1','value2'=&gt;'value2')

答案 2 :(得分:1)

您需要返回一个字符串数组,result()是一个对象数组。

也许在你的模特中试试这个:

return $query->result_array();

答案 3 :(得分:0)

在您的视图中,您可以在那里添加foreach而不是模型。

<?php
   echo form_open('admin/save_content');
   echo form_fieldset();
   foreach($select_options->result_array() as $row){
   $data[$row['id']]=$row['name'];
   echo form_dropdown('categories', $row);
   }
   echo form_submit('category_submit', 'Submit');
   echo form_fieldset_close();
   echo form_close();
?>

未经测试。

答案 4 :(得分:0)

我编辑了Phil Surgeon的数组助手,只使用两个字段(id&amp; value)进行简单的数据库查询。所以助手类现在看起来像这样:

<?php
function array_to_select() {
    //get args
    $args = func_get_args();
    //get args key names
    $keys = array_keys($args[0][0]);
    //set return array
    $return = array();
    foreach ($args[0] as $itteration){
        //$itteration[$keys[0]] is field id value,  $itteration[$keys[1]] is field name value
        $return[$itteration[$keys[0]]] = $itteration[$keys[1]];
    }
    return $return;
}

您可以在控制器中再次使用它 希望它有用。

答案 5 :(得分:-1)

表单下拉,包含许多选项codeigniter form drop down menu和验证类