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

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

Был в сети 04 августа 2021, 21:51
Заказы принимаю
Можно решить стандартным jevix'ом примерно так:

<?php
	if ($modx->event->name == 'OnDocFormSave') {
		$template = $resource->get('template');
		
		if ($template != 0) {
			$id = $resource->get('id');

			//В наборе параметров отключены неугодные теги аля script, iframe и прочие
			$jevixParams = $modx->getObject('modPropertySet',array('name'=>'Ticket'));
			$jevixOptions = $jevixParams->getProperties();

			//content
			if (strlen($content = $resource->getContent()) > 0) {
				$jevixOptions['input'] = $content;
				$content = $modx->runSnippet('jevix', $jevixOptions);
				$resource->setContent($content);
				
			}
			
			switch ($template) {
				//Шаблон с доп. тв, которое нужно обработать
				case 7:
					if (strlen($custom_tv = $resource->getTVValue('custom_tv')) > 0) {
						$jevixOptions['input'] = $custom_tv;
						$custom_tv = $modx->runSnippet('jevix', $jevixOptions);
						
						$resource->setTVValue('custom_tv', $custom_tv);
					}
					
				break;
				
			}
		}
	
		
		$resource->save();
	}
Попробуйте изменить событие на OnDocFormRender (для корректной отрисовки ошибки).

Урл для редиректа придется формировать самостоятельно:
$modx->sendRedirect($modx->getOption('site_url') . 'manager/?a=resource/update&id=' . $parent);

Как альтернатива — можно с минимальным расширением плагина повесить его помимо OnDocFormRender также и на OnBeforeDocFormSave (чтобы исключить возможность создания документа).
Примерно так:
<?php
	if ($modx->event->name == "OnDocFormPrerender" && $mode == "new") {
		if (!$modx->user->isMember('Administrator')) { 
			if ($parent = intval($_REQUEST['parent'])) {
				$disallow_parent_list = array(1, 2, 3);

				if (in_array($parent, $disallow_parent_list)) {
					$modx->event->output('Ресурс не может быть создан в данном разделе');
					//как вариант - можно после алерта редиректить пользователя
				}
			}
		}
	}
Как вариант — написать плагин примерно следующего содержания:
<?php
	if ($modx->event->name == "OnDocFormRender" && $mode == "new") {
		if ($parent = intval($_REQUEST['parent'])) {
		
			if (isset($modx->controller)) {
				switch ($parent) {
					case '1':
						$newTemplate = '10';
						break;
					//...
				}

				$modx->controller->setProperty('template', $newTemplate);
			}
		}
	}
Что нет ни у кого опыта?
Ну просто классический вопрос, который не стоит задавать при отсутствии ответов..)

По факту, для получения ответа на ваш вопрос требуется конкретика, а именно:
— какой именно дизайн (пример сайта, макет, реализованная верстка)
— какая логика должна выполняться на странице возврата товара
— сколько (и каких) этажей в лендинге
Логотип
— логотип мм… что? Нарисовать?
— сроки выполнения

Ну и дополнительно, но не критично:
Настройка связи комплекта товара средствами миниШопа2 без плагинов в корзине
— из любопытства: из-за какой причины нельзя использовать плагины?

Наполнение магазина 10 товаров
— звучит как-то подозрительно, когда всего 10 товаров (не импорт или еще что-то) выделяют отдельным пунктом для программиста

UPD: Пункт про «дополнение» If лучше убрать. =)
Чистый запрос, пожалуй, будет более уместным из-за отсутствия лишней передаваемой информации.

TV — Возможные значения (подойдет для одиночного и множественного списка):
@EVAL return $modx->runSnippet('name');

Код сниппета:
<?php
	$q = $modx->newQuery('modResource');
	//пример ограничения выборки
	$q->where(array(
		"parent" => "16",
		"template" => "10"
	));
	$q->sortby('pagetitle','ASC');

	$q->select(array(
		"modResource.id",
		"modResource.pagetitle",
	));

	$s = $q->prepare();
	$s->execute();

	//если тип тв - одиночный список, то можно также дописать "заглушку" без реального значения:
	//$data[] = "Выберите категорию из списка==";
	while($row = $s->fetch(PDO::FETCH_ASSOC)){
		$data[] = "{$row['pagetitle']}=={$row['pagetitle']}";
	}

	$output = implode("||", $data);
	return $output;
Мм… тогда я не совсем понимаю, в чем ваша проблема:
При редактировании Тикетс в редакторе показываются html теги

при редактировании такого нет

К слову, на этом же сайте можно посмотреть, что html-теги проявляются и при создании и при редактировании тикетов/комментариев.

Возможно, в вашей форме редактирования отваливается MarkItUp из-за сторонней ошибки javascript'a?
Дело не в самом Tickets/ms2Forms, а в визуальном редакторе, который подключается по-умолчанию: MarkItUp.
Если вы хотите визуализировать html-теги, вам необходимо отключить MarkItUp и самостоятельно подключить тот визуальный редактор, который умеет это делать.
На мой взгляд, эту задачу нужно и реализовывать «в другую сторону»:
— загружаем кучу изображений в «альбом» (ресурс)
— при нажатии на превьюшку открывать изображение в полноценном всплывающем окне
— подгружать в это окно (помимо самого изображения) комментарии TicketComments с уникальным &thread для данной картинки (не ресурса)
— расширить таблицу UserFiles, добавив в нее столбец для хранения рейтинга
— выводить рейтинг/кнопки для его изменения

Впрочем, можно попробовать реализовать и через ticketform + ufForm:
— создаете страницу «добавить фотографию»
— через TicketForm выводите в ней формы для заполнения полей ресурса (заголовок, описание)
— там же вызываете ufForm с параметром
&dropzone=`{"maxFiles":1}`
— навешиваете рейтинги/комментарии в шаблоне созданной страницы (как и для обычного ресурса)
UPD: не успел отредактировать — в передачу данных по «автору добавления / количеству изображений»:
'output' =>$modx->getChunk($tplUser, array(
	'count' => $data_value['info']['count'],
	'createdby' => $data_value['info']['createdby']
))
— нужно результат загнать в цикл по $data_value['info']['createdby'].
Не за что..)

Если не трудно — отпишитесь потом, если реализация выйдет удобной. Я схожую задачу реализовал через (не рекламы ради) связку
Tickets + UserFiles и плагин на OnDocFormSave, который при выполнении условий перепривязывал загруженные изображения на свежесозданный документ.

А ms2guploader все никак не доберусь протестировать + интересует, дружит ли он с облачной загрузкой.
Да, почему нет.

Нужно:

1. В выборку
$q->select('`msResourceFile`.`createdon`, `msResourceFile`.`id`, `msResourceFile`.`resource_id`, `modDocument`.`pagetitle`');

добавить автора изображения:
,`modDocument`.`createdby`

2. Счетчик и передаваемую информацию персонализировать для каждого автора, т.е. строка:
${'count_' . $day . '_' . $item['resource_id']}++;

$data = array(
	'pagetitle' => $item['pagetitle'],
	'count' => ${'count_' . $day . '_' . $item['resource_id']}
);

заменится на:
${'count_' . $day . '_' . $item['resource_id'] . '_' . $item['createdby']}++;

$data = array(
	'pagetitle' => $item['pagetitle'],
	'info' => array(
		'count' => ${'count_' . $day . '_' . $item['resource_id'] . '_' . $item['createdby']},
		'createdby' => $item['createdby']
	)
);

3. В цикл передачи данных в чанк:
foreach ($data as $data_key => $data_value) {
	$output .= $modx->getChunk($tplRow, array(
		'id' => $data_key,
		'pagetitle' => $data_value['pagetitle'],
		'count' => $data_value['count']
	));
}

Нужно передавать айди, заголовок и связку информации об авторе и количестве добавленных им изображений:
foreach ($data as $data_key => $data_value) {
	$output .= $modx->getChunk($tplRow, array(
		'id' => $data_key,
		'pagetitle' => $data_value['pagetitle'],
		'output' =>$modx->getChunk($tplUser, array(
			'count' => $data_value['info']['count'],
			'createdby' => $data_value['info']['createdby']
		))
	));
}
— соответственно, появится новый чанк &tplUser. Вот пример его содержания:
[[+count]] изображений от [[+createdby:userinfo=`fullname`]]

А чанк &tplRow изменится на такой:
<li>
	В альбом<b>[[+pagetitle]]</b> добавлены: [[+output]]
</li>

Вроде ничего не забыл..)
Конкретно TicketForm подключают следующие скрипты:

/assets/components/tickets/js/web/default.js
/assets/components/tickets/js/web/lib/plupload/plupload.full.min.js
/assets/components/tickets/js/web/files.js
+ формируют массив TicketsConfig.
+ (опционально) скрипты редактора MarkitUp.

Вы можете попробовать подгружать их самостоятельно и запускать их внутренние элементы инициализации через $(document).ajaxStop. Плюс формировать конфигурационный массив самостоятельно.

UPD: Но я вас заверяю — без глубоких знаний php+js оно того вообще не стоит и грозит очень серьезно переписать исходный сниппет.