LINUX.ORG.RU

modx - как передать параметр в сниппет до начала отправки страницы?

 , ,


0

1

Сегодня впервые столкнулся с modx - необходимо отправить в браузер другой css, если клиент - мобильное устройство. Клиент нормально детектится, на адрес вида sitename/m перенаправляет. Захотел сделать сниппет, или принимающий булев параметр, или считывающий какую-нибудь глобальную переменную $mobile, и, исходя из этого, отдающий десктопный или мобильный css. Вид клиента детектится в index.php. regClientCSS пробовал, но, во-первых, не работает, а, во-вторых, нужно не добавить, а заменить css. Не пойму, как передать параметр в сниппет. Нагуглил только это, но оно должно, видимо, где-то в другом месте выполняться: http://modx-cms.ru/dokumentatsiya/dokumentacziya-evo/razrabotka/programmirovanie/modx-api/runsnippet.html

★★★★

Последнее исправление: wingear (всего исправлений: 1)

Вид клиента детектится в index.php

Если MODx Revolution, то выбрасывай свои костыли. Есть плагины, у них есть события (events). Тебе нужено вызывать плагин по событию OnWebPagePrerender.

Сначала в плагине детектишь клиента, затем, с помощью getChunk вызываешь нужный чанк с css'кой. К примеру:
$output = $modx->getChunk('Header', array('client_css' => 'assets/ui/css/mobile.css');
Здесь мы передаем в плейсхолдер client_css ( [[+client_css]] ) путь к css файлу.

В общем, если не очень доходчиво - извиняюсь и добро пожаловать в жаббер.

eth1
()
Ответ на: комментарий от eth1

спасибо, почти всё понял, кроме одного: в каком плагине детектить?

Есть несколько явно не относящихся к делу, пока сомневаюсь в отношении ManagerManager, QuickManager+, TransAlias и phx. Или как, исходя из кода плагина, понять, что это то, что нужно?

wingear ★★★★
() автор топика
Ответ на: комментарий от wingear

Не не. Нужно писать свой.

У тебя Evolution, с ней я конечно мало работал. Было это где-то в районе «Управление элементами > Плагины > Создать плагин». Пихаешь туда свой детектер, затем на вкладке «События» отмечаешь «OnWebPagePrerender».

С getChunk это я фигню сказал, ночь, глаз замылился. Тебе нужно с помощью с помощью $modx->setPlaceholder($name, $value) из плагина отправить нужное значение в плейсхолдер, который выводит адрес .css файла.

Что-то вроде:

if ( ... ) {
  $value = 'mobile.css';
} else {
  $value = 'desktop.css';
}

$modx->setPlaceholder('client_css', $value);

Ну а дальше уже в чанке или шаблоне:

<link rel="stylesheet" href="path/to/css/[+client_css+]">

eth1
()
Ответ на: комментарий от eth1

не работает - ничего не приходит в client_css. М.б., там не плюсы нужны? Дело не в определении браузера, пробовал рандомную строку в $value запихивать, тоже самое. Сделаю в сниппете определение юзерагента

wingear ★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.