在 Octobercms 中设置表单 return null 上的默认值
Setting a default value on settings form return null in Octobercms
我为 OctoberCMS 创建了一个小插件,但现在要处理为设置表单设置默认值的问题。
我为我的插件设置使用了数据库存储(后端 -> 设置选项卡 -> 我的插件选项卡),效果很好,除了我不能设置默认值。
我有一个 fields.yaml
内容如下:
tabs:
fields:
reviews_border_color:
label: 'Field1'
span: left
tab: 'review_sticker'
required: 1
type: text
default: '#F2F2F2'
rating_star_size:
label: 'Field2'
span: left
tab: 'review_sticker'
required: 1
type: number
default: 14
我像这样检索组件中的设置:
<?php namespace Codedge\TestPlugin\Components;
use Cms\Classes\ComponentBase;
use Codedge\TestPlugin\Models\Settings;
class TestComponent extends ComponentBase
{
public $starSize;
public $borderColor;
public function componentDetails()
{
return [
'name' => 'Test Component',
'description' => '...'
];
}
public function defineProperties()
{
return [];
}
public function init()
{
$this->starSize = Settings::get('rating_star_size'); // not giving a default value when empty, default is 14
$this->borderColor = Settings::get('reviews_border_color'); // not giving a default value when empty, default is '#F2F2F2'
}
}
我还尝试设置默认值,作为 OctoberCMS docs 中建议的 get()
方法中的第二个参数:
public function init()
{
$this->starSize = Settings::get('rating_star_size', 14); // returns null
$this->borderColor = Settings::get('reviews_border_color', '#F2F2F2'); // returns null
}
如果 none 在设置表单字段中 specified/entered,那么有什么建议可以可靠地设置默认值吗?
更新:
经过一番挖掘,我在 system/behaviors/SettingsModel.php
的方法 getSettingsValue()
中找到了解释
/**
* Get a single setting value, or return a default value
*/
public function getSettingsValue($key, $default = null)
{
if (array_key_exists($key, $this->fieldValues)) {
return $this->fieldValues[$key];
}
return $default;
}
因为我的字段存在于 $this->fieldValues
它 returns 它对我来说是空的而不是返回 $default
值。
所以我的想法,如果字段值为空,则返回默认值,不包括在内。
有什么建议吗?
在 Github 上咨询了 OctoberCMS 团队后,当前行为是 intented/not 一个错误 - 请参阅 https://github.com/octobercms/october/issues/2094。可能需要考虑改变这种行为,但这是另一回事了。
为什么不用initSettingsData
函数,可以这样用:
class Settings extends Model
{
public $implement = ['System.Behaviors.SettingsModel'];
// A unique code
public $settingsCode = 'my-settings';
// Reference to field configuration
public $settingsFields = 'fields.yaml';
public function initSettingsData()
{
$this->admin_email = 'some@email.com';
$this->admin_name = 'Walid Ammar';
$this->other_settings = 'other value';
}
}
我为 OctoberCMS 创建了一个小插件,但现在要处理为设置表单设置默认值的问题。
我为我的插件设置使用了数据库存储(后端 -> 设置选项卡 -> 我的插件选项卡),效果很好,除了我不能设置默认值。
我有一个 fields.yaml
内容如下:
tabs:
fields:
reviews_border_color:
label: 'Field1'
span: left
tab: 'review_sticker'
required: 1
type: text
default: '#F2F2F2'
rating_star_size:
label: 'Field2'
span: left
tab: 'review_sticker'
required: 1
type: number
default: 14
我像这样检索组件中的设置:
<?php namespace Codedge\TestPlugin\Components;
use Cms\Classes\ComponentBase;
use Codedge\TestPlugin\Models\Settings;
class TestComponent extends ComponentBase
{
public $starSize;
public $borderColor;
public function componentDetails()
{
return [
'name' => 'Test Component',
'description' => '...'
];
}
public function defineProperties()
{
return [];
}
public function init()
{
$this->starSize = Settings::get('rating_star_size'); // not giving a default value when empty, default is 14
$this->borderColor = Settings::get('reviews_border_color'); // not giving a default value when empty, default is '#F2F2F2'
}
}
我还尝试设置默认值,作为 OctoberCMS docs 中建议的 get()
方法中的第二个参数:
public function init()
{
$this->starSize = Settings::get('rating_star_size', 14); // returns null
$this->borderColor = Settings::get('reviews_border_color', '#F2F2F2'); // returns null
}
如果 none 在设置表单字段中 specified/entered,那么有什么建议可以可靠地设置默认值吗?
更新:
经过一番挖掘,我在 system/behaviors/SettingsModel.php
getSettingsValue()
中找到了解释
/**
* Get a single setting value, or return a default value
*/
public function getSettingsValue($key, $default = null)
{
if (array_key_exists($key, $this->fieldValues)) {
return $this->fieldValues[$key];
}
return $default;
}
因为我的字段存在于 $this->fieldValues
它 returns 它对我来说是空的而不是返回 $default
值。
所以我的想法,如果字段值为空,则返回默认值,不包括在内。
有什么建议吗?
在 Github 上咨询了 OctoberCMS 团队后,当前行为是 intented/not 一个错误 - 请参阅 https://github.com/octobercms/october/issues/2094。可能需要考虑改变这种行为,但这是另一回事了。
为什么不用initSettingsData
函数,可以这样用:
class Settings extends Model
{
public $implement = ['System.Behaviors.SettingsModel'];
// A unique code
public $settingsCode = 'my-settings';
// Reference to field configuration
public $settingsFields = 'fields.yaml';
public function initSettingsData()
{
$this->admin_email = 'some@email.com';
$this->admin_name = 'Walid Ammar';
$this->other_settings = 'other value';
}
}