Поменять longtitle и.т.д. на лету из сниппета

Добрый день, возникла такая проблема.
в сниппете обращаюсь к данным кастомной таблички и через virtual-page всё вывожу.
В чанк всё передаётся и отлично. Но хотелось бы перезаписать longtitle, description, pagetitle своими данными. Так как вызываются названия городов из таблицы и хотелось динамически формировать всё нужное для SEO.
Конечно всё это можно передать в плэйсходеры и что-то колхозить. но мне кажется это не верно.

Тут формирую свои данные для замены.
$longtitle = "Разработка проекта перепланировки h1 в $prepositionalCase, быстро и недорого!";
$pagetitle = "Разработка проекта перепланировки title в $genitiveСase, быстро и недорого!";
$description = "Разработка проекта перепланировки description в $prepositionalCase, быстро и недорого!";
И сделал 2 варианта
Первый.
$id = $modx->resource->get('id');
$page = $modx->getObject('modResource', $id);
$page->set('longtitle',$longtitle);
$page->save();
Второй
if($doc = $modx->getObject('modResource',$id)){
$data = $doc->toArray();
$data['longtitle'] = $longtitle;
$data['pagetitle'] = $pagetitle;
$data['description'] = $description;
$modx->runProcessor('resource/update', $data);
$modx->cacheManager->clearCache(); 
}
Оба варианта меняют нужные мне поля, но надо перезагружать страницу ещё раз.
Так как они меняют в уже загруженном документе, а пользователь на экране видит старые данные.

Как вариант думал сделать сниппет, который вставить в самое нало документа вообще, может тогда когда дело дойдёт до заполнения метатегов и.т.д там будут уже нужные данные. Но что-то мне подсказывает. что я не в том направлении копаю.
Подскажите пожалуйста, кто уже решал подобную проблему.
Alexander777
23 июня 2017, 11:17
modx.pro
2 543
0

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

Андрей
23 июня 2017, 15:10
+2
Если я правильно понял, то сделайте плагин для события OnLoadWebDocument и перезаписывайте там на лету все что угодно

$modx->resource->pagetitle = 'новый pagetitle';
    Alexander777
    23 июня 2017, 20:01
    0
    Спасибо! но я одного не пойму, если делаю такой плагин, то меняется содержимое вообще всех страниц сайта.
    Надо в этот плагин параметры передавать, когда вызывается сниппет, так?
      Alexander777
      23 июня 2017, 20:13
      0
      Ааа дошло, это нужно вместо снипета использовать! Теперь всё отлично получилось!
      Спасибо!!!
        Андрей
        23 июня 2017, 20:13
        +1
        Да он будет на всех страницах, но можете ограничить его поставив условие, например

        //по id, parent, template или еще как-то
        
        if ($modx->resource->id == 1) {
        ...
        }

        Сниппет вам не нужен будет скорее всего, раз вы в плагине все менять будете.
      Володя
      23 июня 2017, 16:36
      0
      Оба варианта меняют нужные мне поля, но надо перезагружать страницу ещё раз.
      Так как они меняют в уже загруженном документе, а пользователь на экране видит старые данные.
      да а зачем вы поля у ресурса то меняете???

      получили массив данных, поменяли в нем что нужно и вывели пользователю, все. Зачем вы себе лишних проблем добавляете?
        Володя
        23 июня 2017, 16:39
        +1
          Alexander777
          23 июня 2017, 18:45
          0
          Спасибо. но к шаблонизатору я ещё обязательно вернусь)) не всё сразу.
          вчера только узнал что такое сниппет в modx, освоил более менее механику работы. Щас дожму плагины, тоже вот только из коммента выше узнал, что это )))
          Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
          7