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

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

С нами с 08 декабря 2012; Место в рейтинге пользователей: #1
Василий Наумкин
23 ноября 2015, 19:18
0
Да, понимаю, виноват.

В своё оправдание могу заявить, что кручусь как белка в колесе и просто об этом не подумал. Есть проблема — решил, остался ненужный коммент — убрал.

Спасибо тебе большое, что заставил меня это сделать! Держи в ответ новый раздел документации.
Василий Наумкин
23 ноября 2015, 15:37
0
Сделать поддержку default_text просили уже давно, о чём говорит самый первый комментарий.

А твой комментарий просто заставил меня уже этим заняться, раз начали писать свои решения. Код отличается, и на мой взгляд серьёзно:

Ты сначала присоединяешь все ТВ к ресурсу, а потом уже фильтруешь по id и имени. Мне кажется, что мой вариант быстрее, ибо присоединяются только нужные ТВ.

Твоё негодование мне непонятно. Никто тебя ни о чём не просил, ничего не обещал и ничего у тебя не брал. Ты сам решил проблему, поделился своим решением и подопнул меня заняться этим вопросом. Я решил его самостоятельно и включил свой вариант в основной код.

Казалось бы, все должны быть рады, но нет, нужно прибежать с разоблачениями.
Василий Наумкин
23 ноября 2015, 14:57
0
Извини, но твоего кода в mSearch2 нет, можешь сравнить:

На написание правильного присоединения таблиц, чтобы это нормально работало при больших объёмах, ушло более 3х секунд.

А твой комментарий я убрал просто потому, что он не нужен.
Василий Наумкин
22 ноября 2015, 21:01
0
Это я сегодня кое-что поменял, да не везде.

Спасибо, поправил.
Василий Наумкин
22 ноября 2015, 16:37
3
0
Парсер MODX работает в цикле до 10 раз, чтобы разобрать все плейсхолдеры. То есть:
1. Видим [[+totalMy]], значения нет
2. Видим [[!getTickets]], запускаем, он выставляет значение
3. Проверяем, что у нас осталось необработанного
4. Запускаемся еще раз и вот теперь только обрабатываем [[+totalMy]]
5. Ой, а чего это у меня так всё тормозит?

Fenom работает один раз и позволяет сохранять работу сниппетов в переменные:
{set $tickets = $_modx->runSnippet('!getTickets', [
    'parents' => 0,
    'totalVar' => 'totalMy',
])}

{$_modx->getPlaceholder('totalMy')}

{$tickets}
Василий Наумкин
22 ноября 2015, 13:41
0
Прикольно! А что будет, если количество выводимых ресурсов нечётно 4? Мне кажется, что твой div просто не закроется.

Лучше использовать отдельный чанк для 4й позиции или решить вопрос через CSS:
.cat-item {
	float: left;
}
.cat-item:nth-child(3+4) {
	clear: left;
}
Василий Наумкин
22 ноября 2015, 12:52
0
Гуру считает, что никак.

Если ошибка нашлась, значит она и раньше была, но по каким-то причинам ты её не видел.
Василий Наумкин
22 ноября 2015, 12:19
0
Владимир, ну ты сам подумай, как такое может быть? Сниппет выводит результаты, оборачивая их в чанк.

Если вдруг нарушилась разметка, наверное дело в чанке, а не в сниппете?
Василий Наумкин
22 ноября 2015, 06:55
+3
Иван, расскажи, как прошло твоё выступление?

Как народ реагировал, задавал ли вопросы? Как сам вообще, на английском докладывать?
Василий Наумкин
22 ноября 2015, 06:54
0
Сомневаюсь, что дело в pdoPage. Полный список — вот здесь.

В pdoPage за долгое время добавился всего один параметр, и тот, по умолчанию, ни на что не влияет.
Василий Наумкин
19 ноября 2015, 18:05
0
Yes, you right. Updated my code, now it works fine.
Василий Наумкин
19 ноября 2015, 10:23
10
+7
My quick example:
<?php
$tplWrapper = '@INLINE <ul>{{+output}}</ul>';
$tplYear = '@INLINE <li>{{+year}}<sup>({{+count}})</sup><ul>{{+resources}}</ul></li>';
$tplMonth = '@INLINE <li>{{+month}}<sup>({{+count}})</sup><ul>{{+resources}}</ul></li>';
$tpl = '@INLINE <li><a href="{{+uri}}">{{+pagetitle}}</a></li>';

$pdo = $modx->getService('pdoFetch');

$resources = $pdo->getCollection(
	'modResource',
	array('published' => true, 'deleted' => false),
	array('parents' => 0, 'sortby' => 'createdon', 'sortdir' => 'DESC')
);
$tree = array();
foreach ($resources as $resource) {
	$year = date('Y', $resource['createdon']);
	$month = date('m', $resource['createdon']);
	$tree[$year][$month][] = $resource;
}

$output = '';
foreach ($tree as $year => $months) {
	$tmp1 = '';
	$count = 0;
	foreach ($months as $month => $resources) {
		$tmp2 = '';
		foreach ($resources as $resource) {
			$tmp2 .= $pdo->getChunk($tpl, $resource);
			$count++;
		}
		$tmp1 .=  $pdo->getChunk($tplMonth, array(
			'month' => $month,
			'count' => count($resources),
			'resources' => $tmp2,
		));
	}
	$output .=  $pdo->getChunk($tplYear, array(
		'year' => $year,
		'count' => $count,
		'resources' => $tmp1,
	));
}

return $pdo->getChunk($tplWrapper, array('output' => $output));

Result:
Василий Наумкин
19 ноября 2015, 09:55
+2
pdoTools can`t do this out of the box. You need to write your own snippet for it.

1. Get all resources
2. Loop through them
3. Get their createdon, split to year and month, than and into such array
$resources = array(
	'2015' => array(
		'11' => array(
			0 => array(
				'id' => 15,
				'pagetitle' => 'Some title',
				...
			),
			1 => array(...)
		)
	)
)
4. Loop through this array and template it
5. Show on site
6. (optional) Cache results

Of course, you can use pdoTools methods for this snippet.
Василий Наумкин
18 ноября 2015, 06:25
0
Если не использовать сырые альфа-версии дополнений, то ничего больше ломаться не должно.
Василий Наумкин
18 ноября 2015, 06:14
+1
Дублирование результатов запроса после leftJoin
Чтобы такого не было, нужно сгруппировать запрос:
$q->groupby('msOrder.id');

Если же нужно выбрать заказ + все его товары, то лучше не использовать leftJoin и добирать эти товары отдельным запросом во время оформления вывода заказа.

Ну а если нужно будет еще и сортировать по товарам, то тогда всё же оставляешь leftJoin и убираешь дубликаты уже во время оформления.
Василий Наумкин
17 ноября 2015, 20:15
0
Не относится.

Ну, значит это косяк в miniShop2.2.