Как автоматически заполнить значения полей в разделе формы, который загружается с помощью ajax в Laravel 4?

У меня есть раздел формы, который динамически загружает различные наборы полей на основе выбора пользователя в элементе управления. Я использую обработчик событий javascript, чтобы определить, когда меняется выбор, и использую AJAX (с полезной нагрузкой HTML), чтобы получить правильный набор полей.

Я хотел бы иметь возможность использовать Laravel's Form::getValueAttribute() метод для автоматического заполнения значений полей формы в статической и динамической частях формы. Однако частичное представление, загружаемое моим вызовом AJAX, не имеет того же экземпляра класса Form, что и представление с моей основной формой, поэтому я не могу просто вызвать getValueAttribute() в частичном.

Моя мысль - заставить AJAX вызывать POST и сериализовать необходимые данные (подмножество Input::old() или данные модели в зависимости от того, была ли страница загружена в результате ошибок проверки или запроса UPDATE) для отправки вместе с POST, чтобы вернувшийся фрагмент HTML имел правильные значения.

Это лучший способ получить то, что я хочу? Если да, есть ли у Laravel какие-либо инструменты, помогающие с сериализацией данных формы? Если нет, что может быть лучше?

1 ответ

Решение

Я нашел подход, который мне нравится больше. Когда представление загружается нормально, я использую AJAX как обычно, чтобы загрузить частичное. Но когда представление загружается для обратной проверки или для редактирования, я использую метод гнезда Laravel's Views для вложения частичного представления, содержащего соответствующие поля, непосредственно в ответ. После этого у партиала есть доступ ко всем входным данным и данным об ошибках, которые мне нужны. Пользователь по-прежнему может изменять набор полей, как обычно, но я выставляю для них запрос на подтверждение, если они уже установили некоторые значения в наборе полей, которые они ранее выбрали. Если они решат продолжить, набор полей очищается, и новый набор полей вводится через AJAX как обычно.

Мой код выглядит примерно так:

контроллер:

public function newThing() {
  if ( Request::session()->has('errors') ) {
      // this is a validation post-back
      return View::make('thing')
        ->nest('fields', 'fields_partial');
  } else {
      // just a normal unfilled form
      return View::make('thing');
  }
}

public function editThing() {
    return View::make('thing')
        ->nest('fields', 'fields_partial');
}

Посмотреть: thing.blade.php (просто отрывок из этого)

...
<form>
    ...
    <select id="picker">...</select>
    <div class="sub-fields">
       {{ isset($fields) ? $fields : '' }}
    </div>
    ...
</form>
...
<script>
    $('#picker').change(function() {
        // if any .sub-fields inputs have been changed, get confirmation from the user

        // if user confirms, do ajax stuff to replace .sub-fields contents with new field set
        // otherwise cancel the change
    });
</script>
Другие вопросы по тегам