1. 该问题的重现步骤是什么?
以默认主题为例
- 启用主题
- 在主题的文件中,添加复选框代码,例如下面代码:
$testBlock = new \Typecho\Widget\Helper\Form\Element\Checkbox(
'testBlock',
[
'test' => _t('测试'),
],
['test'],
_t('测试复选框')
);
$form->addInput($testBlock->multiMode());
- 刷新主题选项页面,点击保存设置
2. 你期待的结果是什么?实际看到的又是什么?
期望结果测试被勾上,实际勾选无效
3. 问题出现的环境
- 操作系统版本:OpenSUSE tw
- Apache/NGINX 版本:docker:joyqi/typecho:nightly-php7.4
- 数据库版本:docker:mysql5.7
- PHP 版本:docker:joyqi/typecho:nightly-php7.4
- Typecho 版本:docker:joyqi/typecho:nightly-php7.4
- 浏览器版本:google-chrome 114.0.5735.106

4. 问题出现原因
|
$form->getInput($key)->value($this->options->{$key}); |
上面这行代码中,从 options 中拿值,但是因为测试复选框新加入的,options 中并没有对应的值,导致给了一个空的值给测试复选框 $this->getInput('testBlock') 。
当主题选项保存的时候,is_array 中的数据是从 $this->getInput('testBlock') 拿 value,但前面程序已经设置为空值,所以在收集提交选项数据时候,以下代码判断不通过,返回 null ,最终导致保存勾选无效
|
$result[$param] = $request->get($param, is_array($this->getInput($param)->value) ? [] : null); |
上面是我排查的原因,我认为 Config.php#L74 应该增加判断是有内容,稍后我将提个 PR 。
1. 该问题的重现步骤是什么?
以默认主题为例
2. 你期待的结果是什么?实际看到的又是什么?
期望结果
测试被勾上,实际勾选无效3. 问题出现的环境
4. 问题出现原因
typecho/var/Widget/Themes/Config.php
Line 74 in 206880b
上面这行代码中,从
options中拿值,但是因为测试复选框新加入的,options中并没有对应的值,导致给了一个空的值给测试复选框 $this->getInput('testBlock')。当主题选项保存的时候,is_array 中的数据是从
$this->getInput('testBlock')拿 value,但前面程序已经设置为空值,所以在收集提交选项数据时候,以下代码判断不通过,返回 null ,最终导致保存勾选无效typecho/var/Typecho/Widget/Helper/Form.php
Line 205 in 206880b
上面是我排查的原因,我认为
Config.php#L74应该增加判断是有内容,稍后我将提个 PR 。