2016-01-26 1 views
0

Я работаю над Laravel. У меня есть страница просмотра лезвия, на которой создаются несколько форм (той же модели). Теперь я хочу, чтобы при нажатии кнопки «Отправить» массив всех форм должен быть возвращен контроллеру. Но он возвращает данные только одной формы вместо массива. Как я могу это достичь, Может ли кто-нибудь помочь мне?Получить данные из нескольких форм Laravel

+0

Вы не можете отправить несколько форм aaik, разве вы не можете просто слить все поля? –

+0

Как я могу объединить их? –

+0

Просто поместите все поля в те же '

' теги ... Если вы хотите какое-то разделение (логическое, семантическое и т. Д.), Вы можете легко достичь этого с помощью '
' или других структур и правильного стиля –

ответ

0

Что вы можете сделать, так это то, что вам нужно заколеровать поле формы с помощью структуры имен как first_name1, first_name2 и так далее. Затем, после отправки формы, вы можете проверить использование цикла таким же образом и получить значения. Здесь вы можете проверить свой пример кода. Он подсчитывает количество циклов.

Вы можете передать счетчик от представления к контроллеру в скрытом поле. Затем вы можете выполнить цикл для проверки и для ввода входов.

Проверьте мой пример кода:

//determine number of rows in database 
     $number_of_loop = Input::get('number_of_loop'); 

     $arrayList = []; //defining the array variable 

     //declaring the validations rules 
     for($i = 1; $i < $number_of_loop; $i++){ 
      $rules = array(
       'currency'.$i => 'required', 
       'iso_code'.$i => 'required', 
       'symbol'.$i  => 'required', 
       'status'.$i  => 'required' 
      ); 
      $validator = Validator::make(Input::all(), $rules); 

      if($validator->fails()){ 

       return Redirect::back()->withErrors($validator)->withInput(); 
      } 
     } 

     for ($i=1; $i <= $number_of_loop; $i++) { 

      $new_currency = new stdClass(); 

      $currency = Input::get('currency' . $i); 
      $iso_code = Input::get('iso_code'.$i); 
      $symbol = Input::get('symbol'.$i); 
      $conversion_rate = Input::get('conversion_rate'.$i); 
      $status = Input::get('status'.$i); 


      $new_currency->currency = $currency; 

      $new_currency->iso_code = $iso_code; 

      $new_currency->symbol = $symbol; 

      $new_currency->conversion_rate = $conversion_rate; 

      $new_currency->enable = $status; 

      array_push($arrayList, $new_currency); 


     } 

Update1

Для хранения всех записей, создать массив и новый StdClass. Храните всю переменную в атрибутах stdclass. и, наконец, нажмите новый stdclass на массив. Затем вы можете получить доступ ко всем входам формы. Проверьте выше обновленный образец кода

+0

благодарит за код. Но это не работает в моем случае. Если я сделаю то же самое, я получил данные только последней формы среди нескольких. –

+0

Вам необходимо сохранить данные в каждом цикле. В противном случае вы получите значения только из последнего цикла. Сначала сохраните записи в каждом цикле и получите доступ к базе данных. – vijayrana

+0

Извините, я не могу объяснить это лучше. Предположим, когда я запускаю цикл, скажем 4 раза, каждая итерация имеет данные последней формы. Я тестировал его с помощью эха. –

2

Это не настоящий вопрос о Ларавеле.

Трюк использует различные формы с каждой кнопкой отправки. Тогда это просто. Проверьте представленную кнопку.

if ($request->isMethod('post')) { 

    if ($request->has('submit_button_form_1')) { 
     // Handle form 
    } 
    elseif ($request->has('submit_button_form_2')) { 
     // Handle form 
    } 
    elseif ($request->has('submit_button_form_3')) { 
     // Handle form 
    } 
} 
+0

благодарит @Schellingerht за код. Но я поставил все эти множественные формы в одной форме. Вы можете сказать, что теперь все формы являются дочерними элементами этой единственной формы. –

+0

Подформы недопустимы html. См. Также http://stackoverflow.com/questions/379610/can-you-nest-html-forms. Лучше разбить, чтобы вы могли обрабатывать разные формы. – schellingerht

0

Прежде всего, я не думаю, что вы можете отправить несколько форм, это так, как есть. У вас есть два варианта.

Во-первых: Создайте одну форму со всеми полями из всех форм, а затем в контроллере вы просто возьмете какое поле, которое хотите, так же, как вы делали бы из массивов так же. как:

$all_fields= Request::all(); 
and then 
$all_fields['something'], $all_fields['something_else'], 

Во-вторых: Использование Ajax, вы можете управлять и отправить значения полей, полей, которые вам нужны.

+0

спасибо @MasterSith. Но я не могу просто поместить все поля в одну форму, поскольку эти множественные формы динамически генерируются при нажатии кнопки. Когда пользователь хочет вставить еще несколько данных, он просто нажимает кнопку, и новая форма добавляется к уже существующим. Затем при отправке клика родительской формы я хочу, чтобы данные всех дочерних форм возвращались в виде массива. Но я понял, что мы не можем отправить несколько форм. Спасибо за это. Я попробую по-другому. –

+0

Используйте ajax, тогда он будет принимать значения от входов и отправлять их контроллеру, вы можете создавать массивы или что угодно. – MasterSith

0

Если вы используете Laravel 5.2, вы можете проверить данные массива. Вам нужно будет поместить все ваши входы в одну форму, поскольку вы просто не можете отправлять несколько форм. Если в каждой форме были разные URL-адреса для атрибута action, как это будет работать?

Для передачи данных в виде массива, вы можете использовать суффиксы атрибут name с []:

{!! Form::open() !!} 
{!! Form::text('name[]') !!} 
{!! Form::text('name[]') !!} 
{!! Form::text('name[]') !!} 
{!! Form::close() !!} 

Когда эта форма представляется, name будет массив с тремя элементами.

Для проверки используйте маски в вашей публикации Имя правила:

return [ 
    'name.*' => 'required|max:255', 
]; 

Вы можете получить доступ к массиву имен в контроллере через Request объекта:

$names = $request->get('names', []); 

foreach ($names as $name) { 
    User::create(['name' => $name]); 
} 

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