if (!$modx->user->isAuthenticated('mgr')) return;
$placeholders = $prefix ? array() : $modx->placeholders;
if ($prefix) {
foreach ($modx->placeholders as $key => $ph) {
if (strpos($key, $prefix) === 0) {
$placeholders[$key] = $ph;
}
}
}
return '<pre>' . print_r($placeholders, true) . '</pre>';
Смотреть вывод лучше с конца, т.к. в начале идут в основном системные настройки (впрочем и они могут пригодиться). Параметр &prefix поможет, если в сниппете используются плейсхолдеры с определенным префиксом, например «fi.» у FormIt.
Николай 07.11.2013 17:09 #
>>> $placeholders = $prefix? array(): $modx->placeholders;
$prefix у вас — строчная переменная.
При этом вы в $placeholders присваиваете или эту строчную переменную, или массив плейсхолдеров MODX-а. Зачем? По конечному выводу понятно, что смысл в том, что если префикс не указан, то будет без цикла выведен массив плейсхолдеров $modx->placeholders, а если указан, то будет фильтрация по префиксу. Но именно здесь и получается промах. Следите: Префикс указан, и переменная $placeholders становится строчной переменной со значением указанного префикса. Далее если в цикле есть совпадения по ключу-префиксу, то вы уже пытаетесь с этой строчной переменной работать как с массивом. Это первое. А второе — если ничего не будет найдено, то конечный «массив» плейсхолдеров — это просто строковая переменная с названием префикса.
Второе: >>> if (!$modx->user->isAuthenticated('mgr')) return;
Просто проверять авторизацию в админке — это еще не панацея. Мало ли кто это, может это какой-нибудь манагер с минимальными правами. Все-таки правильней проверять $modx->hasPermission.
Виталий Киреев 07.11.2013 17:23 #
2) Поскольку это временный хак «только посмотреть», достаточно, что простые пользователи не увидят, заморачиваться смысла нету. По крайней мере мне.
Николай 07.11.2013 18:31 #
Да, действительно, php такие конструкции воспринимает как $placeholders = ($prefix? array(): $modx->placeholders);, а не как ($placeholders = $prefix)? array(): $modx->placeholders;
Это моя ошибка восприятия. Но видимо как раз, чтобы исключать такие ошибки, пишут типа вот так:
Так все проще по восприятию и однозначней.
>> 2) Поскольку это временный хак «только посмотреть», достаточно, что простые пользователи не увидят, заморачиваться смысла нету. По крайней мере мне.
Если бы я хотел показать просто, чтобы посмотрели, я бы это написал просто return print_r($modx->placeholders, true); И мог бы фигачить по 50 таких топиков в день.
Думаю, ценность таких статей минимальная. Вы бы лучше рассказали, как работает в целом механизм плейсхолдеров в MODX-е, посвятили бы в методы $modx->setPlaceholder()/setPlaceholders(), $modx->getPlaceholder() и т.п. Было бы в разы полезней. А так просто вывести плейсхолдеры, это из оперы print_r($_SESSION), а что такое сессии и как они работают — это сами разбирайте. Статья вообще ничему не учит. Думаю, цель была только одна — засветиться.
Сорри за прямоту.
nortonfox 08.11.2013 17:31 #
Николай — не как не хотел вас задеть или обидеть, но я реально думаю, что вам лучше молча писать проекты не создавая посты не на каких сайтах.
Николай 08.11.2013 23:36 #
Не думаю, что вам дано решать, что и где мне писать. Ваше полное право — не читать.
А еще можете написать что-нибудь полезное. Может мы у вас чему-нибудь научимся.
Сергей CapWeb 11.05.2023 00:38 #
У меня вот так сработало