IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    修复Typecho Checkbox复选框无法保存的问题

    Veen Zhao发表于 2023-07-03 13:21:00
    love 0

      Cuteen主题后台设置中的开关项是由Typecho的Checkbox改造的,但是在最新的typecho版本中出现了Checkbox无法勾选保存的现象,也就导致了无法开启主题相关功能,追查代码发现:

      在typecho/var/Widget/Themes/Config.php中第74行位置有一句:

     $form->getInput($key)->value($this->options->{$key}); 

      上面这行代码中,从options中得到值,但是由于主题的复选框是新加入的,因此options中并没有对应的值,导致给了一个空的值给复选框。

      当主题选项保存的时候,is_array中的数据是从$this->getInput('xxxx')拿到value,但前面程序已经设置为空值,所以在收集提交选项数据时候,以下代码判断不通过,返回null,最终导致保存勾选无效。

    $result[$param] = $request->get($param, is_array($this->getInput($param)->value) ? [] : null); 

    解决方案

    解决方案有三种:

    方案一

      升级typecho到最新的开发版,在 #1590 中,此问题已修复

    方案二

      回退typecho版本至 1.2.0,❌不推荐这种做法,小于1.2.1的版本中包含xss漏洞。

    方案三

      打开typecho/var/Widget/Themes/Config.php,在第74行左右将其注释,按照下面代码修改:

      public function config(): Form
      {
          $form = new Form($this->security->getIndex('/action/themes-edit?config'), Form::POST_METHOD);
          themeConfig($form);
          $inputs = $form->getInputs();
    
          if (!empty($inputs)) {
              foreach ($inputs as $key => $val) {
              //将这行注释:
                  //$form->getInput($key)->value($this->options->{$key});
              //改为这三行:
                  if (isset($this->options->{$key})) {
                      $form->getInput($key)->value($this->options->{$key});
                  }
              }
          }
    
          $submit = new Submit(null, null, _t('保存设置'));
          $submit->input->setAttribute('class', 'btn primary');
          $form->addItem($submit);
          return $form;
      }


沪ICP备19023445号-2号
友情链接