在经历了10年的Joomla之后,我是这个奇妙的十月新手,并希望继续前进。 我正在使用出色的Builder插件,并希望在后端使用“创建”或“更新”表单进行“复杂”验证。
浏览网络很多次之后,我不知道如何添加代码以及在何处添加业务验证规则?
我使用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
我了解的是根据YAML的DependOn:nom触发了filterFields()。
当我填写“ Nom”并单击“描述”时,结果为:
1)在函数中,我仍然无法更改表单中的值,因为我显示了字符串“ toto is french”
2)在我尝试修改的文本字段上,我得到了无尽的微调框,现在这些字段只能用键盘输入,而不能用鼠标输入
3)如何删除绿色字符串X_OCTOBER_ASSETS?
答案 0 :(得分:0)
这一切都可以在models.php文件中完成,并且可以运行with Model Events。您还可以在顶部使用use Author\Plugin\Models\Model
调用要注册的特定模型外观。
例如,我想为子弹添加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',
];
答案 1 :(得分:0)
要操作表单字段,您应该覆盖模型中的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
希望这会帮助您入门。
EDIT
为什么要在echo $this->nom.' is french'."\r\n";
函数中添加echo "\r\n".'filterFields() : '.$this->nom."\r\n";
和filterFields
?
只需删除这些行,您就不会有任何错误。
在我的示例中,我提到了这是一种可视化数据响应的快速方法。请查看Backend\Classes\Form和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';
}
}