@@ -51,15 +51,52 @@ TODO: https://github.com/yiisoft/yii2/blob/master/docs/guide-ru/security-authent
51
51
52
52
Теперь давайте вернёмся к форме "Опрос". Для работы с формой в клиентской части(далее frontend) мы использовали
53
53
Active Record модель ` Interview ` , которая описывала форму. Т.к. эта модель описана в frontend, то в backend
54
- она не доступна. Чтобы исправить это, необходимо модель расположить в общей директории - ` common/models/ ` .
55
- Необходимо скопировать файл ` Interview.php ` из ` frontend/models ` в ` common/models/ ` . Это уже сделано.
54
+ к ней можно обратиться как ` frontend/models/Interview ` - что не совсем корректно.
55
+ Чтобы исправить это, необходимо модель расположить в общей директории - ` common/models/ ` .
56
+ Необходимо переместить файл ` Interview.php ` из ` frontend/models ` в ` common/models/ ` . Это уже сделано.
56
57
57
- Вам осталось изменить файлы следующим образом. В common модели изменим пространство имени, удалим свойство "проверочный
58
- код", удалим правила, так как это всё требуется на стороне frontend части. А в frontend модели изменить
59
- родительский класс с ` \yii\db\ActiveRecord ` на ` \common\models\Interview ` и удалите методы ` tableName() ` и ` attributeLabels() ` .
58
+ Вам осталось изменить файлы, зависимые от этой модели, следующим образом:
60
59
61
- Теперь, когда все изменения внесены, в backend возможно использовать модель ` \common\models\Interview ` . Создадим вид,
62
- в котором будут отображаться все записи из таблицы "Опросов". Чтобы облегчить выполнение этой задачи,
60
+ - в common модели ` yii2-app-advanced/common/models/Interview.php ` изменить пространство имени класса.
61
+
62
+ - поменять в ` frontend/controllers/SiteControllers.php ` в методе ` actionInterview() ` пространство имени для этой модели
63
+ с ` frontend/models/Interview ` на ` common/models/Interview ` .
64
+
65
+ - поменять в виде ` yii2-app-advanced/frontend/views/site/interview.php ` пространство имени, также как в предыдущем случае.
66
+
67
+ - удалить файл ` yii2-app-advanced/frontend/models/Interview.php `
68
+
69
+ Теперь, когда все изменения внесены, в backend и frontend возможно использовать единую AR модель - ` \common\models\Interview ` .
70
+
71
+ <p class =" alert alert-info " >
72
+ Для того, чтобы избежать такой ситуации в будущем, лучше сразу генерировать все модели Active Record в "common/models".
73
+ </p >
74
+
75
+ #### Важный момент: Разделение моделей Active Record
76
+
77
+ Очень часто, модель Active Record разбивается на два, три класса, т.е. ` \common\models\Interview ` и её наследники
78
+ ` \frontend\models\Interview ` и ` \backend\models\Interview ` . Сперва это кажется логичным и правильным. Но такое разделение
79
+ влечёт за собой скрытые проблемы. Возможно в большинстве случаев вы даже не столкнётесь с этими проблемами, но они существуют.
80
+ Вот некоторые из них:
81
+
82
+ - может возвратиться некорректная связь с другими разделёнными моделями, вместо ожидаемой ` backend/models/Interview `
83
+ вам будет доступна только ` common/models/Interview ` и будет сложно исправить сложившеюся ситуацию.
84
+
85
+ - изменения общей модели, может оказать негативное влияние на работу модели из другого модельного слоя (frontend, backend).
86
+ Такое на практике встречается очень часто, после правок в общей - ломается что-то критичное на backend.
87
+
88
+ - проблемы с перекрытием событий: beforeValidate. Выливается в проблемы с перекрытием сценариев при валидации.
89
+ Придётся создавать "костыльный" код ` return Model::scenarios(); `
90
+
91
+ Единственным плюсом от разделения это не нужно дублировать атрибуты модели, для остальных моделей, которые обрабатывают AR.
92
+ Но этот плюс теряется за кучей недостатков. В общем постарайтесь придерживаться логики , что модельный слой (Active Record)
93
+ должен быть единым для разных частей приложения (backend, frontend, rest и т.д.). Поэтому работая с yii2-advanced располагайте
94
+ все Active Record модели в ` common/models/ ` . Или создавайте отдельные для frontend и backend, если уж логика настолька
95
+ различна и её нужно разделить.
96
+
97
+ #### Виджет GridView
98
+
99
+ Создадим вид, в котором будут отображаться все записи из таблицы "Опросов". Чтобы облегчить выполнение этой задачи,
63
100
<a href =" /yii2-app-advanced/backend/web/index.php?r=gii " target =" _blank " >обратимся к Gii</a >.
64
101
Выберите генератор "CRUD Generator", который генерирует виды и контроллер на основании модели. Введите в Model Class
65
102
` common\models\Interview ` , а в Controller Class - ` backend\controllers\InterviewController ` . Всё, жмите Preview.
@@ -70,8 +107,6 @@ Active Record модель `Interview`, которая описывала фор
70
107
Нажимаем "Generate" и наслаждаемся <a href =" /yii2-app-advanced/backend/web/index.php?r=interview " target =" _blank " >
71
108
результатами работы</a >.
72
109
73
- #### Виджет GridView
74
-
75
110
Очень часто необходимо вывести данные в виде таблицы. Для решения этой задачи в Yii имеется сверхмощный виджет
76
111
<a href =" http://www.yiiframework.com/doc-2.0/yii-grid-gridview.html " target =" _blank " >yii\grid\GridView</a >. Разрабатывая
77
112
административный раздел сайта, практически всегда этот виджет будет полезен. Вот и сейчас в виде
0 commit comments