Skip to content

Latest commit

 

History

History
90 lines (68 loc) · 3.59 KB

how-to-use.md

File metadata and controls

90 lines (68 loc) · 3.59 KB

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

На этом все. Теперь можно редактировать свойства прикрепленные к модели app\models\Page.