Поменять longtitle и.т.д. на лету из сниппета
Добрый день, возникла такая проблема.
в сниппете обращаюсь к данным кастомной таблички и через virtual-page всё вывожу.
В чанк всё передаётся и отлично. Но хотелось бы перезаписать longtitle, description, pagetitle своими данными. Так как вызываются названия городов из таблицы и хотелось динамически формировать всё нужное для SEO.
Конечно всё это можно передать в плэйсходеры и что-то колхозить. но мне кажется это не верно.
Тут формирую свои данные для замены.
Первый.
Так как они меняют в уже загруженном документе, а пользователь на экране видит старые данные.
Как вариант думал сделать сниппет, который вставить в самое нало документа вообще, может тогда когда дело дойдёт до заполнения метатегов и.т.д там будут уже нужные данные. Но что-то мне подсказывает. что я не в том направлении копаю.
Подскажите пожалуйста, кто уже решал подобную проблему.
в сниппете обращаюсь к данным кастомной таблички и через 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();
}
Оба варианта меняют нужные мне поля, но надо перезагружать страницу ещё раз.Так как они меняют в уже загруженном документе, а пользователь на экране видит старые данные.
Как вариант думал сделать сниппет, который вставить в самое нало документа вообще, может тогда когда дело дойдёт до заполнения метатегов и.т.д там будут уже нужные данные. Но что-то мне подсказывает. что я не в том направлении копаю.
Подскажите пожалуйста, кто уже решал подобную проблему.
Комментарии: 7
Если я правильно понял, то сделайте плагин для события OnLoadWebDocument и перезаписывайте там на лету все что угодно
$modx->resource->pagetitle = 'новый pagetitle';
Спасибо! но я одного не пойму, если делаю такой плагин, то меняется содержимое вообще всех страниц сайта.
Надо в этот плагин параметры передавать, когда вызывается сниппет, так?
Надо в этот плагин параметры передавать, когда вызывается сниппет, так?
Ааа дошло, это нужно вместо снипета использовать! Теперь всё отлично получилось!
Спасибо!!!
Спасибо!!!
Да он будет на всех страницах, но можете ограничить его поставив условие, например
Сниппет вам не нужен будет скорее всего, раз вы в плагине все менять будете.
//по id, parent, template или еще как-то
if ($modx->resource->id == 1) {
...
}
Сниппет вам не нужен будет скорее всего, раз вы в плагине все менять будете.
Оба варианта меняют нужные мне поля, но надо перезагружать страницу ещё раз.да а зачем вы поля у ресурса то меняете???
Так как они меняют в уже загруженном документе, а пользователь на экране видит старые данные.
получили массив данных, поменяли в нем что нужно и вывели пользователю, все. Зачем вы себе лишних проблем добавляете?
Спасибо. но к шаблонизатору я ещё обязательно вернусь)) не всё сразу.
вчера только узнал что такое сниппет в modx, освоил более менее механику работы. Щас дожму плагины, тоже вот только из коммента выше узнал, что это )))
вчера только узнал что такое сниппет в modx, освоил более менее механику работы. Щас дожму плагины, тоже вот только из коммента выше узнал, что это )))
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.