Итак, я создаю конструктор форм. Пользователи будут входить в систему, а затем заполнять формы, созданные администраторами. Я использую saveAll () в моем методе «data_controller» «add».
Это прекрасно работает и выглядит так:
//debug($this->data); prints the following
//app/controllers/data_controller.php (line 21)
Array
(
[Datum] => Array
(
[0] => Array
(
[bool_val] => 1
[field_id] => 56
[form_id] => 208
[user_id] => 1
)
[1] => Array
(
[bool_val] => 0
[field_id] => 64
[form_id] => 208
[user_id] => 1
)
)
)
// data_controller.php
// the add method is like this
function add() {
debug($this->data);
if (!empty($this->data) ) {
$this->Datum->create();
if ($this->Datum->saveAll($this->data['Datum'])) {
$this->Session->setFlash(__('The Datum has been saved', true));
$this->redirect(array('action'=>'index'));
} else {
$this->Session->setFlash(__('The Datum could not be saved. Please, try again.', true));
}
}
$forms = $this->Datum->Form->find('list');
$fields = $this->Datum->Field->find('list');
$users = $this->Datum->User->find('list');
$statuses = $this->Datum->Status->find('list');
$this->set(compact('forms', 'fields', 'users', 'statuses'));
}
Так что это прекрасно работает и создает серию новых записей в таблице «данных» моей базы данных MySQL. Моя ошибка возникает, когда я пытаюсь использовать «saveAll ()» в моем методе «edit». Я гуглил, гуглял и гуглял без удачи. Во всех статьях говорится, что моя структура данных должна быть правильной, или я так понимаю.
Так вот мое мнение. Он переходит к выходным флажкам и другим элементам формы, но мы просто рассмотрим простой пример флажка.
//field_view_datum.ctp
<?php
//debug($field_datum);
switch ($field['Type']['name']) {
case "check box" :
echo "<p>";
echo $form->label($field['FieldName'][0]['name']);
echo $form->hidden('Datum.'.$field_datum['id'].'.id', array('value' => $field_datum['id']));
echo $form->hidden('Datum.'.$field_datum['id'].'.form_id', array('value' => $formID));
echo $form->hidden('Datum.'.$field_datum['id'].'.field_id', array('value' => $field['id']));
echo $form->hidden('Datum.'.$field_datum['id'].'.user_id', array('value' => $userID));
$booly = ($field_datum['bool_val'] == 0) ? false : true;
$options = array('checked' => $booly);
echo $form->checkbox('Datum.'.$field_datum['id'].'.bool_val', $options);
echo "</p>";
break;
Мое представление выведет следующий HTML-код в браузер.
<p>
<label for="DatumFieldOne">Field One</label>
<input type="hidden" id="Datum164Id" value="164" name="data[Datum][164][id]"/>
<input type="hidden" id="Datum164FormId" value="208" name="data[Datum][164][form_id]"/>
<input type="hidden" id="Datum164FieldId" value="56" name="data[Datum][164][field_id]"/>
<input type="hidden" id="Datum164UserId" value="1" name="data[Datum][164][user_id]"/>
<input type="hidden" value="0" id="Datum164BoolVal_" name="data[Datum][164][bool_val]"/>
<input type="checkbox" id="Datum164BoolVal" value="1" checked="checked" name="data[Datum][164][bool_val]"/>
</p>
<p>
<label for="DatumFieldTwo">Field Two</label>
<input type="hidden" id="Datum165Id" value="165" name="data[Datum][165][id]"/>
<input type="hidden" id="Datum165FormId" value="208" name="data[Datum][165][form_id]"/>
<input type="hidden" id="Datum165FieldId" value="64" name="data[Datum][165][field_id]"/>
<input type="hidden" id="Datum165UserId" value="1" name="data[Datum][165][user_id]"/>
<input type="hidden" value="0" id="Datum165BoolVal_" name="data[Datum][165][bool_val]"/>
<input type="checkbox" id="Datum165BoolVal" value="1" name="data[Datum][165][bool_val]"/>
</p>
Итак, когда я отправляю форму, я получаю следующую ошибку:
Fatal error: Call to a member function getColumnType() on a non-object in /cake/libs/model/model.php on line 949
Данные, которые я передаю, и метод моего контроллера выглядят так:
//debug($this->data['Datum']); prints the following
app/controllers/data_controller.php (line 39)
Array
(
[164] => Array
(
[id] => 164
[form_id] => 208
[field_id] => 56
[user_id] => 1
[bool_val] => 1
)
[165] => Array
(
[id] => 165
[form_id] => 208
[field_id] => 64
[user_id] => 1
[bool_val] => 1
)
)
//data_controller.php
function edit($formid = null) {
debug($this->data['Datum']);
if (!empty($this->data) ) {
if ($this->Datum->saveAll($this->data['Datum'])) {
$this->Session->setFlash(__('The Datum has been saved', true));
$this->redirect(array('controller' => 'forms', 'action'=>'index'));
} else {
$this->Session->setFlash(__('The Datum could not be saved. Please, try again.', true));
$this->redirect(array('controller' => 'forms', 'action'=>'view', 'id' => '$formid'));
}
}
}
Любая помощь, которую вы можете оказать, была бы очень признательна. Я провел множество поисков и не нашел правильного ответа. Извините, если этот пост немного затянут.
Спасибо,
Девин
* * Тысяча двадцать-одина [EDIT]
На случай, если вам нужно взглянуть на мою модель или структуру моей таблицы.
//Model
//datum.php
// a basic model nothing unusual here
<?php
class Datum extends AppModel {
var $name = 'Datum';
var $belongsTo = array(
'Form' => array(
'className' => 'Form',
'foreignKey' => 'form_id',
'conditions' => '',
'fields' => '',
'order' => ''
),
'Field' => array(
'className' => 'Field',
'foreignKey' => 'field_id',
'conditions' => '',
'fields' => '',
'order' => ''
),
'User' => array(
'className' => 'User',
'foreignKey' => 'user_id',
'conditions' => '',
'fields' => '',
'order' => ''
),
'Status' => array(
'className' => 'Status',
'foreignKey' => 'status_id',
'conditions' => '',
'fields' => '',
'order' => ''
)
);
}
?>
//this is from my latest schema snapshot
var $data = array(
'id' => array('type' => 'integer', 'null' => false, 'default' =>
NULL, 'key' => 'primary'),
'form_id' => array('type' => 'integer', 'null' => true, 'default'
=> NULL),
'field_id' => array('type' => 'integer', 'null' => true, 'default'
=> NULL),
'user_id' => array('type' => 'integer', 'null' => true, 'default'
=> NULL),
'status_id' => array('type' => 'integer', 'null' => true,
'default' => NULL),
'value' => array('type' => 'text', 'null' => true, 'default' =>
NULL),
'file_path' => array('type' => 'string', 'null' => true, 'default'
=> NULL),
'bool_val' => array('type' => 'boolean', 'null' => true, 'default'
=> '0'), // I am using MySQL so this is a tinyint(1)
'created' => array('type' => 'datetime', 'null' => true, 'default'
=> NULL),
'modified' => array('type' => 'datetime', 'null' => true,
'default' => NULL),
'indexes' => array('PRIMARY' => array('column' => 'id', 'unique'
=> 1))
);
[EDIT]
Итак, я сделал так, как предложил один из авторов, и это то, что я получил, поставив «debug ($ model)»; на торт / libs / model / model.php (строка 949):
cake/libs/model/model.php (line 949)
data //this being what debug() returns
Fatal error: Call to a member function getColumnType() on a non-object in /cake/libs/model/model.php on line 950
Я могу видеть, что не так, моя модель называется Datum или datum.php, а не данные. У меня нет очевидного решения в моей голове, это немного глубоко в Cake для меня. Есть предложения?
Я только что посмотрел на мой метод "view" с тем же оператором отладки, и он выводит "Datum", а не "data", как я получаю из моего "edit" метода. На всякий случай, если это кому-нибудь пригодится.