Skip to content

Commit 08b2100

Browse files
committed
Merge branch 'master' into step-1.0
2 parents 66d75d7 + 9ddc283 commit 08b2100

File tree

3 files changed

+51
-16
lines changed

3 files changed

+51
-16
lines changed

scripts/steps/step-000.2.md

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,8 @@ public function actionContact()
6060
и используется в `contact.php`. Отличия `\yii\widgets\ActiveForm` от `yii\bootstrap\ActiveForm` в том, что последний
6161
выводит элементы формы с учётом <a href="http://getbootstrap.com/css/#forms" target="_blank">требований Bootstrap</a>.
6262

63-
На первых порах возникает вопрос - зачем использовать этот виджет и вообще php код, если можно использовать HTML. Во-первых
64-
использование виджета ускоряет процесс создания рутинных, обычных форм и делает легким процесс проверки пользовательских данных.
63+
На первых порах возникает вопрос - зачем использовать этот виджет и вообще php код, если можно использовать HTML. Во-первых,
64+
использование виджета ускоряет процесс создания рутинных, обычных форм, а во-вторых - делает легким процесс проверки пользовательских данных.
6565

6666
В `contact.php`
6767

@@ -301,18 +301,18 @@ return $this->refresh();
301301
- Проверочный код - каптча
302302

303303
Форма опрос, в отличие от формы обратной связи, подразумевает под собой анализ ответов всех пользователей. Т.е нам
304-
понадобится сохранять в базу данных и обрабатывать пользовательские данные. Как вы помните, базовый класс
305-
`yii\base\Model` позволяет:
304+
понадобится сохранять в базу данных и обрабатывать пользовательские данные. В случае с формой обратной связи пользовательские
305+
данные только отправлялись на почту. Как вы помните, базовый класс `yii\base\Model` позволяет:
306306

307307
- наполнять модель данными,
308308
- извлекать данные из модели,
309309
- проверять данные на корректность;
310310

311-
Поэтому его недостаточно для работы с базой данных. В Yii реализован популярный способ доступа к данным
311+
Как видно его недостаточно для работы с базой данных. В Yii реализован популярный способ доступа к данным
312312
<a href="https://ru.wikipedia.org/wiki/ActiveRecord" target="_blank">Active Record</a> - класс
313313
<a href="http://www.yiiframework.com/doc-2.0/yii-db-activerecord.html" target="_blank">yii\db\ActiveRecord</a>
314314
Этот класс наследуется от базового класса `yii\base\Model`, расширяя его до такого состояния, при котором модель
315-
становится отражением строки в таблице из базы данных. Следовательно с моделью можно работать так же как со строкой в
315+
становится отражением **одной строки** в таблице из базы данных. Следовательно с моделью можно работать так же как со строкой в
316316
базе данных - искать, создавать, изменять, удалять. Следующий код иллюстрирует всю мощь и красоту реализованного шаблона
317317
проектирования Active Record в Yii:
318318

scripts/steps/step-000.3.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -525,7 +525,7 @@ public function actionInterview()
525525

526526
Метод `save($runValidation)` подразумевает под собой следующий сценарий:
527527

528-
1. вызывается `beforeValidate()`, если `$runValidation = true`. Если `$runValidation = false` этот и последующий шаги
528+
1. вызывается `beforeValidate()`, если `$runValidation = true`. Если `$runValidation = false` этот и последующий шаг
529529
игнорируется.
530530
2. вызывается `afterValidate()`.
531531
3. вызывается `beforeSave()`. Если метод возвращает false, то процесс прерывается и дальнейшие шаги не выполняются.

scripts/steps/step-000.4.md

Lines changed: 44 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -51,15 +51,52 @@ TODO: https://github.com/yiisoft/yii2/blob/master/docs/guide-ru/security-authent
5151

5252
Теперь давайте вернёмся к форме "Опрос". Для работы с формой в клиентской части(далее frontend) мы использовали
5353
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/`. Это уже сделано.
5657

57-
Вам осталось изменить файлы следующим образом. В common модели изменим пространство имени, удалим свойство "проверочный
58-
код", удалим правила, так как это всё требуется на стороне frontend части. А в frontend модели изменить
59-
родительский класс с `\yii\db\ActiveRecord` на `\common\models\Interview` и удалите методы `tableName()` и `attributeLabels()`.
58+
Вам осталось изменить файлы, зависимые от этой модели, следующим образом:
6059

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+
Создадим вид, в котором будут отображаться все записи из таблицы "Опросов". Чтобы облегчить выполнение этой задачи,
63100
<a href="/yii2-app-advanced/backend/web/index.php?r=gii" target="_blank">обратимся к Gii</a>.
64101
Выберите генератор "CRUD Generator", который генерирует виды и контроллер на основании модели. Введите в Model Class
65102
`common\models\Interview`, а в Controller Class - `backend\controllers\InterviewController`. Всё, жмите Preview.
@@ -70,8 +107,6 @@ Active Record модель `Interview`, которая описывала фор
70107
Нажимаем "Generate" и наслаждаемся <a href="/yii2-app-advanced/backend/web/index.php?r=interview" target="_blank">
71108
результатами работы</a>.
72109

73-
#### Виджет GridView
74-
75110
Очень часто необходимо вывести данные в виде таблицы. Для решения этой задачи в Yii имеется сверхмощный виджет
76111
<a href="http://www.yiiframework.com/doc-2.0/yii-grid-gridview.html" target="_blank">yii\grid\GridView</a>. Разрабатывая
77112
административный раздел сайта, практически всегда этот виджет будет полезен. Вот и сейчас в виде

0 commit comments

Comments
 (0)