При виборі PHP фреймворку, можна трохи заплутатися з тим, що він повинен робити, і з тим для чого призначений фреймворк і що він виконує. Не кожен фреймворк підтримує ORM-шар для роботи з базами даних, має якісне співтовариство і хорошу документацію. Це може не перешкодити якщо потрібен простий фреймворк. Однак, якщо необхідний фреймворк який би зручний і простий в освоєнні, то необхідно ретельно підійти до питання вибору фреймворку і зважити всі «за» і «проти».
Головні фактори вибору оптимального фреймворку для розробки сайту:
Будь-яка людина може помилитися при виборі PHP фреймворку, однак можна захиститися від такого роду помилок. Тому необхідно переконатися, що обраний фреймворк має достатню функціональність і гарну підтримку, тому що зазвичай невеликі фреймворки створюються особами, знання PHP і навіть дещо обмежені. Це може викликати різні помилки і питання, які в кінцевому рахунку заважають і уповільнюють процес розробки.
Вибираючи PHP фреймворк необхідно звертати увагу на те, наскільки він легкий в освоєнні і розумінні. Це має дуже важливе значення для малодосвідченого PHP програміста. Також необхідно переконатися, що база даних і веб-сервер сумісні з архітектурою обраного фреймворку.
Якщо не притримувати вищевказаних вимог, то можливі падіння в продуктивності розробки проекту, продуктивності коду і легкості супроводу. Іншою поширеною помилкою є неправильна установка фреймворку. При установці необхідно слідувати інструкції, щоб уникнути помилок.
В якості проекту, для ознайомлення з можливостями фреймворків, була обрана розробка сайту-каталогу одягу і взуття, який буде володіти такими особливостями:
Для розробки такого проекту був обраний MVC-фреймворк yii, який володіє відносно низьким «порогом входження» і великим російськомовним спільнотою.
Роботу над створенням будь-якого сайту можна розділити на наступні етапи:
Хороший дизайн може принести власникові сайту багато переваг перед конкурентами і матеріальну вигоду. Залежно від того, які цілі ставить перед собою компанія при створенні сайту, дизайн може підтвердити або підкреслити статус компанії - власника, створити додаткову рекламу компанії або послуг, уявити впізнаваний бренд і т.п.
Дизайн сайту виконаний в сріблясто-пурпурових тонах. Сріблястий колір символізує строгість, стиль, силу. Пурпурний підкреслює стиль і доповнює його смаком. Дизайн помірно консервативний, традиційний і говорить про чоловічому стилі. Шапка сайту з логотипом і банером відображає назва і вигідне комерційну пропозицію.
Під час проектування база даних були виділені наступні таблиці:
Крім перерахованих вище полів кожна таблиця має первинним ключем id для зв'язку з іншими таблицями і зручності управління записами.
Для створення програми на основі фреймворку yii, необхідно завантажити останню версію з офіційного сайту www.yiiframework.com, розпакувати і скопіювати теку framework в z: \ home \ magazin.local \ www. Так як для установки під denwer, інструкція відрізняється від офіційної, то, перед установкою, необхідно відредагувати файл z: \ home \ magazin.local \ www \ framework \ yiic.bat, вказавши в ньому замість php.exe повний шлях до php: z : \ usr \ local \ php5 \ php.exe. Після цього необхідно запустити командний інтерпретатор і ввести наступні команди:
C: \ Users \ root> z:
Z: \> cd \ home \ magazin.local \ www
Z: \ home \ magazin.local \ www> framework \ yiic.bat webapp magazin
При появі питання «Create a Web application under 'Z: \ home \ magazin.local \ www \ magazin'? [Yes | no] »необхідно натиснути y, після чого буде створено каркас додатка і виведений список створених файлів
Створена основа має низку базових функцій, такими як вбудована авторизація, висновок статичних сторінок і т.д.
Для зручності перенесення на інший web-сервер або хостинг, після створення, каркас додатка був винесений з теки magazin на один рівень вище, а в index.php і index-test.php виправлений шлях до фреймворку.
Файл конфігурації програми розташований за наступним шляхом: protected / config / main.php. Файл описує налаштування програми у вигляді асоціативного php-масиву. Для настройки підключення до бд був налаштований компонент додатка db в секції components:
'Db' => array (
// рядок у форматі dsn для підключення до БД
'ConnectionString' => 'mysql: host = localhost; dbname = magazin',
// Ім'я користувача
'Username' => 'root',
'Password' => '',
'Charset' => 'utf8',
),
Після того як основа додатка створена і налаштована, можна приступити до розробки контролерів і моделей. Починаючи з версії 1.1.2, фреймворк доступний разом з вбудованим генератором коду Gii. Gii дозволяє генерувати моделі на основі таблиць в базі даних, а так само CRUD-контролери для основних дій з управління записами, такими як додавання запису (Create), побачити список записів, перегляд запису (Read), редагування записи (Update) і видалення ( Delete). Для активації Gii в файл конфігурації програми було додано опис підключення модуля gii:
'Gii' => array (
'Class' => 'system.gii.GiiModule',
// Пароль для входу в кодогенератор
'Password' => 'generate',
// Дозволені ip-адреси
'IpFilters' => array ( '127.0.0.1', ':: 1'),
),
Після цього, для того щоб зайти в Gii необхідно перейти за наступним посиланням в браузері: http: //magazin.local/index.php? R = gii /. Після авторизації буде доступний простий, зручний інтерфейс для генерації коду.
Так як модель використовується для управління записами в одній таблиці, то були згенеровані 4 моделі: Price, Category, Photo, Text. Для цього використовувався розділ Model Generator, в якому в якості імені таблиці була вказана *.
Для генерації CRUD-контролерів, в Gii є розділ Crud Generator. Так як таблиця Photo є допоміжною, то для управління записами в ній не потрібен окремий контролер, тому були згенеровані 3 контролера: PriceController, MenuController (для Category), TextController.
Подання в фреймворку yii - це спеціальний php-скрипт, що складається з простих виразів, що відповідає за відображення елементів призначеного для користувача інтерфейсу. У кожного уявлення є ім'я, яке використовується для пошуку скрипта уявлення. Якщо ім'я уявлення test, то ім'я скрипта уявлення test.php.
Для відображення уявлення використовується метод CController :: render, якому передається ім'я уявлення і масив значень, який перетворюється в локальні змінні всередині уявлення. Наприклад, якщо всередині дії update контролера ItemController викликається:
$ This-> render ( 'update', array (
'Model' => $ model,
'Language' => Yii :: app () -> language,
));
то, скрипт уявлення буде розташований за наступним шляхом: protected / views / item / update.php, а всередині нього будуть доступні дві локальні змінні: $ model і $ language.
Всередині скрипта уявлення так само доступний екземпляр контролера, до якого можна звернутися за допомогою $ this. Це дозволяє використовувати всередині уявлення властивості і методи контролера, наприклад, для відображення віджета, кешування, виведення заголовка сторінки і т. Д.
Так само, при обробці скрипта уявлення неявно використовується спеціальне подання - макет, який декорує призначений для користувача інтерфейс і може містити такі елементи як шапка сайту і підвал. Усередині макета доступна локальна змінна $ content, в якій зберігається висновок скрипта уявлення. Макет, по-замовчуванню, розташований за наступним шляхом: protected / views / layouts / main.php.
Віджет - це компонент, вбудований в уявлення, з метою відображення складної, самостійної частини інтерфейсу. Наприклад, віджет може використовуватися для виведення меню, таблиці і т. п.
Крім віджетів, в фреймворку присутній клас CHtml, статичні методи якого дозволяють виводити посилання на основі заданих маршрутів (route), форми і її елементів введення і т. п. Найбільш часто використовуваний метод це Chtml :: link (<заголовок>, <маршрут в вигляді масиву або рядки>), який дозволяє вивести посилання на основі правил маршрутизації.
Всі дії по встановленню верстки та доопрацюванні каркаси можна розділити на наступні пункти:
При розробці проекту основною мовою була англійська, всі інші мови були додані за допомогою файлів перекладів і будуть описані пізніше в роботі.
Установка верстки була розпочата з макета. Основні елементи, які присутні в макеті це шапка сайту, включаючи меню, меню категорій праворуч і підвал.
Для відображення меню сайту використовувався віджет zii.widgets.CMenu, який дуже просто підключається і настроюється:
<? Php $ this-> widget ( 'zii.widgets.CMenu', array (
// Список пунктів
'Items' => array (
array ( 'label' => Yii :: t ( 'menu', 'Home'), 'url' => array ( '/ price / index')),
array ( 'label' => Yii :: t ( 'menu', 'New'), 'url' => array ( '/ price / new')),
array ( 'label' => Yii :: t ( 'menu', 'Help'), 'url' => array ( 'text / index', 'page' => 'help')),
array ( 'label' => Yii :: t ( 'menu', 'Price'), 'url' => array ( '/ price / get')),
array ( 'label' => Yii :: t ( 'menu', 'Contact'), 'url' => array ( '/ text / index', 'page' => 'contact')),
array ( 'label' => Yii :: t ( 'menu', 'Logout'), 'url' => array ( '/ admin / logout'), 'visible' =>! Yii :: app () -> user-> isGuest),
),
)); ?>
де label - назва пункту меню, url - маршрут (route) до контролера і дії, а visible - статус видимості пункту. Для відображення меню категорій товарів використовувався віджет CTreeView, настройка якого повністю аналогічна, за винятком формування списку вкладених категорій, який був винесений в окремий віджет-адаптер - LeftMenu, який спочатку розроблявся для виведення меню зліва, але в зв'язку з незручністю інтерфейсу винесено в праву частину .
Так само, для відображення заголовка сторінки використовувалося св-во контролера $ this-> pageTitle.
Для відображення головної сторінки з товарами, а так само сторінки новинок використовувався віджет zii.widgets.CListView:
<? Php $ this-> widget ( 'zii.widgets.CListView', array (
'DataProvider' => $ dataProvider,
'ItemView' => '_ item',
'Template' => '{sorter} {items} {pager}',
'SortableAttributes' => array (
'Title'.ucfirst (Yii :: app () -> language),
'Time',
'Cost'
),
'PagerCssClass' => 'pager clear',
));?>
де dataProvider - провайдер даних, itemView - спеціальний файл уявлення відображає одну модель у вигляді локальної змінної $ data, template - шаблон виводу, sortableAttributes відповідають за сортування даних по полях, а pagerCssClass використовувався для настройки положення перемикача сторінок. Провайдер даних - спеціальний компонент-адаптер, який відповідає за вибірку моделей (записів) за певним умові, їх сортування, а також за розбиття по сторінках, буде розглянуто пізніше в роботі. Js-скрипт HighSlide був підключений відповідно до опису на оф. сторінці.
Відображення прайс-листа і інших сторінок було виконано без застосування віджетів у вигляді стандартного php-коду.
Так як модель відповідає за вибірку і валідацію (перевірку) даних, то в ній описуються умови вибірки та перевірки даних.
Правила валідації описуються в методі rules моделі. Цей метод повинен повернути масив з описом правил валідації, наприклад:
public function rules ()
{
return array (
array ( 'titleRu, titleEn, titleRo', 'length', 'max' => 255, 'min' => 4),
array ( 'titleRu, titleEn, titleRo', 'required'),
array ( 'parent', 'numerical', 'integerOnly' => true, 'allowEmpty' => false),
);
}
Формат опису правила виглядає наступним чином:
array (<ім'я св-ва / св-в моделі (полів в таблиці) »,« псевдонім валідатора>, <ім'я доп. параметра валідатора 1> => <значення параметра 1>, ...)
Кожне ім'я валідатора є псевдонімом класу. Це дозволяє створювати і використовувати свої класи валідації. Основні валідатори:
Розширені можливості пошуку кожного з валідаторів докладно описані в керівництві по yii.
Після того як правила валідації були налаштовані, в модель були додані статичні методи для вибірки списку товарів. Кожній такій метод використовує провайдер даних і виглядає приблизно так:
public static function searchByCategory ($ category, $ pageSize)
{
// створення умови вибірки
$ Criteria = new CDbCriteria ();
$ Criteria-> select = 'Id, title'.ucfirst (Yii :: app () -> language).' as title, cost ';
$ Criteria-> addInCondition ( 'idCategory', Category :: getAllChildren ($ category));
// створення провайдера даних
return new CActiveDataProvider (__ CLASS __, array (
// умова вибірки
'Criteria' => $ criteria,
// настройка посторінкового виведення
'Pagination' => array (
'PageSize' => $ pageSize
),
// підтримка сортування
'Sort' => array (
'DefaultOrder' => 'title'.ucfirst (Yii :: app () -> language),
'Attributes' => array (
'Title'.ucfirst (Yii :: app () -> language),
'Time',
'Cost'
)
)
));
}
Як видно з наведеного вище коду провайдер даних є екземпляром класу CActiveDataProvider (а так само нащадком CDataProvider) і дуже гнучкий в налаштуванні.
Для виведення посилань для адміністраторських дій необхідно перевірка чи є користувач адміністратором. Так як адміністратор всього один в системі і поділ прав не використовується, то достатньо лише перевірки на авторизовані користувача: if (Yii :: app () -> user-> isGuest).
Після того як були виведені всі посилання, були доопрацьовані подання форм з урахуванням специфіки моделей і правил валідації. Для цього використовувалися статичні методи CHtml, відповідальні за виведення полів введення форми. Найбільш часто використовувані методи CHtml для форм:
Для додавання фотографій використовувалося розширення SwfUpload, використання якого докладно описано на сторінці керівництва.
Після того як всі основні дії з доопрацювання каркаса виконані, залишилося додати підтримку великих навантажень (кешування), налаштувати багатомовність і красиві посилання.
Для активації кешування в файлі конфігурації було додано опис компонента додатка cache з класом CFileCache, що відповідає за зберігання кешу в локальних файлах.
Для настройки кешування в контролерах використовувався компонент COutputCache, описаний в методі filters контролера:
array (
// Компонент відключений для адміністраторських дій
'COutputCache -create, update, upload',
// Термін придатності
'Duration' => 24 * 3600 * 365,
// залежності
'Dependency' => array (
'Class' => 'CChainedCacheDependency',
'Dependencies' => array (
// по глобальній зміні pm_time
new CGlobalStateCacheDependency ( 'pm_time'),
// по глобальній зміні cu_time
new CGlobalStateCacheDependency ( 'cu_time'),
),
),
// дані в кеші відрізняються по категорії, сортування, сторінок, мови
'VaryByParam' => array ( 'category', 'sort', 'page', 'lang'),
// і по статусу авторизованого користувача
'VaryByExpression' => 'Yii :: app () -> user-> isGuest',
// кеш використовується тільки для GET-запитів
'RequestTypes' => array ( 'GET'),
),
де cu_time - Останнім часом поновлення категорій, а pu_time - товарів і змінюються за подією збереження моделі.
Так як, по-замовчуванню, додаток вже підтримує багатомовність за допомогою класу CPhpMessageSource, який зберігає перекази в php-файлах перекладу, то в проекті використовувався саме цей спосіб зберігання.
Кожне повідомлення перекладу відноситься до будь-якої категорії. Повідомлення перекладів зберігаються за наступним шляхом: protected / messages / <код мови> / <ім'я категорії> .php. Файли переклади містять в собі асоціативний масив, де ключем є фраза на вихідному (англійська) мовою, а значення - перекладене для даного коду (українська, наприклад).
Для перекладу повідомлення, фреймфорк yii надає статичний метод Yii :: t (<ім'я категорії »,« повідомлення »), а для зберігання поточної мови на засланні в файл конфігурації було підключено стороннє розширення як компонент додатка urlManager: LangUrlManager.
Для активації «красивих», человекопонятний посилань компонент додатка urlManager був налаштований таким чином:
'UrlManager' => array (
'Class' => 'application.extensions.urlManager.CLangUrlManager',
// формувати посилання в форматі / route / p1 / v1 / p2 / v2 / ...
'UrlFormat' => 'path',
'Rules' => array (
// код мови завжди розташований попереду посилання
'<Lang: (en | ua |pl)>' => '/ price',
'<Lang: (en | ua | pl)> / <_ c>' => '<_ c>',
'<Lang: (en | ua | pl)> / <_ c> / <_ a>' => '<_ c> / <_ a>',
'<Lang: (en | ua | pl)> / text / index / <page:. *>' => 'Text / index',
),
// не виводити index.php на засланні
'ShowScriptName' => false,
),
а в кореневій папці сайту (www) був доданий файл .htaccess з активацією і налаштуванням mod_rewrite в web-сервері apache:
Options + FollowSymLinks
IndexIgnore * / *
RewriteEngine on
RewriteCond% {REQUEST_FILENAME}! -F
RewriteCond% {REQUEST_FILENAME}! -D
RewriteRule. index.php
Ми розробили багатофункціоанальний, мультимовний сайт каталог одягу на основі фреймворку Yii2. В Yii вкладено багато можливостей які виділяють цей фреймворк на тлі інших і роблять розробку з його допомогою дуже швидкою і приємною.