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

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

Был в сети 04 августа 2021, 21:51
Заказы принимаю
$res = "[[!TicketForm? &requiredFields=`longtitle,model,introtext` &allowedFields=`longtitle,fullname,model,introtext,avtor,video,yaobzor` &redirectUnpublished=`63` &parents=`$action1` &tplFormCreate=`tpl.Tickets.form.create1` ]]";
— это определенно лучше переписать:

$params = array();
$params['requiredFields'] = 'longtitle,model,introtext';
$params['parents'] = $action1;
//...

$res = $modx->runSnippet('TicketForm', $params);

if (!empty($res)) {
	die($res);
}
У вас, видимо, включен fenom? Тогда скорее всего, причина в этом.

Для решения вы можете вынести код сниппета в отдельный файл (ajax/name.php):

<?php
	if ($_SERVER['HTTP_X_REQUESTED_WITH'] != 'XMLHttpRequest' || empty($_POST['action'])) {
		return;
	}

	define('MODX_API_MODE', true);

	require '/путь_до_index.php';
	
	// Запускает нужные службы MODX
	$modx->getService('error','error.modError');
	$modx->setLogLevel(modX::LOG_LEVEL_ERROR);
	$modx->setLogTarget(XPDO_CLI_MODE ? 'ECHO' : 'HTML');


	//ваш код сниппета который, в итоге, формирует $result


	if (!empty($result)) {
		die(json_encode($result));
	}

И при помощи jQuery на срабатывания нужного события запрашивать/возвращать результат:
$.ajax({
	type: "POST",
	url: 'ajax/name.php',
	data: {отправляемые данные},
					
	success: function(response) {
		var data = eval(response);

		//вставляете в нужную область результат работы сниппета
	}
});
Уберите форму регистрации в чанке tpl.Office.auth.login (или в чанке, определенном в сниппете) — в таком случае пользователю просто неоткуда будет регистрироваться через Office.

UPD:
Если совсем принципиально выпилить весь функционал регистрации, то можете заодно удалить соответствующие функции в:

system_heart/components/office/controllers/auth.class.php

Но лучше в таком случае написать свой контроллер, продублировать в нем методы авторизации из вышеописанного контроллера и вызывать сниппет следующим способом:
[[!Office? &action=`имя_вашего_контроллера`]]

+ в чанке формы авторизации нужно также заменить:
<input type="hidden" name="action" value="auth/formLogin" />
на:
<input type="hidden" name="action" value="название_вашего_класса/название_функции_авторизации" />
Поддерживаю.

Весь вопрос на мой взгляд сводится к тому, что весомее — узкоспециализированное или глобальное дополнение. Ну и % повтора функционала одного от другого.

Не совсем понятна позиция Сергея (не та часть, где говорится о копировании готового функционала с незначительными косметическими изменениями), т.к. код, как я понял, не пересекается — т.е. все сводится к позиции «я придумал выводить онлайн-пользователей первым».

С тем же успехом можно заблокировать функционал загрузки аватары пользователя с фронтэнда, т.к. это уже есть в Office (опять же, вопрос в долях, но все же).

+ позиция ModStore воспринимается потенциально-уязвимой, т.к. в рамках их правил можно зарегистрировать дополнение с большой зоной охвата (modFrontendTools) с ценой под 9к и засовывать туда вообще все подряд, блокируя доступ точечным дополнениям.
Если данные возвращаются корректные, но никуда не вставляются, то скорее всего проблема в том, что скрипт не находит соответствующие контейнеры, по которым производит .append(). Т.е. проверяйте соответствие структуре:
<div id="pdopage">
	[[!+page.nav]]
	<div class="rows">
		[[!pdoPage?
			...
			&ajaxMode=`button`
		]]
	</div>
</div>
Честно говоря, понятнее не стало..)

Ну смотрите: у вас сейчас это условие ограничивает выборку по «скидочным товарам», у которых введена старая цена.

Если вам просто не нужно это условие — удалить/сохранить (вполне очевидно, хех).

Если вам нужно это условие, но реализованное другим способом, то модификаторами MODX'a или чем-то сродни этому обойтись не получится. В этом случае нужно или искать причину, почему эта строчка не срабатывает (смотреть журнал ошибок) или написать свой сниппет для схожей выборки.

На вашем месте я бы начал с первого.
Если у вас 1 тег в гет-параметре, то:
[[!pdoPage? &parents=`0`
	...
	&includeTVs=`tags`
	&where=`{"tags:LIKE":"%[[#GET.tag]]%"}`
	//tags заменить на название своего тв
]]

Ну или тоже самое на чистом pdo, если помимо списка id не нужны примеси:
$tag = $modx->sanitizeString($_GET['tag']);

if (empty($tag)) {
	return 'Не выбран ни один тег.'
}


$q = $modx->newQuery('modResource');
//возможно, потребуется дополнительно обернуть в "%" . $tag . "%" 
$q->where(array('tags:LIKE' => $tag));
$q->select('`modResource`.`id`');
if ($q->prepare() && $q->stmt->execute()) {
	$ids = $q->stmt->fetchAll(PDO::FETCH_COLUMN);
	
	return $ids;
}
else {
	return 'Подходящих результатов не найдено.';
}

В противном случае нужно дробить get-параметр по разделителю и циклом добавлять условия OR.
Это не «проблема» — вы сортируете по родителю, а родитель — это айди. На вашем скриншоте можно отследить последовательность айди и убедиться в правильности сортировки.

Если вы выводите список ресурсов напрямую из списка контейнеров-годов (без вывода самих контейнеров) то можете заджоинить pagetitle у родителей через leftjoin и сортировать уже по нему.
github.com/modxcms/revolution/issues/12400 — похоже на это.

Если у вас хром, можете дополнительно открыть консоль на закладке Network, после чего перейти на страницу управления пакетами. В network'e выберите элемент, который возвращает ошибку и в появившейся формочке перейдите на закладку «response» — тогда получится узнать подробнее об ошибке.

Возможно, проблема связана с работой Xampp.
— Создаете hidden-инпут или textarea с «display: none;» внутри формы отправки сообщения менеджеру.
— При нажатии на кнопку отправления через jQuery циклом забиваете в свежесозданное поле все товары.

Ну и в чанке отправляемого письма добавляете соответствующий плейсхолдер.
Ошибка 500 — ошибка на стороне сервера. Смотрите его логи (они обычно видны в панелях управления хостингом и/или складируются в папку аля logs на ftp).

Конкретно по 500 — вариантов причин слишком много, чтобы угадать наверняка..)