2010-01-14 1 views
1

Итак, я создаю построитель форм. Пользователи будут входить в систему, а затем заполнять формы, которые создали Админы. Я использую saveAll() в моем методе «data_controller» «add».Cakephp saveAll() Неустранимая ошибка: вызов функции-члена getColumnType()

Это прекрасно работает и и выглядит следующим образом:

//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». У меня есть googled и googled и googled без везения. Во всех статьях говорится, что моя структура данных должна быть правильной, или именно так я их понимаю.

Так вот мой взгляд. Он перемещается, чтобы вывести флажки и другие элементы формы, но мы просто рассмотрим простой пример.

//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]

Так что я сделал, как один плакат предложил, и это то, что я получил, когда ввод "отладки ($ модель);" на торте/LIBS/модель/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 не данные у меня нет очевидного решения в моей голове, это немного глубоко в Торт для меня. Какие-либо предложения?

Я просто взглянул на мой метод «просмотра» с тем же отладчиком, и он выводит «Datum», а не «данные», как я получаю из своего метода «редактирования». На всякий случай это полезно для всех.

ответ

0

Правильный ответ был доставлен в группе CakePHP, см:

http://groups.google.com/group/cake-php/browse_thread/thread/759c93f04a626c5b#

+0

. Это решение, которое разрешило ошибку, которую я получал. Я изменил свою модель контроллера данных и, самое главное, таблицу DB из «данных» в «информацию», и ошибка исчезла. Спасибо :) – MrDevin

0

Не уверен, что это правда, но я думаю, что входной массив неверен. Должно выглядеть так:

array(
    [0] => array(
     [Datum] => array(
      [id] => 164 
      [form_id] => 208 
      [field_id] => 56 
      [user_id] => 1 
      [bool_val] => 1 
     ) 
    ) 
    [1] => array(
     [Datum] => array(
      [id] => 165 
      ... 
     ) 
    ) 
) 

Как уже упоминалось ранее, я не совсем уверен. Если это не поможет, я бы рекомендовал разместить отладки ($ модель) на упомянутой линии

if ($model != $this->alias && isset($this->{$model})) { 
    return $this->{$model}->getColumnType($column); 
} 

С уважением, harpax

+0

поэтому изменение структуры массива не дают разные результаты. Так что я сделал, как вы предложили, и это то, что я получил: торт/ЛИЭС/модель/model.php (строка 949) данные Фатальная ошибка: Вызов функции члена getColumnType() на не-объект in /cake/libs/model/model.php on line 950 Я мог бы видеть, что не так, мое имя модели Datum или datum.php не данные У меня нет очевидного решения в моей голове, это немного глубоко в Торт для меня. Какие-либо предложения? – MrDevin

+0

Я просто взглянул на свой «вид» с тем же отладчиком, и он «Datum» распечатал, а не «данные», как я получил от моего метода «редактирования». Incase, который полезен для любого – MrDevin

0

Вы используете связанные модели?Я построил свою первую структуру с не связанными моделями, и когда я их связал, я получил ту же ошибку. Мне пришлось вернуться и изменить все мои save(), find() и т. Д., Чтобы явно определить поле для контроллера.

Пример:

$total = $this->Flo->find('count', array('conditions' => $conditions, 'order' => 'id DESC')); 

должен был стать

$total = $this->Flo->find('count', array('conditions' => $conditions, 'order' => 'Flo.id DESC')); 

Не уверен, что это дело для вас, но если вы используете связанные модели я думаю, что это стоит посмотреть.

Смежные вопросы