‘htmlentities () ожидает, что параметр 1 будет строковым, задан массив’ ошибка в представлении Laravel

#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