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 个字段,其中 NamePublish 取决于 CategoryType 的值。

字段定义

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 字段取决于 categorytype.

型号

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';
    }
}