Как автоматически заполнить значения полей в разделе формы, который загружается с помощью 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>