typecho实现主题设置页的控件继承自同一个类,所以它们支持同样数量的参数,但对于某些空间来说,其中某几个参数是不必要的,但这一节中的单选框元素,就是一个集齐了5个参数的狠角色,在functions.php中,我们利用这个类来实现一个单选框。
参数回顾
Typecho_Widget_Helper_Form_Element_Text这个类支持5个参数,兄弟类Typecho_Widget_Helper_Form_Element_Radio也一样,不同的是,对于Radio元素来说,这5个参数都有用武之地:
- $name 表单输入项名称
- $options 选择项
- $value 表单默认值
- $label 表单标题
- $description 表单描述
程序展现与源代码
function themeConfig($form) {
$searchForm= new Typecho_Widget_Helper_Form_Element_Radio('searchForm', array(
'white' => '白色',
'black' => '黑色'
), 'white', _t('导航栏颜色'), _t('用户可以选择是否开启搜索功能'));
$form->addInput($searchForm);
}
这是一段示例的程序,虽然提供了单选框的默认值,但在实际的测试中,这个默认值并没有起到应有的作用,展现于后台的初始状态如下图,程序设置了默认值为“white”,但后台初始化后,白色按钮并没有被选中:
此时用如下语句意图打印searchForm的值是没有效果的:
<?php if($this->options->searchForm){echo 'My value is '.$this->options->searchForm;} ?>
选中白色并保存设置后,页面会打印出如下结果:
My value is white
在部分主题中看到过这种语法:
<?php if($this->options->searchForm){echo 'My value is '.$this->options->searchForm();} ?>
加上括号后,刚才输出在屏幕上的“My value is white”的语序会变为这样:
whiteMy value is
在不加括号的时候,语句返回一个值给了echo函数,供echo拼接字符串使用,而加了括号以后,语句不再返回值,而是象一个立即执行的函数一样直接在屏幕上输出了内容,所以就有了语序上的变化。
多行模式
单选框可选项目较多时,我们也可以考虑将可选择项目多行排列,比如将程序修改如下:
function themeConfig($form) {
$searchForm= new Typecho_Widget_Helper_Form_Element_Radio('searchForm', array(
'red' => '红色',
'yellow' => '黄色',
'blue' => '蓝色',
'white' => '白色',
'black' => '黑色'
), NULL, _t('导航栏颜色'), _t('用户可以选择是否开启搜索功能'));
$form->addInput($searchForm -> multiMode());
}
修改为上述语句后“设置外观”页面的展现如下图:
垃圾回收机制
有一个需要留意的问题是,如果不想在代码中保留上述选项,并且在functions.php中明确删除了上面示例中的代码,searchForm的值还是能够被提取到,所以仅删除掉代码是不够的,我们需要在“设置外观”页面下重新点击保存设置,此时没有被引用的值才会被清除,所以修改代码之后,记得要及时保存一下设置。
如何让默认值生效
最初以为是自己设置的问题,在另一个typecho博客上尝试后,发现默认值同样是无法生效的,也就是设置完funcions.php之后,并不会触发数据的更新,但安装一个新的主题后,确实是有默认设置的,区别就在于,新安装主题后有一个启用的步骤,于是将主题换成另一个,然后重新启用回来,发现默认值正确得到了显示。