Мультигорода без контекстов и поддоменов на ZoomX

Задача: сделать смену контактов при изменении города, город меняется так: site/spb/contacts.

Создаём ресурс «Города», в нём дочерними ресурсами создаём ресурсы-города с отдельным шаблоном. К этому шаблону привязываем tv, например email. Alias ресурса-города — это часть пути, отвечающая за город в адресной строке. Заполняем tv с контактами.

В примерах ниже id папки «Города» — 16, id города по умолчанию (например Москва) — 17.

В routes.php пишем:
$request = explode('/' , $_SERVER['REQUEST_URI']);
$city = $request[1];
$alias = end($request);
$city_prefix = '';
$home = '/';

if (!empty($city)) {
    $query = $modx->newQuery('modResource', ['alias' => $city, 'parent' => 16]);
    $query->select('id');
    $city_id = $modx->getValue($query->prepare());

    if ($city_id) {
        $city_prefix = "$city/";
        if ($alias == $city) {
            $alias = '/';
            $home = $city;
        }
        $modx->setOption('site_url', $modx->getOption('site_url')  . $city . '/');
        $modx->resource = zoomx()->getResource($alias);
    }
}

$modx->setPlaceholder('city_id', $city_id ?: 17);

/* роут для домашней страницы*/
$router->get($home, function() use ($modx) {
    return viewx("home.tpl");
});

/* пример роута*/
$router->get($city_prefix . 'search', function() use ($modx) {
    return viewx("search.tpl");
});

Нам понадобится модификатор field, как его создать написано тут: modzone.ru/blog/2020/12/19/zoomx-creating-smarty-plugins/

Выведем список городов:
{nocache}
        {$items = 'pdoResources'|snippet:[
            'parents' => 16,
            'depth' => 1,
            'limit' => 0,
            'showUnpublished' => 1,
            'sortby' => '{ "menuindex": "ASC" }',
            'return' => 'data'
        ]}
        <ul>
            {foreach $items as $item}
                <li>
                    <a href="/{$item.alias}{if 'id'|resource != 1}/{'alias'|resource}{/if}">{$item.pagetitle}</a>
                </li>
            {/foreach}
        </ul>
{/nocache}
Тут нужно либо как-то выделить текущий город, либо скрыть его. Думаю, разберётесь как это сделать)

Выведем выбранный город:
{'city_id'|ph|field:'pagetitle' nocache}

Теперь выведем email:
<a href=""mailto:{'city_id'|ph|field:'email' nocache}">{'city_id'|ph|field:'email' nocache}</a>

Если интересно, потом могу написать про геолокацию.
Лёша
03 октября 2022, 17:14
modx.pro
3
701
+5

Комментарии: 4

Сергей Шлоков
04 октября 2022, 07:28
+3
Позволю себе поумничать. ) Процесс создания готового продукта делится на 3 этапа:
1. Программирование задуманного функционала.
2. Рефакторинг.
3. Оптимизация.
Решение вполне рабочее. Поэтому пора приступать ко второму этапу и вынести из роутов посторонний код. Например, в какой-нибудь сервис.

Ну и не могу не отметить, что нарушено одно из важнейших правил обеспечения безопасности — никогда не доверяй данным, пришедшим от пользователя. Их всегда необходимо фильтровать. Но это претензии к коду. За реализацию +.
    Лёша
    05 октября 2022, 18:37
    0
    А что значит «сервис»? У меня в голове только один вариант — вынести в php файл и через require подключить
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
4