Php 表单验证失败后重新填充Codeigniter中的复选框

Php 表单验证失败后重新填充Codeigniter中的复选框,php,codeigniter,Php,Codeigniter,在表单验证失败后,重新填充一组复选框将用户返回到同一表单时出现问题。下拉菜单和文本输入可以重新填充,但不能重新填充复选框 下面是复选框的代码片段: <td> <?php echo form_checkbox('ambience[]', 'casual', set_checkbox('ambience[]', 'casual')); ?> Casual <br /> <?php echo fo

在表单验证失败后,重新填充一组复选框将用户返回到同一表单时出现问题。下拉菜单和文本输入可以重新填充,但不能重新填充复选框

下面是复选框的代码片段:

        <td>
            <?php echo form_checkbox('ambience[]', 'casual', set_checkbox('ambience[]', 'casual')); ?> Casual <br />
            <?php echo form_checkbox('ambience[]', 'romantic', set_checkbox('ambience[]', 'romantic')); ?> Romantic <br />
            <?php echo form_checkbox('ambience[]', 'outdoor', set_checkbox('ambience[]')); ?> Outdoor / Alfresco <br />
            <?php echo form_checkbox('ambience[]', 'trendy', set_checkbox('ambience[]')); ?> Hip & Trendy <br />
            <?php echo form_checkbox('ambience[]', 'vibrant', set_checkbox('ambience[]')); ?> Vibrant <br />
            <?php echo form_checkbox('ambience[]', 'up_scale', set_checkbox('ambience[]')); ?> Upscale <br />
        </td>

随意的
浪漫的
户外/露天
时尚时尚
充满活力的
高档的
成功重新填充的文本输入代码段为:

<?php echo form_dropdown('price_range', $options, set_value('price_range')); ?>


有什么想法吗?我真的很困惑为什么
set\u checkbox
不能像广告宣传的那样工作。

您的
set\u checkbox
调用是错误的。当您在form_复选框中使用类似“ambience[]”的数组时,您不希望在
set_复选框调用中包含方括号([])。另一个问题是set_checkbox需要第二个参数,您只在前两个复选框中包含了该参数

设置_复选框应始终如下所示:

set_checkbox('ambience', 'value');
form_checkbox('ambience[]', 'value', set_checkbox('ambience[]', 'value'));
其中,“value”是
form\u复选框调用的第二个参数。像这样:

form_checkbox('ambience[]', 'value', set_checkbox('ambience', 'value'));

为了使set_复选框正常工作,需要在该元素上使用实际的验证规则。我遇到了这个问题,无法获得重新提交时显示的值,直到我包括:

$this->form_validation->set_rules('checkbox_name', 'checkbox_title', 'trim');

然后,一切都很顺利

事实上,我发现只有这样使用它才有效:

set_checkbox('ambience', 'value');
form_checkbox('ambience[]', 'value', set_checkbox('ambience[]', 'value'));

名称上需要方括号才能正常工作。

下面是一个工作示例。您需要在
$this->form\u validation->set\u rules()
form\u checkbox()
set\u checkbox()
中的每一个中包含带有括号[]的数组名

function set_checkbox_array($field, $value)
{
    $arr = isset($_POST[$field]) ? $_POST[$field] : FALSE;
    return ($arr !== FALSE && is_array($arr) && in_array($value, $arr)) ? 'checked="checked"' : '';
}
在控制器中:

    $this->load->library('form_validation');

    $this->form_validation->set_rules('set_reminder_days[]', 'Reminder Day', 'trim');

    if( $this->form_validation->run() == FALSE ) //Field validation failed.
    {
        //form validation errors will show up automatically
    }
    else //Validation success.
    {
        //This is an array of all checked checkboxes
        $reminder_days = $this->input->post('set_reminder_days');
    }
他认为:

    $day_options = array(
        'S' => 'Sunday',
        'M' => 'Monday',
        'T' => 'Tuesday',
        'W' => 'Wednesday',
        'Th' => 'Thursday',
        'F' => 'Friday',
        'Sa' => 'Saturday'
    );

    foreach( $day_options as $key => $day_option ) {
        echo form_checkbox('set_reminder_days[]', $key, set_checkbox('set_reminder_days[]', $key), 'class="form-checkbox"');
    }

我意识到set_复选框包含3个参数:

 set_checkbox(string $checkboxname, string $value, boolean $isChecked);
例如:

 echo form_checkbox('mycbx[]',
                    $item['id'],
                    set_checkbox('mycbx[]', $item['id'], false)
      );
或者这样:

$checkbox = array(
    'name'        => 'mycbx[]',
    'value'       => $item['id'],
    'checked'     => set_checkbox('mycbx[]', $item['id'], false)
);
echo form_checkbox($checkbox);

这不是使用表单帮助器。我尝试使用这个代码

<input type="checkbox" name="tes_display" value="1" <?php echo set_checkbox('tes_display', '1', FALSE); ?> /> 

我在这里尝试了所有的解决方案,但都没有成功。因此,我收集了所有数据,将其打包到一个数组中,然后使用循环检查数组中的值是否与所选框的值匹配,如果匹配,则将checked属性更改为checked

以下是html代码:

<div class="col-sm-10 tags">
    <label>
        <input class="tags" type="checkbox" name="tags[]" value="love" >Love                            
    </label>
    <label>
        <input class="tags" type="checkbox" name="tags[]" value="God" >God
    </label>
    <label>
        <input class="tags" type="checkbox" name="tags[]" value="Reality" >Reality
    </label>
    <label>
        <input class="tags" type="checkbox" name="tags[]" value="Entrepreneurship">Entrepreneurship
    </label>
</div>

爱
上帝
现实
创业
下面是函数中的javascript代码

(function(){
    var tag_string = '<?php echo $_post['tags']; ?>',
        tags = tag_string.split(', ');
    boxes = document.getElementsByClassName('tags');
    for(i = 0; i< boxes.length;i++ ){
        if(tags.toString().includes(boxes[i].value)){
            boxes[i].checked = "checked";
        }
    }
})();
(函数(){
变量标记_字符串=“”,
tags=tag_string.split(',');
box=document.getElementsByClassName('tags');
对于(i=0;i
在我的一个项目中,我使用它如下:

我认为:

$checkbox_name = 'menu_type_id[]';
$menu_type_attributes = array(
  'name'              => 'menu_type_id[]',
  'id'                => 'menu_type_id',
  'class'             => 'checkbox-custom rectangular',
  'value'             => $menu_type->get_id(), 
  'checked'           => set_checkbox('menu_type_id[]', $menu_type->get_id()),                 
  'aria-describedby'  => 'menuTypeIdHelp'
);
echo form_checkbox($menu_type_attributes);
在控制器中,我进行了验证(仅供参考,如果要保留复选框的选中状态,您必须在复选框上进行表单验证)

即使您的业务规则不要求您至少选中一个复选框,您仍然需要对该复选框进行验证。例如,你可以使用

$this->form_validation->set_rules('menu_type_id[]),'menu type(s)'trim')


希望这能对其他人有所帮助,b/c代码点火器的文档中没有此信息

如果在第一个索引中使用ambience[0],在第二个索引中使用ambience[1],是否有效?我尝试使用该索引,并从名称中删除
[]
,但两者都不起作用。对此存在很多困惑。括号必须始终以_checkbox()和set_checkbox()调用的形式保留。还必须有一个验证规则。括号必须包含在第一个set_rules()参数中。如果不需要该字段,请使用trim。我这样做了
,复选框没有重新填充。我在CodeIgniter安装上尝试过,效果非常好。你确定你选中了“休闲”复选框而不是其他复选框吗?如果在第一个“echo form_”复选框(…)的正上方
会发生什么情况?您看到阵列中的环境值了吗?codeigniter文档不符合
set_复选框(“环境”、“值”)我同意。您需要验证它(即使它只是“修剪”)才能正常工作。+1是唯一解释您需要验证规则才能设置复选框正常工作的答案。就连Codeigniter文档也不清楚这一点。看起来复选框的set_值也是如此。因为OP说上面的答案被接受了,我忍不住觉得这是不准确的。如果您正在使用表单验证,即
form\u validation->run()
,我相信这是问题的正确答案。谢谢!我也有同样的问题,这让我发疯。我希望这是在文档中。你的答案实际上是错的。你不能使用set_checkbox('ambience[])中的方括号。事实上他没有错。为了发布一个复选框值数组并记住选中了哪些值,方括号必须位于set_复选框、复选框名称以及控制器中的$this->form_validation->set_rules中。谢谢兄弟。这真的很有效。我尝试过在表单验证参数中设置提醒天数[]和设置提醒天数,这没关系。另一个我意识到的是记住使用POST方法,GET方法不知何故不起作用。