#php #codeigniter #orm #codeigniter-datamapper
#php #codeigniter #orm #codeigniter-datamapper
Вопрос:
Я пытаюсь сохранить длинную форму в Datamapper от Codeigniter. Я могу сохранить форму, если передам значение следующим образом
$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.
Почему бы вам не сделать это наоборот, перебрав ключи post?
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). Однако я забыл, зачем я это использую … но я удалил некоторые пользовательские материалы. Это должно быть полезно для вас, если вы часто этим занимаетесь. Это определенно экономит мне время.
Комментарии:
1. @MakDotGNU: Я добавил немного кода, который может вас заинтересовать.