Работа с базой и генерация моделей 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(); // Сохранение в базу