Шорткоды в MODX Revolution

Получаем ссылку на документ по id:

$url = $modx->makeUrl(4);
$url = $modx->makeUrl(4, '', array('param' => 'value')); //добавляем GET-параметры
$url = $modx->makeUrl(4,'','','full'); //указываем формат

Получаем объект ресурса, в котором вызван сниппет:

$page = $modx->resource;

Получаем объект ресурса по id и другим параметрам:

$page = $modx->getObject('modResource', 555); //555 - id ресурса
$page = $modx->getObject('modResource', array('pagetitle' => 'Страница'));
$page->get('id'); //получаем id
$page->get('content'); //получаем поле контент
$page->set('content',$content); //записываем новый контент
$page->getTVValue('tvname'); //получаем значение TV
$page->setTVValue('tvname', 'new value'); //записываем новое значение

Создаем програмно документ:

$page = $modx->newObject('modDocument');
$page->set('template',1);
$page->set('pagetitle','Новый документ');
$page->set('parent',5);
$page->save();

Получаем массивы дочерних и родительских id:

//Возвращает одномерный массив из списком дочерних id для ресурса c id=23, 2 - глубина выборки
$chids = $modx->getChildIds(23,2,array('context' => 'web'));
//Возвращает одномерный массив из списком родительских id для ресурса c id=23, 2 - уровень выборки.
//Ключ соответствует уровню родительского ресурса, относительно id=23.
$pids = $modx->getParentIds(23,2,array('context' => 'web'));
$parent = $pids[0];//Первый родительский

Ключ текущего контекста:

$modx->context->key;

Подставляем выбор ресурсов из базы в TV:

@SELECT `pagetitle`,`id` FROM `site_content` WHERE `parent` = 216
@SELECT `pagetitle`,`id` FROM `site_content` WHERE `parent` IN(17,24,25,27,28,29,40,41) AND `published` = 1 ORDER BY pagetitle ASC

Прием параметров в сниппетах:

$tpl = $modx->getOption('tpl', $scriptProperties, 'tpl.chunk');
$id = (int) $modx->getOption('id',$_GET,0);
$sort = $modx->getOption('pagetitle',$_GET,'pagetitle');

Включаем вывод ошибок:

error_reporting(E_ALL | E_STRICT);
ini_set('display_errors', 1);

Получаем корневой путь сайта:

$modx->getOption('base_path');

Ресет пароля

UPDATE modx_users SET password = MD5('the-new-password') WHERE username = 'theusername';

Логируем ошибки:

$modx->log(modX::LOG_LEVEL_ERROR, 'Error!');

PDO Query

OperatorSymbolExample
Equals none $query->where(array('width' => 15));
Not Equals != $query->where(array('width:!=' => 15));
Greater Than > $query->where(array('width:>' => 15));
Less Than < $query->where(array('width:<' => 15));
Greater Than or Equal to >= $query->where(array('width:>=' => 15));
Less Than or Equal to <= $query->where(array('width:<=' => 15));
Like LIKE $query->where(array('width:LIKE' => '%15%'));
Not Like NOT LIKE $query->where(array('width:NOT LIKE' => '%15%'));
Exists in IN $query->where(array('width:IN' => array(15,16,17,20)));
Not Exists in NOT IN code>$query->where(array('width:NOT IN' => array(15,16,17,20)));
Is Null IS $query->where(array('width:IS' => null));

Для построения PDO запросов к БД нам нужно знать классы объектов, которые сопоставлены с нужными таблицами, найти их можно в файле:

core/model/schema/modx.mysql.schema.xml

Основные из них:

"modResource" - ресурсы ("site_content" )
"modTemplateVar" - TV-параметры ("site_tmplvars")
"modTemplateVarResource" - значения TV-параметров ("site_tmplvar_contentvalues")
"modUser" - юзеры ("users")
"modUserProfile" - вся информация о юзере ("user_attributes")

Примеры запросов:

//ищем id ресурсов, у которых TV с id = 5 содержит "alpha"
$ids = array();
$query = $modx->newQuery('modTemplateVarResource', array('tmplvarid' => 5, 'value:LIKE' => '%alpha%'));
$query->select('contentid');
$query->sortby('contentid','ASC');
$query->limit(10);
if ($query->prepare() && $query->stmt->execute()) {
    $res = $query->stmt->fetchAll(PDO::FETCH_ASSOC);
    foreach($res as $r){
      $ids[] = $r['contentid'];
    }
}
//можем посмотреть SQL-команду
echo $query->toSQL();

innerJoin:

//получаем pagetitle ресурсов, у которых TV с id = 5 содержит "alpha"
$pagetitles = array();
$query = $modx->newQuery('modTemplateVarResource', array('tmplvarid' => 5, 'value:LIKE' => '%alpha%'));
$query->innerJoin('modResource', 'r', 'r.id = modTemplateVarResource.contentid');
$query->select('r.pagetitle');
$query->sortby('r.pagetitle','ASC');
$query->limit(10);
if ($query->prepare() && $query->stmt->execute()) {
    $res = $query->stmt->fetchAll(PDO::FETCH_ASSOC);
    foreach($res as $r){
        $pagetitles[] = $r['pagetitle'];
    }
}

Пример выборки по другому способу:

$prefix = $modx->getOption(xPDO::OPT_TABLE_PREFIX);
$sql = "SELECT contentid 
        FROM ".$prefix."site_tmplvar_contentvalues 
        WHERE tmplvarid = 8 
        AND contentid IN(".implode(',',$sanatoriums).") 
        AND value >= $price_from AND value <= $price_to";
$sanatoriums = array();
foreach ($modx->query($sql) as $row) {
   $sanatoriums[] = $row['contentid'];
}

Используем MODX API в статических файлах (пример для корня сайта):

// Вывод ошибок
ini_set('display_errors', 1);
ini_set('memory_limit', '512M');
error_reporting(E_ERROR);

// Подключаем
define('MODX_API_MODE', true);
require 'index.php';

// Включаем обработку ошибок
$modx->getService('error','error.modError');
$modx->setLogLevel(modX::LOG_LEVEL_FATAL);
$modx->setLogTarget(XPDO_CLI_MODE ? 'ECHO' : 'HTML');

Устанавливаем теплейт для нового дочернего ресурса в зависимости от родительского ID.

Плагин назначаем на событие OnDocFormRender

if($_REQUEST['parent'] == 2){
    if (isset($modx->controller)) {
        $modx->controller->setProperty('template', 5);
    } 
}