Octobercms Builder-如何为后端表单编写验证代码并修改字段

时间:2019-11-08 21:56:48

标签: octobercms octobercms-backend

在经历了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?

Picture of the result on Description clic

2 个答案:

答案 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',
];

enter image description here

答案 1 :(得分:0)

要操作表单字段,您应该覆盖模型中的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

希望这会帮助您入门。

EDIT

为什么要在echo $this->nom.' is french'."\r\n";函数中添加echo "\r\n".'filterFields() : '.$this->nom."\r\n";filterFields

只需删除这些行,您就不会有任何错误。

在我的示例中,我提到了这是一种可视化数据响应的快速方法。请查看Backend\Classes\FormBackend\Classes\FormField,以更好地了解其工作原理。

您的方法可能如下所示:

public function filterFields($fields, $context = null) {
    if ( $this->nom == 'toto' ) {
        $fields->pays->value = 'FR';
        $fields->pays->hidden = true;
        $fields->ville->value = 'Paris';
    }
}