Cakephp saveAll () Неустранимая ошибка: вызов функции-члена getColumnType () - PullRequest
1 голос
/ 14 января 2010

Итак, я создаю конструктор форм. Пользователи будут входить в систему, а затем заполнять формы, созданные администраторами. Я использую 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" метода. На всякий случай, если это кому-нибудь пригодится.

Ответы [ 3 ]

0 голосов
/ 15 января 2010

Используете ли вы связанные модели? Я построил свою первую структуру с неассоциированными моделями, и когда я связал их, я получил ту же ошибку. Мне пришлось вернуться назад и изменить все мои 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'));

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

0 голосов
/ 16 января 2010

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

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

0 голосов
/ 14 января 2010

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

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
            ...
        )
    )
)

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...