Автоматическая Генерация страниц по значениям из базы данных

Добрый день, мудрецы!

Требуется помощь. В настоящее время на сайте реализован каталог артистов с разбиением по странам. У каждой страны есть города, которые задаются в личных кабинетах артистов.
Можно ли как-то автоматически генерировать страницу под каждый город, который присутствует в базе и выводить на ней список артистов, у которых этот город выбран в личном кабинете?

Руками это адских сизифов труд! В базе несколько десятков тысяч городов.

Подскажите, куда копать?

Нашел Virtual Page, но разобраться в нем не получается, документацию так и не нашел.

P.s. Если кто может помочь за вознаграждение — буду вдвойне рад.
Андрей
07 июля 2021, 15:15
modx.pro
287
0

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

Stepan
11 июля 2021, 15:17
+1
с 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 смог решить этот вопрос
    Андрей
    11 июля 2021, 15:25
    0
    Степан, спасибо за ответ!
    Сейчас вложенность такая: sitename.ru/artists/russia и на этой странице выводится список артистов из России. Требуется еще большая вложенность — до города :)

    Так как сайт еще и мультиязычный и городам в базе присвоен уникальный id, то вложенность планировалась следующая: sitename.ru/artists/russia/1, где 1 — это к примеру москва (далее уже с помощью сниппета 1 превращается в Москва, Moscow и т.д.)

    То есть на этой странице будет выведен уже список российских артистов, но только тех, кто из Москвы
      Андрей
      11 июля 2021, 15:27
      0
      страница самого артиста находится по другому пути:
      sitename.ru/user/имя_артиста
        Stepan
        11 июля 2021, 17:59
        0
        например на странице 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 признак так как я не остановился на этом и мне нужны были больше вложенности)
        {"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=`наш_чанк_или_что_там`
        ]]
        по поводу как вывести на странице я думаю ты понял
        в принципе можно обойтись без плагина, но… тогда не будет кастомного заголовка и тогда не будет обработки на несуществующую страницу
          Андрей
          15 июля 2021, 14:15
          0
          Степан, гигантское спасибо за такой подробный ответ! Сел пробовать
            Stepan
            16 июля 2021, 11:28
            0
            если что-то не будет получаться сюда пиши
            чтобы у кого еще такой вопрос возникнет у него было-бы максимальное погружение))
      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
      6