<commit_before># Использование свойств из DataStructureTools для произвольной модели

Ниже будет описан процесс (он состоит из трех простых шагов) добавления возможности прикреплять свойства к модели на примере `app\models\Page`. 


## Генерация необходимых таблиц

В первую очередь, необходимо создать необходимые для хранения свойств таблицы (они разные для каждой модели). Для этого есть специальнообученный хелпер.

Ниже описана команда позволяющая создать необходимые таблицы для модели `app\models\Page`:

```php
\DevGroup\DataStructure\helpers\PropertiesTableGenerator::generate('\app\models\Page');
// \DevGroup\DataStructure\helpers\PropertiesTableGenerator::generate(\app\models\Page::class); // Альтернативная версия
```

Как правило, такие операции проводятся в миграциях.


## Модификация модели

Когда таблицы созданы, необходимо добавить к модели поведение. Для этого открываем файл нашей модели и добавляем в метод `behaviors()` поведение `\DevGroup\DataStructure\behaviors\HasProperties`. Получится что-то похожее на 

```php
public function behaviors()
{
    return [
        // other behaviors
        'properties' => [
            'class' => '\DevGroup\DataStructure\behaviors\HasProperties',
            // 'class' => \DevGroup\DataStructure\behaviors\HasProperties::class, // Альтернативная версия
            'autoFetchProperties' => true,
        ],
        // other behaviors
    ];
}
```

Следом добавляем треит `\DevGroup\DataStructure\traits\PropertiesTrait`

```php
// uses namespace and uses
class Page extends \yii\db\ActiveRecord
{
    use \DevGroup\DataStructure\traits\PropertiesTrait;
    // other code here
}
```

И добавим правила валидации полей свойств. Для этого модифицируем метод `rules()` нашей модели:

```php
public function rules()
{
    return ArrayHelper::merge(
        [
            // Page model rules
        ],
        $this->propertiesRules()
    );
}
```

Теперь у нас появилась возможность получать группы и свойста, валидировать данные и сохранять.


## Редактирование свойств в backend

Для редактирования свойств нам необходимо немного изменить экшен редактирования контроллера административной части, добавив в него строку с установкой флага автосохранения свойств модели `$model->autoSaveProperties = true;` сразу после загрузки модели.

```php
public function actionUpdate($id)
{
    $model = $this->findModel($id);
    $model->autoSaveProperties = true;
    // other code
}
```

После этого добавляем вызов виджета формы свойств в представлении формы редактирования модели.

```php
<?=
\DevGroup\DataStructure\widgets\PropertiesForm::widget(
    [
        'model' => $model,
    ]
)
?>
```

На этом все. Теперь можно редактировать свойства прикрепленные к модели `app\models\Page`.<commit_msg>actions order fix<commit_after># Использование свойств из DataStructureTools для произвольной модели

Ниже будет описан процесс (он состоит из трех простых шагов) добавления возможности прикреплять свойства к модели на примере `app\models\Page`.


## Модификация модели

В первую очередь, необходимо добавить к модели поведение. Для этого открываем файл нашей модели и добавляем в метод `behaviors()` поведение `\DevGroup\DataStructure\behaviors\HasProperties`. Получится что-то похожее на 

```php
public function behaviors()
{
    return [
        // other behaviors
        'properties' => [
            'class' => '\DevGroup\DataStructure\behaviors\HasProperties',
            // 'class' => \DevGroup\DataStructure\behaviors\HasProperties::class, // Альтернативная версия
            'autoFetchProperties' => true,
        ],
        // other behaviors
    ];
}
```

Следом добавляем треит `\DevGroup\DataStructure\traits\PropertiesTrait`

```php
// uses namespace and uses
class Page extends \yii\db\ActiveRecord
{
    use \DevGroup\DataStructure\traits\PropertiesTrait;
    // other code here
}
```

И добавим правила валидации полей свойств. Для этого модифицируем метод `rules()` нашей модели:

```php
public function rules()
{
    return ArrayHelper::merge(
        [
            // Page model rules
        ],
        $this->propertiesRules()
    );
}
```


## Генерация необходимых таблиц

Далее необходимо создать необходимые для хранения свойств таблицы (они разные для каждой модели). Для этого есть специальнообученный хелпер.

Ниже описана команда позволяющая создать необходимые таблицы для модели `app\models\Page`:

```php
\DevGroup\DataStructure\helpers\PropertiesTableGenerator::generate('app\models\Page');
// \DevGroup\DataStructure\helpers\PropertiesTableGenerator::generate(\app\models\Page::class); // Альтернативная версия
```

Как правило, такие операции проводятся в миграциях.


## Редактирование свойств в backend

Для редактирования свойств нам необходимо немного изменить экшен редактирования контроллера административной части, добавив в него строку с установкой флага автосохранения свойств модели `$model->autoSaveProperties = true;` сразу после загрузки модели.

```php
public function actionUpdate($id)
{
    $model = $this->findModel($id);
    $model->autoSaveProperties = true;
    // other code
}
```

После этого добавляем вызов виджета формы свойств в представлении формы редактирования модели.

```php
<?=
\DevGroup\DataStructure\widgets\PropertiesForm::widget(
    [
        'model' => $model,
    ]
)
?>
```

На этом все. Теперь можно редактировать свойства прикрепленные к модели `app\models\Page`.
{'fraction_non_alphanumeric': 0.09738937233845583, 'fraction_numerical': 0.0, 'mean_word_length': 3.9742173112338857, 'pattern_counts': {'":': 0, '<': 5, '<?xml version=': 0, '>': 23, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '5177676', 'n_tokens_mistral': 1891, 'n_tokens_neox': 2111, 'n_words': 466}