Дмитрий

Дмитрий

С нами с 05 ноября 2018; Место в рейтинге пользователей: #363
Дмитрий
29 декабря 2019, 08:06
0
Круть!!!
Но есть вопрос.
Как сделать чтобы изображения были не 1.jpg и подобные, а например подставить название из tv/алиаса/и т.д.?

В сниппете можно динамическую генерацию url сделать.
Я скопировал сниппет, сделал url в своем сниппете какой мне нужно, но где генерируется название изображения из id и исходного расширения, я не представляю. Да и лезть и что-то менять в самих файлах компонента это неправильно…
Дмитрий
25 декабря 2019, 16:30
0
нет, это не опечатка, это я уже из рабочего кода с сайта взял часть, которая отвечает за вывод id опубликованных дочерних ресурсов контейнеров… там далее по коду нужна переменная $childIds

Если чисто для тестирования в консоли, то тогда так:
//получение массива ВСЕХ дочерних ресурсов контейнеров	
        $parentId = 100;// id ресурса, у которого ищем потомков
		$childIds= $modx->getChildIds($parentId,10,array('context' => 'web'));
		$res = array();
		$q = $modx->newQuery('modResource', array('modResource.id:IN' => $childIds, 'isfolder' => 1, 'published' => 1));
		$q->select('id');
		if ($q->prepare() && $q->stmt->execute()) {
			while ($row = $q->stmt->fetch(PDO::FETCH_ASSOC)) {
				$res[] = $row['id'];
			}
		}
		 
print '<pre>';
print_r($res);// получаем массив с id дочерних опубликованных ресурсов контейнеров всех уровней
print '</pre>';
Дмитрий
25 декабря 2019, 16:02
+1
Благодарю!
Да, так выводит контейнеры, но также и кучу(DEBUG @ /… Как от них избавиться?
Кроме того 5 SQL queries. Total time в районе 0,02 s
Если убрать кучу(DEBUG @ /..., то как одно из решений очеь даже нормальное!

В общем сделал вот так. Публикую, может кому пригодится! Делал сам, так как нигде не нашел подобного универсального решения.
Если можно как-то улучшить, то буду признателен за публикацию примера с улучшением.

Вот сам код.
//получение массива ВСЕХ дочерних ресурсов контейнеров	
        $parentId = 100;// id ресурса, у которого ищем потомков
		$childIds= $modx->getChildIds($parentId,10,array('context' => 'web'));
		$res = array();
		$q = $modx->newQuery('modResource', array('modResource.id:IN' => $childIds, 'isfolder' => 1, 'published' => 1));
		$q->select('id');
		if ($q->prepare() && $q->stmt->execute()) {
			while ($row = $q->stmt->fetch(PDO::FETCH_ASSOC)) {
				$res[] = $row['id'];
			}
		}
		$childIds = $res; // получаем массив с id дочерних опубликованных ресурсов контейнеров всех уровней
Так всего SQL queries: 1

Выводит все дочерние опубликованные ресурсы контейнеры всех уровней
Array
(
[0] => 41
[1] => 42
[2] => 43
[3] => 46
)

SQL time: 0,0001 s
SQL queries: 1
PHP time: 0,0104 s
Total time: 0,0106 s
Memory: 0 MB
Дмитрий
25 декабря 2019, 15:36
+1
$parentId = 100;
$childs = $modx->runSnippet('pdoResources',array(
    'parents' => $parentId,
    'returnIds' => 1,
    'limit' => 0
));
return $childs;
В консоли выдает вот что:
[2019-12-25 15:25:58] (DEBUG @ /home/login/domains/mydomen.ru/public_html/core/model/modx/modlexicon.class.php: 416)
Language string not found: «ASC»
[2019-12-25 15:25:58] (DEBUG @ /home/login/domains/mydomen.ru/public_html/core/model/modx/modlexicon.class.php: 416)
Language string not found: «DESC»
[2019-12-25 15:25:58] (DEBUG @ /home/login/domains/mydomen.ru/public_html/core/model/modx/modlexicon.class.php: 416)
Language string not found: «ASC»
[2019-12-25 15:25:58] (DEBUG @ /home/login/domains/mydomen.ru/public_html/core/model/modx/modlexicon.class.php: 416)
Language string not found: «DESC»
[2019-12-25 15:25:58] (DEBUG @ /home/login/domains/mydomen.ru/public_html/core/model/modx/modlexicon.class.php: 416)
Language string not found: «is equal to»
[2019-12-25 15:25:58] (DEBUG @ /home/login/domains/mydomen.ru/public_html/core/model/modx/modlexicon.class.php: 416)
Language string not found: «is not equal to»
[2019-12-25 15:25:58] (DEBUG @ /home/login/domains/mydomen.ru/public_html/core/model/modx/modlexicon.class.php: 416)
Language string not found: «less than»
[2019-12-25 15:25:58] (DEBUG @ /home/login/domains/mydomen.ru/public_html/core/model/modx/modlexicon.class.php: 416)
Language string not found: «less than or equal to»
[2019-12-25 15:25:58] (DEBUG @ /home/login/domains/mydomen.ru/public_html/core/model/modx/modlexicon.class.php: 416)
Language string not found: «greater than or equal to»
[2019-12-25 15:25:58] (DEBUG @ /home/login/domains/mydomen.ru/public_html/core/model/modx/modlexicon.class.php: 416)
Language string not found: «is empty»
[2019-12-25 15:25:58] (DEBUG @ /home/login/domains/mydomen.ru/public_html/core/model/modx/modlexicon.class.php: 416)
Language string not found: «is not empty»
[2019-12-25 15:25:58] (DEBUG @ /home/login/domains/mydomen.ru/public_html/core/model/modx/modlexicon.class.php: 416)
Language string not found: «is null»
[2019-12-25 15:25:58] (DEBUG @ /home/login/domains/mydomen.ru/public_html/core/model/modx/modlexicon.class.php: 416)
Language string not found: «is in array»
[2019-12-25 15:25:58] (DEBUG @ /home/login/domains/mydomen.ru/public_html/core/model/modx/modlexicon.class.php: 416)
Language string not found: «is between»
[2019-12-25 15:25:58] (DEBUG @ /home/login/domains/mydomen.ru/public_html/core/model/modx/modlexicon.class.php: 416)
Language string not found: «System default»
[2019-12-25 15:25:58] (DEBUG @ /home/login/domains/mydomen.ru/public_html/core/model/modx/modlexicon.class.php: 416)
Language string not found: "-1 (relative to site_url)"
[2019-12-25 15:25:58] (DEBUG @ /home/login/domains/mydomen.ru/public_html/core/model/modx/modlexicon.class.php: 416)
Language string not found: «full (absolute, prepended with site_url)»
[2019-12-25 15:25:58] (DEBUG @ /home/login/domains/mydomen.ru/public_html/core/model/modx/modlexicon.class.php: 416)
Language string not found: «abs (absolute, prepended with base_url)»
[2019-12-25 15:25:58] (DEBUG @ /home/login/domains/mydomen.ru/public_html/core/model/modx/modlexicon.class.php: 416)
Language string not found: «http (absolute, forced to http scheme)»
[2019-12-25 15:25:58] (DEBUG @ /home/login/domains/mydomen.ru/public_html/core/model/modx/modlexicon.class.php: 416)
Language string not found: «https (absolute, forced to https scheme)»
53,41,42,43,46,51,50,44

SQL time: 0,0008 s
SQL queries: 5
PHP time: 0,0184 s
Total time: 0,0192 s
Memory: 0 MB
если выключить ошибки, то выдает:
53,41,42,43,46,51,50,44
не все ресурсы, а кроме того некоторые НЕ контейнеры
Дмитрий
21 декабря 2019, 17:19
+1
Все, вопрос закрыт, Сергей Шлоков помог здесь
Дмитрий
21 декабря 2019, 15:13
0
Если в нормальном прописать
'where' => [
    'parent:=' => 0,
    'AND:hidemenu:=' => 0,
    'AND:published:=' => 1,	
    'OR:isfolder:=' => 1,
    'AND:hidemenu:=' => 0,
    'AND:published:=' => 1	
]
То 'resources' => -24 тоже работать не будет.
Дмитрий
21 декабря 2019, 15:09
0
Так это pdoMenu входящее в pdoTools, только переделано таким образом, что применяется единственный чанк, и можно забыть про 10 шаблонов (tplOuter, tplInner, tpl, tplHere, tplParentRow, tplParentRowHere, tplParentRowActive, tplInnerRow, tplInnerRowHere, tplCategoryFolder).
Очень удобно.

resources там есть.
Если убрать
'where' => [
    'parent:=' => 0,
    'AND:hidemenu:=' => 0,
    'AND:published:=' => 1,	
    'OR:isfolder:=' => 1,
    'AND:hidemenu:=' => 0,
    'AND:published:=' => 1	
]
То 'resources' => -24 работает, и ресурс 24 исключается из выборки.
Дмитрий
21 декабря 2019, 10:52
0
Я извиняюсь конечно, что сразу не указал про ресурсозатраты, думал это само собой разумеется, если дал ссылку на страницу.
А множественные вызовы — это самый первый способ, о котором, каждый немного работавший с MODX, подумал бы. Если этот способ подходил бы, я бы не задавал этот вопрос.
В любом случае, благодарю за участие и попытку помочь.

Думаю, это можно реализовать одним вызовом pdoMenuFenom, я примерно так сделал HTML карту сайта.

Просто думал есть лучший способ.
Дмитрий
21 декабря 2019, 10:35
0
Уже так пробовал, не работает.
Дмитрий
21 декабря 2019, 00:14
0
Можно примерный пример, извиняюсь за тавтологию :)
Дмитрий
21 декабря 2019, 00:12
0
Это будет ресурсозатратно — много запросов и время генерации будет большое.

Там же цифры такие:
total time: 0.2947 s
queries: 39 (0.1899 s)
memory: 4 096 kb
39 запросов всего, и это запросы всей страницы, а не только этого вывода…
Дмитрий
11 декабря 2019, 20:56
1
0
Вот такой плагин получился, может кому еще пригодится.
Обозвал его "Подружить easyComm с LastModified"

/**** Плагин: Подружить easyComm с LastModified ****/

if ($modx->event->name == 'OnEcMessageSave' || $modx->event->name == 'OnEcMessageUnpublish' || $modx->event->name == 'OnEcMessagePublish') {

	$thread = $object->getOne('Thread');

	if($thread && $resource = $thread->getOne('Resource')) {
 
		if ($object->get('published') == true && $object->get('publishedon') != null 
		|| $object->get('published') == false && $object->get('publishedon') == null && $object->get('extended')['was_published'] == 1
		|| $modx->event->name == 'OnEcMessageUnpublish' 
		|| $modx->event->name == 'OnEcMessagePublish') {			
			
			//очищаем кэш
			$resource->_contextKey = $resource->context_key;
			$cache = $modx->cacheManager->getCacheProvider($modx->getOption('cache_resource_key', null, 'resource'));
			$key = $resource->getCacheKey();
			$cache->delete($key, array('deleteTop' => true));
			$cache->delete($key);
			
				// проверка - публиковалось ли сообщение
				if ($object->get('extended')['was_published'] != 1 && $object->get('published') == true && $object->get('publishedon') != null) {
					$v = $object->get('extended');
					$v['was_published'] = 1;
					$object->set('extended', $v);
					$object->save();
				} elseif ($object->get('extended')['was_published'] == 1 && $object->get('published') == false && $object->get('publishedon') == null) {
					$v = $object->get('extended');
					$v['was_published'] = 0;
					$object->set('extended', $v);
					$object->save();	
				}				
				
				// если в компоненте LastModified включена системная настройка "Обновление родителя" то делаем обновление через процессор
				if ($modx->getOption('lastmodified.update_parent') == true) {
						$modx->runProcessor('resource/update',$resource->toArray());	
					} else { // если выключена, то просто обновляем дату последнего редактирования ресурса
						$resource->set('editedon', time());
						$resource->save(true);	
				}
		}		
	}
}

Вроде все работает как задумано. А именно:

1. Если редактировать сообщение, которое еще не публиковалось или снятое с публикации, НО при этом не публиковать его, то дата редактирования ресурса и его родителя не меняется кэш не очищается.

2. Если опубликовать/снять с публикации сообщение любым способом (из меню в списке или в модальном окне — чекбокс «Опубликовано»), а также если отредактировать и сохранить опубликованное сообщение, то меняется дата последнего редактирования ресурса и очищается кэш ресурса.

Кроме того, если в компоненте LastModified включена системная настройка «Обновление родителя», то обновляется также дата редактирования родителя и очищается его кэш. Если указанная настройка выключена, то меняется дата редактирования ресурса и очищается его кэш. С родителем ничего не происходит.

Буду благодарен, за конструктивную критику и за предложения по улучшению.

Благодарю за помощь!
Дмитрий
11 декабря 2019, 15:51
0
Ок, благодарю, я уже подумывал использовать это поле, так как там ничего нет ни в одном сообщении, кроме того здесь пишешь: «extended — не используется в текущей версии».
Правда сейчас не могу проверить, нет доступа к сайту. Дома буду проверю.

Еще вопрос. Если ты указал, что поле сообщения можно получить вот так:
$message->get('extended');

То наверное в моем коде
if($object->get('published') == true && $object->get('publishedon') != null ...

 //лучше записать так???
if($message->get('published') == true && $message->get('publishedon') != null ...
И подскажи в чем отличие? Или это одно и тоже?
Дмитрий
11 декабря 2019, 13:02
0
Что-то в таблице _ec_messages не нашел поле properties.

Или в какой-то другой таблице это поле? Как туда записать и проверять находящееся там значение? Просто ни разу не работал с таким полем…
Дмитрий
11 декабря 2019, 02:51
0
сделал вот так
if ($modx->event->name == 'OnEcMessageSave' || $modx->event->name == 'OnEcMessageUnpublish' || $modx->event->name == 'OnEcMessagePublish') {

	$thread = $object->getOne('Thread');

	if($thread && $resource = $thread->getOne('Resource')) {

		if ($object->get('published') == true && $object->get('publishedon') != null || $modx->event->name == 'OnEcMessageUnpublish' || $modx->event->name == 'OnEcMessagePublish') {
			//очищаем кэш
			$resource->_contextKey = $resource->context_key;
			$cache = $modx->cacheManager->getCacheProvider($modx->getOption('cache_resource_key', null, 'resource'));
			$key = $resource->getCacheKey();
			$cache->delete($key, array('deleteTop' => true));
			$cache->delete($key);

				// если в компоненте LastModified включена системная настройка "Обновление родителя" то делаем обновление через процессор
			if ($modx->getOption('lastmodified.update_parent') == true) {
					$modx->runProcessor('resource/update',$resource->toArray());	
				} else { // если выключена, то просто обновляем дату последнего редактирования ресурса
					$resource->set('editedon', time());
					$resource->save(true);	
			}
		}		
	}
}

Но опять одно НО!

При редактировании ресурса, если поставить галочку «Опубликован» и сохранить, то проверку делаю так
if($object->get('published') == true && $object->get('publishedon') != null) {...}

Однако при редактировании сообщения, если СНЯТЬ галочку с «Опубликован» и сохранить, то обнуляются значения полей 'published' и 'publishedon', поэтому не знаю за что зацепиться, чтобы сделать проверку. Других подходящих полей в таблице _ec_messages нет. Например, типа поле со значением что ресурс ранее уже публиковался, но снят с публикации.

Может что-то упускаю?
Дмитрий
10 декабря 2019, 22:17
0
Немного упустил такой момент. Обновление срабатывает даже тогда, когда сообщение не опубликовано.

В связи с этим вопрос. Как получить значение published сообщения, чтобы сделать проверку: если сообщение опубликовано или в неопубликованном сообщении установлен флажок в чекбокс «Опубликовано:», то только в этом случае обновлять ресурс.
В общем как сделать такую проверку?
Дмитрий
10 декабря 2019, 20:53
0
Почему-то не очищается кэш ни так
$resource->clearCache();
ни так
$resource->save(true);  // не затирается старый кэш новым.

Еще дело в том, что в компоненте LastModified есть системная настройка lastmodified.update_parent
«Обновление родителя», поэтому при включенной этой настройке нужно обновлять ресурс через «тяжелый процессор», чтобы обновился родитель, а если выключена то просто менять дату последнего редактирования ресурса.

Поэтому сделал так, вроде все работает…
if ($modx->event->name == 'OnEcMessageSave') {

	$thread = $object->getOne('Thread');

	if($thread && $resource = $thread->getOne('Resource')) {

	//очищаем кэш
	$resource->_contextKey = $resource->context_key;
	$cache = $modx->cacheManager->getCacheProvider($modx->getOption('cache_resource_key', null, 'resource'));
	$key = $resource->getCacheKey();
	$cache->delete($key, array('deleteTop' => true));
	$cache->delete($key);

		// если в компоненте LastModified включена системная настройка "Обновление родителя" то делаем обновление через процессор
		if ($modx->getOption('lastmodified.update_parent') == true){
			$modx->runProcessor('resource/update',$resource->toArray());	
		} else { // если выключена, то просто обновляем дату последнего редактирования ресурса
			$resource->set('editedon', time());
			$resource->save(true);	
		}
	}
}

Благодарю всех за помощь!
Дмитрий
10 декабря 2019, 09:53
0
то есть так
$thread = $object->getOne('Thread');
if($thread) {
    $resource = $thread->getOne('Resource');
}
if($resource) {
    $resource->set('editedon', time());
    $resource->save();
    $resource->clearCache();
}