2011-05-11 28 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