CakePHP Вызов функции-члена save() для необъекта
Начнем с упрощенной версии моего кода:
Модель: Sku.php
class Sku extends AppModel {
}
Контроллер: SkusController.php
class SkusController extends AppController {
public function admin_add() {
$this->layout = 'admin';
if($this->request->is('post')) {
if($this->Sku->save($this->request->data)) {
// Do stuff
}
else // Do stuff
}
}
}
Вид: Skus > admin_add.ctp
<?php echo $this->Form->create('Sku', array('type'=>'file')); ?>
<?php echo $this->Form->input('Sku.item_no')); ?>
<?php echo $this->Form->input('Sku.size'); ?>
<?php echo $this->Form->input('Sku.color'); ?>
<button type="submit">Save SKU</button>
<?php echo $this->Form->end(); ?>
Когда я отправляю форму, я получаю сообщение об ошибке Вызов функции-члена save() для необъекта. В начале моего файла контроллера, если я добавлю следующее, все работает нормально, и новая строка вставляется в таблицу skus.
public $uses = 'Sku';
Если бы я использовал все правильные соглашения об именах, не мог бы я пропустить предыдущую строку? Более того, если я изменю все имена файлов и классов на Test, следуя тем же соглашениям об именах, это будет работать без переменной $ users. Это заставляет меня поверить, что у меня есть какой-то конфликт в другом месте моего кода. Любые предложения относительно того, почему это может происходить или где искать потенциальную проблему?
Заранее спасибо!
2 ответа
Редактировать: Похоже, что инфлектор не может превратить множественное число в единственное число: http://dogmatic69.com/inflector/Skus. Так что либо вы должны использовать $ использование, либо вы добавляете правило к инфлектору. Смотрите конфигурацию инфлектора.
Для свойства Controller::$ вы не используете массив или логическое значение.
public $uses = 'Sku';
Должно быть:
public $uses = array('Sku');
На самом деле вам вообще не нужно его определять, если контроллер и модель соответствуют соглашениям.
Прочитайте документацию http://api.cakephp.org/2.4/class-Controller.html$ использует
$uses
Массив, содержащий имена классов моделей, которые использует этот контроллер.Пример:
public $uses = array('Product', 'Post', 'Comment');
Может быть установлено несколько значений для выражения различных опций:
- true Использовать название модели по умолчанию.
- array () Использовать только модели, определенные в родительском классе.
- false Не используйте модели вообще, не объединяйте также с родительским классом.
- массив ('Post', 'Comment') Используйте только модели Post и Comment. Модели также будут объединены с родительским классом.
Значение по умолчанию верно.
Попробуйте следующий код, я думаю, он будет работать
Модель: Sku.php
class Sku extends AppModel {
var $name = 'Sku';
}