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

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

Был в сети 04 августа 2021, 21:51
Заказы принимаю
Вставляет при помощи пхп в самом сниппете как-то так:
$modx->regClientStartupScript('<script type="text/javascript">здесь код</script>', true);

Не подгружает, скорее всего, потому что сниппет не инициализируется в любом контексте, отличном от web.

Причиной может служить как неправильная инициализация скрипта с вашей стороны (возможно, следует указать параметр &context), так и банальный недосмотр со стороны разработчика.

//ну и так, на всякий случай — когда работаете через разные контексты, всегда не лишним будет включить системную настройку allow_forward_across_contexts
Да, можно и так, но, имхо, это лишняя динамичная нагрузка, которую незачем воспроизводить каждый раз при отображении + в GetResources придется обязательно выставлять includeContent, который сам по себе может не использоваться.

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

Далее, создаем плагин и подключаем его на событие OnDocFormSave:
if ($modx->event->name == 'OnDocFormSave') {

		//отсеиваем ненужные шаблоны, оставляя только тот, где требуется произвести подсчет
		if ($resource->get('template') == "айди_шаблона") {

			//вырезаем все теги, затем пробелы и под конец считаем кол-во символов и заносим их в соответствующее тв-поле
			$resource->setTVValue('название_тв_с_числом_символов', strlen(str_replace(' ', '', strip_tags($resource->getContent(), '') ) ) );
			$resource->save();
		}
	}

И выводите созданное тв-поле в любом желаемом месте.
Раз вы реализуете данную задачу через ajax, имхо, лучше и загрузчик вынести в скрипты:

$(document).on('af_complete', function(event, response) {
	if (response.form.attr('id') == 'айди_формы' && response.success == true) {
		$.fileDownload('путь_до_файла').done(function () { alert('Файл успешно загружен!'); });
	}
});

Хук, соответственно, не нужен.
assets/components/tickets/js/web/default.js

,save: function(form, button)  {
			$(form).ajaxSubmit({
				data: {action: 'comment/save'}
				,url: TicketsConfig.actionUrl
				,form: form
				,button: button
				,dataType: 'json'
				,beforeSubmit: function() {
					clearInterval(window.timer);
					$('.error',form).text('');
					$(button).attr('disabled','disabled');
					return true;
				}
				,success: function(response) {
					$(button).removeAttr('disabled');
					if (response.success) {
						//тут ваш код для скрытия
						Tickets.forms.comment(false);


+ Файл скрипта лучше перенести в отдельную папку и указать его путь в системных настройках, чтобы не затерлось при обновлении.
Дополнительные табы реализуются при помощи ExtJS. (примеры)

Что же до аналога вкладки tickets'ов — можно или расширить его ядро в том месте, где определяется этот таб (не рекомендуется, т.к. при обновлении расширения все слетит) или сэмулировать его вызов внутри свежесозданного таба, по аналогии с тем, как он вызывается для tickets'ов. В этом случае минусом будет то, что при изменении данного вызова для tickets'ов в новых версиях, ваша версия закладки комментариев для прочих ресурсов станет устаревшей.
Упс. Хром не всегда возвращает алерт о новом сообщении вовремя..)

Классы состоят из тех, которые возвращает сам снипеет (допустим, pdoResources, который по-умолчанию возвращает modResource) — это «основной» класс (его еще можно переназвать при помощи параметра &class), к которому будет происходить join.
Это может быть как modResource, Data и прочее — зависит от сниппета и легко просматривается через &showLog.

Через leftJoin же мы определяем псевдоним таблицы («Image» в примере выше) и далее в коде используем его как префикс у поля, чтобы определить из какой из таблиц выбрать колонку (для selecta, метода склеивания таблиц и тд).
Что до «добавочных» классов при leftJoine — это расширяющие модели xPDO, которые получаются при помощи парсинга папки core/components/Название_класса, в которой уже хранится остальная информация (какая таблица, какие типы данных и так далее).
Тут я вам точнее не скажу, советую почитать
вот это или это.
1. Или при помощи дополнения pdoField, или при помощи экспериментального парсера, идущего в комплекте с pdoTools — тогда вот таким образом: [[#12.pagetitle]].
Только учтите, что если вызывать эти данные таким образом, а не в рамках, допустим, вашего getResources единым массивом — то это лишний запрос в базе, а если их будет много = все будет тормозить.

2. вам нужно добавить параметр &includeContent=`1`. А вообще — советую перейти на pdoResources, он быстрее будет..)