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

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

С нами с 01 июля 2013; Место в рейтинге пользователей: #33
02 апреля 2016, 10:33
+1
$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);
}
02 апреля 2016, 08:47
0
У вас, видимо, включен 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);

		//вставляете в нужную область результат работы сниппета
	}
});
26 марта 2016, 23:16
+2
Уберите форму регистрации в чанке 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="название_вашего_класса/название_функции_авторизации" />
26 марта 2016, 22:05
1
0
1. Отключаете редактор «markItUp»
2. Ставите свой визуальный редактор и подключаете его к форме
3. Правите встроенные скрипты тикетсов, чтобы он корректно переваривал новый визуальный редактор

Вот таким способом, например, можно подключить Ckeditor к форме.
25 марта 2016, 14:39
+10
Поддерживаю.

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

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

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

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

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

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

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

На вашем месте я бы начал с первого.
19 марта 2016, 13:18
0
У вас здесь правильная конструкция, для чего вы хотите ее заменить?
19 марта 2016, 13:14
0
@INLINE — в тех сниппетах, где это реализовано (pdoTools, например) позволяет создавать «виртуальные чанки», т.е. писать разметку для шаблона напрямую в параметр, не создавая для этого полноценный чанк.
19 марта 2016, 12:56
0
Не пользовался getPage, но разве здесь:
&pageNavOuterTpl=`[[+prev]][[+pages]][[+next]]`
&pagePrevTpl=`<a[[+classes]][[+title]] href="[[+href]]">`
&pageNextTpl=`<a[[+classes]][[+title]] href="[[+href]]">`

не нужен @INLINE?
17 марта 2016, 12:58
+1
Если у вас 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.
17 марта 2016, 12:45
2
0
[[!pdoResources? 
	&parents=`...`
	...
	&leftJoin=`{
		"Parent":{
			"class": "modResource",
			"alias": "Parent",
			"on":"Parent.id = modResource.parent"
		}
	}`
	&sortby=`{"Parent.menuindex":"desc", "menuindex":"desc"}`
]]
17 марта 2016, 12:16
0
Это не «проблема» — вы сортируете по родителю, а родитель — это айди. На вашем скриншоте можно отследить последовательность айди и убедиться в правильности сортировки.

Если вы выводите список ресурсов напрямую из списка контейнеров-годов (без вывода самих контейнеров) то можете заджоинить pagetitle у родителей через leftjoin и сортировать уже по нему.
17 марта 2016, 11:59
0
msOrder — не умеет (у него вообще нет входящего параметра includeTVs).

Если вы хотите на странице оформления заказа также отображать и список выбранных товаров — их нужно цеплять отдельным сниппетом.
17 марта 2016, 03:00
0
github.com/modxcms/revolution/issues/12400 — похоже на это.

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

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

Ну и в чанке отправляемого письма добавляете соответствующий плейсхолдер.
17 марта 2016, 01:09
0
Смотрите журнал ошибок/консоль браузера, скорее всего туда спроецируется причина.
16 марта 2016, 15:50
0
Ошибка 500 — ошибка на стороне сервера. Смотрите его логи (они обычно видны в панелях управления хостингом и/или складируются в папку аля logs на ftp).

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