复选框在用户配置文件上不显示为选中(即使选中=“选中”)

时间:2015-12-03 作者:Andy McCormick

我有一个动态的复选框列表,显示在管理区域(user edit.php)的用户配置文件上。用户应该能够选择复选框,将其选择保存为usermeta字段中的数组。很简单。但是,当我在更新用户后加载用户配置文件时,即使选项保存在usermeta字段中,并且复选框的属性为checked=“checked”,也不会选中这些框。

起初,我只是使用一个基本的in\\u array()来检查复选框值是否位于usermeta的数组中。如果是,则我设置checked=“checked”。这起到了作用,并在开发工具中显示为showing checked=“checked”,但仍然没有选中标记。下面是它的样子:

$courseResults = DwgFunctions::get_all_courses();
        $userWaivedModules = DwgFunctions::checkCourses(\'scorm_waived_courses\',$user);
            foreach($courseResults as $course){
                $courseListing.= \'<input type="checkbox" name="waivedCourses[]" value="\'.$course->getCourseId().\'" \'.(in_array($course->getCourseId(),$userWaivedModules)?"checked=\\"checked\\"":"").\'/>\'.$course->getTitle().\'<br />\';
            }
读了一些书后,我发现WordPress喜欢让我们使用checked()函数。当然,它只是检查字符串,我需要它来检查数组。所以我使用了在论坛上找到的一个方便的功能,现在有了这个:

    $courseResults = DwgFunctions::get_all_courses();
    $userWaivedModules = DwgFunctions::checkCourses(\'scorm_waived_courses\',$user);
        foreach($courseResults as $course){
            $courseListing.= \'<input type="checkbox" name="waivedCourses[]" value="\'.$course->getCourseId().\'" \'.DwgFunctions::dwg_checked($userWaivedModules,$course->getCourseId()).\'/>\'.$course->getTitle().\'<br />\';
        }
我的deg\\u checked函数如下所示:

  function dwg_checked($haystack, $current){
            if(is_array($haystack) && in_array($current, $haystack)) {
                $current = $haystack = 1;
            }
        return  checked($haystack, $current);
        }
两种方式的结果都是一样的:

<input type="checkbox" name="waivedCourses[]" value="1-555e1f4f86bd2">SC DDSN Family-Arranged Respite - An Overview for Families<br>
<input type="checkbox" name="waivedCourses[]" value="1-555e1f89ae931" checked="checked">Overview for Families - Quiz<br>
<input type="checkbox" name="waivedCourses[]" value="1-555e1f9d1d688" checked="checked">Overview for Families - Quiz<br>
<input type="checkbox" name="waivedCourses[]" value="1-555e20e3079ad" checked="checked">Overview for Families - Quiz<br>
<input type="checkbox" name="waivedCourses[]" value="FamilyModule_FinalQuizc0ea0981-8158-4077-b94a-6d182db566a3">FamilyModule_FinalQuiz<br>
<input type="checkbox" name="waivedCourses[]" value="FAMILYMODULE_QUIZ3ecc3d81-1281-4477-adb8-ac81ef96724a">FAMILYMODULE_QUIZ<br>
<input type="checkbox" name="waivedCourses[]" value="FamilyModule_TheFinalQuizad828150-f6da-4e19-b69c-5a78a74d412a">FamilyModule_FinalQuiz_2<br>
但是,它在屏幕上显示为:unchecked boxes

如果我按原样更新用户(有些框显示checked=“checked”,但实际上没有一个框显示复选标记),它将完全清除我的usermeta值。

如果我真的选中了复选框,它将显示复选标记,并且还实现了css for input[类型=复选框]:checked:before,并将设置保存在usermeta中。请注意,动态添加checked属性时,不会实现css before伪类。checked

input[type=checkbox]:checked:before {
    content: \'\\f147\';
    margin: -3px 0 0 -4px;
    color: #1e8cbe;
}
你知道会发生什么吗?其他地方的复选框工作正常,但它们不使用数组(也不使用checked()函数)

2 个回复
最合适的回答,由SO网友:Andy McCormick 整理而成

我猜用户编辑屏幕只像表格一样。我的其他复选框使用的是标准表结构。因此,我不只是使用输入复选框,而是在元素中插入复选框,并在元素中插入标签,以遵循页面其余部分的结构。现在我的代码如下所示:

$courseResults = DwgFunctions::get_all_courses();
        $userWaivedModules = DwgFunctions::checkCourses(\'scorm_waived_courses\',$user);
            foreach($courseResults as $course){
                $courseListing.= \'<tr class="waived-modules"><th><input type="checkbox" name="waivedCourses[]" value="\'.$course->getCourseId().\'" \'.DwgFunctions::dwg_checked($userWaivedModules,$course->getCourseId()).\'/></th>\';
                $courseListing.= \'<td><label for="waivedCourses">\'.$course->getTitle().\'</label></td></tr>\';
            }
这导致:enter image description here

仍然不能百分之百确定为什么这一个有效而另一个无效,但只要它现在有效。

SO网友:Brahma Kumar Krishna

我知道这是一篇老帖子,但我在搜索同一个问题时偶然发现了你的问题。我想我会分享我的两分钱,这样人们(将来)搜索同一个问题将节省一些时间。

那么,默认的解决方案似乎是我们实际上必须使用checked() function 管理中的Wordpress,如中的复选框部分所述this article.

无论如何,基本思想是我们可以使用以下语法在呈现页面之前预先选中复选框(在复选框输入字段中):

checked( $checkbox_value_from_db[\'array_of_meta_values\'][0], \'yes\' ) 
希望这对某人有帮助。