Сорри, не видел топика… Полезный материал есть зде

Сорри, не видел топика… Полезный материал есть здесь. По поводу приведенного примера: в целом да, он работоспособный. Но не оптимальный. Здесь есть серьезная хитрость: у тебя указан вызов конкретного shopModx-ого процессора, но это не обязательно делать. Почему? Посмотрим на метод системного процессора resource/create modResourceCreateProcessor::getInstance()

public static function getInstance(modX &$modx,$className,$properties = array()) {
    $classKey = !empty($properties['class_key']) ? $properties['class_key'] : 'modDocument';
    $object = $modx->newObject($classKey);

    if (!in_array($classKey,array('modDocument','modResource',''))) {
        $className = $classKey.'CreateProcessor';
        if (!class_exists($className)) {
            $className = 'modResourceCreateProcessor';
        }
    }
    /** @var modProcessor $processor */
    $processor = new $className($modx,$properties);
    return $processor;
}

Особенно обратить внимание на:

$className = $classKey.'CreateProcessor';
        if (!class_exists($className)) {
            $className = 'modResourceCreateProcessor';
        }

То есть он на лету формирует по маске название класса-процессора для указанного class_key, и если такой объявлен, то выполняется именно этот процессор вместо системного. Итог: можно легко вызывать и системный процессор, при этом выполнится shopModx-овый в соответствии с указанным class_key. Конечный код такой:

$options = array(
    'pagetitle' => 'Пример создания',
    'template' => 3,
    'parent' => 87,
    'class_key' => 'ShopmodxResourceProduct',
    'sm_currency' => 79,
    'published' => true,
);

$response  =  $modx->runProcessor('resource/create', $options);

if($response->isError()){
    print "error";
}
print_r($response->getResponse());
print '<br />OK';

Только еще не указан sm_price.