2011-06-16 13 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。