Сергей Шлоков

Сергей Шлоков

С нами с 31 января 2013; Место в рейтинге пользователей: #3
Сергей Шлоков
06 августа 2014, 14:28
0
Есть отличный компонент CMP Generator. Создаешь таблицу в MySql, запускаешь CMP Generator и получаешь готовый компонент.
Сергей Шлоков
01 августа 2014, 22:13
0
У меня 2.3.0. Не вставляется никуда. Надо обновится. Может в единичке дело.
Сергей Шлоков
01 августа 2014, 18:31
0
Еще у меня на 2.3 не работает драг-т-дроп сниппетов из дерева элементов. Было удобно.
Сергей Шлоков
01 августа 2014, 16:14
0
Еще спрошу на всякий случай, а ты свой сниппет вызываешь кэшированным? Чтоб все эти вычисления работали он должен быть некэшируемым.
Сергей Шлоков
01 августа 2014, 15:21
0
В 2.3.1 писали, что должен быть
return "";
А зачем в каждой секции if стоит return? Достаточно одного в самом конце сниппета.
Сергей Шлоков
31 июля 2014, 15:55
0
Одна голова хорошо, а 2 лучше.
P.S. А если указать с восклицательным знаком, то кэшироваться не должно
[[!+properties.hitspage.hitts]]
Сергей Шлоков
31 июля 2014, 15:42
0
Алло, Сергей!
Кто там? :)
Нафига нужен плейхолдер и плагин, если сниппет отдаёт готовое число?! Вызываешь сниппет в чанке — он выводит число и оно возвращается в оформлении pdoResources.
Я тоже не понимаю для чего ребята из Artdevue это сделали (я ссылку на руководство давал в предыдущем комменте). Я тоже считаю, что проще было бы указать
[[+properties.hitspage.hitts]]
Но автор этого топика написал, что в ajax так не работает. Хотя должен по логике.
Сергей Шлоков
31 июля 2014, 15:14
0
Так в чанке и стоит плейсхолдер {%hp-[[+id]]%}. Но он обрабатывается обрабатывается плагином на событие onWebpagePreRender. А твой плагин обрывает обработку после события OnLoadWebDocument. Вот он не не парсится.
Число просмотров пишется в таблицу ресурсов в поле properties.
П.С. Вот у ребят как описано hitspage
А вот плагин.
<?php
switch ($modx->event->name) {
    case 'OnWebPagePrerender':
        if($modx->hpCount === true) {
            // get a reference to the output
			$output = &$modx->resource->_output;
    		if (preg_match_all ("/{%hp-(.*?)%}/",$output , $hp_list)) {
			  // If the array is not empty, choose the number of comments on the resource id (column rid)
			  if (is_array($hp_list)) {
				  array_walk($hp_list[1], 'intval');
				  $hp = $modx->newQuery('modResource', array('id:IN' => $hp_list[1]));
				  $hp->select(array('modResource.id','modResource.properties'));
				  if ($hp->prepare() && $hp->stmt->execute()) {
					  $resultsHp = $hp->stmt->fetchAll(PDO::FETCH_ASSOC);
					  foreach ($resultsHp as $rHp) {
						  $objHP = json_decode($rHp['properties']);
						  if (in_array($rHp['id'],$hp_list[1])) {
							  $hp_list[1][array_search($rHp['id'],$hp_list[1])] =  intval($objHP->hitspage->hitts);
						  }
					  }
				  }
			  }
			  // Replace all your templates in the resource to the correct values
			  $output = str_replace($hp_list[0], $hp_list[1], $output);
		  }
        }
    break;
}
Сергей Шлоков
31 июля 2014, 15:01
1
0
За окном +32. Мозги плавятся. Я думал, что pdoResources в $output выводит все ресурсы, обернутые в чанк, в котором указан [[+плейсхолдер]]. Тогда у всех будет одно число или нет? Чего-то туго соображаю. :(
Сергей Шлоков
31 июля 2014, 14:49
0
HitsPage не выставляет плейсхолдеры, а выводит сразу число. Наверно, было бы удобно добивить туда такую возможность.
Я себе в шпаргалку записал твой код. Пригодится. :)
Сергей Шлоков
31 июля 2014, 13:16
0
+1.
Интересно, почему авторы HitsPage не предложили такое простое решение.
Сергей Шлоков
31 июля 2014, 13:12
0
Если ты создал новый плагин, то исходный надо отключить.
Сергей Шлоков
31 июля 2014, 13:03
0
:) Мне пока да.
Сергей Шлоков
31 июля 2014, 12:49
0
а в чем проблема?
Посмотри и скажи мне. Я не большой спец по плагинам, помогаю чем могу.
Сергей Шлоков
31 июля 2014, 12:45
0
Типа того. Работает?
Сергей Шлоков
31 июля 2014, 12:38
0
Володя, у меня встречный вопрос, а ты видел эти плагины AjaxSnippet и HitsPage?
Сергей Шлоков
31 июля 2014, 12:20
+1
Пришлось лезть в код ajaxsnippet. Компонент состоит из сниппета и плагина, повешенного на событие OnLoadWebDocument. Из чего сделал вывод, что я ошибался насчет событий при ajax. События также выполняются. Но в данном случае, при ajax запросе плагин выполняется на событие OnLoadWebDocument и обрывает дальнейшее выполнение плагинов. Поэтому, плагин HitsPage не срабатывает на следующее событие OnWebPagePrerender.
Что тут можно сделать? Отредактировать плагин (а лучше скопировать под своим именем, чтоб при обновлении не затерлось) и внести перед строчкой в плагине AjaxSnippet'а
$response = array(
	'output' => $output,
	'key' => $_REQUEST['as_action'],
	'snippet' => $scriptProperties['snippet'],
);
вот этот код
if (preg_match_all ("/{%hp-(.*?)%}/",$output , $hp_list)) {
// If the array is not empty, choose the number of comments on the resource id (column rid)
	if (is_array($hp_list)) {
		 array_walk($hp_list[1], 'intval');
		  $hp = $modx->newQuery('modResource', array('id:IN' => $hp_list[1]));
		  $hp->select(array('modResource.id','modResource.properties'));
		  if ($hp->prepare() && $hp->stmt->execute()) {
			  $resultsHp = $hp->stmt->fetchAll(PDO::FETCH_ASSOC);
			  foreach ($resultsHp as $rHp) {
				  $objHP = json_decode($rHp['properties']);
				  if (in_array($rHp['id'],$hp_list[1])) {
					  $hp_list[1][array_search($rHp['id'],$hp_list[1])] =  intval($objHP->hitspage->hitts);
				  }
			  }
		  }
	  }
	  // Replace all your templates in the resource to the correct values
	  $output = str_replace($hp_list[0], $hp_list[1], $output);
}
Решение, конечно, не очень красивое, но должно работать.
Сергей Шлоков
31 июля 2014, 11:24
0
Наверно как-то можно. Указать параметр &toPlaceholder=`MyPlaceholder`. А потом разобрать его в своем сниппете, например, HPCount (код можно взять из плагина Hitspage).
$output = $modx->getPlaceholder('MyPlaceholder');
if (preg_match_all ("/{%hp-(.*?)%}/",$output , $hp_list)) {
// If the array is not empty, choose the number of comments on the resource id (column rid)
	if (is_array($hp_list)) {
		 array_walk($hp_list[1], 'intval');
		  $hp = $modx->newQuery('modResource', array('id:IN' => $hp_list[1]));
		  $hp->select(array('modResource.id','modResource.properties'));
		  if ($hp->prepare() && $hp->stmt->execute()) {
			  $resultsHp = $hp->stmt->fetchAll(PDO::FETCH_ASSOC);
			  foreach ($resultsHp as $rHp) {
				  $objHP = json_decode($rHp['properties']);
				  if (in_array($rHp['id'],$hp_list[1])) {
					  $hp_list[1][array_search($rHp['id'],$hp_list[1])] =  intval($objHP->hitspage->hitts);
				  }
			  }
		  }
	  }
	  // Replace all your templates in the resource to the correct values
	  $output = str_replace($hp_list[0], $hp_list[1], $output);
	$modx->setPlaceholder('MyPlaceholder',$output);
}

А вызывать так
[[ajaxsnippet ....]] 
[[!HPCount ]]
[[+MyPlaceholder]]
Не проверял. Может нужно пилить. Только я не знаю, AjaxSnippet отработает плейсхолдер или нет, нужно пробовать.
Можно все сделать в одном сниппете. Если есть желание, то сам.
Сергей Шлоков
31 июля 2014, 09:43
+1
Проблема в том, что не срабатывает плагин, который повешен на событие OnWebPagePrerender. А как вы понимаете, это событие не наступает при ajax'е.
Сергей Шлоков
30 июля 2014, 13:45
0
Это как альтернатива, но не хотелось бы домашний комп засорять. В PHPStorm есть встроенный Web-server, хотелось бы настроить его.