API MODX REVOLUTION
API MODX REVOLUTION Работа с объектами modx
Содержание
- getObjectGraph
- getCollection
- getCollectionGraph
- modUser
- Log
- Create and Update
- Select
- Объекты minishop
- Другое
Вернет дополнительные поля пользователя
<?php
$user_id = 0;
if(!empty($user_id)){
if($modx->user->isAuthenticated()){
$user_id = $modx->user->id;
}
}
$extended = array();
$user_id = (int)$user_id;
if(!empty($user_id)){
if($user_id){
if($user = $modx->getObject("modUser", $user_id)){
$profile = $user->getOne('Profile');
$extended = $profile->get('extended');
}
}
}
Получить информацию о пользователе
<?php
// Вернет объект modUser
$object = $modx->getUser();
// id пользователя авторизованного
$modx->getLoginUserID();
// Добавить пользователя в группу
$groupName = 'Users';
$modx->user->joinGroup($groupName);
# проверка принадлежности к группе пользователей
if($modx->user->isAuthenticated()){
$group = array(1); // id группы
$userGroup = $modx->user->getUserGroups(); // список груп авторизированного пользователя
$group_in = array_intersect($group, $userGroup); // сравнение
}
# проверка доступа к группе (можно массив)
if ($modx->user->isMember('Менеджеры')) {
return true;
}
// Генерация нового пароля
$modx->user->generatePassword();
Получить связующие объекты
<?php
$id = array('id' => 1);
// Из одного объекта
$object = $modx->getObjectGraph('modResource', '{"Parent":{}}', $criteria);
echo '<pre>';
print_r($object->Parent->toArray()); die;
// Из многих объектов
$object = $modx->getObjectGraph('modResource', '{"TemplateVars":{}}', $criteria;
foreach ($object->TemplateVars as $tv) {
echo '<pre>';
print_r($tv->toArray()); die;
}
Получить связующие объекты в коллекции
<?php
$products = $this->modx->getCollectionGraph('msopModification', '{"Product":{"Data":{"Vendor":{}}}}');
foreach ($products as $product) {
echo '<pre>';
print_r($product->toArray()); die;
}
Сделать элементы сайта не статичными
<?php
$elements = array('modPlugin','modChunk','modSnippet');
foreach ($elements as $name) {
$c = $modx->newQuery($name);
$c->where(array('static' => 1));
if($objectList = $modx->getCollection($name, $c)){
foreach ($objectList as $object) {
$object->set('static', 0);
$object->save();
}
}
}
Выборка записей в массив
Быстрая выборка записей не обрабатывая класс объекта
<?php
// getList object
$nameObject = 'modResource';
$q = $modx->newQuery($nameObject);
$q->select($modx->getSelectColumns($nameObject,$nameObject,'', array('id','url'), true));
$q->sortby($nameObject.'.id','ASC');
if ($q->prepare() && $q->stmt->execute()){
$objectsData = $q->stmt->fetchAll(PDO::FETCH_ASSOC);
if(is_array($objectsData) && count($objectsData)>0){
foreach($objectsData as $row){
}
}
}
еще быстрее так как в памяти ничего не хранится
<?php
// getList object
// getList object
$q = $this->modx->newQuery('modResource');
$q->select('id,code');
$q->sortby('id','ASC');
if ($q->prepare() && $q->stmt->execute()){
while($row = $q->stmt->fetch(PDO::FETCH_ASSOC)){
$row = '';
}
}
msProduct
<?php
$parent = 15625;
/* @var msProduct $object*/
$c = $modx->newQuery('msProduct');
$c->where(array('parent' => $parent));
$c->limit(120);
if($objectList = $modx->getCollection('msProduct', $c)){
foreach ($objectList as $object) {
}
}
Log
Логирование сообщений
поиск ресурсов по uri в контексте
<?php
// Load main services
//$modx->setLogTarget(XPDO_CLI_MODE ? 'ECHO' : 'HTML');
//$modx->setLogLevel(modX::LOG_LEVEL_FATAL);
//$modx->setLogLevel($is_debug ? modX::LOG_LEVEL_INFO : modX::LOG_LEVEL_ERROR);
$modx->getService('error','error.modError');
$modx->error->message = null;
// Установка места куда будут записываться логи
$log_target = array(
'target'=>'FILE',
'options' => array(
'filename'=>'import.log',
'filepath' => MODX_CORE_PATH.'cache/registry/mgr/import/'
)
);
Create and Update
Создания и обновление полей объектов MODX REBOLUTION по схемам
Перегенерация schema для объектов modx таблицы
Необходимо создать файл: /core/components/ИМЯ компонента/model/build.model.php
и указать имя компонента $package
<?php
//For run from Console paste follow line
//require MODX_CORE_PATH . 'components/nameComponents/model/build.model.php';
/********************************************************/
/**
* Recursive directory remove
*
*/
function rrmdir($dir) {
if (is_dir($dir)) {
$objects = scandir($dir);
foreach ($objects as $object) {
if ($object != "." && $object != "..") {
if (filetype($dir."/".$object) == "dir") rrmdir($dir."/".$object); else unlink($dir."/".$object);
}
}
reset($objects);
rmdir($dir);
}
}
if (!isset($modx)) {
$root = dirname(dirname(dirname(dirname(dirname(__FILE__)))));
define('MODX_API_MODE', true);
require $root.'/index.php';
}
$package = 'ИМЯ КОМПОНЕНТА'; // Class name for generation
$prefix = $modx->config['table_prefix']; // table prefix
// Folders for schema and model
$modelPath = $modx->getOption('core_path').'components/'. $package . '/model/';
$schemaPath = $modelPath.'schema/';
$xml = $schemaPath.$package.'.mysql.schema.xml';
// Remove old files
rrmdir($modelPath.$package .'/mysql');
/*******************************************************/
$modx->error->message = null;
$modx->loadClass('transport.modPackageBuilder', '', false, true);
$manager = $modx->getManager();
$generator = $manager->getGenerator();
$generator->parseSchema($xml, $modelPath);
print "\nDone\n";
Второй шаг
Указываем объект для которого будут генерировать новы схемы. На всяки случай установлена проверка при условии что в таблице уже есть данные то схемы объекта не будут перезаписыватся
<?php
ini_set('display_errors', 1);
ini_set("max_execution_time", 50);
define('MODX_API_MODE', true);
require 'index.php';
$object = 'tmContracts';
$tmObjectCount = $modx->getCount($object);
if (!empty($tmObjectCount)) {
$message = 'Таблица ' . $object . ' содержит записи .' . $tmObjectCount . ' шт.';
} else {
require MODX_CORE_PATH . 'components/minishop/model/build.model.php';
// Сделать создание таблиц для активных справочников
$manager = $modx->getManager();
$generator = $manager->getGenerator();
$manager->removeObjectContainer($object);
$manager->createObjectContainer($object);
$message = 'Объект ' . $object . ' перезаписан';
}
echo $message;
Выборка полей объекта
$modx->getSelectColumns('modResource','modResource','', array('id','url'), true);
<?php
$xpdo_meta_map = array (
'modResource' =>
array (
0 => 'msCategory',
1 => 'msProduct',
),
'xPDOSimpleObject' =>
array (
0 => 'msProductData',
1 => 'msVendor',
2 => 'msProductFile',
3 => 'msDelivery',
4 => 'msPayment',
5 => 'msOrder',
6 => 'msOrderStatus',
7 => 'msOrderLog',
8 => 'msOrderAddress',
9 => 'msOrderProduct',
10 => 'msLink',
11 => 'msOption',
),
'xPDOObject' =>
array (
0 => 'msCategoryMember',
1 => 'msProductOption',
2 => 'msDeliveryMember',
3 => 'msProductLink',
4 => 'msCustomerProfile',
5 => 'msCategoryOption',
),
);
поиск ресурсов по uri в контексте
<?php
$uri = 'catalog';
$find = $modx->findResource($uri, 'web');
Вызвать процессор
<?php
$data = array(
'name' => '',
);
/* @var modProcessorResponse $response */
$response = $modx->runProcessor('product/create', $data, array(
'processors_path' => MODX_CORE_PATH.'components/minishop/processors/mgr/'
));
if ($response->isError()) {
return $response->getAllErrors();
}
return $response->response;
Заготовка на API
<?php
error_reporting(E_ALL | E_STRICT);
ini_set('display_errors', 1);
// Включаем консольный режим движка
define('MODX_API_MODE', true);
// Сам файл находится в домашней директории, а MODX по отношению к нему - в www
require '../index.php';
require_once "class.php";
$mtime= microtime();
$mtime= explode(" ", $mtime);
$mtime= $mtime[1] + $mtime[0];
$tstart= $mtime;
function usage(){
global $tstart, $modx;
$memory = round(memory_get_usage(true)/1024/1024, 4).' Mb';
print "<div>Memory: {$memory}</div>";
$totalTime= (microtime(true) - $tstart);
$totalTime= sprintf("%2.4f s", $totalTime);
if(!empty($modx)){
$queryTime= $modx->queryTime;
$queryTime= sprintf("%2.4f s", $queryTime);
$queries= isset ($modx->executedQueries) ? $modx->executedQueries : 0;
$phpTime= $totalTime - $queryTime;
$phpTime= sprintf("%2.4f s", $phpTime);
print "<div>queries: {$queries}</div>";
print "<div>queryTime: {$queryTime}</div>";
print "<div>phpTime: {$phpTime}</div>";
}
print "<div>TotalTime: {$totalTime}</div>";
}
12 июня 2017, 11:45 37018
Вы должны авторизоваться, чтобы оставлять комментарии.
Комментарии ()