Юрий Фомин

Юрий Фомин

С нами с 08 апреля 2014; Место в рейтинге пользователей: #74
Юрий Фомин
30 января 2017, 16:47
0
у меня не было задачи чтобы с полями ресурсов-дублей велась работа. туда вообще бы никогда бы и не заглядывали. Но ваше решение интересно… надо будет влить в плагин.
И уже далее вы правы на счет вывода синпета в шаблон. Но это уже за гранью того что должен был реализовать. Вам огромное спасибо, что помогли.
Юрий Фомин
30 января 2017, 16:23
0
не вижу в этом смысла…
во первых плагин должен выполнить дополнительные манипуляции, что увеличивает время работы (а контекстов у нас уйма).
во вторых зачем забивать в базу дублями контента, который может быть довольно обьемный.
Юрий Фомин
30 января 2017, 16:18
0
про «открытие страницы» все просто:
оригинал — joxi.ru/4AkOW64upM6nAq
дубль — joxi.ru/1A598YPcaKezAE

про ваш плагин, я вобщето еще был бы рад подучить то что вы тут написали. маловато знаний у меня, только учусь. если объясните что и как, отвечу.
Юрий Фомин
30 января 2017, 16:05
0
в том то и дело что в этом плагине он ничего не должен делать, а то он просто подставит весь контент в ресус-дубь. чего и хотелось избежать.
то есть код
[[!OriginalFields?&id=`'.$id.'`&field=`content`]]
должен сработать не в момент работы плагина по редактированию ресурса, а в момент открытия страницы. поэтому от и вынесен в отдельный снипет. в противном случае можно было бы просто указать:
$response->set('content', $resource->get('content'));
Юрий Фомин
30 января 2017, 15:56
+2
Для бабела нужна привязка ресурс-ресурс для перелинковки. В моей задаче не должно было быть действий от заказчика вроде «создать перевод ресурса 325», то есть ничего ручками кроме тех преславутых переменных в контенте и по сайту
для простого мультиязычника бабел вполне хорошая весч.
Юрий Фомин
30 января 2017, 15:54
0
По поводу текста контента, весь фокус в том чтобы не вставлять весь контент в ресурсы контекстов-дублей. Представь что у оригинального контекста статься на 5000 знаков и это все помнож на количество контекстов-дублей (к примеру 80) иного 400000 знаков в базе зачем они там? не лучше ли оставить 5000 у ресурса оригинального контекста, а в поле контекста ресурсов-дублей поставить вызов снипета который и будет вытягивать контент только оригинального ресурса. надеюсь понятно )).
По поводу
$id = $id;
$field = $field;
лучше у Копирфильда спросить я и сам пока разбираюсь. Вобще тут должны подтягиваться настройки снипета для подтягивания контента из ресурсов оригинального контекста (пункт 5). к примеру [[originalFields?&id=`[[*id]]`&field=`content`]]. Я учусь и буду только рад если кто подскажет как это правильно подтянуть в самом снипете.
Юрий Фомин
27 января 2017, 18:56
3
+2
Таки дописал велосипед про автоматизацию создания/удаления и редактирования ресурсов в контекстах-дублях.

<?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();
}
Юрий Фомин
25 января 2017, 14:40
0
а что за событие сработает по дублям при обновлении оригинала? случаем не OnDocFormRender?
Юрий Фомин
25 января 2017, 14:21
0
спасибо! работает, но только он удаляет ресурсы в других контекстах сразу без переноса в конзину, а что для этого механизма надо подскажите пожалуйста?
Юрий Фомин
25 января 2017, 13:29
0
А вот с удалением не особо получается, помогите пожалуйста кто может советом

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();
    }
}
Юрий Фомин
25 января 2017, 13:05
+1
Итак… (барабанная дробь) представляю вашему вниманию очередной велосипед!
буду премного благодарен если кто то из сожаления или непомерно бОльших знаний поправит это творение мученика науки. Но во всяком случае плагин работает дублируя ресурсы на остальные контенты кроме 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();
}
Юрий Фомин
24 января 2017, 23:06
0
Сергей вы оказались правы по поводу цикла. Притом создание пошло во втором контексте по счету, до третьего контекста он не добрался, вырубило его. буду копать в сторону newObject.
Если можете помогите с newObject советом пожалуйста.
Юрий Фомин
24 января 2017, 22:55
0
прошу прощения мой недогляд
Юрий Фомин
24 января 2017, 22:45
0
плагин автоматом выключает… в общем со снипетами проще ))
Юрий Фомин
24 января 2017, 22:32
0
тут странность нарисовалась… один и тот же код в плагине с событием OnDocFormSave и в снипете на странице. Но снипет работете, а вот плагин нет. В логах пусто… в чем может быть проблема???
Юрий Фомин
24 января 2017, 17:54
0
так как новые ресурсы будут создаваться/удаляться только в основном контексте то вот такой ваниантик работает на ура:
$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'
	));
}
Юрий Фомин
24 января 2017, 17:44
0
а сами контексты не нужно распарсить перед действиями в них?
Юрий Фомин
24 января 2017, 10:44
0
Может еще мыслишку подкините, как в контекстах, перебором создать страницы в нужных родителях идентично основному? (во загнул )) создаешь в основном контексте ресурс, он дублируется в остальные. заранее спасибо.
Юрий Фомин
24 января 2017, 10:33
+1
Хлопцы! огромное спасибо, и не надеялся на такую щедрость! Спасибо!!!
Юрий Фомин
16 января 2017, 21:06
0
Алексей, спасибо за подсказку. Видать когда я писал про бабел думал о переводах, а не о задаче. Нужно именно автосоздание/удаление дублей оригинальных ресурсов в других контекстах.
Даже примеры соответствующих плагинов были.
а не припомните где?
Еще раз спасибо за ответ.