За последние 24 часа нас посетили 17206 программистов и 1686 роботов. Сейчас ищут 1224 программиста ...

Laravel. Input::old() для динамических полей.

Тема в разделе "PHP для новичков", создана пользователем Sergey_Tsarev, 8 янв 2019.

  1. Sergey_Tsarev

    Sergey_Tsarev Активный пользователь

    С нами с:
    17 мар 2016
    Сообщения:
    502
    Симпатии:
    105
    Всем привет! Есть форма. Примерно такая:
    HTML:
    1. <label>Название</label>
    2. <input type="text" name="name">
    3. <label>Описание</label>
    4. <input type="text" name="description">
    5. <span>Добавить спецификацию</span>
    При нажатии на кнопку Добавить спецификацию добавляются динамические поля. Поля могут быть текстовыми, могут быть чекбоксами, радиокнопками, ну и тп. Проблема такая. Допустим человек добавил три спецификации:
    HTML:
    1. <div>
    2. <h3>Спецификация #1</h3>
    3. <label>Размер</label>
    4. <label><input type="checkbox" name="size[]" value="1">Маленький</label>
    5. <label><input type="checkbox" name="size[]" value="2">Средний</label>
    6. <label><input type="checkbox" name="size[]" value="3">Большой</label>
    7.  
    8. <label>Тип</label>
    9. <label><input type="checkbox" name="type[]" value="1">Ручной</label>
    10. <label><input type="checkbox" name="type[]" value="2">Автоматический</label>
    11.  
    12. -----------------
    13.  
    14. <h3>Спецификация #2</h3>
    15. <label>Размер</label>
    16. <label><input type="checkbox" name="size[]" value="1">Маленький</label>
    17. <label><input type="checkbox" name="size[]" value="2">Средний</label>
    18. <label><input type="checkbox" name="size[]" value="3">Большой</label>
    19.  
    20. <label>Тип</label>
    21. <label><input type="checkbox" name="type[]" value="1">Ручной</label>
    22. <label><input type="checkbox" name="type[]" value="2">Автоматический</label>
    23.  
    24. -----------------
    25.  
    26. <h3>Спецификация #3</h3>
    27. <label>Размер</label>
    28. <label><input type="checkbox" name="size[]" value="1">Маленький</label>
    29. <label><input type="checkbox" name="size[]" value="2">Средний</label>
    30. <label><input type="checkbox" name="size[]" value="3">Большой</label>
    31.  
    32. <label>Тип</label>
    33. <label><input type="checkbox" name="type[]" value="1">Ручной</label>
    34. <label><input type="checkbox" name="type[]" value="2">Автоматический</label>
    35. </div>
    В первой он выбрал размер Маленький. Во второй, он размер не выбирал, а выбрал тип Ручной. В третьей вновь выбрал только размер. Допустим Средний.

    Теперь он совершает ошибку в названии или описании товара и валидатор кидает его обратно, возвращая введённые данные. Смотрим как же выглядит Input::eek:ld(). И видим, что данные для динамических полей выглядят так:
    Код (Text):
    1. ["size"]=> array(2) { [0]=> string(1) "1" [1]=> string(1) "2" }
    2. ["type"]=> array(1) { [0]=> string(1) "1" }
    То есть, если я пройдусь по этим данным в цикле, он мне вернёт только две спецификации. В одной будет указан Размер и Тип, а во второй только Размер. И это не будет соответствовать тому, что ввёл пользователь. Все динамические поля необязательны к заполнению. Есть какое-то красивое решение или придумывать велосипед придётся?
     
  2. Sergey_Tsarev

    Sergey_Tsarev Активный пользователь

    С нами с:
    17 мар 2016
    Сообщения:
    502
    Симпатии:
    105
    Что-то никто не отвечает) Отвечу сам тогда. Проблема в том, что если мы отправляем на сервер пустое текстовое поле, то оно всё равно отобразится в присланном массиве $_POST. А вот чекбоксы приходят только те, которые отмечены. И получается, что если ни один чекбокс не отмечен, то и во входящих данных мы его не увидим. Ещё одна проблема обнаружилась в том, что если человек выбрал несколько чекбоксов в разных спецификациях, то они все равно попадут в один массив. В общем жуткая путаница. Решение я нашел такое: Для каждой спецификации нужно создавать отдельный массив и явно задавать ему ключ.
    HTML:
    1. -----------------
    2. <h3>Спецификация #2</h3>
    3. <label>Размер</label>
    4. <label><input type="checkbox" name="size[0][]" value="1">Маленький</label>
    5. <label><input type="checkbox" name="size[0][]" value="2">Средний</label>
    6. <label><input type="checkbox" name="size[0][]" value="3">Большой</label>
    7. <label>Тип</label>
    8. <label><input type="checkbox" name="type[0][]" value="1">Ручной</label>
    9. <label><input type="checkbox" name="type[0][]" value="2">Автоматический</label>
    10. -----------------
    И тогда получается, что массив каждой спецификации будет находится в отдельном элементе присланного массива.
    Код (Text):
    1. ["size"]=> array(2) {
    2.     [0]=> array(2) {
    3.         [0]=> string(1) "1"
    4.         [1]=> string(1) "2"
    5.     }
    6.     [1]=> array(1) {
    7.         [0]=> string(1) "1"
    8.     }
    9. }
    10. ["type"]=> array(1) {
    11.     [1]=> array(1) {
    12.         [0]=> string(1) "1"
    13.     }
    14. }
    Нам остаётся получить все уникальные ключи присланного массива и пройтись по ним циклом. А можно и не искать все ключи, а просто найти самое большое значение ключа из присланного массива.