Работа с базой и генерация моделей Propel
Работа категорий товаров и товарных моделей происходит с помощью ORM Propel. Propel даёт возможность автоматически сгенерировать классы для быстрого доступа к полям в таблицах базы. В этом нам поможет schema.xml и propel.yaml в корне сайта.
Подготовка к генерации модели
1. Внос поля в schema.xml. Используются базовые 4 схемы по путям.
// для работы с общей таблицей route
/application/modules/core/schema.xml
// схема товаров, категорий и всего shop
/application/modules/shop/schema.xml
// схема таблиц 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="ru"/>
</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(); // Сохранение в базу