Octobercms Builder - 如何编写后端表单验证代码和修改字段
Octobercms Builder - How to write validation code for backend form and modify fields
在使用 Joomla 10 年之后,我对这个美妙的 10 月还是陌生的,我想继续使用它。
我正在使用很棒的 Builder 插件,并希望在后端使用 'create' 或 'update' 表单进行 'complex' 验证。
网上看了很多遍,还是想不通添加业务验证规则的代码怎么放,放在哪里?
我使用 yaml 选项来获得动态字段和简单验证。
现在我想要复杂的规则,比如:如果一个类别是 X 并且一个类型是 Y 那么(文本)名称字段被设置为 'ZZZ'
有人可以让我在 PHP 中添加此类代码吗?
我可以读取字段值,但无法以编程方式更改输入。
经过多次尝试,我陷入了这个问题。
任何帮助将不胜感激。谢谢
[编辑]
在 Raja 的帮助下,我修改了我的代码:
PHP型号
class Event extends Model {
use \October\Rain\Database\Traits\Validation;
use \October\Rain\Database\Traits\SoftDelete;
public $rules = [];
// in models/your_object_model
public function filterFields($fields, $context = null) {
echo "\r\n".'filterFields() : '.$this->nom."\r\n";
// var_dump($fields->nom);
if ( $this->nom == 'toto' ) {
echo $this->nom.' is french'."\r\n";
$fields->pays->value = 'FR';
$fields->pays->hidden = true;
$fields->ville->value = 'Paris';
}
}
}
YAML:
fields:
nom:
label: Nom
span: full
type: text
description:
label: Description
size: ''
span: full
type: richeditor
pays:
label: Pays
span: auto
default: US
type: text
dependsOn: nom
ville:
label: Ville
span: auto
default: NY
dependsOn: nom
type: text
据我了解,filterFields() 是基于 YAML dependsOn: nom 触发的。
当我填写 'Nom' 并点击描述时,现在的结果是:
1) 我仍然无法在进入函数时更改表单 中的值,因为我显示字符串 "toto is french"
2) 在我尝试修改的文本字段上,我得到了无尽的微调器,现在不能用鼠标输入这些字段,只能用键盘输入
3) 如何删除绿色字符串 X_OCTOBER_ASSETS?
Picture of the result on Description clic
这一切都可以在 models.php 文件中完成并工作 with Model Events。您也可以在顶部使用 use Author\Plugin\Models\Model
调用要注册的特定模型外观。
例如,我喜欢在 slug 后附加 ID,以便您可以使用 afterSave()
事件。您使用 $this
.
的记录
public function afterSave()
{
$id = $this->id;
if (strpos($this->slug, '-'.$id) === false)
{
$this->slug = $this->slug.'-'.$id;
}
}
如果要验证模型,可以使用 public $rules
found here。下面是一个必需的唯一名称的示例,以及验证器失败时弹出的图像。
public $rules = [
'name' => 'required|unique:author_plugin_database',
];
要操作表单字段,您应该覆盖模型中的 filterFields
方法 - Docs。
假设我们的模型有 4 个字段,其中 Name
和 Publish
取决于 Category
和 Type
的值。
字段定义
category:
label: Category
type: dropdown
options:
category_a: Category A
category_b: Category B
category_c: Category C
type:
label: Type
type: dropdown
options:
type_a: Type A
type_b: Type B
type_c: Type C
name:
label: Name
comment: 'Comment..'
dependsOn: [category,type]
publish:
label: Publish
type: switch
comment: 'Comment..'
default: true
dependsOn: [category,type]
注意:使用 dependsOn
选项设置字段依赖项。这里的 Name
字段取决于 category
和 type
.
型号
public function filterFields($fields, $context = null)
{
// Category selected has a value of 'category_b';
if ($this->category == 'category_b') {
// Try this to see available properties on this field type
// var_dump($fields->name);
// Category = 'category_b' && Type selected = 'type_c'...
if ($this->type == 'type_c') {
$fields->name->value = 'Category set to B and Type to C';
$fields->publish->value = false;
$fields->publish->hidden = true;
} else {
$fields->name->value = "Category set to B";
$fields->name->comment = 'Comment changed..';
$fields->publish->value = false;
$fields->publish->comment = "Switch has been turned off";
}
}
elseif (($this->category == 'category_a') && ($this->type == 'type_a')) {
$fields->name->value = 'Category set to A';
// ect...
}
}
这很简单。您可以更新某个字段的所有属性,如果您只需要显示评论或隐藏某些内容,这将非常有用。 context
参数让您可以更好地控制何时应用过滤器,例如 update
希望这能帮助您入门。
编辑
为什么要将 echo $this->nom.' is french'."\r\n";
和 echo "\r\n".'filterFields() : '.$this->nom."\r\n";
添加到 filterFields
函数中?
只需删除这些行,您就不会出现任何错误。
在我的示例中,我提到这是一种可视化数据的快速方法response.Take查看 Backend\Classes\Form and Backend\Classes\FormField 以更好地理解它的工作原理。
您的方法可能如下所示:
public function filterFields($fields, $context = null) {
if ( $this->nom == 'toto' ) {
$fields->pays->value = 'FR';
$fields->pays->hidden = true;
$fields->ville->value = 'Paris';
}
}
在使用 Joomla 10 年之后,我对这个美妙的 10 月还是陌生的,我想继续使用它。 我正在使用很棒的 Builder 插件,并希望在后端使用 'create' 或 'update' 表单进行 'complex' 验证。
网上看了很多遍,还是想不通添加业务验证规则的代码怎么放,放在哪里?
我使用 yaml 选项来获得动态字段和简单验证。 现在我想要复杂的规则,比如:如果一个类别是 X 并且一个类型是 Y 那么(文本)名称字段被设置为 'ZZZ' 有人可以让我在 PHP 中添加此类代码吗?
我可以读取字段值,但无法以编程方式更改输入。 经过多次尝试,我陷入了这个问题。 任何帮助将不胜感激。谢谢
[编辑] 在 Raja 的帮助下,我修改了我的代码: PHP型号
class Event extends Model {
use \October\Rain\Database\Traits\Validation;
use \October\Rain\Database\Traits\SoftDelete;
public $rules = [];
// in models/your_object_model
public function filterFields($fields, $context = null) {
echo "\r\n".'filterFields() : '.$this->nom."\r\n";
// var_dump($fields->nom);
if ( $this->nom == 'toto' ) {
echo $this->nom.' is french'."\r\n";
$fields->pays->value = 'FR';
$fields->pays->hidden = true;
$fields->ville->value = 'Paris';
}
}
}
YAML:
fields:
nom:
label: Nom
span: full
type: text
description:
label: Description
size: ''
span: full
type: richeditor
pays:
label: Pays
span: auto
default: US
type: text
dependsOn: nom
ville:
label: Ville
span: auto
default: NY
dependsOn: nom
type: text
据我了解,filterFields() 是基于 YAML dependsOn: nom 触发的。
当我填写 'Nom' 并点击描述时,现在的结果是:
1) 我仍然无法在进入函数时更改表单 中的值,因为我显示字符串 "toto is french"
2) 在我尝试修改的文本字段上,我得到了无尽的微调器,现在不能用鼠标输入这些字段,只能用键盘输入
3) 如何删除绿色字符串 X_OCTOBER_ASSETS?
Picture of the result on Description clic
这一切都可以在 models.php 文件中完成并工作 with Model Events。您也可以在顶部使用 use Author\Plugin\Models\Model
调用要注册的特定模型外观。
例如,我喜欢在 slug 后附加 ID,以便您可以使用 afterSave()
事件。您使用 $this
.
public function afterSave()
{
$id = $this->id;
if (strpos($this->slug, '-'.$id) === false)
{
$this->slug = $this->slug.'-'.$id;
}
}
如果要验证模型,可以使用 public $rules
found here。下面是一个必需的唯一名称的示例,以及验证器失败时弹出的图像。
public $rules = [
'name' => 'required|unique:author_plugin_database',
];
要操作表单字段,您应该覆盖模型中的 filterFields
方法 - Docs。
假设我们的模型有 4 个字段,其中 Name
和 Publish
取决于 Category
和 Type
的值。
字段定义
category:
label: Category
type: dropdown
options:
category_a: Category A
category_b: Category B
category_c: Category C
type:
label: Type
type: dropdown
options:
type_a: Type A
type_b: Type B
type_c: Type C
name:
label: Name
comment: 'Comment..'
dependsOn: [category,type]
publish:
label: Publish
type: switch
comment: 'Comment..'
default: true
dependsOn: [category,type]
注意:使用 dependsOn
选项设置字段依赖项。这里的 Name
字段取决于 category
和 type
.
型号
public function filterFields($fields, $context = null)
{
// Category selected has a value of 'category_b';
if ($this->category == 'category_b') {
// Try this to see available properties on this field type
// var_dump($fields->name);
// Category = 'category_b' && Type selected = 'type_c'...
if ($this->type == 'type_c') {
$fields->name->value = 'Category set to B and Type to C';
$fields->publish->value = false;
$fields->publish->hidden = true;
} else {
$fields->name->value = "Category set to B";
$fields->name->comment = 'Comment changed..';
$fields->publish->value = false;
$fields->publish->comment = "Switch has been turned off";
}
}
elseif (($this->category == 'category_a') && ($this->type == 'type_a')) {
$fields->name->value = 'Category set to A';
// ect...
}
}
这很简单。您可以更新某个字段的所有属性,如果您只需要显示评论或隐藏某些内容,这将非常有用。 context
参数让您可以更好地控制何时应用过滤器,例如 update
希望这能帮助您入门。
编辑
为什么要将 echo $this->nom.' is french'."\r\n";
和 echo "\r\n".'filterFields() : '.$this->nom."\r\n";
添加到 filterFields
函数中?
只需删除这些行,您就不会出现任何错误。
在我的示例中,我提到这是一种可视化数据的快速方法response.Take查看 Backend\Classes\Form and Backend\Classes\FormField 以更好地理解它的工作原理。
您的方法可能如下所示:
public function filterFields($fields, $context = null) {
if ( $this->nom == 'toto' ) {
$fields->pays->value = 'FR';
$fields->pays->hidden = true;
$fields->ville->value = 'Paris';
}
}