2016-01-26 99 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

這不是一個真正的Laravel問題。

訣竅是每個提交按鈕使用不同的形式。然後,這很簡單。檢查提交的按鈕。

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,那麼您可以驗證陣列數據。您需要將所有輸入內容放在一個表單中,因爲您無法發送多個表單。如果每個表單具有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]); 
} 

我不因爲你沒有將它包含在你的問題中,所以知道你的數據結構,但這應該足以讓你適用於你的情況。