2011-05-11 26 views
2

我试图在Codeigniter的Datamapper中保存一个长表单。我能够保存表单如果我通过这样的更改数据映射器中的循环对象ORM

$t->brandName = $this->input->post('brandName'); 
$t->specialNotes = $this->input->post('specialNotes'); 
$t->name = $this->input->post('name'); 

价值现在,如果我把保存的方法它的工作原理

$t->save(); 

由于形式是大我试图在的foreach添加对象的值

$a = get_object_vars($t); 
foreach ($a['stored'] as $k => $val){ 
     $t->$k = $this->input->post("$k"); 
} 

但是如果我叫$t->save()这是行不通的。

回答

1

我不确定$a['stored']代表什么,但它在Datamapper中没有默认值。

你为什么不以相反的方式做循环,通过后键?

foreach ($_POST as $key => $val) 
{ 
    $t->$key = $this->input->post($key); 
} 
$t->save(); 

注意:任何不存在的列都将被Datamapper忽略。


其实我写了这样的DataMapper的扩展:

class DM_Data { 

    function assign_postdata($object, $fields = NULL) 
    { 
     // You can pass a different field array if you want 
     if (! $fields) 
     { 
      $fields = $object->validation; 
     } 
     foreach ($fields as $k => $data) 
     { 
      $rules = isset($data['rules']) ? $data['rules'] : array(); 

      if (! isset($_POST[$k])) continue; 

      // Cast value to INT, usually for an empty string. 
      if (in_array('integer', $rules)) 
      { 
       $object->$k = (integer) $_POST[$k]; 
      } 
      // Do other manipulation here if desired 
      else 
      { 
       $object->$k = $_POST[$k]; 
      } 

     } 
     return $object; 
    } 

} 

您可以使用$t->assign_postdata()->save(),并且选择通过字段的数组更新到功能(在DataMapper的验证格式)。但是,我忘记了为什么要使用它......但我删除了一些自定义内容。如果你这样做的话,这应该对你有用。这绝对可以节省我的时间。

+0

@MakDotGNU:我添加了一些可能会让你感兴趣的代码。 – 2011-05-11 19:13:55

+0

谢谢@wesley这会帮助我。 – 2011-05-12 05:39:15