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

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

С нами с 01 июля 2013; Место в рейтинге пользователей: #27
Максим Кузнецов
15 мая 2018, 16:25
+2
На мой взгляд, плагин тут нецесообразен, так как, во-первых, увеличит время сохранения тикета, а во-вторых его относительно-универсальная реализация (в случае, если нужен точечный контроль формы, родителей и тд) будет куда более громоздкой, чем тоже самое, но на js:

1. Добавляем в параметры допустимых полей сниппета ticketForm необходимое тв-поле (tvname1)

2. Добавляем внутри формы создания/обновления мультиселектор:
<select multiple>
    <option>1</option>
    <option>2</option>
    <option>3</option>
</select>

2. Добавляем для тега select атрибут data-real, со значением, равным названию нашего тв-поля и произвольный класс (пусть будет bimbo-input, от слова «пустышка»):
select data-real="tvname1" class="bimbo-input"

3. После тега select (или в любом другом месте внутри тега form) добавляем настоящий инпут, хранящий значение тв-поля:
//Для формы создания
<input type="hidden" name="tvname1" id="ticket-tvname1" class="bimbo-real" value="" />

//Для формы обновления
<input type="hidden" name="tvname1" id="ticket-tvname1" class="bimbo-real" value="[[+tvname1]]" />

4. В js добавляем событие, переносящие заполненные значения от селектора-пустышки в настоящий инпут при изменении первого:
$(document).on('change', '.bimbo-input', function(e) {
	$('input[name="' + $(this).attr("data-real") + '"]').val($(this).val());
});

5. В тот же js добавляем событие, переносящие реальное значение из скрытого инпута в пустышку при загрузке страницы:
$(document).ready(function(){
	$('.bimbo-real').each(function(){
		$('.bimbo-input[data-real="' + $(this).attr("name") + '"]').val($(this).val());
	});
});

В итоге:
— решение относительно универсально, т.к. не привязано ни к ticket-ам, ни к конкретным родителям, а упирается только в наличие нужных классов и скрытых полей
— вся лишняя нагрузка происходит в процессе заполнения
— может работать не только с мультиселекторами, но и простыми селекторами или инпутами (удобно в случаях, если селектор нужно кастомизировать каким-либо js-скриптом, который в процессе видоизменяет его структуру)
Максим Кузнецов
15 мая 2018, 16:01
0
В нем не получится отработать только этот кусок, так как нужно переопределить всю функцию. Смотрите:
— когда вызывается файл main/default.js и auth/default.js, в первом определяется переменная Office и вложенные в неё общие функции, а во втором добавляется функция, работающая с авторизацией и регистрацией (и там же инициируется)
— принцип «переопределения» функции в том, что мы как бы переписываем переменную, содержащую саму функцию, и в её последующих вызовах уже будет выполняться то, что мы изменили.

И этот вариант хорош для больших файлов, где масса функций, а нам нужно изменить только одну из них. Например, в mSearch2 — таким образом мы сведем к минимуму проблемы, которые могут появиться при обновлении.

Но в файле auth/default.js всего 1 функция, которую мы и переопределяем. Поэтому в переопределении нет смысла, и вариант со своим файлом наиболее оправдан.
Максим Кузнецов
15 мая 2018, 14:32
0
Для чего?

Так как переадресация должна происходить только после успешной регистрации, вам по-прежнему нужен сегмент, отправляющий данные на проверку и получающие ответ.

Вызов ДО основого файла будет перезаписан новой функцией от Office.
Вызов ПОСЛЕ приведет к тому, что у вас будет 2 идентичных скрипта, работать из которых будет только последний.
Максим Кузнецов
15 мая 2018, 14:00
+1
Мм… вы имеете ввиду, что вызываете invokeEvent со своими переменными? Или расширяете класс msOrderHandler, заменив в нем функцию submit?

Если не секрет, какой объект resource вы получаете? И не легче ли получить его внутри плагина стандартными способами, как-то так:
$resource = $modx->getObject('modResource', array(
	//перечисление требуемых условий, например
	//'id' => 1
));
Максим Кузнецов
15 мая 2018, 13:52
0
А откуда в событии, принимающее переменные msOrder и order, у вас появился объект resource?

(к слову, в редакторе сообщений есть тег code, который красиво оформляет синтаксис кода)
Максим Кузнецов
15 мая 2018, 13:38
0
Хороший вопрос.)

Приложите содержимое вашего плагина msOnCreateOrder. Если он выдает ошибку даже при пустом содержимом, стоит подумать о переустановке дополнения minishop2 и/или обновлении версии MODX-a
Максим Кузнецов
15 мая 2018, 13:11
+1
Оба варианта правильные.
Способ с Inline-чанком избавляет от лишнего запроса к БД, способ с обычным чанком более читаем и удобнее, когда один и тот же чанк используется в нескольких вызовах. Лично я стараюсь использовать файловые чанки.
Максим Кузнецов
15 мая 2018, 07:37
+3
«В INLINE чанках нельзя указывать сниппеты, другие чанки или фильтры вывода через обычные теги, потому что так парсер MODX обработает их в первую очередь, и сниппет получит совсем не то, что вы хотели.»

Документация.
Максим Кузнецов
15 мая 2018, 07:33
0
Возможно, где-то внутри вашего плагина происходит php-ошибка, останавливающая процесс оформления заказа.

Также не лишним будет открыть консоль браузера и посмотреть, не появляется ли в ней ошибка при нажатии на кнопку «заказать».
Максим Кузнецов
15 мая 2018, 07:09
0
Возможность обойтись есть — при помощи плагина. Он вполне себе универсален, просто не дает возможности выводить в процессе редиректа какие-либо сообщения пользователю.

UPD: плюс, на мой взгляд, с точки зрения СЕО, переадресация с помощью js здесь более уместна, чем редирект. Но, возможно, сеошники меня поправят или предложат правильный код ответа (не 301/302).

Вообще, я изначально и писал вариант с переопределением функции (без необходимости замены js), но затем обратил внимание, что родной файл итак содержит, по-сути, всего 1 функцию, которую мы и заменяем.
В итоге загружаемый браузером код увеличивается в два раза без какой-либо необходимости — поэтому я и привел вариант с подменой файла.
Максим Кузнецов
14 мая 2018, 15:41
1
+2
Если речь о готовом модуле, то нет, не вижу в этом смысла.

Если подразумевалась пошаговая инструкция, то как-то так:

1. В чанке формы регистрации (по умолчанию tpl.Office.auth.login) дописать:
//Код вставляем внутри формы с id="office-auth-register"
	//Не забыв указать id нужного ресурса
	<input type="hidden" name="redirect" value="{айди_страницы_переадресации | url}" />

2. Создаем новый js-файл и копируем в него содержимое /assets/components/office/js/auth/default.js

3. Указываем путь до него в системной настройке office_auth_frontend_js

4. В новом файле заменяем данный код:
if (response.success) {
	Office.Message.success(response.message);
	if (!response.data.sms) {
		$form.resetForm();
	}
}
следующим:
if (response.success) {
	//Если всплывающее сообщение не нужно, то эту строчку можно убрать
	Office.Message.success(response.message);
	
	var redirect_page = $('#office-auth-register').find('input[name="redirect"]');

	//В данном коде редирект происходит для всех форм Office, где есть input с name="redirect"

	//Если нужно ограничить срабатывание только для формы регистрации, 
	//то в условие необходимо дописать && $form.attr('id') == 'office-auth-register'
	if (redirect_page.length > 0) {
		window.location.href = redirect_page.val();
	}
	else {
		if (!response.data.sms) {
			$form.resetForm();
		}
	}
}

Опционально, если до редиректа нужно дать время пользователю на просмотр сообщения об успешной регистрации, то строчку window.location.href можно обернуть таймаутом:
setTimeout(function(){
	window.location.href = redirect_page.val();
}, 2000);
Максим Кузнецов
14 мая 2018, 01:20
+1
Не лишним будет ограничить активацию при помощи $mode === 'new', плюс исключить контекст mgr, иначе редирект будет происходить при любом сохранении пользователя.

В рамках Office можно также переопределить функцию Office.Auth:
//...
if (response.success) {
	//...
	window.location.href = "ссылка для редиректа";
	//(можно перехватывать ссылку для редиректа из какого-нибудь input type="hidden" внутри формы для большей универсальности.
}
(функцию можно переопределить так)
Максим Кузнецов
07 мая 2018, 12:05
0
Боюсь и я вам помочь не в силах, если при возвращении к исходным параметрам работоспособность не восстановилась.
Навскидку, тут одно из: или сторонний плагин или код, влияющий на функционал, или в новых версиях UserFiles что-то изменилось, или не все восстановили.
Максим Кузнецов
07 мая 2018, 01:25
0
Возможно, стоит попробовать указать
'parent'  => $resource->get('parent')

Дело в том, что при создании тикета, он физически формируется лишь при нажатии на кнопку «добавить», в то время как сами изображения в моем способе загружаются ДО создания ресурса, а в процессе его создания уже переназначаются новому ресурсу. Поэтому и необходим промежуточный родитель.
Максим Кузнецов
06 мая 2018, 16:38
+1
1. На кнопку «выберите файлы» в чанке сниппета ufForm навешиваете уникальный id
id="my-button"

2. Визуально скрываете эту же кнопку с помощью стилей или классов
style="display: none;"

3. На кнопку «добавить фотографию» вешаете событие, указав id из шага 1:
onclick="$('#my-button').trigger('click');"
(для примера из шага 3 требуется подключенный jQuery до кнопки «добавить фотографию»)
Максим Кузнецов
06 мая 2018, 15:43
0
Все зависит от того, что эта кнопка должна делать:
— вы можете подключить любую библиотеку всплывающих окон, засунуть во всплывающее окно вызов ufForm, а на кнопку «добавить файлы» повесить открытие этого окна
— вы можете скрыть форму ufForm с помощью css, а при нажатии на кнопку «добавить файлы» менять её отображающие классы или стили

Если вопрос был в том, где необходимо дописать html кнопки: чанки tplFormCreate/tplFormUpdate.
Максим Кузнецов
29 апреля 2018, 00:04
+5
В процессе перевода возник спорный момент (так как я не слишком хорошо знаком с голландской культурой) Василий, подскажи, пожалуйста:
> which will result in a lot of the Dutch (and Vasily & Yana) to dress in orange

— вы оделись в оранжевую одежду или нарядились апельсинами? (нужны пруфы)
Максим Кузнецов
25 апреля 2018, 02:23
+1
На мой скромный взгляд, вы подходите к задаче не с той стороны.

Если целью сайта было научиться азам программирования и верстки, то конечный продукт не будет эффективным для боевых задач. Если же вам необходим конечный продукт, реализованный своими силами, то совсем не обязательно писать все с нуля.

Разработка целого сайта подразумевает очень обширную сферу деятельности, и нет ничего зазорного в том, чтобы делегировать часть задач. Вы же не писали все используемые дополнения с нуля — поступите также и с дизайном, возьмите готовый шаблон. В процессе настройки его под себя вы все равно будете узнавать что-то новое, но в правильной дозировке, не превращая всю полученную информацию в кашу.

Что же до самого сайта, из того, что сразу бросается в глаза:
— скрипты, подключаемые с google fonts, можно склеить в один запрос (примерно так):
<link href='http://fonts.googleapis.com/css?family=East+Sea+Dokdo|Oswald|=Open+Sans+Condensed:300|Amatic+SC&subset=latin,cyrillic' rel='stylesheet' type='text/css'>
— без оглядки на небольшую эффективность тега keywords, его максимально допустимая длина — 250 символов (лучше уложиться в 150).
— иконку для сайта (favicon) можно сгенерировать детальнее для разных устройств — https://realfavicongenerator.net/
— для минимизации количества запросов, шрифты и стили лучше склеивать и минифицировать. Не углубляясь в детали, для вашего текущего уровня знаний подойдет MinifyX
— код, указанный ниже, не работает, т.к. он вызван до инициализации jQuery (вообще рекомендую при разработке почаще заглядывать в консоль браузера на наличие ошибок):
<script type="text/javascript">
$(document).ready(function()  {   
$("a[rel^='prettyPhoto']").prettyPhoto();
    });
</script>
— при помощи плагина на событие OnWebPagePrerender можно реализовать сжатие html, что позитивно оценивается поисковыми системами.
case 'OnWebPagePrerender':
	$html = $modx->resource->_output;
	$html = preg_replace('|\s+|', ' ', $html);
	$modx->resource->_output = $html;