#laravel #laravel-5 #laravel-5.2
#laravel #laravel-5 #laravel-5.2
Вопрос:
Я тестировал Request.php (отправка формы с пустыми обязательными полями) моего представления create и получил сообщение об ошибке «htmlentities () ожидает, что параметр 1 будет строковым, задан массив».
Я знаю, что ошибка была сгенерирована из-за приведенного ниже кода. Это часть моего представления (вызывает функции javascript), используемая для создания напоминаний о будущих встречах.
Я просто не понимаю, что именно вызывает ошибку.
<div style="display:none">
<div id="reminderiteminitial">
<div class="row" style="padding: 0.5em 0 0.5em 0.5em">
<div class="col-sm-2" >
{!! Form::text('reminder_time[]', 30, ['class' => 'form-control', 'placeholder' => '']) !!}
</div>
<div class="col-sm-2" >
{!! Form::select('reminder_timeunit[]', ['minute' => 'minutes(s)', 'hour' => 'hour(s)', 'day' => 'day(s)', 'week' => 'week(s)', 'month' => 'month(s)'], null, ['class' => 'form-control']) !!}
</div>
<div class="col-sm-2" >
{!! Form::select('delivery_method[]', ['eml' => 'Email'], null, ['class' => 'form-control']) !!}
</div>
<div class="col-sm-4" >
{!! Form::text('delivery_contact[]', null, ['class' => 'form-control', 'placeholder' => 'Your email address']) !!}
</div>
<div class="col-sm-2" >
<input class="btn btn-default" type="button" value="Delete reminder" onClick="removeitem(this);">
</div>
</div>
</div>
</div>
<div id="reminderitem">
</div>
<div class="row" style="padding: 1.5em 0 2.5em 0">
<div class="col-sm-12">
<input class="btn btn-default" type="button" value="Add a reminder" onClick="addreminderitem();">
</div>
</div>
Javascript:
<script language='javascript' type='text/javascript'>
var itemCount = 1;
var limit = 6;
function addreminderitem(){
if (itemCount == limit) {
alert("You have reached the maximum number of reminders.");
}
else {
var newreminderitem = document.getElementById('reminderitem');
var initialreminderitem_clone = document.getElementById('reminderiteminitial').cloneNode(true);
initialreminderitem_clone.id = 'item_' itemCount ;
newreminderitem.appendChild(initialreminderitem_clone);
}
}
function removeitem(item){
item.parentNode.parentNode.parentNode.remove();
itemCount = itemCount - 1;
}
</script>
Упс показывает:
reminder_time
array:1 [
0 => "30"
]
reminder_timeunit
array:1 [
0 => "minute"
]
delivery_method
array:1 [
0 => "eml"
]
delivery_contact
array:1 [
0 => ""
]
Обновление # 2
Что странно, так это то, что если я заменю следующий код HTML-формы:
<div class="col-sm-2" >
{!! Form::text('reminder_time[]', 30, ['class' => 'form-control', 'placeholder' => '']) !!}
</div>
<div class="col-sm-2" >
{!! Form::select('reminder_timeunit[]', ['minute' => 'minutes(s)', 'hour' => 'hour(s)', 'day' => 'day(s)', 'week' => 'week(s)', 'month' => 'month(s)'], null, ['class' => 'form-control']) !!}
</div>
<div class="col-sm-2" >
{!! Form::select('delivery_method[]', ['eml' => 'Email'], null, ['class' => 'form-control']) !!}
</div>
<div class="col-sm-4" >
{!! Form::text('delivery_contact[]', null, ['class' => 'form-control', 'placeholder' => 'Your email address']) !!}
</div>
<div class="col-sm-2" >
<input class="btn btn-default" type="button" value="Delete reminder" onClick="removeitem(this);">
</div>
с помощью html, который он генерирует:
<div class="col-sm-2" >
<input class="form-control" placeholder="" name="reminder_time[]" type="text" value="30">
</div>
<div class="col-sm-2" >
<select class="form-control" name="reminder_timeunit[]"><option value="minute">minutes(s)</option><option value="hour">hour(s)</option><option value="day">day(s)</option><option value="week">week(s)</option><option value="month">month(s)</option></select>
</div>
<div class="col-sm-2" >
<select class="form-control" name="delivery_method[]"><option value="eml">Email</option></select>
</div>
<div class="col-sm-4" >
<input class="form-control" placeholder="Your email address" name="delivery_contact[]" type="text">
</div>
<div class="col-sm-2" >
<input class="btn btn-default" type="button" value="Delete reminder" onClick="removeitem(this);">
</div>
Я не получаю ошибку !?
Комментарии:
1. Установите whoops и получите более подробную информацию, там нет ничего, что могло бы вызвать эту ошибку, поскольку вы используете неэкранированный вывод.
2. Я полагаю, что это может быть все, что вы делаете или добавляете в свой #reminderitem div. В этой части кода нет ничего плохого.
3. Установлено Упс, вывод показан выше. Не уверен, что искать в Whoops
4. @JulianRodriguez ну, я ничего не добавлял к reminderitem в своем тесте. Это то, что для меня странно.
5. Хорошо, это странно. Я попробовал ваш код в чистом проекте laravel всего пару минут назад, и все было в порядке. Я бы сказал, что эта часть кода не генерирует ошибку. Вероятно, причиной этой ошибки является foreach в каком-то другом месте вашего представления.
Ответ №1:
Ошибка
Ваши имена полей должны быть объявлены как строка, а не как массив:
<input name="reminder_time" />
вместо
<input name="reminder_time[]">`
Проверка массива
Или вы можете изменить свои правила проверки для массива (https://laravel.com/docs/5.3/validation#validating-arrays ):
$rules = [
'reminder_time.*' => 'unique',
],
Комментарии:
1. Дело в том, что мне нужно, чтобы они были объявлены как массивы (например, reminder_time[] ), потому что у меня есть возможность генерировать много напоминаний. reminder_time [0] и reminder_time [1] могут иметь одинаковые значения
2. Таким образом, вам необходимо изменить правила проверки для массива, а также, если remainder_time хранится как один столбец в базе данных, вам нужно
json_encode()
это илиserialize()
перед сохранением.3. Попытался добавить эту проверку в мои правила запроса ‘reminder_time.*’ => ‘numeric’, ‘reminder_timeunit.*’ => ‘alpha_num’, ‘delivery_method.*’ => ‘alpha_num’, ‘delivery_contact.*’ => ’email’, но получил ту же ошибку … и почемуработает ли это с обычным html, но не с Forms Html, см. Обновление # 2
4. Да, это не имеет смысла. Это вообще не должно быть именем, иначе оно не будет работать в обычном html