Новости
- Готуємо базу даних ¶
- Налаштовуємо підключення до БД ¶
- Створюємо нащадка Active Record ¶
- створюємо Action ¶
- створюємо View ¶
- Відчуваємо в дії ¶
- висновок ¶
Цей розділ розповість про те, як створити нову сторінку, яка буде показувати дані по країнам, отримані з таблиці countries бази даних. Для досягнення цієї мети вам буде необхідно налаштувати підключення до бази даних, створити клас Active Record , визначити action і створити view .
Вивчивши цю частину, ви навчитеся:
- Налаштовувати підключення до БД.
- Визначати клас Active Record.
- Запитувати дані, використовуючи клас Active Record.
- Відображення всіх відомостей у view з використанням пагінацію.
Зверніть увагу, щоб засвоїти цей розділ, ви повинні мати базові знання та навички використання баз даних. Зокрема, ви повинні знати, як створити базу даних і як виконувати SQL запити, використовуючи клієнтські інструменти для роботи з БД.
Готуємо базу даних ¶
Для початку створіть базу даних під назвою yii2basic, з якої ви будете отримувати дані в вашому додатку. Ви можете створити базу даних SQLite, MySQL, PostgreSQL, MSSQL або Oracle, так як Yii має вбудовану підтримку для багатьох баз даних. Для простоти, в подальшому описі буде матися на увазі MySQL.
Після цього створіть в базі даних таблицю country і додайте в неї трохи демонстраційних даних. Ви можете запустити наступну SQL інструкцію, щоб зробити це:
CREATE TABLE `country` (` code` CHAR (2) NOT NULL PRIMARY KEY, `name` CHAR (52) NOT NULL,` population` INT (11) NOT NULL DEFAULT '0') ENGINE = InnoDB DEFAULT CHARSET = utf8; INSERT INTO `country` VALUES ( 'AU', 'Australia', 24016400); INSERT INTO `country` VALUES ( 'BR', 'Brazil', 205722000); INSERT INTO `country` VALUES ( 'CA', 'Canada', 35985751); INSERT INTO `country` VALUES ( 'CN', 'China', 1375210000); INSERT INTO `country` VALUES ( 'DE', 'Germany', 81459000); INSERT INTO `country` VALUES ( 'FR', 'France', 64513242); INSERT INTO `country` VALUES ( 'GB', 'United Kingdom', 65097000); INSERT INTO `country` VALUES ( 'IN', 'India', 1285400000); INSERT INTO `country` VALUES ( 'RU', 'Russia', 146519759); INSERT INTO `country` VALUES ( 'US', 'United States', 322976000);На даний момент у вас є база даних під назвою yii2basic і всередині неї таблиця country з трьома стовпцями, що містять десять рядків даних.
Налаштовуємо підключення до БД ¶
Перед продовженням переконайтеся, що у вас встановлені PHP-розширення PDO і драйвер PDO для використовуваної вами бази даних (наприклад, pdo_mysql для MySQL). Це базова вимога в разі використання вашим додатком реляційної бази даних. Після того, як вони встановлені, відкрийте файл config / db.php і змініть параметри на вірні для вашої бази даних. За замовчуванням цей файл містить наступне:
<? Php return [ 'class' => 'yii \ db \ Connection', 'dsn' => 'mysql: host = localhost; dbname = yii2basic', 'username' => 'root', 'password' => ' ',' charset '=>' utf8 ',];Файл config / db.php - типовий конфігураційний інструмент, який базується на файлах. Даний конфігураційний файл визначає параметри, необхідні для створення і ініціалізації примірника yii \ db \ Connection , Через який ви можете робити SQL запити до якої мається на увазі базі даних.
Підключення до БД, налаштоване вище, є в коді програми через вираз Yii :: $ app-> db.
Інформація: файл config / db.php буде підключений головною конфігурацією додатка config / web.php, яка описує те, як екземпляр додатки слід буде почати. Для детальної інформації, будь ласка, зверніться до розділу конфігурації .
Якщо вам необхідно працювати з базами даних, підтримка яких не включена безпосередньо в фреймворк, варто звернути увагу на наступні розширення:
Створюємо нащадка Active Record ¶
Щоб представляти і отримувати дані з таблиці country, створіть клас - нащадок Active Record , Під назвою Country і збережіть його у файлі models / Country.php.
<? Php namespace app \ models; use yii \ db \ ActiveRecord; class Country extends ActiveRecord {}Клас Country успадковується від yii \ db \ ActiveRecord . Вам не потрібно писати жодного рядка коду всередині нього! З кодом, наведеним вище, Yii зв'яже ім'я таблиці з ім'ям класу.
Інформація: Якщо немає можливості поставити пряму залежність між ім'ям таблиці і ім'ям класу, ви можете перевизначити метод yii \ db \ ActiveRecord :: tableName () , Щоб явно задати ім'я пов'язаної таблиці.
Використовуючи клас Country, ви можете легко маніпулювати даними в таблиці country, як показано в цих фрагментах:
use app \ models \ Country; $ Countries = Country :: find () -> orderBy ( 'name') -> all (); $ Country = Country :: findOne ( 'US'); echo $ country -> name; $ Country -> name = 'USA'; $ Country -> save ();Інформація: Active Record - потужний спосіб доступу і маніпулювання даними БД в об'єктно-орієнтованому стилі. Ви можете знайти детальну інформацію в розділі Active Record . В якості альтернативи, ви також можете взаємодіяти з базою даних, використовуючи більш низькорівневий спосіб доступу, званий Data Access Objects .
створюємо Action ¶
Для того, щоб показати дані по країнам кінцевим користувачам, вам треба створити новий action. Замість розміщення нового action'a в контролері site, як ви робили в попередніх розділах, буде мати більше сенсу створити новий контролер спеціально для всіх дій, що відносяться до даних по країнам. Назвіть новий контролер CountryController, і створіть action index всередині нього, як показано нижче.
<? Php namespace app \ controllers; use yii \ web \ Controller; use yii \ data \ Pagination; use app \ models \ Country; class CountryController extends Controller {public function actionIndex () {$ query = Country :: find (); $ Pagination = new Pagination ([ 'defaultPageSize' => 5, 'totalCount' => $ query -> count (),]); $ Countries = $ query -> orderBy ( 'name') -> offset ($ pagination -> offset) -> limit ($ pagination -> limit) -> all (); return $ this -> render ( 'index', [ 'countries' => $ countries, 'pagination' => $ pagination,]); }}Збережіть код вище в файлі controllers / CountryController.php.
Action index викликає Country :: find (). Даний метод Active Record будує запит до БД і витягує всі дані з таблиці country. Щоб обмежити кількість країн, що повертаються кожним запитом, запит розбивається на сторінки за допомогою об'єкта yii \ data \ Pagination . Об'єкт Pagination служить двом цілям:
- Встановлює пункти offset і limit для SQL інструкції, представленої запитом, щоб вона повертала тільки одну сторінку даних за раз (в нашому випадку максимум 5 рядків на сторінку).
- Він використовується у view для відображення пагінатора, що складається з набору кнопок з номерами сторінок, це буде роз'яснено в наступному підрозділі.
В кінці коду action index виводить view з ім'ям index, і передає в нього дані по країнам разом c інформацією про пагінацію.
створюємо View ¶
Насамперед створіть підтеку з ім'ям country всередині директорії views. Ця папка буде використовуватися для зберігання всіх view, виведених контролером country. Всередині директорії views / country створіть файл з ім'ям index.php, що містить наступний код:
<? Php use yii \ helpers \ Html; use yii \ widgets \ LinkPager; ?> <H1> Countries </ h1> <ul> <? Php foreach ($ countries as $ country):?> <Li> <? = Html :: encode ( "{$ country-> code} ({$ country-> name})")?>: <? = $ Country -> population?> </ Li> <? Php endforeach; ?> </ Ul> <? = LinkPager :: widget ([ 'pagination' => $ pagination])?>View має 2 частини щодо відображення даних по країнам. У першій частині надані дані по країнам виводяться як невпорядкований HTML-список. У другій частині виводиться віджет yii \ widgets \ LinkPager , Використовуючи інформацію про пагінацію, передану з action у view. Віджет LinkPager відображає набір посторінкових кнопок. Клік по кожній із них оновить дані по країнам у відповідній сторінці.
Відчуваємо в дії ¶
Щоб побачити, як працює весь вищенаведений код, перейдіть за наступним посиланням в своєму браузері:
http:На початку ви побачите сторінку, яка показує п'ять країн. Під країнами ви побачите пагінатор з чотирма кнопками. Якщо ви клацніть на кнопці "2", то побачите сторінку, яка буде показувати інші п'ять країн з бази даних: друга сторінка записів. Подивившись уважніше, ви побачите, що URL в браузері теж змінилося на
http:За кадром Pagination надає всю необхідну функціональність для посторінкового розбивки набору даних:
- На початку Pagination показує першу сторінку, яка відображає SELECT запит країн з параметрами LIMIT 5 OFFSET 0. Як результат, перші п'ять країн будуть отримані і відображені.
- Віджет LinkPager виводить кнопки сторінок використовуючи URL'и, створені Pagination . Ці URL'и міститимуть параметр запиту page, який представляє різні номери сторінок.
- Якщо ви клацніть на кнопці "2", спрацює і буде опрацьовано новий запит для маршруту country / index. Таким чином новий запит країн матиме параметри LIMIT 5 OFFSET 5 і поверне наступні п'ять країн для відображення.
висновок ¶
У цьому розділі ви навчились працювати з базою даних. Також ви навчилися отримувати і відображати дані з посторінковою розбивкою за допомогою yii \ data \ Pagination і yii \ widgets \ LinkPager .
У наступному розділі ви навчитеся використовувати потужний інструмент генерації коду, званий Gii , Щоб з його допомогою швидко здійснювати деякі часто використовувані функції, такі як операції Create-Read-Update-Delete (CRUD) для роботи з даними в таблиці бази даних. Насправді код, який ви тільки що написали, в Yii може бути повністю згенерований автоматично з використанням Gii.
Lt;?Lt;?
Php use yii \ helpers \ Html; use yii \ widgets \ LinkPager; ?
Php foreach ($ countries as $ country):?
Html :: encode ( "{$ country-> code} ({$ country-> name})")?
Country -> population?
Php endforeach; ?
LinkPager :: widget ([ 'pagination' => $ pagination])?