Skip to content

Commit f836cd1

Browse files
committed
Merge branch 'step-0.1' into step-0.2
2 parents a11cd07 + c796f15 commit f836cd1

File tree

3 files changed

+110
-12
lines changed

3 files changed

+110
-12
lines changed

scripts/steps/step-000.0.md

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
11
###Знакомство с шаблоном приложения Advanced
22

33
Для перехода к следующему упражнению, выполните команду из директории yii2-tutorial
4-
`git checkout -f step-0`. В последствии будет установлен "Шаблон приложения advanced", который станет доступен по
4+
5+
```
6+
git checkout -f step-0
7+
```
8+
9+
В последствии будет установлен "Шаблон приложения advanced", который станет доступен по
510
<a href="/yii2-app-advanced/frontend/web/" target="_blank">ссылке</a>.
611

712
<p class="alert alert-info">
@@ -15,15 +20,18 @@
1520

1621
Сейчас наш сайт пытается подключится к базе данных `yii2advanced` MySQL. Yii не ограничивает вас в выборе базы данных, вы
1722
можете легко изменить базу данных, будь то MySQL, MSSQL, PostgreSQL или другие. Для обучения будем использовать
18-
<a href="https://ru.wikipedia.org/wiki/SQLite" target="_blank">SQLite</a>.
23+
<a href="https://ru.wikipedia.org/wiki/SQLite" target="_blank">SQLite</a>, так как она компактная и не требует накладных
24+
расходов. Знать тонкости синтаксиса SQLite не придётся, так как в большинстве случаев вместо SQL будет использоваться
25+
<a href="https://ru.wikipedia.org/wiki/ORM">ORM</a> подход.
26+
1927
<p class="alert alert-warning">Обратите внимание, что для работы PHP и SQLite потребуется подключение php_pdo_sqlite.
2028
<a href="/scripts/helpers/check.php" target="_blank">Проверьте подключено ли оно у вас.</a>
2129
</p>
2230

23-
Поменяем настройки для нашего сайта:
31+
Поменяем настройки подключения к базе данных для всего сайта:
2432

2533
Зайдите в `/yii2-app-advanced/common/config/`. В этой директории хранятся файлы конфигурации для работы всех
26-
(клиентской, административной, и других) частей вашего сайта. В файле `main-local.php`:
34+
(клиентской, административной, и других) частей сайта. В файле `main-local.php`:
2735

2836
```php
2937
<?php
@@ -49,7 +57,7 @@ return [
4957
```
5058

5159

52-
Компонент `mailer`(компонент отправки почты) оставим без изменений. А вот настройки компонента `db` изменим на
60+
Компонент `mailer`(компонент отправки почты) оставим без изменений. А вот настройки компонента `db` изменим.
5361

5462
<p class="alert alert-info">Подробнее о компонентах в
5563
<a href="https://github.com/yiisoft/yii2/blob/master/docs/guide-ru/structure-application-components.md" target="_blank">
@@ -71,13 +79,13 @@ return [
7179
<p class="alert alert-info">Рекомендуется ознакомится с <a href="http://www.yiiframework.com/doc-2.0/yii-db-connection.html" target="_blank">
7280
API класса Connection</a>
7381
</p>
74-
Этому классу необходимо знать DSN, в нашем случае это путь к файлу - `/yii2-app-advanced/sqlite.db`.
82+
Для соединения нужно указать DSN, в нашем случае это путь к файлу - `/yii2-app-advanced/sqlite.db`.
7583

7684
> Имя источника данных (DSN) - это логическое имя, которое используется ODBC (Open Database Connectivity), чтобы
7785
> обращаться к диску и другой информации, необходимой для доступа к данным.
7886
7987
После настройки подключения, необходимо наполнить данные в базу данных. Для это будем использовать "миграции".
80-
Для чего нужны миграции? Вот сейчас нужно заполнить sqlite данными, создать таблицы и чтобы не описывать десятки sql запросов,
88+
Для чего нужны миграции? Вот сейчас нужно заполнить sqlite данными, создать таблицы и чтобы не описывать sql запросы,
8189
которые вы должны выполнить, была создана одна миграция. Всё что вам нужно сделать, это выполнить консольную команду в
8290
`yii2-app-advanced`:
8391

@@ -103,11 +111,11 @@ Apply the above migration? (yes|no) [no]:y
103111
Migrated up successfully.
104112
```
105113

106-
Теперь в `yii2-app-advanced` можно обнаружить файл `sqlite.db` - это и есть наша база данных.
114+
Теперь в `yii2-app-advanced` можно обнаружить файл `sqlite.db` - это и есть наша база данных.
107115

108116
Ну что ж, вернёмся на <a href="/yii2-app-advanced/frontend/web/index.php?r=site%2Fsignup" target="_blank">Signup</a>
109117
и попробуем ввести регистрационные данные: `Username` - `admin`, `Email` - `admin@local.net`, `Password` - `123456`.
110-
После отправки данных, случится переход на главную страницу с последующей аутентификацией пользователя `admin`. Сейчас
118+
После отправки данных, произойдёт переход на главную страницу с последующей аутентификацией пользователя `admin`. Сейчас
111119
мы находимся в пользовательском приложении (frontend). Шаблон `Advanced` также реализует административное приложение(backend).
112120
Чтобы попасть в него, просто перейдите по <a href="/yii2-app-advanced/backend/web/" target="_blank">ссылке</a>.
113121
На данный момент backend скуден по функционалу, чем frontend. Далее постараемся исправить эту ситуацию.

scripts/steps/step-000.3.md

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -495,9 +495,9 @@ EVENT_AFTER_ACTION будет срабатывать, только когда с
495495
Таблицу `interview` в базе данных, которая описывает нашу модель `frontend/models/Interview`, мы создали ранее.
496496
Напомним, что использовали шаблон проектирования Active Record. Модель `Interview` наследует всю функциональность
497497
из <a href="http://www.yiiframework.com/doc-2.0/yii-db-activerecord.html" target="_blank">yii\db\ActiveRecord</a>,
498-
поэтому трудностей с сохранением не должно возникнуть. Нужно использовать лишь один метод `save()`, который также
499-
включает в себя валидацию данных. Т.е. метод `$model->validate()` мы можем заменить на `$model->save()` в контроллере
500-
`SiteController`.
498+
поэтому трудностей с сохранением не должно возникнуть. Нужно использовать лишь один метод `save($runValidation == true)`,
499+
который также включает в себя валидацию данных. Т.е. метод `$model->validate()` мы можем заменить на `$model->save()`
500+
в контроллере `SiteController`.
501501

502502
```php
503503
public function actionInterview()
@@ -518,6 +518,33 @@ public function actionInterview()
518518
}
519519
```
520520

521+
Метод `save($runValidation)` подразумевает под собой следующий сценарий:
522+
523+
1. вызывается `beforeValidate()`, если `$runValidation = true`. Если `$runValidation = false` этот и последующий шаги
524+
игнорируется.
525+
2. вызывается `afterValidate()`.
526+
3. вызывается `beforeSave()`. Если метод возвращает false, то процесс прерывается и дальнейшие шаги не выполняются.
527+
4. происходит сохранение данных в базу данных
528+
5. вызывается `afterSave()`;
529+
530+
В нашем случае есть один нюанс - например, на вопрос "Какие космонавты вам известны?", пользователь может выбрать несколько
531+
вариантов. Следовательно данные поступят в модель в виде массива значений, а в базе это поле хранится в виде строки.
532+
Получается необходимо преобразовать массив данных в строку для последующего сохранения. Сделаем это с помощью
533+
переопределения метода `beforeSave()` в модели Interview:
534+
535+
```php
536+
public function beforeSave($insert)
537+
{
538+
if (parent::beforeSave($insert)) {
539+
$this->planets = implode(',', $this->planets);
540+
$this->astronauts = implode(',', $this->astronauts);
541+
return true;
542+
}
543+
544+
return false;
545+
}
546+
```
547+
521548
#### Дополнительная информация для самостоятельного ознакомления:
522549

523550
- <a href="https://github.com/yiisoft/yii2/blob/master/docs/guide-ru/structure-models.md" target="_blank">Модели</a>.

scripts/steps/step-000.4.md

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,66 @@
99
git checkout -f step-0.4
1010
```
1111

12+
Входной файл административного раздела (далее Backend) доступен по ссылке
13+
<a href="/yii2-app-advanced/backend/web/index.php?r=site/logout" target="_blank">
14+
/yii2-app-advanced/backend/web/index.php</a>, а все файлы для работы backend располагаются в директории
15+
`/yii2-app-advanced/backend/`.
16+
17+
Если вы не прошли аутентификацию на сайте, то в backend вас не пустит. В работу вступил так называемый фильтр
18+
контроллера <a href="http://www.yiiframework.com/doc-2.0/yii-filters-accesscontrol.html" target="_blank">
19+
yii\filters\AccessControl</a>. Фильтры являются особым видом поведений, которые могут быть выполнены до действия
20+
контроллера или после.
21+
22+
Если открыть `SiteController` backend части, то можно обнаружить следующий код:
23+
24+
```php
25+
return [
26+
'access' => [
27+
'class' => AccessControl::className(),
28+
'rules' => [
29+
[
30+
'actions' => ['login', 'error'],
31+
'allow' => true,
32+
],
33+
[
34+
'actions' => ['logout', 'index'],
35+
'allow' => true,
36+
'roles' => ['@'],
37+
],
38+
],
39+
],
40+
];
41+
```
42+
43+
С помощью правил доступа `rules` можно описать к каким действиям контроллера применять те или иные ограничения.
44+
45+
<p class="alert alert-info">Подробная информация по работе фильтров описана в
46+
<a href="https://github.com/yiisoft/yii2/blob/master/docs/guide-ru/structure-filters.md" target="_blank">официальном
47+
руководстве</a>
48+
</p>
49+
50+
Теперь давайте вернёмся к форме "Опрос". Для работы с формой в клиентской части(далее frontend) мы использовали
51+
Active Record модель `Interview`, которая описывала форму. Т.к. эта модель описана в frontend, то в backend
52+
она не доступна. Чтобы исправить это, необходимо модель расположить в общей директории - `common/models/`.
53+
Необходимо скопировать файл `Interview.php` из `frontend/models` в `common/models/`. Это уже сделано.
54+
55+
Вам осталось изменить файлы следующим образом. В common модели изменим пространство имени, удалим свойство "проверочный
56+
код", удалим правила, так как это всё требуется на стороне frontend части. А в frontend модели изменить
57+
родительский класс с `\yii\db\ActiveRecord` на `\common\models\Interview` и удалите методы `tableName()` и `attributeLabels()`.
58+
59+
Теперь, когда все изменения внесены, в backend возможно использовать модель `\common\models\Interview`. Создадим вид,
60+
в котором будут отображаться все записи из таблицы "Опросов". Чтобы облегчить выполнение этой задачи,
61+
<a href="http://localhost:9000/yii2-app-advanced/backend/web/index.php?r=gii" target="_blank">обратимся к Gii</a>.
62+
Выберите генератор "CRUD Generator", который генерирует виды и контроллер на основании модели. Введите в Model Class
63+
`common\models\Interview`, а в Controller Class - `backend\controllers\InterviewController`. Всё, жмите Preview.
64+
"CRUD Generator" генерируется вид для создания, изменения, удаления и просмотра модели, также помогает генерировать
65+
страницу `index.php`, которая показывает список моделей постранично, используя виджет
66+
<a href="http://www.yiiframework.com/doc-2.0/yii-grid-gridview.html" target="_blank">GridView</a> или
67+
<a href="http://www.yiiframework.com/doc-2.0/yii-widgets-listview.html" target="_blank">ListView</a>
68+
Нажимаем "Generate" и наслаждаемся <a href="/yii2-app-advanced/backend/web/index.php?r=interview" target="_blank">
69+
результатами работы</a>
70+
71+
72+
73+
TODO: описать виджет GridView, ограничить доступ
74+

0 commit comments

Comments
 (0)