GeekBrains - домашняя работа по курсу Yii2 Framework
Улучшаю учебный проект.
- В контроллер
NoteController
добавлен экшенactionShared()
для вывода заметок, к которым предоставлен доступ другим пользователям. Заметки выводятся в представленииnote/shared
. - В контроллер
AccessController
добавил экшенactionUnsharedAll()
, который удаляет доступ к заметке у всех пользователей. - В представление
note/shared
добавил кнопку на удаление у всех пользователей доступа к заметке. - Операции с БД на добавление, удаление, обновление данных делаются через метод
POST
. - В контроллер
NoteController
добавил экшенactionAccessed()
, который выводит заметки других пользователей, предоставшие к ним доступ текущему пользователю. Заметки выводятся в представленииnote/accessed
. - Перед предоставлением доступа к заметке другому пользователю проверяю, чтобы доступа еще небыло. В случае если это не так, вывожу сообщение об ошибки.
- В представлении
note/accessed
сделал сортировку по полюАвтор
. - В представлении
note/view
вывожу информацию о пользователях, которым предоставлен доступ к текущей (открытой) заметке. При выводе информации о пользователях проверяется, что автор заметки текущий пользователь. - В контроллер
NoteController
добавил экшенactionUnshared()
для удаления доступа к заметке конкретному пользователю. - В представлении
note/view
в GridView пользователей добавил кнопку на удаление доступа к заметке и возможность сортироки. - В urlManager добавил правила роутинга.
- Перевел форму входа на сайт.
- В контроллере
NoteController
у экшенаactionDelete()
обрабатывается ошибка БД, которая возникает при удалении заметки, у которой есть запись в таблицеaccess
. Выводится сообщение, что надо сначала удалить доступы. - В меню добавил ссылки на мои, расшаренные и доступные заметки.
- Прочие исправления, улучшения.
Улучшаю учебный проект.
- Доступ к экшенам контроллера только авторизованным пользователям.
- Добавил вьюху
note/my
, в которой выводится заметки текущего пользователя. - При создании заметки в поле
creator_id
пишется id текущего пользователя. - При обновлении и удалении заметки проверяется, что текущий пользователь имеет к ней доступ.
- Во вьюхах
note/my
иnote/view
добавил кнопку для предоставление доступа другому пользователю. - В основное меню добавил ссылку на просмотр заметок текущего пользователя.
- В формах удалил все лишние поля, поправил "хлебные крошки", название полей.
- В экшен
Create
передается ID заметки, которой надо дать доступ. - Во вьюхе
access/create
удалил поле с ID заметки. - Во вьюхе
access/create
список пользователей, которым можно дать доступ, выводится в виде выпадающего списка. - При добавлении доступа к заметке проверяется, что текущий пользователь имеет к ней доступ.
- В формах удалил все лишние поля, поправил "хлебные крошки", название полей.
В учебном проекте реализовать аутентификацию пользователя, хранение пароля пользователя в захешированном виде. Добавить поведение TimestampBehavior
у моделей User
и Note
.
- В миграции заменил методы, которые добавляют внешние ключи (урок 5), на
addForeignKey
классаMigration
. - В моделях
User
иNote
добавил поведениеTimestampBehavior
. - В моделе
User
добавил свойствоpassword
, добавил его вrules()
и вывел в форме вместо свойстваpassword_hash
. - В моделе
User
реализовал интерфейсIdentityInterface
. - В моделе
User
добавил методbeforeSave
, в котором генерируется хеш пароля и auth_key. - В моделе
User
реализовал проверку правильности введенного пароля через повторный ввод. - Во вьюхах контроллера
Note
иUser
поправил формат вывода дат создания и обновления записи. - В форме создания и обновления пользователя удалил лишние поля.
Разобраться с доступом к данным БД через объектно-ориентированный интерфейс (ORM).
- Создал миграцию на добавление внешних ключей для удобства генерации модели через Gii.
- С помощью Gii создал модели и контроллеры для работы с таблицами БД note, user и access.
- Создал экшен
UserController::actionTest()
, в котром описал:- Создание записи в таблице user с помощью метода
save()
. - Создал заметку в таблице note для созданного пользователя с помощью метода
link()
. - Добавил запись в промежуточную таблицу access с помощью метода
link()
.
- Создание записи в таблице user с помощью метода
- Создал экшен
UserController::actionLoad()
, в котором:- Прочитать из БД все записи из таблицы user применив жадную подгрузку связанных данных из note, с запросами без JOIN, используя метод
with()
. - Тоже самое, только c JOIN, используя метод
innerJoinWith()
.
- Прочитать из БД все записи из таблицы user применив жадную подгрузку связанных данных из note, с запросами без JOIN, используя метод
- В моделе User добавил метод
getAccessedNotes()
, связывающий User и Note через релейшен accesses. - Создал экшен
UserController::actionAccess()
, в котором пробовал добавить доступ пользователю к заметке.
Каким образом ведется работа с БД: подключение, выборка данных, добавление данных. Как осуществляется миграция данных. Работа с логами и отладка кода.
- Создал миграцию, в рамках которой создаются 3 таблицы:
user
,note
,access
. Так же реализовал возможность отката миграции. - Добавил экшен
TestController::actionInsert()
, в котором добавляются данные в таблицу user методомinsert()
и в таблицу note методомbatchInsert()
.
- Добавил экшен
TestController::actionSelect()
, в котором выбираю данные из таблицuser
иnote
:- \yii\db\createCommand: SQL запрос с универсальными кавычками и параметром.
- \yii\db\Query: все записи с id>1 отсортированные по имени
orderBy()
- \yii\db\Query: количество записей
count()
- \yii\db\Query: содержимое таблицы
note
с присоединенными по полюcreator_id
записями из таблицы userinnerJoin()
Понять что такое хелперы, для чего используются и где хранятся. Изучить каким образом формируются атрибуты модели на основе базовых классов Model и ActiveRecord. Как настраиваются правила валидации атрибутов, для чего нужны сценарии. Каким образом создаются формы.
- Настроил правила валидации атрибута
name
иprice
в методеProduct::rules()
.- name - длина до 20 символов, необходимо обрезать пробелы
trim
и вырезать тэгиstrip_tags()
. - price - только целые числа больше 0 и меньше 1000.
- name - длина до 20 символов, необходимо обрезать пробелы
- Добавил метод
Product::scenarios()
, в котором указал для сценария по умолчаниюSCENARIO_DEFAULT
, что активный атрибут толькоname
. - В форме модели
Product
полеname
сделал через выпадающий список. - Добавил отдельные сценарии в модели
Product
на измнение и добавление данных.- SCENARIO_CREATE - активные атрибуты
name
,price
,created_at
. - SCENARIO_UPDATE - активные атрибуты
price
,created_at
.
- SCENARIO_CREATE - активные атрибуты
Изучить каким образом подключаться в БД. Какие есть базовые классы, какие возможности они дают, магические методы __set(), __get(), __call(). Как генерировать код через Gii. Что такое виджеты.
- Разобрался на базе компонента
TestService
, как создаются компоненты, каким образом их прописать в конфиге, как вызываются. - Настроил подключение к БД.
- Создал таблицу
product
. - C помощью генератора кода
Gii
создал модельProduct
, которая описывает работу с таблицей БДproduct
. - C помощью
Gii
сгенерировал CRUD-методы для работы с модельюProduct
. - Изменил вывод виджета
DetailView
во вьюхе /views/product/view.php. - Изменил вывод виджета
GridView
во вьюхе /views/product/index.php.
Разобраться каким образом настраивается среда разработки через Vagrant. Изучить архитектуру приложения Yii2, какие бывают шаблоны.
- Развернул виртуальную машину c настроенным сервером с помощью Vagrant файла проекта yii-app-basic.
- Создал контроллер TestController с одним методом actionIndex.
- Создал вьюху "/views/test/index.php" для вывода данных метода actionIndex.
- Добавил в меню пункт меню на новый контроллер.
- Настроил ЧПУ.
- Создал модель Product.
- Создал несколько товаров на базе класса Product и вывел их в цикле во вьюхе через прямой доступ к полям/атрибутам и через виджет DetailView.