Робота з базою та генерація моделей Propel
Робота категорій товарів та товарних моделей відбувається за допомогою ORM Propel. Propel дозволяє автоматично згенерувати класи для швидкого доступу до полів у таблицях бази. В цьому нам допоможе schema.xml і propel.yaml у корені сайту.
Підготовка до створення моделі
1. Внесення поля до schema.xml. Використовуються базові 4 схеми по шляхам.
// для роботи із загальною таблицею route
/application/modules/core/schema.xml
// схема товарів, категорій та всього shop
/application/modules/shop/schema
//схема таблиць smart_filter
/application/modules/smart_filter/schema.xml
// схема таблиць банерів
/application/modules/xbanners/schema.xml
2. Вибравши до якої schema.xml відноситься доопрацювання, шукаємо потрібну таблицю.
2.1. Якщо змінюється таблиця, яка має <behavior name="i18n"> (поведінка для зв'язку з мультимовністю i18n).
Приклад shop_category:
В <table name="shop_category">
додаємо нове поле
<column name="new_our_field" type="varchar" size="255" />
Повний приклад:
<?xml version="1.0" encoding="UTF-8"?>
<database name="Shop" defaultIdMethod="native" baseClass="CMSFactory\PropelBaseModelClass" heavyIndexing="true"
package="shop.models">
<table name="shop_category" phpName="SCategory">
<vendor type="mysql">
<parameter name="Charset" value="utf8"/>
</vendor>
........
<column name="new_our_field" type="varchar" size="255" />
........
</table>
</database>
2.2. Якщо змінюється кінцева таблиця, на яку посилається <behavior name="i18n">, то потрібно додати і в таблицю яка посилається і в таблицю на яку посилається behavior.
Приклад, зробити поле new_our_field мультимовним у shop_category_i18n:
В <table name="shop_category">
додаємо нове поле
<column name="new_our_field" type="varchar" size="255" />
тут же додаємо поле "new_our_field" до:
<behavior name="i18n">
<parameter name="i18n_columns" value="name, h1, description, new_our_field"/>
<parameter name="default_locale" value="ua"/>
</behavior>
В <table name="shop_category_i18n">
додаємо нове поле
<column name="new_our_field" type="varchar" size="255" />
Повний приклад:
<?xml version="1.0" encoding="UTF-8"?>
<database name="Shop" defaultIdMethod="native" baseClass="CMSFactory\PropelBaseModelClass" heavyIndexing="true"
package="shop.models">
<table name="shop_category" phpName="SCategory">
<vendor type="mysql">
<parameter name="Charset" value="utf8"/>
</vendor>
........
<column name="new_our_field" type="varchar" size="255" />
<behavior name="i18n">
<parameter name="i18n_columns" value="name, h1, description, new_our_field"/>
<parameter name="default_locale" value="en"/>
</behavior>
........
</table>
<table name="shop_category_i18n" phpName="SCategoryI18n">
<vendor type="mysql">
<parameter name="Charset" value="utf8"/>
</vendor>
........
<column name="new_our_field" type="varchar" size="255" />
........
</table>
</database>
3. Створюємо поле зі своїми параметрами в потрібну таблицю в mysql. Наприклад, shop_category або shop_category_i18n.
ALTER TABLE `your_table` ADD `new_our_field` VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '';
Генерація моделі в Linux
1. Заходимо в корінь нашого проекту з терміналу:
// У корені проекту повинен бути propel.yaml
cd /var/www/project.loc
2. Перебуваючи в проекті, запустіть команду генерації моделей (в linux повинен бути встановлений php потрібної версії глобально)
/var/www/project.loc> ./application/third_party/propel/propel/bin/propel -v build
Генерація моделі у Windows
1. Якщо php не стоїть глобально і в Bash консолі не відгукується команда "php -v", то потрібно завантажити php тієї версії, з якою працюватиме ваш сайт (v7.2-7.4).
2. Заходимо з Bash консолів проект
// У корені проекту повинен бути propel.yaml
C:\> cd .\OSPanel\domains\project.loc
3. Команда для генерації в корені проекту (Наприклад, php лежить на шляху "C:\php74\php.exe")
C:\OSPanel\domains\project.loc> C:\php74\php.exe .\application\third_party\propel\propel\bin\propel -v build
Якщо генерація проведена успішно, буде лог і таке повідомлення. Інакше можна ознайомитись із документацією ORM Propel.
Використання
<?php
/* Викликаємо модель категорій */
$category = \SCategoryQuery::create()
->joinWithI18n('en', 'INNER_JOIN')
->filterById($id)
->findOne();
/* Читання з нашого поля new_our_field (з snake_case у camelCase Propel перекладає сам) */
$new_our_field = $category->getNewOurField();
/* Запис у полі */
$category->setNewOurField($new_our_field . '- additional text')
->save(); // Збереження основою