Автоматическая Генерация страниц по значениям из базы данных
Добрый день, мудрецы!
Требуется помощь. В настоящее время на сайте реализован каталог артистов с разбиением по странам. У каждой страны есть города, которые задаются в личных кабинетах артистов.
Можно ли как-то автоматически генерировать страницу под каждый город, который присутствует в базе и выводить на ней список артистов, у которых этот город выбран в личном кабинете?
Руками это адских сизифов труд! В базе несколько десятков тысяч городов.
Подскажите, куда копать?
Нашел Virtual Page, но разобраться в нем не получается, документацию так и не нашел.
P.s. Если кто может помочь за вознаграждение — буду вдвойне рад.
Требуется помощь. В настоящее время на сайте реализован каталог артистов с разбиением по странам. У каждой страны есть города, которые задаются в личных кабинетах артистов.
Руками это адских сизифов труд! В базе несколько десятков тысяч городов.
Подскажите, куда копать?
Нашел Virtual Page, но разобраться в нем не получается, документацию так и не нашел.
P.s. Если кто может помочь за вознаграждение — буду вдвойне рад.
Комментарии: 6
с Virtual Page в принципе просто и сложно…
суть проблемы — это то как вы потом пойдете по пути сайта…
т.е. например сейчас у вас sitename.ru/country/avtor_name.html
при таком раскладе вы получите полноценную страницу автора потому как такой путь существует в базе
если мы берем Virtual Page и делаем роутинг типа
во вторых ваш обработчик должен понять все это…
собственно уточните ваш вопрос какие url вы видете в результате… тогда вам легче будет подсказать пути решения, а так да, я только Virtual Page смог решить этот вопрос
суть проблемы — это то как вы потом пойдете по пути сайта…
т.е. например сейчас у вас sitename.ru/country/avtor_name.html
при таком раскладе вы получите полноценную страницу автора потому как такой путь существует в базе
если мы берем Virtual Page и делаем роутинг типа
/{country_name:[A-Za-zА-Яа-я0-9-]+}/{city_name:[A-Za-zА-Яа-я0-9-]+}/{id}.html
так во-первых у вас весь роутинг сата посыпетсяво вторых ваш обработчик должен понять все это…
собственно уточните ваш вопрос какие url вы видете в результате… тогда вам легче будет подсказать пути решения, а так да, я только Virtual Page смог решить этот вопрос
Степан, спасибо за ответ!
Сейчас вложенность такая: sitename.ru/artists/russia и на этой странице выводится список артистов из России. Требуется еще большая вложенность — до города :)
Так как сайт еще и мультиязычный и городам в базе присвоен уникальный id, то вложенность планировалась следующая: sitename.ru/artists/russia/1, где 1 — это к примеру москва (далее уже с помощью сниппета 1 превращается в Москва, Moscow и т.д.)
То есть на этой странице будет выведен уже список российских артистов, но только тех, кто из Москвы
Сейчас вложенность такая: sitename.ru/artists/russia и на этой странице выводится список артистов из России. Требуется еще большая вложенность — до города :)
Так как сайт еще и мультиязычный и городам в базе присвоен уникальный id, то вложенность планировалась следующая: sitename.ru/artists/russia/1, где 1 — это к примеру москва (далее уже с помощью сниппета 1 превращается в Москва, Moscow и т.д.)
То есть на этой странице будет выведен уже список российских артистов, но только тех, кто из Москвы
страница самого артиста находится по другому пути:
sitename.ru/user/имя_артиста
sitename.ru/user/имя_артиста
например на странице sitename.ru/artists/russia/moscow/ нужен список актеров...?
тогда делаем следующим образом…
для начала по хошему было бы кашерно иметь в качестве ID значения города строку типа
|--------------------|
urlname | name
|--------------------|
moscow | Москва
|---------------------|
ну чтобы tv имел значение urlname
переходим в Virtual Page
на закладку Обработчик
+ Добавляем
Имя: ArtistForCity(например)
Тип: динамический ресурс
Запись: выбираем необходимый шаблон списка артистов(потом туда передадим значения для фильтра)
на закладку маршруты
+ добавляем
Маршрут: /artists/{country_name:[A-Za-zА-Яа-я0-9-]+}/{city_name:[A-Za-zА-Яа-я0-9-]+}/
Метод: GET
Обработчик: (выбираем наш который создали чуть ранее)
Событие: OnPageNotFound
свойства: (тут я для себя создал еще 1 признак так как я не остановился на этом и мне нужны были больше вложенности)
а дальше я без плагина не смог обойтись(у меня там все сложнее), так как нам нужен кастомный title т.п.
я бы делал через pdo
например pdoResources
в принципе можно обойтись без плагина, но… тогда не будет кастомного заголовка и тогда не будет обработки на несуществующую страницу
тогда делаем следующим образом…
для начала по хошему было бы кашерно иметь в качестве ID значения города строку типа
|--------------------|
urlname | name
|--------------------|
moscow | Москва
|---------------------|
ну чтобы tv имел значение urlname
переходим в Virtual Page
на закладку Обработчик
+ Добавляем
Имя: ArtistForCity(например)
Тип: динамический ресурс
Запись: выбираем необходимый шаблон списка артистов(потом туда передадим значения для фильтра)
на закладку маршруты
+ добавляем
Маршрут: /artists/{country_name:[A-Za-zА-Яа-я0-9-]+}/{city_name:[A-Za-zА-Яа-я0-9-]+}/
Метод: GET
Обработчик: (выбираем наш который создали чуть ранее)
Событие: OnPageNotFound
свойства: (тут я для себя создал еще 1 признак так как я не остановился на этом и мне нужны были больше вложенности)
{"a_page":"city_page"}
а дальше я без плагина не смог обойтись(у меня там все сложнее), так как нам нужен кастомный title т.п.
<?php
switch ($modx->event->name) {
case 'vpOnResourceAfterCreate':
$pdo = $modx->getService('pdoFetch');
$fastrouter = $modx->getOption('fastrouter', $_REQUEST, array());
$_prop = $fastrouter['properties'];
$_set_w = false;
if ($_prop['a_page'] == 'city_page') {
$_data = $pdo->getCollection('modTemplateVarResource', [ 'tmplvarid'=> 'твой_id_tv', 'value' => $fastrouter['city_name'] ]);
if ($_data) {
//foreach ($_data as $D) {
// $_id[] = $D['contentid'];
//}
//$modx->setPlaceholder(implode($_id), 'PL_res_ids'); // передадим шаблону наш новый PL
$modx->setPlaceholder('city_url', $fastrouter['city_name']); // назначили id-шники наших страниц
$resource->set('pagetitle', 'Артисты города : '. "тут_как-то_нужно_получить_твой_город");
} else {
$modx->sendErrorPage();
}
}
break;
}
далее в самом шаблонея бы делал через pdo
например pdoResources
[[!pdoResources?
&parent=`0`
&hideContainers=`1`
&prepareTVs=`1`,
&includeTVs= `список твешек`
&tvFilters=`our_tv==[[+city_url]]`
&tpl=`наш_чанк_или_что_там`
]]
по поводу как вывести на странице я думаю ты понялв принципе можно обойтись без плагина, но… тогда не будет кастомного заголовка и тогда не будет обработки на несуществующую страницу
Степан, гигантское спасибо за такой подробный ответ! Сел пробовать
если что-то не будет получаться сюда пиши
чтобы у кого еще такой вопрос возникнет у него было-бы максимальное погружение))
чтобы у кого еще такой вопрос возникнет у него было-бы максимальное погружение))
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.