Разная информация по регионам

16 февраля 2023, 23:00

Пример реализации мультирегиональности

Рассмотрим реализацию мультирегиональности на примере взаимодействия с компонентом cityFields. Создаём TV city_id. Возможные значения @SELECT `name`,`id` FROM `[[++table_prefix]]cf_cities` ORDER BY `active` ASC Дальit предположим, что есть ресурс Доставка, условия доставки отличаются в зависимости от города. Поэтому создаем дочерние ресурсы по отношению к ресурсу Доставка:

  • Доставка в Москве;
  • Доставка в Майкопе. У каждого выбираем соответствующий город в city_id. Сохраняем. Плагин на сохранение создаст необходимый плейсходлер.
<?php
$hidemenu = $resource->get('hidemenu');
$published = $resource->get('published');
$parent = $resource->get('parent');
$city_id = $resource->getTVValue('city_id');

// EVENTS
switch ($modx->event->name) {
    case 'OnDocFormDelete':
        if ($hidemenu && !$published && !in_array($parent, array(0, 2, 9, 40, 41, 42))) {
            $modx->addPackage('cityfields', MODX_CORE_PATH . 'components/cityfields/model/');
            if ($parentResource = $modx->getObject('modResource', $parent)) {
                $alias = $parentResource->get('alias');
                if ($field = $modx->getObject('cfField', array('placeholder' => $alias))) {
                    $field->remove();
                }
            }
        }
        break;

    case 'OnResourceUndelete':
    case 'OnDocFormSave':
        if ($hidemenu && !$published && !in_array($parent, array(0, 2, 9, 40, 41, 42))) {
            $modx->addPackage('cityfields', MODX_CORE_PATH . 'components/cityfields/model/');
            if ($parentResource = $modx->getObject('modResource', $parent)) {
                $alias = $parentResource->get('alias');
                if (!$modx->getCount('cfField', array('placeholder' => $alias, 'city_id' => $city_id))) {
                    $field = $modx->newObject('cfField');
                    $field->fromArray(array(
                        'city_id' => $city_id,
                        'placeholder' => $alias,
                        'value' => $id
                    ), '', true);
                    $field->save();
                }
            }
        }
        break;
}

А потом просто меняем код основного шаблона на этот

{extends 'file:elements/pages/wrapper.tpl'}
{block 'content'}
{set $plsName = 'cf.'~$_modx->resource.alias}
{set $path = '!getParsedConfigPath' | snippet:['rid' => $_modx->getPlaceholder($plsName)]}
{include $path}
{/block}


Предыдущий документ
Создание и обновление элементов
Следующий документ
Перед началом работы