设置复选框codeigniter不填充字段

时间:2013-05-07 15:27:36

标签: php codeigniter checkbox

我有一个从数据库中检索到的扇区列表,我试图仅根据用户填充所选扇区。共有7个部门(如下所示)。

HTML:

<p class="sector"><span>North East</span><input type="checkbox" class="sector-list" name="sector[]" value="1" /></p>
<p class="sector"><span>City of Sunderland</span><input type="checkbox" class="sector-list" name="sector[]" value="2" /></p>
<p class="sector"><span>Sunderland East</span><input type="checkbox" class="sector-list" name="sector[]" value="3" /></p>
<p class="sector"><span>Sunderland North</span><input type="checkbox" class="sector-list" name="sector[]" value="4" /></p>
<p class="sector"><span>Sunderland West</span><input type="checkbox" class="sector-list" name="sector[]" value="5" /></p>
<p class="sector"><span>Coalfield</span><input type="checkbox" class="sector-list" name="sector[]" value="6" /></p>
<p class="sector"><span>Washington</span><input type="checkbox" class="sector-list" name="sector[]" value="7" /></p>

控制器:

foreach($data['all_sectors'] as $sectors):
    echo"<p class='service'><span>$sectors->sector</span><input type='checkbox' class='sector-list' name='sector[]' value='$sectors->ID' /></p>";
endforeach;

现在,当用户去编辑他们的个人资料时,我正在尝试预先填充用户之前选择的复选框。

我很困惑如何在创建帐户时重新填充这些行业。我尝试了以下内容。

控制器:

$data['assigned_sectors'] = $this->info_model->getAssignedSectors();

foreach($data['assigned_sectors'] as $sector) 
    {
        $id_str = array(
            'ID' => $sector->sector_ID
        );
    }
    print_r($id_str);

以下是'$ data ['assigned_sectors']'

的结果
Array ( [0] => stdClass Object ( [agency_ID] => 2 [sector_ID] => 3 [ID] => 3 [sector] => Sunderland East ) [1] => stdClass Object ( [agency_ID] => 2 [sector_ID] => 4 [ID] => 4 [sector] => Sunderland North ) )

我尝试将两者都添加到foreach复选框html但没有运气

set_checkbox('sector[]', $data['assigned_sectors']->sector_ID) //not working
set_checkbox('sector[]', $id_str->ID) //not working

我可能忽略了一些简单的东西,但任何帮助都会非常感激。谢谢!

更新:

$this->load->model('admin/info_model');
    $data['agency_sectors'] = $this->info_model->getAgencySectors($agency);

    $this->load->model('admin/agencies_model');
    $data['all_sectors'] = $this->agencies_model->getAgencySectors($agency);

    echo"<p id='sectors'><label for='sectors'>Sector</label></p>";
    echo"<div id='sector_list' style='float: left;width: 70%;'>";
    foreach($data['agency_sectors'] as $sector):
        foreach($data['all_sectors'] as $sectors):
        $selected_text = ($sector->sector_ID === $sectors->ID) 
           ? " checked='checked'" 
             : '' ;
    echo"<p class='service'><span>$sectors->sector</span><input type='checkbox' class='sector-list' name='sector[]' value='$sectors->ID' " . $selected_text . "/></p>";
        endforeach;
    endforeach;
    echo"</div>";

如果从7中选择了2个代理扇区,则会将列表重复两次,3个结果相同,等等

2 个答案:

答案 0 :(得分:3)

name属性应与set_checkbox的第一个参数匹配:

变化:

set_checkbox('sector', '1') 

为:

set_checkbox('sector[]', '1')

****** **** UPDATE

我之前的回答是不正确的。您无法从数据库中的值设置set_checkbox的复选框选中状态。 See @Raidenace's answer

您必须通过检查循环中的值是否相同来设置它:

而不是这段代码:

<p class='sector'><span>$sectors->sector</span>
  <input type='checkbox' class='sector-list' name='sector[]' 
    value='1' " 
      . set_checkbox('sector', $data['assigned_sectors']->sector_ID) . " />
</p>

试试这段代码:

$selected_text = ($data['assigned_sectors']->sector_ID === $sectors->ID) 
                   ? " checked='checked'" 
                     : '' ;
<p class='sector'><span>$sectors->sector</span>
  <input type='checkbox' class='sector-list' name='sector[]' 
    value='$sectors->ID' " . $selected_text . " />
</p>

答案 1 :(得分:3)

好吧,这似乎不直观但是set_checkbox()函数“允许你通过传递的POST数组中的值设置复选框的选定值。所以这意味着要恢复一个复选框到表单提交期间用户选择的值,在表单的用例中得到验证,并且由于验证错误,用户返回到同一表单。我不认为这是你正在尝试的在你的情况下完成。

我必须从他们的功能定义中弄明白

/**
 * Set Checkbox
 *
 * Let's you set the selected value of a checkbox via the value in the POST array.
 * If Form Validation is active it retrieves the info from the validation class
 *
 * @access  public
 * @param   string
 * @param   string
 * @param   bool
 * @return  string
 */
if ( ! function_exists('set_checkbox'))
{
    function set_checkbox($field = '', $value = '', $default = FALSE)
    {
        $OBJ =& _get_validation_object();

        if ($OBJ === FALSE)
        {
            if ( ! isset($_POST[$field]))
            {
                if (count($_POST) === 0 AND $default == TRUE)
                {
                    return ' checked="checked"';
                }
                return '';
            }

            $field = $_POST[$field];

            if (is_array($field))
            {
                if ( ! in_array($value, $field))
                {
                    return '';
                }
            }
            else
            {
                if (($field == '' OR $value == '') OR ($field != $value))
                {
                    return '';
                }
            }

            return ' checked="checked"';
        }

        return $OBJ->set_checkbox($field, $value, $default);
    }
}