У меня есть форма для создания пользовательских вопросов. Для этого пользователю необходимо ввести вопрос (например, какой у вас телефон?), А также тип поля (текст, длинный текст, флажок, меню выбора, переключатель). Если пользователь выбирает поле флажка, выбирает меню или переключатель, ему также необходимо представить доступные параметры для вопроса.
В базе данных вопросы вставляются в таблицы questions и question_options, например:
Таблица вопросов:
id question type conference_id
1 Text text 1
2 Checkbox checkbox 1
3 Radio radio_btn 1
4 select select_menu 1
5 textarea long_text 1
6 file file 1
Сводная таблица Registration_type_questions:
id registration_type_id question_id required
1 1 1 1
2 1 2 1
3 1 3 0
4 1 4 0
5 1 5 0
6 1 6 1
Параметры хранятся в таблице questions_options:
id question_id value
1 2 check1
2 2 check2
3 3 rad1
4 3 rad2
5 4 select1
6 4 select2
Затем в представлении, которое я хочу правильно отобразить в представлении registration.blade.php, входы (текст, переключатель, флажок, выбор, текстовое поле и входной файл) на основе типа, хранящегося в столбце «тип» таблицы вопросов. А также добавьте обязательный атрибут, если обязательный столбец в сводной таблице равен «1».
Когда вопрос имеет тип текста, переключателя, выбора, текстового поля или файла, он работает нормально, требуемый атрибут добавляется в поле формы.
Но он не работает должным образом с флажками, потому что в случае флажков, если вопрос относится к флажку типа и требуется вопрос, это должно означать, что пользователю необходимо ответить на этот вопрос, но не должно означать, что пользователю необходимо установить все флажки.
Проблема в том, что с помощью функции getHTMLInput () сгенерированный html для флажков требовался при каждом вводе флажка, и из-за этого пользователю необходимо проверять все флажки:
<div class = "form-group">
<label for = "participant_question">Checkbox</label>
<div class = "form-check">
<input type = "checkbox" name = "participant_question[]" value = "check1" class = "form-check-input" required = "">
<label class = "form-check-label" for = "exampleCheck1">check1</label>
</div>
<div class = "form-check">
<input type = "checkbox" name = "participant_question[]" value = "check2" class = "form-check-input" required = "">
<label class = "form-check-label" for = "exampleCheck1">check2</label>
</div>
<input type = "hidden" name = "participant_question_required[]" value = "1">
<input type = "hidden" value = "2" name = "participant_question_id[]">
</div>
Вы знаете, как решить эту проблему? Когда требуется настраиваемый вопрос, это должно означать, что вопрос является обязательным, поэтому пользователь должен установить хотя бы 1 флажок, но не должен означать, что пользователю необходимо установить все флажки.
А также знаете ли вы, как, если требуется специальный вопрос, добавить внутри каждого вопроса метку «<span class = "text-primary">*</span>»?
GetHtmlInput () в модели вопроса:
class Question extends Model
{
protected $fillable = [
'question', 'type', 'conference_id',
];
public static $typeHasOptions = [
'radio_btn',
'select_menu',
'checkbox'
];
public function registration_type()
{
return $this->belongsToMany('App\RegistrationType', 'registration_type_questions')
->withPivot('required');
}
public function options()
{
return $this->hasMany('App\QuestionOption');
}
public function hasOptions()
{
return in_array($this->type, self::$typeHasOptions);
}
public function getHtmlInput($name = "", $options = "", $required = false, $class = "", $customtype = false) {
$html = '';
$html .= $customtype == 'select_menu' ? "<select name='participant_question' class='form-control' " . ($required ? " required" : "")
. ">" : '';
if (empty($options)) {
switch ($customtype) {
case "text":
$html .= "
<input type='text' name='participant_question' class='form-control'" . ($required ? " required" : "")
. ">";
break;
case "file":
$html .= "
<input type='file' name='participant_question' class='form-control'" . ($required ? " required" : "") . ">";
break;
case "long_text":
$html .= "
<textarea name='participant_question' class='form-control' rows='3'" . ($required ? " required" : "") . ">"
. $name .
"</textarea>";
break;
}
} else {
foreach ($options as $option) {
switch ($customtype) {
case "checkbox":
$html .= "
<div class='form-check'>
<input type='checkbox' name='participant_question[]' value='" . $option->value . "' class='form-check-input'" . ($required ? " required" : "") . ">" .
' <label class = "form-check-label" for = "exampleCheck1">' . $option->value . '</label>' .
"</div>";
break;
case "radio_btn":
$html .= "
<div class='form-check'>
<input type='radio' name='participant_question[]' value='" . $option->value . "' class='form-check-input'" . ($required ? " required" : "") . ">" .
' <label class = "form-check-label" for = "exampleCheck1">' . $option->value . '</label>' .
"</div>";
break;
case "select_menu":
$html .= "<option value='" . $option->value . "'>" . $option->value . "</option>";
break;
}
}
}
$html .= $customtype == 'select_menu' ? "</select>" : '';
return $html;
}
}
Затем getHtmlInput () используется как:
@if ($allParticipants == 0)
@foreach($selectedRtype['questions'] as $customQuestion)
<div class = "form-group">
<label for = "participant_question">{{$customQuestion->question}}</label>
@if ($customQuestion->hasOptions() && in_array($customQuestion->type, ['checkbox', 'radio_btn', 'select_menu']))
{!! $customQuestion->getHtmlInput(
$customQuestion->name,
$customQuestion->options,
($customQuestion->pivot->required == '1'),
'form-control',
$customQuestion->type)
!!}
@else
{!! $customQuestion->getHtmlInput(
$customQuestion->name,
[],
($customQuestion->pivot->required == '1'),
'form-control',
$customQuestion->type)
!!}
@endif
<input type = "hidden"
name = "participant_question_required[]"
value = "{{ $customQuestion->pivot->required }}">
<input type = "hidden"
value = "{{ $customQuestion->id }}"
name = "participant_question_id[]"/>
</div>
@endforeach
@endif
Сгенерированный HTML с помощью getHTMLInput ():
<form method = "post" action = "">
<div class = "form-group">
<label for = "participant_question">Text</label>
<input type = "text" name = "participant_question" class = "form-control" required = "">
<input type = "hidden" name = "participant_question_required[]" value = "1">
<input type = "hidden" value = "1" name = "participant_question_id[]">
</div>
<div class = "form-group">
<label for = "participant_question">Checkbox</label>
<div class = "form-check">
<input type = "checkbox" name = "participant_question[]" value = "check1" class = "form-check-input" required = "">
<label class = "form-check-label" for = "exampleCheck1">check1</label>
</div>
<div class = "form-check">
<input type = "checkbox" name = "participant_question[]" value = "check2" class = "form-check-input" required = "">
<label class = "form-check-label" for = "exampleCheck1">check2</label>
</div>
<input type = "hidden" name = "participant_question_required[]" value = "1">
<input type = "hidden" value = "2" name = "participant_question_id[]">
</div>
<div class = "form-group">
<label for = "participant_question">Radio</label>
<div class = "form-check">
<input type = "radio" name = "participant_question[]" value = "rad1" class = "form-check-input">
<label class = "form-check-label" for = "exampleCheck1">rad1</label>
</div>
<div class = "form-check">
<input type = "radio" name = "participant_question[]" value = "rad2" class = "form-check-input">
<label class = "form-check-label" for = "exampleCheck1">rad2</label>
</div>
<input type = "hidden" name = "participant_question_required[]" value = "0">
<input type = "hidden" value = "3" name = "participant_question_id[]">
</div>
<div class = "form-group">
<label for = "participant_question">select</label>
<select name = "participant_question" class = "form-control">
<option value = "select1">select1</option>
<option value = "select2">select2</option>
</select>
<input type = "hidden" name = "participant_question_required[]" value = "0">
<input type = "hidden" value = "4" name = "participant_question_id[]">
</div>
<div class = "form-group">
<label for = "participant_question">textarea</label>
<textarea name = "participant_question" class = "form-control" rows = "3"></textarea>
<input type = "hidden" name = "participant_question_required[]" value = "0">
<input type = "hidden" value = "5" name = "participant_question_id[]">
</div>
<div class = "form-group">
<label for = "participant_question">file</label>
<input type = "file" name = "participant_question" class = "form-control" required = "">
<input type = "hidden" name = "participant_question_required[]" value = "1">
<input type = "hidden" value = "6" name = "participant_question_id[]">
</div>
<input type = "submit" class = "btn btn-primary" value = "Store">
</form>
Кроме того, при проверке этой формы в валидаторе HTML, таком как валидатор w3c, появляются ошибки:
Значит, поле флажка не должно быть обязательным?
@johnW, я полагаю, Джеймс говорит: «Если требуется флажок, его необходимо поставить. Так почему же пользователь должен это проверить?». Если только не установлен флажок «Я согласен / согласен», который может потребоваться.
Спасибо, но что необходимо, так это иметь группу требуемых флажков, тогда пользователь должен выбрать хотя бы один флажок в группе, потому что это обязательная группа флажков.






Это потому, что у вас есть html группы флажков внутри вашего цикла foreach:
foreach ($options as $option) {
switch ($customtype) {
case "checkbox":
$html .= "
<div class='checkbox-group' " . ($required ? " required" : "") . ">
Вам нужно подумать о том, как вы можете обойти это, возможно, используя переменную типа $checkboxesFound и установите ее в 0 в начале функции, а когда установлен флажок, увеличьте переменную, а если $checkboxesFound == 0, то повторите групповой div.
Спасибо, но я не понимаю, зачем нужно, чтобы checkboxesFound, потому что когда есть флажки, код для флажков находится в флажке «case».
Тогда вам придется переосмыслить структуру этого кода, я использовал $checkboxesFound в качестве примера, поэтому в первый раз, когда у вас есть случай флажка, переменная будет равна 0, затем увеличьте ее, чтобы в следующий раз, когда будет обнаружен флажок, она не будет равна 0 и вы не будете повторять группу флажков, извините, я использую мобильный банкомат
Спасибо, но невозможно всегда иметь одну и ту же структуру с "checkbox-group", даже если есть только 1 checkbox внутри div с классом "checkbox-group"?
Да, вы можете поместить только 1 в группу, но я немного запутался в вводе здесь, вы говорите, что хотите, чтобы ваш вывод имел 2 флажка в группе флажков? Это каждый раз или зависит от ввода? Какие значения аргументов входят в функцию?
Спасибо, я тоже не знаю, что лучше всего подходит для этого случая. Для всех входов работает нормально, если требуется настраиваемый вопрос, на входе появляется обязательный атрибут. Но в случае флажков, для вопроса типа флажок с кодом выше все флажки, связанные с этим вопросом, должны быть отмечены, потому что все поля флажка отображаются с атрибутом «обязательный». Но если вопрос относится к типу флажка и вопрос является обязательным, это должно означать, что пользователю необходимо ответить на этот вопрос, но не должно означать, что пользователю необходимо установить все флажки.
Он должен иметь возможность установить только 1 флажок, обязательно должен означать, что в группе флажков должен быть установлен хотя бы 1 флажок, не должно означать, что все флажки, связанные с флажком типа вопроса, должны быть отмечены всеми.
В HTML5 нет решения, позволяющего реализовать необходимость наличия группы флажков, поэтому с некоторыми изменениями вы можете этого добиться. Сначала на вашем контроллере вам нужно будет изменить его, чтобы добиться того же, что вы делаете с меню выбора.
// on top of your method:
$html .= $customtype == 'checkbox' ? "<div class='checkbox-group ".($required ? " required" : "")."'>" : '';
// at the bottom
$html .= $customtype == 'checkbox' ? "</div>" : '';
Тогда в вашем случае «флажок» вам нужно будет только распечатать параметры, которые будут внутри вашей «требуемой группы флажков»:
case "checkbox":
$html .= "
<div class='form-check'>
<input type='checkbox' name='participant_question[]' value='" . $option->value . "' class='form-check-input' ><label class='form-check-label' for='exampleCheck1'>" . $option->value . "</label>
</div>";
Это должно вывести следующий html:
<div class = "checkbox-group required">
<div class = "form-check">
<input type = "checkbox" name = "participant_question[]" value = "whatever" class = "form-check-input"><label class = "form-check-label" for = "exampleCheck1">whatever</label>
</div>
<div class = "form-check">
<input type = "checkbox" name = "participant_question[]" value = "whatever2" class = "form-check-input"><label class = "form-check-label" for = "exampleCheck1">whatever2</label>
</div>
</div>
Затем при отправке я не знаю, делаете ли вы это с помощью ajax или нет, но я предполагаю, что вы этого не сделаете, поэтому, если вы добавите идентификатор в свою форму -> id = "questionForm"
$('#questionForm').submit(function() {
if ($('div.checkbox-group.required div :checkbox:checked').length > 0) {
return true;//submit the form
} else {
return false; // do not submit the form
}
});
К сожалению, с помощью только html5 достичь того, что вы ищете, невозможно, какое бы решение вы ни выбрали, его, вероятно, придется делать с помощью js.
Спасибо, но если этот флажок не отображается должным образом, html похож на "<div class = " form-group "> <label for = " members_question "> Checkbox </label> <div class = " checkbox-group required "> требуется & gt; <div class = "form-check"> <input type = "checkbox" name = "members_question []" value = "check1" class = "form-check-input"> <label class = "form-check- label "for = " exampleCheck1 "> check1 </label> </div> <div class = " form-check "> <input type = " checkbox "name = " members_question [] "value = " check2 "class = " form -check-input "> <label class = " form-check-label "for = " exampleCheck1 "> check2 </label> </div> </div>
<input type = "hidden" name = "Participant_question_required []" value = "1"> <input type = "hidden" value = "2" name = "members_question_id []"> </div> ".
Это должно быть опечатка, потому что это сложно, так как я не кодировал ее в среде IDE, вы не можете проверить, где она?
Отредактировал мой пост, исправив ошибку с опечаткой, я думаю, вы могли видеть, что я всегда ставил обязательно, а затем условие, идея в том, что вам нужно делать то же самое, что и то, что вы делаете с select, а не просто бездумно копировать пасту! xP
Отредактировал снова, потому что увидел, что сделал еще одну опечатку X)
Спасибо, если флажок не установлен и является обязательным, форма не отправляется, но не появляется никаких проверочных сообщений, таких как «Заполните это поле», как в других полях. Ты знаешь почему? А также знаете ли вы, как, если требуется настраиваемый вопрос, добавить внутри каждой метки вопроса эту "<span class = " text-primary "> * </span>"?
И есть проблема, например, если флажок не требуется, с этим кодом "$ ('# registration_form'). Submit (function () {alert (" 'test "); if ($ (' div.checkbox- group.required div: checkbox: checked '). length> 0) {return true; // отправить форму} else {return false; // не отправлять форму}}); " форма не отправляется, но если флажок не требуется, он не должен возвращать false.
Я просто показал вам и объяснил, почему то, что вы просили, невозможно выполнить только с html5, я показал вам, как я не хочу кодировать все ваши кейсы, я просто закодировал базовый кейс, который вы просили ...
добавьте внутри каждой метки вопроса этот "<span class = " text-primary "> * </span>" -> это можно легко сделать, добавив условный оператор внутри вашего case в вашем контроллере
Это должно быть в RegistrationController или в модели вопроса?
Где вы генерируете свой html-ввод в модели вопроса, когда вы вставляете метку, которую можете использовать, и оператор if с $ required переменной, как вы уже сделали, и если это требуется, добавьте <span class = "text-primary"> * </ span >
Спасибо, но метка отсутствует в модели вопроса, она находится в registration.blade.php, поэтому она должна быть такой: "<label for = " members_question "> {{$ customQuestion-> question}} <span class = " text -primary "> * </span> </label>", но таким образом он появляется всегда, если ввод требуется, но также и если он не требуется.
То, что я имел в виду, когда вы использовали getInputHtml, могло быть там, лично я не поклонник того, как вы структурируете свой проект, но что бы то ни было
Спасибо, я новичок, возможно, getHtmlInput в модели не подходит, потому что модель возвращает HTML, но я не знаю, как ее структурировать более правильно, чтобы достичь этого контекста создания настраиваемых полей с правильным типом в зависимости от что это в столбце типа таблицы вопросов.
Замените свой getHtmlInput () этим
public function getHtmlInput($question_id, $index_position, $name = "", $options = "", $required = false, $class = "", $customtype = false) {
//dd($name);
$html = '';
$html .= $customtype == 'select_menu' ? "<select name='participant_question[".$question_id."][".$index_position."]' class='form-control' " . ($required ? " required" : "")
. ">" : '';
if (empty($options)) {
switch ($customtype) {
case "text":
$html .= "
<input type='text' name='participant_question[".$question_id."][".$index_position."]' class='form-control'" . ($required ? " required" : "")
. ">";
break;
case "file":
$html .= "
<input type='file' name='participant_question[".$question_id."][".$index_position."]' class='form-control'" . ($required ? " required" : "") . ">";
break;
case "long_text":
$html .= "
<textarea name='participant_question[".$question_id."][".$index_position."]' class='form-control' rows='3'" . ($required ? " required" : "") . ">"
. $name .
"</textarea>";
break;
}
} else {
foreach ($options as $option) {
switch ($customtype) {
case "checkbox":
$html .= "
<div class='form-check'>
<input type='checkbox' name='participant_question[".$question_id."][".$index_position."][]' value='" . $option->value . "' class='form-check-input'" . ($required ? " required" : "") . ">" .
' <label class = "form-check-label" for = "exampleCheck1">' . $option->value . '</label>' .
"</div>";
break;
case "radio_btn":
$html .= "
<div class='form-check'>
<input type='radio' name='participant_question[".$question_id."][".$index_position."][]' value='" . $option->value . "' class='form-check-input'" . ($required ? " required" : "") . ">" .
' <label class = "form-check-label" for = "exampleCheck1">' . $option->value . '</label>' .
"</div>";
break;
case "select_menu":
$html .= "<option value='" . $option->value . "'>" . $option->value . "</option>";
break;
}
}
}
$html .= $customtype == 'select_menu' ? "</select>" : '';
return $html;
}
а также
код лезвия с этим
@if ($allParticipants == 0)
{{ $index_position = 0 }}
@foreach($selectedRtype['questions'] as $customQuestion)
{{ $question_id = [[QUESTION_ID]] }}
<div class = "form-group">
<label for = "participant_question">{{$customQuestion->question}}</label>
@if ($customQuestion->hasOptions() && in_array($customQuestion->type, ['checkbox', 'radio_btn', 'select_menu']))
{!! $customQuestion->getHtmlInput(
$question_id,
$index_position,
$customQuestion->name,
$customQuestion->options,
($customQuestion->pivot->required == '1'),
'form-control',
$customQuestion->type)
!!}
@else
{!! $customQuestion->getHtmlInput(
$question_id,
$index_position,
$customQuestion->name,
[],
($customQuestion->pivot->required == '1'),
'form-control',
$customQuestion->type)
!!}
@endif
</div>
{{ $index_position = $index_position+1 }}
@endforeach
@endif
вам необходимо установить атрибут имени таким же, как у тех же групповых опций, чтобы необходимая опция работала должным образом.
Но в вашем коде все параметры, включая разные группы параметров, имеют одинаковый атрибут имени.
Приведенный выше код не протестирован. Но я надеюсь, что это сработает для тебя
Спасибо, но так, если поле флажка является обязательным, пользователю также необходимо установить все флажки, связанные с этим полем флажка. А также для каждого поля появляется число вроде «0 текста», «1 флажок», «...».
И с этим кодом при нажатии кнопки формы «Регистрация магазина» появляется ошибка «SQLSTATE [23000]: нарушение ограничения целостности: 1048 Столбец 'question_id' не может быть пустым (SQL: вставить в answers (question_id, participant_id, answer, updated_at, created_at) values (, 38, re, 2018-06-10 11:33:48, 2018-06-10 11:33:48)) ".
Я изменил код для идентификатора вопроса. убедитесь, что вы получили правильный идентификатор вопроса и заменили его на [[QUESTION_ID]]. ОК
флажки предназначены для необязательных. но все равно получишь это. вы можете заменить следующие строки
Спасибо, с этим кодом в сгенерированном HTML-коде имя имеет значения типа 2 "member_question [2] [1] []", как, например, сгенерированный html для флажка:
"12 <div class = " form-group "> <label for = " members_question "> Флажок </label> <div class = " form-check "> <input type = " checkbox "name = " members_question [2] [ 1] [] "value = " check1 "class = " form-check-input "required = " "> <label class = " form-check-label "for = " exampleCheck1 "> check1 </label> </div> <div class = "form-check"> <input type = "checkbox" name = "members_question [2] [1] []" value = "check2" class = "form-check-input" required = ""> < label class = "form-check-label" for = "exampleCheck1"> check2 </label> </div> </div> ".
Почему имя не может быть просто member_question []? И с этим кодом, если поле флажка является обязательным, необходимо установить все флажки.
Я имею в виду, что у флажков есть только два возможных состояния, поэтому они не требуются неявно