Дмитрий

Дмитрий

С нами с 05 ноября 2018; Место в рейтинге пользователей: #363
Станислав
13 апреля 2020, 12:38
1
+1
Попробуйте так
{'!TaggerGetTags' | snippet : [ 'groups' => '1'] ?: '-'}
Дмитрий
04 февраля 2020, 19:12
1
0
Пока получилось добиться следующего.
switch ($modx->event->name) {
    case 'OnDocFormPrerender':
    $modx->controller->addHTML('
	<script type="text/javascript">	
			Ext.ComponentMgr.onAvailable("modx-panel-resource", function (e) {			
			var res = Ext.getCmp("modx-panel-resource");
			res.on("beforeSubmit", function(){			
			// Меняем зачение TV поля			
			Ext.get("tv45").dom.value = "'.$resource->getTVValue(6).'";			
			});		    
		});
    </script>');
    break;
}

Значение поля меняется сразу после сохранения без перезагрузки страницы. Вставляется сразу значение и оно видно в поле, исключение TV поле типа image, так как в image вставляется вначале в скрытое поле (как сделать чтобы в TV типа image значение сразу было видно в поле, пока не понял).

Значение вставляется, однако это значение получено из базы до изменения (то есть старое значение), поскольку событие «OnDocFormPrerender» происходит до загрузки формы редактирования ресурса в менеджере и скрипт регистрируется со старым значением.

Проблемы (задачи/вопросы).
1. Как отловить изменение значения при сохранении ресурса и передать новое значение скрипту, не могу понять. Ведь как-то, думаю, на ExtJS можно отловить это событие (изменение значения при сохранении ресурса «OnDocFormSave») и передать уже зарегистрированному скрипту???

2. Как сделать, чтобы в TV поле типа image вставляемое скриптом значение сразу становилось видимым?

А пока данный кодом можно воспользоваться (может кому пригодиться), если нужно вставить при сохранении ресурса значение из одного TV поля в другое, при этом значение сразу видно в админке и сохраняется в базе.
Олег Щавелев
02 февраля 2020, 02:05
1
+1
Да. У меня по началу то же была некая паника как работать с шаблонизацией. Ну нужно всегда распечатывать массивы и смотреть что там внутри. Выводиться так потому что разбит на два параметра результат и полный массив данных. Особенно что феном дает прикольные модификаторы.

{$_modx->resource | print}
{$_modx->resource | print_r}
{$_modx->resource | var_dump}
А если мы цикле мы можем распевать только одну итерацию

{$resource | print_r : 1}


И сразу все как на ладони. И точно такие трудозатраты минимизируются.
Дмитрий
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 включена системная настройка «Обновление родителя», то обновляется также дата редактирования родителя и очищается его кэш. Если указанная настройка выключена, то меняется дата редактирования ресурса и очищается его кэш. С родителем ничего не происходит.

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

Благодарю за помощь!
Дмитрий
14 апреля 2019, 06:18
2
0
Все дело было в одной настройки smtp, а именно вот в этой:
SMTP посылать по одному — mail_smtp_single_toНет

У меня стояло — "Да"

То есть скрывались получатели, для нераскрытия в письме email-адресов при отправке нескольким получателям.

Эта статья натолкнула на мысль отключить эту настройку.

Однако появился новый вопрос.
Плагином, который сейчас сделал, я отправляю на один адрес. Но в дальнейшем может понадобится для других целей (своим плагином или функционалом компонента) отправлять письма сразу нескольким адресатам.

Поэтому вопрос в следующем.
Как при включенной настройке (mail_smtp_single_to — Да) в плагине, в котором отправляю письма отключить ее?
Наумов Алексей
26 марта 2019, 15:16
1
0
Не совсем. OnEcMessagePublish сработает когда в админке будет выбран пункт меню «Опубликовать». Но если просто отредактировать сообщение, проставив галочку «Опубликован», то будет событие OnEcMessageSave.

Если нужно отслеживать, что поменялся список отзывов, то надо ловить все события: OnEcMessageSave, OnEcMessagePublish, OnEcMessageUnpublish, OnEcMessageDelete, OnEcMessageUndelete, OnEcMessageRemove.

плагин один, код один, события несколько. Уже в плагине смотрите, что произошло.
Получить id вроде как, если не путаюсь:
$id = $object->get('id');
Наумов Алексей
26 марта 2019, 14:43
1
0
По событиям документации нет.

Список:
// ecThread events
OnBeforeEcThreadRemove
OnEcThreadRemove
// ecMessage events
OnBeforeEcMessageSave
OnEcMessageSave
OnBeforeEcMessagePublish
OnEcMessagePublish
OnBeforeEcMessageUnpublish
OnEcMessageUnpublish
OnBeforeEcMessageDelete
OnEcMessageDelete
OnBeforeEcMessageUndelete
OnEcMessageUndelete
OnBeforeEcMessageRemove
OnEcMessageRemove

В событии как правило доступен $object (ecMessage или ecThread).
Сергей Шлоков
06 ноября 2018, 14:29
3
+2
1. Создаёте плагин с любым именем и следующим содержанием
<?php
switch ($modx->event->name) {
    case 'pdoToolsOnFenomInit':
        /** @var Fenom $fenom */
        $fenom->addModifier('lcfirst', function ($input) {
           return mb_strtolower(mb_substr($input, 0, 1)) . mb_substr($input, 1);
        });

        break;
}
2. Отмечаете событие «pdoToolsOnFenomInit» на второй вкладке.
3. Сохраняете.
4. Пользуетесь.
Володя
25 июля 2017, 09:55
1
+2
при обычном вызове он отрабатывает, а феном не понимает — вот и все.
скопируйте сниппет подключите в нем pdo и замените вызовы $modx->getChunk на аналогичные от pdo