• Блог
  • Методы работы с плейсхолдерами MODX
Многие знают, что в MODX уже есть набор системных плейсхолдеров — [[++site_url]], [[++assets_url]], [[+modx.user.id]] и т.д. Но очень часто возникает необходимость вывести какую-то дополнительную информацию на сайте. В этом случае нам нужно определить свои плейсходеры и для этого в MODX есть несколько методов.
Напомню, что плейсхолдеры — это один из базовых элементов MODX. Они используются, как правило, для отображения хранимой в них информации в чанках и шаблонах и имеют следующий синтаксис [[+Placeholder]].
Все плейсхолдеры находятся в массиве $modx->placeholders. Именно в него добавляются наши плейсхолдеры и из него зачитываются при парсинге страницы.

Давайте рассмотрим все методы для работы с ними.

  1. setPlaceholder(key, value)
  2. setPlaceholders(array, prefix)
  3. toPlaceholder(key, value, prefix, separator, restore)
  4. toPlaceholders(array, prefix, separator, restore)
  5. getPlaceholder(key)
  6. unsetPlaceholder(key)
  7. unsetPlaceholders(keys)

1. setPlaceholder()

setPlaceholder(string $key, mixed $value)

Этот метод сохраняет плейсхолдер с указанным ключем и присваивает ему переданное значение. Он ничего не возвращает.

$modx->setPlaceholder('name','Barry');
После этого вам становится доступным плейсхолдер [[+name]]. Его можно вставлять в шаблон, контент страницы или в чанк.

2. setPlaceholders()

setPlaceholders (array|object  $placeholders, [string $namespace = ''])

В этом методе можно определить сразу несколько плейсхолдеров, которые могут быть переданы в простом ассоциативном массиве или в объекте. Обратите внимание, у этого метода есть второй параметр $namespace, который используется в качестве префикса. Этот метод также ничего не возвращает.

$modx->setPlaceholders(array(
   'name' => 'John',
   'email' => 'jdoe@gmail.com',
),'my.');
Доступные плейсхолдеры — [[+my.name]] и [[+my.email]].

3. toPlaceholder()

toPlaceholder(string $key, mixed $value, [string $prefix = ''], [string $separator = '.'], [boolean $restore = false])

Этот метод похож на setPlaceholder(), но имеет дополнительные параметры для префикса и разделителя, который добавляется между префиксом и ключом. А еще у него есть пятый параметр $restore, который, если указать ему true, вернет в массиве старое значение плейсходера в ключе "restore". Метод toPlaceholder() возвращает массив с плейсхолдерами в ключе 'keys'.

В параметре $value можно передавать массив. Ключи этого массива будут добавлены к ключу через разделитель.
//Пример 1.
$res = $modx->toPlaceholder('city','Moscow','my');
// Выставит плейсхолдер [[+my.city]] со значение 'Moscow' и вернет массив
array(
  'keys' => array('my.city')
)

// Пример 2.
// Если мы попытаемся переопределить уже установленный плейсхолдер и 
// установим последний параметр $restore в true
$res = $modx->toPlaceholder('sity','Omsk','my','.',true)
// то получим такой массив
array(
  'keys' => array('my.sity')
  'restore' => array(
    'my.city' => 'Moscow'
  )
)

// Пример 3.
// Передаем массив
$res = $modx->toPlaceholder('city',array('oldName'=>'Константинополь','newName'=>'Стамбул'),'turkey')
// получаем 2 плейсхолдера - [[+turkey.city.oldName]] и [[+turkey.city.newName]] со значениями 'Константинополь'
// и 'Стамбул' соответственно. А в переменной $res будет массив
array(
  'keys' => array(
    'turkey.city.oldName',
    'turkey.city.newName'
  )
)

4. toPlaceholders()

toPlaceholders(array|object  $subject, [string $prefix = ''], [string $separator = '.'], [boolean $restore = false])

Этот метод расширяет метод toPlaceholders(). В $subject можно передавать многоуровневый массив. Он будет рекурсивно обработан. Ключ каждого уровня массива будет добавлен к ключу плейсхолдера через разделитель

$modx->toPlaceholders(
  array(
    'foo' => 'bar',
    'document' => array(
      'pagetitle' => 'My Page')
  ), 
  'my'
);
Получаем [[+my.foo]] и [[+my.document.pagetitle]].

5. getPlaceholder()

getPlaceholder(string $key)

Этот метод позволяет получить уже установленный плейсхолдер.

$value = $modx->getPlaceholder('MyPlaceholder');
// Альтернативный способ
$value = $modx->placeholders['MyPlaceholder'];

6. unsetPlaceholder()

unsetPlaceholder(string $key)

Удаляет установленный плейсхолдер.

$modx->unsetPlaceholder('MyPlaceholder');

7. unsetPlaceholders()

unsetPlaceholders(string|array $keys)

Удаление нескольких плейсхолдеров.

$modx->unsetPlaceholders(array('my.name','my.email'));
// Удаление плейсхолдеров с префиксом 'my.'
$modx->unsetPlaceholders('my.');

Надеюсь, теперь использование этих методов не вызовет затруднений.

0   21163

Комментарии ()

  1. Alex 13 сентября 2018 # 0
    А как переопределять настройки, к примеру: [[++site_url]]? (только для некоторых ресурсов, а не для всего сайта)
    Пытаюсь сделать плагин на событие OnWebPagePrerender
    $modx->setOption('site_url','web.ru');
    но ничего не выходит.
    также пробовал:
    $modx->setPlaceholder('site_url','web.ru');
    Тоже не получается.
    Думается, что дело в кэшировании свойств контекста.
    1. Сергей Шлоков 13 сентября 2018 # 0
      Кэширование здесь не причем. Событие OnWebPagePrerender срабатывает уже после того, как все теги были распарсены. Используйте для этого событие OnLoadWebDocument. Кроме того, системные плейсхолдеры выставляются с дополнительным плюсом
      $modx->setPlaceholder('+site_url','web.ru');
      
      1. Alex 13 сентября 2018 # 0
        Событие OnWebPagePrerender срабатывает уже после того, как все плейсхолдеры были распарсены. modzone.ru/blog/2015/12/27/frontend-events-for-modx/
        очень круто – что последовательность событий, да и при чём на русском описание!
        вот что у меня получилось:
        switch ($modx->event->name) {
            case 'OnLoadWebDocument':
        	$properties['pls_rewrite'] = ['site_url'=>'web.ru'];
                foreach($properties['pls_rewrite'] as $k => $v){	
                	$modx->setOption($k,$v);			
        		//For fenom-parser {$_modx->config.site_url}
                	$modx->setPlaceholder('+'.$k,$v);	
        		//For modx-parser [[++site_url]]
                }
            break;
        }
    2. Nik 21 февраля 2021 # 0
      Спасибо Сергей, хорошо и доступно все описано. И не только про плейсхолдеры.

      Вы должны авторизоваться, чтобы оставлять комментарии.

      Выделите опечатку и нажмите Ctrl + Enter, чтобы отправить сообщение об ошибке.