Василий Наумкин

Василий Наумкин

С нами с 08 декабря 2012; Место в рейтинге пользователей: #1
Василий Наумкин
03 декабря 2015, 19:24
0
Ну создай тестовый сайт и покажи нам эту проблему воочию — разберёмся.
Василий Наумкин
03 декабря 2015, 18:55
0
В чем именно тут ошибка использования? для $_modx нет getObject?
Именно.

Может, прочитаешь уже документацию, а?
Василий Наумкин
03 декабря 2015, 18:45
0
Да как обычно, всё работает только у меня и больше нигде.

Между {$modx} и {$_modx} есть очень серьёзная разница, и если ты пытаешься использовать вторую переменную как первую, то и будет fatal error.
Василий Наумкин
02 декабря 2015, 16:29
0
Ну, у меня проблем нет. В админке используются нормальные ТВ, при сохранении в ресурс они преобразовываются в значения ресурса, а дальше в выборках участвуют только поля ресурса.

Везде всё хорошо =)
Василий Наумкин
02 декабря 2015, 16:21
0
Да, новый вариант вот такой:
$scriptProperties['where'] = '["
	(Ticket.parent IN ('.$parents.') OR Ticket.show_on_start = 1)
	AND Ticket.hide_on_start = 0 
	AND Ticket.ticket_rating > -2
"]';
Собственно, именно поэтому я и предпочитаю не использовать ТВ вообще. И теперь это вполне возможно, даже без miniShop2.
Василий Наумкин
02 декабря 2015, 16:13
0
Ну там монструозненько было, с having и 3500 тикетов. Если интересно, вот старый страшный код:
$scriptProperties['leftJoin'] = json_encode(array(
	'Votes' => array('class' => 'TicketVote', 'on' => 'Votes.id = Ticket.id AND Votes.class = \'Ticket\''),
	'TVshow' => array('class' => 'modTemplateVarResource', 'on' => 'TVshow.contentid = Ticket.id AND TVshow.tmplvarid = 7'),
	'TVhide' => array('class' => 'modTemplateVarResource', 'on' => 'TVhide.contentid = Ticket.id AND TVhide.tmplvarid = 8'),
));
$scriptProperties['select'] = json_encode(array(
	'Votes' => 'SUM(Votes.value) as rating',
	'TVshow' => 'TVshow.value as show',
	'TVhide' => 'TVhide.value as hide',
));
$scriptProperties['having'] = '["rating > -2 OR rating IS NULL"]';
$scriptProperties['where'] = '["(Ticket.parent IN ('.$parents.') OR TVshow.value IS NOT NULL) AND TVhide.value IS NULL"]';
Василий Наумкин
02 декабря 2015, 15:57
3
+2
Прикольно, именно так уже какое-то время и фильтруются новости на главной modx.pro. Там есть 2 ТВ параметра: выводить на главной, или скрывать на главной.

При работе с ТВ запрос с фильтрацией по этим 2м ТВ выходил под 0.5 сек, сейчас — 0.06 сек. Мой плагин выглядит вот так:
<?php
switch ($modx->event->name) {
	
	case 'OnMODXInit':
		$modx->loadClass('modResource');
		$modx->map['modResource']['fields']['show_on_start'] =
		$modx->map['modResource']['fields']['hide_on_start'] = 
		$modx->map['modResource']['fields']['ticket_rating'] = 0;
		$modx->map['modResource']['fieldMeta']['show_on_start'] =
		$modx->map['modResource']['fieldMeta']['hide_on_start'] = array(
			'dbtype' => 'tinyint',
			'precision' => 1,
			'attributes' => 'unsigned',
			'phptype' => 'boolean',
			'null' => true,
			'default' => 0,
		);
		$modx->map['modResource']['fieldMeta']['ticket_rating'] = array(
			'dbtype' => 'int',
			'precision' => 10,
			'attributes' => '',
			'phptype' => 'int',
			'null' => true,
			'default' => 0,
		);
		break;
		
		case 'OnBeforeDocFormSave':
			$resource->set('show_on_start', !empty($resource->get('tv7')));
			$resource->set('hide_on_start', !empty($resource->get('tv8')));
			break;
		
		case 'OnTicketVote':
			if ($object->class == 'Ticket') {
				if ($ticket = $modx->getObject('Ticket', $object->id)) {
					$properties = $ticket->getProperties('tickets');
					$rating = !empty($properties['rating'])
						? $properties['rating']
						: 0;
					$ticket->set('ticket_rating', $rating + $object->value);
					$ticket->save();
				}
			}
			break;
}
Ка видите, там еще и сортировка по рейтингу тикетов есть — дарю! OnTicketVote был добавлен в последней версии Tickets.
Василий Наумкин
02 декабря 2015, 08:51
0
даже если эта страница не относится к miniShop2
Если на этой странице вызывается сниппет, инициализирующий miniShop2 — то она уже к нему относится.

Сами по себе скрипты и стили не вставляются, их кто-то вставляет.
Василий Наумкин
01 декабря 2015, 06:57
0
Параметр &linkTTL у сниппета OfficeAuth, в секундах.

По умолчанию как раз 10 минут, проверил.
Василий Наумкин
01 декабря 2015, 06:44
0
В последних версиях Office, если пытаться зайти неактивированным юзером, то отправляется повторная ссылка на активацию. Но не чаще чем раз в 30 минут.

Как у других дополнений — не знаю.
Василий Наумкин
30 ноября 2015, 15:05
0
1. pdoPage не принимает массивы, он вызывает сниппет, которому передаёт offset и limit.
2. Сниппет делает запрос в БД. По умолчанию это pdoResources, который использует ровно те же методы, что и метод $_modx->getResources().
3. Результат оформляется в чанки тем же pdoResources, который использует Fenom.
4. Вывод на страницу.

Скажи пожалуйста, зачем пытаться сделать всё наоборот? Просто потому, что заняться нечем?
Василий Наумкин
30 ноября 2015, 14:54
0
Сниппеты MODX могут возвращать исключительно строки
Не нужно вешать на шаблонизатор вообще всё, что только в голову приходит.

Он для оформления, а не для работы с БД.
Василий Наумкин
30 ноября 2015, 14:48
0
Учитывая, что у Fenom есть доступ к GET — не вижу проблем.

Только pdoPage это всё равно сделает лучше.
Василий Наумкин
30 ноября 2015, 14:40
3
+1
Сниппеты MODX могут возвращать исключительно строки, так уже повелось. $modx->fromJSON не нужен, Fenom умеет сам это делать:
{set $result = json_decode($_modx->runSnippet('snippet'), 1)}

Можно еще вот так:
{var $resources = $_modx->getResources(
    ['published' => 1, 'deleted' => 0],
    ['sortby' => 'id', 'sortdir' => 'ASC', 'limit' => 50]
)}
{foreach $resources as $resource}
    {$_modx->getChunk('@INLINE <p>{$id} {$pagetitle}</p>', $resource)}
{/foreach}
Но это только для ресурсов.
Василий Наумкин
30 ноября 2015, 12:04
+2
Конечно, предусмотрено, именно поэтому я и даю ссылку на другое дополнение.