Octobercms Builder - Как написать проверочный код для внутренней формы и изменить поля - PullRequest
1 голос
/ 09 ноября 2019

Я новичок в этом фантастическом октябре после 10 лет Joomla и хотел бы продолжить его. Я использую отличный плагин Builder и хотел бы иметь «сложные» проверки в бэк-энде с формами «создавать» или «обновлять».

После многих поисков в сети я могуНе представляете, как и где разместить код для добавления правил проверки бизнеса?

Я играл с опциями yaml, чтобы иметь динамические поля и простые проверки. Теперь я хотел бы иметь сложные правила, такие как: если категория - это X, а тип - это Y, тогда поле (текстовое) имени устанавливается в «ZZZ». Может кто-нибудь подсказать мне, как добавить такой код в PHP?

Я могу читать значения полей, но не могу программно изменить входные данные. После многих попыток я застрял в проблеме. Любая помощь будет принята с благодарностью. Спасибо.

[EDIT] После помощи Раджи я изменил свой код следующим образом: PHP Model

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 зависящих: ном.

Когда я заполняю 'Nom' и нажимаю на Описание, результат теперь:

1) Я все еще не могуизменить значение в форме , когда я иду в функцию, потому что я отображаю строку «toto is french»

2) В текстовых полях, которые я пытаюсь изменить, я получаю бесконечный счетчик иполя не могут быть введены с помощью мыши, только с клавиатуры

3) Как я могу удалить зеленую строку X_OCTOBER_ASSETS?

Изображение результата в Description click

Ответы [ 2 ]

0 голосов
/ 10 ноября 2019

Чтобы манипулировать полями формы, вы должны переопределить метод 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';
    }
}
0 голосов
/ 09 ноября 2019

Все это можно сделать в файле models.php и работать с событиями модели . Вы можете вызвать фасады конкретных моделей, которые вы хотите зарегистрировать, также вверху: use Author\Plugin\Models\Model.

Например, мне нравится добавлять слаг с идентификатором, чтобы вы могли использовать событие afterSave(). Вы используете запись с $this.

public function afterSave()
{
    $id = $this->id;
    if (strpos($this->slug, '-'.$id) === false) 
    {
        $this->slug = $this->slug.'-'.$id;
    }
}

Если вы хотите проверить модель, вы можете использовать public $rules , найденный здесь . Вот пример того, как должно выглядеть требуемое уникальное имя, и изображение того, что появляется при сбое валидатора.

public $rules = [
    'name' => 'required|unique:author_plugin_database',
];

enter image description here

...