Мультигорода без контекстов и поддоменов на ZoomX
Задача: сделать смену контактов при изменении города, город меняется так: site/spb/contacts.
Создаём ресурс «Города», в нём дочерними ресурсами создаём ресурсы-города с отдельным шаблоном. К этому шаблону привязываем tv, например email. Alias ресурса-города — это часть пути, отвечающая за город в адресной строке. Заполняем tv с контактами.
В примерах ниже id папки «Города» — 16, id города по умолчанию (например Москва) — 17.
В routes.php пишем:
Нам понадобится модификатор field, как его создать написано тут: modzone.ru/blog/2020/12/19/zoomx-creating-smarty-plugins/
Выведем список городов:
Выведем выбранный город:
Теперь выведем email:
Если интересно, потом могу написать про геолокацию.
Создаём ресурс «Города», в нём дочерними ресурсами создаём ресурсы-города с отдельным шаблоном. К этому шаблону привязываем 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>
Если интересно, потом могу написать про геолокацию.
Комментарии: 4
Позволю себе поумничать. ) Процесс создания готового продукта делится на 3 этапа:
1. Программирование задуманного функционала.
2. Рефакторинг.
3. Оптимизация.
Решение вполне рабочее. Поэтому пора приступать ко второму этапу и вынести из роутов посторонний код. Например, в какой-нибудь сервис.
Ну и не могу не отметить, что нарушено одно из важнейших правил обеспечения безопасности — никогда не доверяй данным, пришедшим от пользователя. Их всегда необходимо фильтровать. Но это претензии к коду. За реализацию +.
1. Программирование задуманного функционала.
2. Рефакторинг.
3. Оптимизация.
Решение вполне рабочее. Поэтому пора приступать ко второму этапу и вынести из роутов посторонний код. Например, в какой-нибудь сервис.
Ну и не могу не отметить, что нарушено одно из важнейших правил обеспечения безопасности — никогда не доверяй данным, пришедшим от пользователя. Их всегда необходимо фильтровать. Но это претензии к коду. За реализацию +.
А что значит «сервис»? У меня в голове только один вариант — вынести в php файл и через require подключить
Имеется ввиду вот это
Немного перекликается с тем, что я писал modx.pro/help/23305
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.