Список всех контекстов
Как можно получить список всех контекстов в снипете/плагине? Буду рад ссылкам, подсказкам и прочим добрым словам ))
Комментарии: 25
Как-то так:
<?php
$contexts = $modx->getCollection('modContext', array('key:NOT IN' => array('mgr')));
foreach($contexts as $cx) {
if($cx->prepare()) {
echo $cx->key.', ';
}
}
$contexts = $modx->getCollection('modContext', array('key:!=' => 'mgr'));
foreach($contexts as $context) {
echo $context->key;
}
Кто короче :)
collection('modContext')->each(function($context){echo $context['key'];});
Хлопцы! огромное спасибо, и не надеялся на такую щедрость! Спасибо!!!
Может еще мыслишку подкините, как в контекстах, перебором создать страницы в нужных родителях идентично основному? (во загнул )) создаешь в основном контексте ресурс, он дублируется в остальные. заранее спасибо.
Примерно так в плагине, но это решение увеличит время создания основной страницы:
if ($modx->event->name == 'OnDocFormSave' && $mode == 'new') {
$contexts = $modx->getCollection('modContext', array('key:!=' => 'mgr'));
if ($curr_ctx_key = array_search($resource->get('context'), $contexts)) {
unset($contexts[$curr_ctx_key]);
}
foreach ($contexts as $context) {
//Создаем ресурс (заполняем все основные не-тв поля)
$response = $modx->runProcessor('resource/create', array(
'template' => $resource->get('template'),
'isfolder' => $resource->get('isfolder'),
'published' => $resource->get('published'),
'pagetitle' => $resource->get('pagetitle'),
'parent' => '', //нужно додумать логику, как связывать родителей из одного контекста с другим
));
if ($response->isError()) {
return $modx->error->failure($response->getMessage());
}
else {
//Получаем id свежесозданной копии
$newId = $response->response['object']['id'];
//Заполняем тв-поля
$newPage = $modx->getObject('modResource', $newId);
$newPage->setTVValue('Поле_1', $resource->getTvValue('Поле_1'));
$newPage->setTVValue('Поле_2', $resource->getTvValue('Поле_2'));
//...
$newPage->save();
}
}
$modx->cacheManager->clearCache();
}
А не получится ли бесконечного цикла через процессор? А в процессор не нужно контекст передавать?
Упс, да, не хватает:
С циклом… мм… да, пожалуй, необходим доп. флажок (или поле со списком связующих элементов, для синхронизации при редактировании) или срабатывание плагина на создание ресурсов только из одного контекста.
'context' => $context,
С циклом… мм… да, пожалуй, необходим доп. флажок (или поле со списком связующих элементов, для синхронизации при редактировании) или срабатывание плагина на создание ресурсов только из одного контекста.
Наверно проще через newObject, тогда проблема уходит.
Сергей вы оказались правы по поводу цикла. Притом создание пошло во втором контексте по счету, до третьего контекста он не добрался, вырубило его. буду копать в сторону newObject.
Если можете помогите с newObject советом пожалуйста.
Если можете помогите с newObject советом пожалуйста.
//создаем ресурс
$newResource = $modx->newObject('modDocument');
$newResource->set('pagetitle', 'заголовок');
$newResource->set('parent', 'родитель');
$newResource->set('template', 'шаблон');
$newResource->set('published', 1);
$newResource->set('context', 'контекст');
//...
$newResource->save();
//заполняем тв-поля
$docId = $newResource->get('id');
$for_tvs = $modx->getObject('modResource', $docId);
$for_tvs->setTVValue('название_тв_поля', 'значение');
//...
$for_tvs->save();
if ($modx->event->name == 'OnDocFormSave' && $mode == 'new') {
$contexts = $modx->getCollection('modContext', array('key:NOT IN' => ['mgr','web'])); // если web основной
$data = $resource->toArray();
foreach ($contexts as $context) {
$data['context_key'] = $context->key;
$data['parent'] = 0; // Тут нужно продумать логику, иначе в корень будет сохранен.
//$data['alias'] = ...; // Алиас возможно также нужно переопределить
$newResource = $modx->newObject('modDocument', $data);
//Если есть ТВ - пример кода выше
$newResource->save();
}
}
Как-то так. Не пробовал. По идее должно работать.
а сами контексты не нужно распарсить перед действиями в них?
так как новые ресурсы будут создаваться/удаляться только в основном контексте то вот такой ваниантик работает на ура:
$contexts = $modx->getCollection('modContext', array('key:NOT IN' => array('mgr', 'web')));
foreach($contexts as $context) {
$response = $modx->runProcessor('resource/create', array(
'context_key' => $context->key,
'pagetitle' => 'new'
));
}
тут странность нарисовалась… один и тот же код в плагине с событием OnDocFormSave и в снипете на странице. Но снипет работете, а вот плагин нет. В логах пусто… в чем может быть проблема???
плагин автоматом выключает… в общем со снипетами проще ))
прошу прощения мой недогляд
Итак… (барабанная дробь) представляю вашему вниманию очередной велосипед!
буду премного благодарен если кто то из сожаления или непомерно бОльших знаний поправит это творение мученика науки. Но во всяком случае плагин работает дублируя ресурсы на остальные контенты кроме web.
буду премного благодарен если кто то из сожаления или непомерно бОльших знаний поправит это творение мученика науки. Но во всяком случае плагин работает дублируя ресурсы на остальные контенты кроме web.
if ($modx->event->name == 'OnDocFormSave' && $mode == 'new') {
$contexts = $modx->getCollection('modContext', array('key:NOT IN' => ['mgr','web']));
// получаем родителя
$parent = $resource->get('parent');
if ($parent != '0') {
$parentId = $modx->getObject('modResource', $parent);
$parentAlias = $parentId->get('alias');
}
// проходимся по контекстам
foreach ($contexts as $context) {
$newResource = $modx->newObject('modDocument');
$newResource->set('context_key', $context->key);
$newResource->set('pagetitle', $resource->get('pagetitle'));
$newResource->set('alias', $resource->get('alias'));
// пишем еще различные поля для ресурса
if ($parent != '0') {
$res = $modx->getObject('modResource', array('context_key'=>$context->key, 'alias'=>$parentAlias));
$parntId = $res->get('id');
} else {
$parntId = $parent;
}
$newResource->set('parent', $parntId);
$newResource->save();
}
$modx->cacheManager->clearCache();
}
А вот с удалением не особо получается, помогите пожалуйста кто может советом
if ($modx->event->name == 'OnDocFormDelete' && $mode == 'new') {
$contexts = $modx->getCollection('modContext', array('key:NOT IN' => ['mgr','web']));
foreach ($contexts as $context) {
$newResponse = $modx->getObject('modResource', array('context_key'=>$context->key, 'alias' => $resource->get('alias')));
$newResponse->remove();
}
}
Событие OnDocFormDelete не имеет параметра $mode.
спасибо! работает, но только он удаляет ресурсы в других контекстах сразу без переноса в конзину, а что для этого механизма надо подскажите пожалуйста?
$newResponse->set('deleted', 1);
а что за событие сработает по дублям при обновлении оригинала? случаем не OnDocFormRender?
Таки дописал велосипед про автоматизацию создания/удаления и редактирования ресурсов в контекстах-дублях.
<?php
if ($modx->event->name == 'OnDocFormSave') {
// собираем дублированные контексты (web - оригинальный контекст)
$contexts = $modx->getCollection('modContext', array('key:NOT IN' => ['mgr','web']));
// получаем родителя создаваемого ресурса
$parent = $resource->get('parent');
if ($parent != '0') {
$parentId = $modx->getObject('modResource', $parent);
$parentAlias = $parentId->get('alias');
}
$alias = $resource->get('alias');
$id = $resource->get('id');
// проходимся по контекстам
foreach ($contexts as $context) {
$response = $modx->getObject('modResource', array('context_key'=>$context->key, 'alias' => $alias));
// если ресурс уже существует то тогда просто обновляем поля (кроме контента)
if ($response) {
$response->set('pagetitle', $resource->get('pagetitle'));
$response->set('longtitle', $resource->get('longtitle'));
$response->set('description', $resource->get('description'));
$response->set('content', '[[!OriginalFields?&id=`'.$id.'`&field=`content`]]');
// ... много остальных полей
$response->set('deleted', $resource->get('deleted'));
$response->save();
} else {
// создание нового ресурса
$newResource = $modx->newObject('modDocument');
// заполняем поля ресурса
$newResource->set('context_key', $context->key);
$newResource->set('pagetitle', $resource->get('pagetitle'));
$newResource->set('longtitle', $resource->get('longtitle'));
$newResource->set('description', $resource->get('description'));
$newResource->set('content', '[[!OriginalFields?&id=`'.$id.'`&field=`content`]]');
// ... много остальных полей
$newResource->set('deleted', $resource->get('deleted'));
// поле родителя для создания дубля в нем а не в корне
if ($parent != '0') {
$res = $modx->getObject('modResource', array('context_key'=>$context->key, 'alias'=>$parentAlias));
$parntId = $res->get('id');
} else {
$parntId = $parent;
}
$newResource->set('parent', $parntId);
// сохраняем свежеиспеченый ресурс
$newResource->save();
}
}
// очищаем кеш
$modx->cacheManager->clearCache();
}
// удаление ресурсов в дублирующих контекстах
if ($modx->event->name == 'OnDocFormDelete') {
// собираем дублированные контексты (web - оригинальный контекст)
$contexts = $modx->getCollection('modContext', array('key:NOT IN' => ['mgr','web']));
// проходимся по контекстам
foreach ($contexts as $context) {
// получаем нужные (верней не нужные поэтому и удаляемые) нам ресурсы
$response = $modx->getObject('modResource', array('context_key'=>$context->key, 'alias' => $resource->get('alias')));
// помечаем как удаленные
$response->set('deleted', $resource->get('deleted'));
$response->save();
// удаляет полностью
// $response->get('id');
// $response->remove();
}
$modx->cacheManager->clearCache();
}
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.