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

  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;
  }
打赏
评论区
头像
    头像

    刚建站的时候遇到这个bug了

    头像
    Ezuxoay
      

    主题还更新吗

      头像
      Veen Zhao
        
      @Ezuxoay

      当然更新,6系列已经在计划当中了

    头像

    感谢分享

    头像
    指南
      

    前排!