Я делаю викторину, используя Webform. Я хотел бы использовать многозначный список выбора для одного из вопросов и хочу оценить пользователя по любой комбинации выбранных правильных ответов.
Используя в качестве примера милые котята по умолчанию элемента Image Select веб-формы, для значений select:
- котенок_1
- котенок_2
- котенок_3
- котенок_4
Я хотел бы иметь возможность сказать, что конкретная комбинация вариантов выбора является правильным ответом. Скажите котенок_1 и котенок_3, когда они выбраны, должен отображаться элемент с надписью «Правильный ответ!».
Из того, что я вижу об условиях, их нельзя применять к нескольким значениям. Я мог бы создать параметр «шаблон», но это сообщит мне только о том, выбраны ли котенок_1, котенок_3 или оба, а не если они оба выбраны.
Если это невозможно без пользовательского кода, можно ли его добавить через плагин и т. д., я тоже не могу понять.
Я хотел продемонстрировать это кому-то, поэтому я изменил модуль, чтобы добавить его, diff ниже, но очень хотелось бы лучшего способа.
diff -r /tmp/webform/js/webform.states.js web/modules/contrib/webform/js/webform.states.js
115,119d114
< else if ('multi_value' в ссылке) {
< const multiValue = ссылка['multi_value'].split(',');
< const equal = (multiValue.length === value.length) && (multiValue.sort().every((v, i) => v === value[i]));
< вернуть равно;
< }
diff -r /tmp/webform/src/Element/WebformElementStates.php web/modules/contrib/webform/src/Element/WebformElementStates.php
485,486d484
< [$trigger_selector => ['value' => 'multi_value']],
< 'или',
945с943
< elseif (in_array($trigger, ['multi_value', 'шаблон', '!шаблон', 'меньше', 'less_equal', 'больше', 'больше_равно', 'между', '!между'])) {
---
> elseif (in_array($trigger, ['шаблон', '!шаблон', 'меньше', 'less_equal', 'больше', 'больше_равно', 'между', '!между'])) {
1105d1102
< 'multi_value' => t('Несколько значений'),
diff -r /tmp/webform/src/WebformEntityConditionsManager.php web/modules/contrib/webform/src/WebformEntityConditionsManager.php
75d74
< 'multi_value' => $this->t('имеет значения'),
233с232
< if (in_array($trigger_substate, ['multi_value', 'шаблон', '!шаблон', 'меньше', 'less_equal', 'больше', 'больше_равно', 'между', '!между'])) {
---
> if (in_array($trigger_substate, ['шаблон', '!шаблон', 'меньше', 'less_equal', 'больше', 'больше_равно', 'между', '!между'])) {
diff -r /tmp/webform/src/WebformSubmissionConditionsValidator.php web/modules/contrib/webform/src/WebformSubmissionConditionsValidator.php
764c764
< if (in_array($trigger_substate, ['multi_value', 'шаблон', '!шаблон', 'меньше', 'less_equal', 'больше', 'больше_равно', 'между', '!между'])) {
---
> if (in_array($trigger_substate, ['шаблон', '!шаблон', 'меньше', 'less_equal', 'больше', 'больше_равно', 'между', '!между'])) {
775,778c775
< if ($element_plugin->hasMultipleValues($element) && $trigger === 'multi_value') {
< $result = $this->checkConditionTrigger($trigger, $trigger_value, (массив) $element_value);
< }
< elseif ($element_plugin->hasMultipleValues($element) && $trigger !== 'пусто') {
---
> if ($element_plugin->hasMultipleValues($element) && $trigger !== 'пусто') {
832,837d828
<
< case 'multi_value':
< сортировка ($ element_value);
< $multi_values = взорвать(',', $trigger_value);
<сортировка($multi_values);
< return $multi_values === $element_value;