【问题标题】:Repopulating checkboxes in Codeigniter after Unsuccessful Form Validation表单验证失败后重新填充 Codeigniter 中的复选框
【发布时间】:2011-06-14 01:38:29
【问题描述】:

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

这是复选框代码的 sn-p:

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

成功重新填充的文本输入的代码 sn-p 是:

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

有什么想法吗?我真的很困惑为什么 set_checkbox 不能像宣传的那样工作。

【问题讨论】:

  • 第一个使用 ambience[0] 之类的索引,第二个使用 ambience[1] 这样的索引是否有效?
  • 我尝试使用索引,并从名称中删除[],两者都不起作用。
  • 对此有很多困惑。在 form_checkbox() 和 set_checkbox() 调用中必须始终保留括号。还必须有一个验证规则。括号必须包含在第一个 set_rules() 参数中。如果不需要该字段,请使用修剪。

标签: php codeigniter


【解决方案1】:

为了使 set_checkbox 正常工作,需要对该元素使用实际的验证规则。我遇到了这个问题,在重新提交之前无法获得要在重新提交时显示的值:

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

然后,一切都很完美。

【讨论】:

  • 我同意。您需要对其进行验证(即使它只是“修剪”)才能正常工作。
  • +1 作为唯一解释您需要验证规则才能使 set_checkbox 工作的答案。甚至 Codeigniter 文档也不清楚这一点。看起来复选框的 set_value 也是如此。
  • 既然OP说上面的答案被接受了,我不禁觉得这是不准确的。如果您正在使用表单验证,即 form_validation-&gt;run() 发生在某处,那么我相信这是该问题的正确答案。
  • 谢谢!我遇到了同样的问题,这让我发疯了。
  • 我希望这在文档中。
【解决方案2】:

您的set_checkbox 呼叫是错误的。当您在 form_checkbox 中使用类似“ambience[]”的数组时,您不想在 set_checkbox 调用中包含方括号 ([])。另一个问题是 set_checkbox 需要第二个参数,您只包含在前两个复选框中。

set_checkbox 应该总是这样:

set_checkbox('ambience', 'value');

其中 'value' 是 form_checkbox 调用的第二个参数。像这样:

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

【讨论】:

  • 我这样做了&lt;?php echo form_checkbox('ambience[]', 'casual', set_checkbox('ambience', 'casual')); ?&gt; 并且复选框没有重新填充
  • 我在我的 CodeIgniter 安装上尝试过,效果很好。您确定您选中了“休闲”复选框而不是其他复选框吗?如果您在第一个echo form_checkbox(...); 的正上方&lt;?php print_r($_REQUEST); ?&gt; 会发生什么?你看到数组中的环境值了吗?
  • codeigniter 文档与set_checkbox('ambience', 'value');不一致
【解决方案3】:

我实际上发现它只有在你这样使用时才有效:

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

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

【讨论】:

  • 您的答案实际上是错误的。您不能在 set_checkbox('ambience[]') 中使用方括号。
  • 其实他没有错。为了发布一个复选框值数组并记住哪些值被选中,方括号必须在 set_checkbox 中,也在复选框的名称中,并且在控制器中的 $this->form_validation->set_rules 中。
【解决方案4】:

这是一个工作示例。您需要在每个$this-&gt;form_validation-&gt;set_rules()form_checkbox()set_checkbox() 中包含数组名称和括号[]

在控制器中:

    $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"');
    }

【讨论】:

  • 谢谢兄弟。这真的很有效。我已经在 form_validation 参数中尝试了 set_reminder_days[] 和 set_reminder_days,没关系。另一个我意识到的是记住使用 POST 方法,GET 方法不知何故不起作用。
【解决方案5】:

我意识到 set_checkbox 需要 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);

【讨论】:

    【解决方案6】:

    这不是使用表单助手。我尝试使用此代码。

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

    【讨论】:

      【解决方案7】:
      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"' : '';
      }
      

      【讨论】:

        【解决方案8】:

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

        这里是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";
                }
            }
        })();
        

        【讨论】:

          【解决方案9】:

          在我的一个项目中,我使用它如下:

          在我所做的视图中:

          $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)', 'required');
          

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

          $this-&gt;form_validation-&gt;set_rules('menu_type_id[]', 'Menu type(s)', 'trim');

          希望这对那里的某些人有所帮助,b/c 此信息在 Code Igniter 的文档中不可用。

          【讨论】:

            猜你喜欢
            • 2010-12-30
            • 2014-10-10
            • 1970-01-01
            • 1970-01-01
            • 2013-02-28
            • 2017-04-06
            • 1970-01-01
            • 2010-11-10
            • 1970-01-01
            相关资源
            最近更新 更多