TicketForm и поля multiselect (multiple)
2 1 000
        Всем здравствуйте. 
Искал решения для заполнения полей типа multiselect htmlbook.ru/html/select/multiple через ticketForm. Есть решение для select modx.pro/help/6325/#comment-45022, но хотелось бы использовать ТВ-поля «множественный список» в админке, а на фронтенде — multiselect. Нужно это для последующей фильтрации через mFilter2. У страницы будут выбраны одно или несколько значений из списка с множественным выбором.
Если у вас есть наработки в этой области и вы готовы поделиться — я с удовольствием отблагодарю небольшим спасибо на карту или телефон.
Заранее благодарен.
    
    
                                                                                
            Искал решения для заполнения полей типа multiselect htmlbook.ru/html/select/multiple через ticketForm. Есть решение для select modx.pro/help/6325/#comment-45022, но хотелось бы использовать ТВ-поля «множественный список» в админке, а на фронтенде — multiselect. Нужно это для последующей фильтрации через mFilter2. У страницы будут выбраны одно или несколько значений из списка с множественным выбором.
Если у вас есть наработки в этой области и вы готовы поделиться — я с удовольствием отблагодарю небольшим спасибо на карту или телефон.
Заранее благодарен.
Комментарии: 3
                На мой взгляд, плагин тут нецесообразен, так как, во-первых, увеличит время сохранения тикета, а во-вторых его относительно-универсальная реализация (в случае, если нужен точечный контроль формы, родителей и тд) будет куда более громоздкой, чем тоже самое, но на js:
1. Добавляем в параметры допустимых полей сниппета ticketForm необходимое тв-поле (tvname1)
2. Добавляем внутри формы создания/обновления мультиселектор:
2. Добавляем для тега select атрибут data-real, со значением, равным названию нашего тв-поля и произвольный класс (пусть будет bimbo-input, от слова «пустышка»):
3. После тега select (или в любом другом месте внутри тега form) добавляем настоящий инпут, хранящий значение тв-поля:
4. В js добавляем событие, переносящие заполненные значения от селектора-пустышки в настоящий инпут при изменении первого:
5. В тот же js добавляем событие, переносящие реальное значение из скрытого инпута в пустышку при загрузке страницы:
В итоге:
— решение относительно универсально, т.к. не привязано ни к ticket-ам, ни к конкретным родителям, а упирается только в наличие нужных классов и скрытых полей
— вся лишняя нагрузка происходит в процессе заполнения
— может работать не только с мультиселекторами, но и простыми селекторами или инпутами (удобно в случаях, если селектор нужно кастомизировать каким-либо 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-скриптом, который в процессе видоизменяет его структуру)
                UPD: Упс, забыл добавить преобразование массива значений в пригодный вид для мультиселектора админке:
                    //измененный шаг 4
$(document).on('change', '.bimbo-input', function(e) {
	var real_form = $('input[name="' + $(this).attr("data-real") + '"]');
	if ($(this).val() instanceof Array) {
		real_form.val('');
		$.each($(this).val(), function(key, value) {
			if (real_form.val() == "") {
				real_form.val(value);
			}
			else {
				//Если разделитель отличается от дефолтного - указать актуальный
				real_form.val(real_form.val() + '||' + value);
			}
		});
	}
	else {
		real_form.val($(this).val());
	}
});            
                UPD2: Вдогонку, раз изменили шаг 4, нужно подправить и шаг 5:
                    $(document).ready(function(){
	$('.bimbo-real').each(function(){
		if ($(this).val().split("||") instanceof Array) {
			//В зависимости от указанного в админке разделителя, заместо || может быть запятая
			$('.bimbo-input[data-real="' + $(this).attr("name") + '"]').val($(this).val().split("||"));
		}
		else {
			$('.bimbo-input[data-real="' + $(this).attr("name") + '"]').val($(this).val());
		}
	});
});            
                            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.