Laravel-4 Blade: создание поля выбора формы с использованием значений в объекте

#php #forms #laravel-4 #blade

#php #формы #laravel-4 #laravel-blade

Вопрос:

Я хочу создать поле выбора названий городов для формы. Я смог создать и передать в свое представление объект $ city, значения которого я могу корректно перечислить в своем представлении, если просто отобразить их вне формы. Для поля выбора необходимы два свойства $ city: $city-> id и $city-> name.

Мои попытки сделать это с помощью Blade заканчиваются неудачей. Проблема сводится к следующему: как мне вложить @foreach внутрь оператора Blade Form::select? Например, без @foreach, просто переходя к паре городов, это работает отлично, включая выбор пустого места и Альбукерке по умолчанию:

 {{ Form::open() }}
{{ Form::Label('city_bldg_id','City:') }}
{{ Form::select('city_bldg_id', array(
    '',
    '2'=>'Albuquerque',
    '11'=>'Bernalillo'
    ),'2') }}
{{ Form::close() }}
  

Для того, чтобы заполнить поле выбора всеми значениями в $ city, казалось бы, мне нужно использовать @foreach внутри массива Form::select. Возможно ли это сделать? Если да, то каким образом? Все мои попытки приводят к синтаксическим ошибкам. Или $ city должен быть массивом, а не объектом?

Я так близко, что могу попробовать это, но я не могу понять последний шаг. Любые предложения по соответствующему коду были бы высоко оценены. Спасибо!

Ответ №1:

Обычно я предпочитаю создавать выбранные данные перед переходом к представлению. Это легче читать, если это просто

 {{ Form::select('city_bldg_id', $cities, '2' }}
  

(Примечание сбоку: не уверен, нужно ли заключать 2 в кавычки. Вероятно, нет.)

Таким образом, вы можете выполнять foreaches все, что хотите, чтобы создать массив, и вы можете сделать это на чистом PHP вместо Blade.

Одним из простых способов создания массива, если вы получаете данные из модели Eloquent, например, City , является lists() метод:

 $cities = City::lists('name', 'id');
  

Если вам нужно отфильтровать определенные города, вы просто делаете это обычным способом:

 $cities = City::where('somefield', '=', 'value')-> etc... ->lists('name', 'id');
  

(Надеюсь, я не слишком много предполагаю о том, что вы уже знаете. Если это кажется слишком примитивным и вам не помогает, я приношу извинения.)

Комментарии:

1. Большое спасибо, Джоэл. Ваши ответы были правильными на моем уровне; я все еще изучаю основы Laravel. Теперь у меня все работает идеально с помощью lists (), но у меня остаются два незначительных вопроса: 1) Значение по умолчанию, например, 2, как указано выше, не работает (это вызывает синтаксическую ошибку, с одинарными кавычками или без них), и 2) Как я могу добавить пустое значение, которое выдает NULL в качестве выбора в поле выбора?

2. Ой, я виноват. Проблема со значением по умолчанию была просто опечаткой (забыл закрыть метод с помощью «)». Итак, это не проблема. И на данный момент я не собираюсь беспокоиться о выборе null — возможно, появится простое решение для этого. Приветствия.

3. Рад, что у вас получилось! Для второго вы могли бы просто array_merge([''], $cities); — по сути, вы берете список, содержащий только пустое значение, и ваш список городов, и объединяете их. Я признаю, что это не очень эстетично, но работает гладко.

4. Очень умно — мне это нравится. Еще раз спасибо! Я действительно ценю вашу помощь. Отличных праздничных выходных. -Стив

5. Добро пожаловать, спасибо вам, аналогично, и с днем рождения вашей страны. 🙂