Максим Кузнецов

Максим Кузнецов

Был в сети 04 августа 2021, 21:51
Заказы принимаю
Поддержка — в основном, только вот здесь.
Вообще, minishop2 — бесплатное дополнение, поэтому и поддержка осуществляется исключительно на энтузиазме (ну, или можете попробовать обратиться к автору дополнения).

По вашему вопросу — скорее всего, придется править ядро минишопа в отображении ext.js.
Да, пожалуй, через pdoPage — не лучшее решение.

Наверное, и джоинить такую кипу данных при большом количестве категорий — сомнительное решение.
Можно, конечно, попробовать вывести изначальную связку (категория + 5 товаров) через pdoMenu, но, думаю, лучше вызывать единый pdoResources для категорий, в чанке для каждой из которых будет отрабатывать сниппет, возвращающий 5 товаров + кнопка «смотреть далее».

Далее — писать скрип на аяксе, который будет срабатывать при нажатии на кнопку, после чего выполняя примерно следующую логику:
— смотреть айди категории и текущее количество товаров (прописать в верстке чанка id категории и data-count)
— совершать аякс запрос на php, в котором будет выполняться pdoResources с parent=id_категории и offset=data-count
— возвращать запрос, после чего:
— если результатов 0, то удалять кнопку из dom
— если не 0 — append'ить их в нужное место и менять data-count.
Допустим, у нас есть сниппет, который потенциально может иметь вид: [[!name@config? &param1=`value1` &param2=`value2`]]. Вот как его вызов можно транспонировать в код:

<?php
	//объявляем массив параметров сниппета name:
	$allParams = array();
	
	//если у сниппета есть параметры, вынесенные в системные наборы параметров c названием config:
	$configProperty = $modx->getObject('modPropertySet', array ('name' => 'config')); 
	$allParams = $configProperty->getProperties();
	
	//перечисляем обычные параметры сниппета для вызова:
	$allParams['param1'] = 'value1';
	$allParams['param2'] = 'value2';

	//запускаем сниппет name с заданным массивом параметров:
	$result = $modx->runSnippet('name', $allParams);

	//возвращаем
	return $result;

— Т.е. вы можете писать как прямые запросы к базе через pdo (об этом лучше почитать отдельно), так и запускать через php целенаправленные сниппеты и возвращать результат.
— Через jquery на событие keyup вешается функция отправки уже введенных пользователем данных при помощи ajax'a на php-скрипт (+ здесь же можно реализовать проверку того, что алгоритм начнет работать только если пользователь ввел 3 или более символов)
— Пишется пхп, который находит в базе данных или из введенного вами перечня (можно даже из файла) подходящие результаты.
— Через аякс возвращаются результаты.

Пример:
<form id="form">
	<input type="text" id="searchForm">
	<ul id="searchHelper" style="display: none;"></ul>
</form>

<script type="text/javascript">
	$('#searchForm').keyup(function(){
		if($(this).val().length>3){
			//заместо адреса можно перенаправлять на текущую страницу, при условии что на ней вызывается сниппет, перехватывающий ajax-значения
			$.get('адрес_до_пхп_файла',{'query':$(this).val()},function(data){
				data = eval('('+data+')');
				if(data.length!=undefined && data.length>0){
					$("#searchHelper").html('');
					for(i in data){
						$('#searchHelper').append('<li>'+data[i]+'</li>');
					}
					$('#searchHelper').css('display', 'block');
				}
			});
		}
	});

	$('#searchHelper > li').live('click',function(){
		$('#searchForm').val($(this).text());
		$('#form').submit();
	});

</script>
1) По пунктам:
— При регистрации через Login нужно заносить пользователя в определенную группу (Users).
— Выставить группе анонимных пользователей права Load only на все контексты, где нужно запрашивать авторизацию
— Добавить в системной настройке unauthorized_page (403 ошибка) айди страницы с формой авторизации

После чего всех неавторизованных пользователей, при запросе на закрытую страницу, будет перебрасывать на страницу авторизации.

//Примечание: для альтернативы, если не нужна переадресация, можно создать простой сниппет (допустим, getAccess) и вызывать его на каждой странице.

Сниппет getAccess:
<?php
	$user = (!empty($userId)) ? $modx->getObject('modUser', $userId) : $modx->user;

	if (is_object($user) && $modx->user->isAuthenticated('web')) {
		return $content;
	}
	else {
		return $modx->getChunk('название_чанка');
	}
— соответственно, нужно создать чанк с формой авторизации и обозначить для сниппета параметр &content, в котором будет храниться html-код.

Пример:
<html>
	<head>
		[[$meta]]
	</head>
	<body>
		[[!getAccess? &content=`
			//ваш хтмл-код
		`]]
	</body>
</html>
(как альтернатива, можно переписать строчку сниппета «return $content» на «return $modx->getChunk($content);» — в таком случае, при вызове в поле &content нужно будет указывать название чанка, который отобразится авторизованному пользователю).

Из минусов такого метода — поисковые системы проиндексируют кучу дублей одинаковых страниц с формой авторизации.

2.
modstore.pro/packages/ecommerce/payandsee — может быть, это вам поможет? В противном случае — придется настраивать свои сниппеты, завязанные на extend-полях пользователя.