2011-06-16 42 views
0

我有一個kohana應用程序,並且我有一個帶有多個複選框的表單,用戶應該在表單中檢查他的偏好。所以我在用戶表和偏好表之間有一個關係1:n。我的問題是,我想保存這些偏好,在表格中選擇,我不知道如何。

我有以下形式:

<form id="address" method="POST" action="<?= Route::url('Save user preferences' , array('user_id' => $user));?>"> 
    <? foreach ($prefered_products as $pp): ?> 
    <input type="checkbox" name="user_preferences_preference[]" value="<?= $pp ?>" /><?= $pp->product; ?><br /> 

    <? endforeach; ?> 
      <button type="submit">Salveaza preferintele tale</button> 
    </form> 

和我保存數據:

foreach ($_POST['user_preferences_preference'] as $up) { 
    $user_preferences->prefered = $up; 
    $user_preferences->user = $this->user; 
    $user_preferences->save(); 

    } 
$this->view->message = __('Thank you for your feedback!'); 

但好像我解析喜好的方式是不正確的,我得到:ErrorException [注意] :爲foreach提供的無效參數()

有關如何獲得多個$ _post首選項的任何想法? 謝謝!

+0

這意味着'$ _POST ['user_preferences_preference']'不是一個數組(或一個Traversable)。你嘗試過'var_dump'嗎? – netcoder 2011-06-16 14:23:01

+0

僅當您未選中複選框時纔會發出警告? – Rafe 2011-06-16 14:54:14

+1

使用'$ data = Arr :: get($ _ POST,'user_preferences_preference',array())'或'$ data =(array)$ _ POST ['user_preferences_preference']'。 – biakaveron 2011-06-17 05:34:38

回答

0

問題是,複選框只會在設置時發佈數據。你應該反向檢查值。即;

  • 從數據庫
  • 檢查抓取所有的偏好(ID的)如果數值在$ _POST變種發現在DB
  • 如果不是,更新爲假(或0或別的什麼),如果設置,讀出價值。
1

我有一個稍微不同的方式做到這一點。

當我創建一個複選框我也創建一個相同的隱藏字段設定爲零

<input type="hidden" name="my_check" value="0" /> 
<input type="checkbox" name="my_check" value="$value" /> 

複選框,如果選中,將覆蓋隱藏的值。這樣,當你發送表單時,你最終會得到$ _POST ['checkbox] = 1或0,但它總是存在於$ _POST中。

這種方法的好處是你可以擴展Form :: checkbox助手,這樣它總是存在的,你不必擔心它的每個窗體/控制器。

p.s.在你上面的例子中,你可能會想這樣做:

<input type="hidden" name="user_preferences_preference[$pp->id]" value="0" /> 
<input type="checkbox" name="user_preferences_preference[$pp->id]" value="<?= $pp ?>" /> 
<?= $pp->product; ?><br /> 

或者使用$ key值而不是$ pp-> id。