MODX. xPDO. Плейсхолдеры (Placeholders)

Плейсхолдеры — один из базовых элементов MODX, что-то вроде переменных, которые используются, для отображения хранимой в них информации в чанках и шаблонах. В базовом синтаксисе MODX плейсхолдеры записываются так: [[+placeholder]], при использовании fenom — {$placeholder} или {$_pls['prefix.placeholder']}.

Перед тем как попасть в тег MODX, информация о плейсхолдерах формируется в системном массиве $modx->placeholders. Чтобы добавлять, изменять, или удалять плейсхолдеры, при работе с этим массивом, есть ряд xPDO методов, которые описаны ниже.

Добавление плейсхолдеров

  • setPlaceholder('name', 'value') — устанавливает один плейсхолдер с именем name и значением value, который будет доступен при вызове [[+name]].
    $modx->setPlaceholder('berry','blueberry');
  • setPlaceholders(array/object $placeholders, ['prefix']) — устанавливает коллекцию плейсхолдеров, передаваемых с помощью простого ассоциативного массива или объекта. При этом доступ к плейсхолдеру осуществляется через ключи передаваемого массива. У этого метода есть необязательный параметр $namespace, если его установить, то вызов должен также начинаться с имени простраства.
    $modx->setPlaceholders(array(
       'berry' => 'blueberry',       // [[+goodies.berry]]
       'fruit' => 'kiwi',            // [[+goodies.fruit]]
    ),'goodies.');
  • toPlaceholder('name', 'value', ['prefix'], ['separator'], [restore]) — устанавливает один плейсхолдер, но работает с ним как с многомерным массивом. В отличие от setPlaceholder имеет 3 дополнительных необязательных параметра: 
    • prefix — используется для указания имени пространства, к которому будет относится плейсхолдер;
    • separator — устанавливает разделитель между префиксом и ключем (по умолчанию точка '.', но при переопределении '1');
    • restore — может иметь значение true или false. В случае если установлено true, в результирующий массив добавляется еще 1 ключ [restore] с массивом содержащим предыдущие данные (не все, только ближайшие)
      // Простая работа с методом toPlaceholder
      $modx->toPlaceholder('berry','blueberry','goodies'); 
      // установит плейсхолдер [[+goodies.berry]] со значением 'blueberry'
      
      // переопределим уже установленный плейсхолдер, установим параметр $restore в true (и разделитель точку)
      $val = $modx->toPlaceholder('berry','cherry','goodies', '.', true); 
      // установит плейсхолдер [[+goodies.berry]] со значением 'cherry', 
      // а также создаст массив restore с ключем goodies.berry и значением 'blueberry'
      // B переменной $val будет храниться массив:
      // array(
      //  'keys' => array('goodies.berry')
      //  'restore' => array(
      //    'goodies.berry' => 'blueberry'
      //   )
      // )
      
      // В метод можно передавать массив
      $val = $modx->toPlaceholder('berry', array('inForest'=>'blueberry','inGarden'=>'cherry'),'goodies')
      // получим 2 плейсхолдера - [[+goodies.berry.inForest]] и [[+goodies.berry.inGarden]] 
      // со значениями 'blueberry' и 'cherry' соответственно. 
      // B переменной $val будет храниться массив:
      // array(
      //  'keys' => array(
      //    'goodies.berry.inForest',
      //    'goodies.berry.inGarden'
      //   )
      // )
  • toPlaceholders(array/object $placeholders, ['prefix'], ['separator'], [restore]) — устанавливает коллекцию плейсхолдеров, передаваемых с помощью массива или объекта. Дополнительные параметры и принцип работы аналогичен методу toPlaceholder, разница лишь в методе добавления данных:
    $modx->toPlaceholders(
      array(
        'berry' => 'blueberry',
        'foreign' => array(
          'fruit' => 'kiwi')
      ), 
      'goodies.'
    );
    
    // установит 2 плейсхолдера [[+goodies.berry]] и [[+goodies.foreign.fruit]]

Получение плейсхолдеров

  • getPlaceholder('name') — позволяет получить существующий плейсхолдер по указанному ключу:
    $val = $modx->getPlaceholder('goodies.berry');

    Можно обратиться к массиву плейсхолдеров напрямую:

    $val = $modx->placeholders['goodies.berry'];

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

  • unsetPlaceholder(key) — удаляет один плейсхолдер, указанный в ключе:
    $modx->unsetPlaceholder('goodies.berry');
  • unsetPlaceholders(keys) — удаляет коллекцию плейсхолдеров:
    // можно указывать 1 плейсхолдер
    $modx->unsetPlaceholders(goodies.berry);
    
    // можно указывать элементы массива
    $modx->unsetPlaceholders(
       array('goodies.berry','goodies.fruit')
    );
    
    // можно указывать пространство имен 'goodies.'
    $modx->unsetPlaceholders('goodies.');

Некоторые особенности 

  • При работе с системными плейсхолдерами необходимо указывать дополнительный '+':
$modx->setPlaceholder('+site_url','riwkus.pro');
  • В некоторых случаях плейсхолдеры нельзя вызвать с использованием тегов MODX, если вы столкнулись с подобной ситуацией, используйте fenom конструкцию {$_modx->getPlaceholder('placeholder')}.
  • Если возникла необходимость посмотреть какие плейсхолдеры существуют при рендере страницы, можно использовать сниппет viewPlaceholders:
    if (!$modx->user->isMember('Administrator')) 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>';