在LAMP设置上使用CakePHP 2.4.9(Ubuntu 13.10,Apache 2,MySQL Server 5.5,PHP 5.5.3)。
尝试将模型(用户)打包到插件中,但我遇到了一个奇怪的问题:
在两个不同的操作中,我使用save()
来创建或更新用户。这有效:
if ($this->request->data) {
if ($this->User->create() && $this->User->save($this->request->data)) {
$this->Session->setFlash(_('<strong>Congratulations!</strong> Successfully created a new user.'), 'default', array('class' => 'alert alert-success'));
$this->redirect(array('action' => 'register'));
} else {
$this->Session->setFlash(_('<strong>Oops!</strong> Could not create a new user.'), 'default', array('class' => 'alert alert-danger'));
}
}
但这不起作用:
if ($this->request->data) {
$this->User->id = $id;
if ($this->User->save($this->request->data)) {
$this->Session->setFlash(_('<strong>Congratulations!</strong> Successfully updated your user account.'), 'default', array('class' => 'alert alert-success'));
$this->redirect(array('action' => 'settings'));
} else {
$this->Session->setFlash(_('<strong>Oops!</strong> Could not update user account.'), 'default', array('class' => 'alert alert-danger'));
}
}
当我尝试保存后一个示例(“更新操作”)时,它给出了以下错误:
致命错误
错误:在非对象上调用成员函数getColumnType() 文件:/home/johan/sites/userplugin/lib/Cake/Model/Model.php 行:1412
注意:如果要自定义此错误消息,请创建app / View / Errors / fatal_error.ctp
表单非常标准,我使用FormHelper
创建表单和字段。但是在更新表单中,我有一个带有ID的隐藏字段:
<?php echo $this->Form->hidden('id'); ?>
如果我删除它,更新表单会通过,但会创建一个新对象!所以就像$this->User->id = $id
没有做任何事情一样。我目前手动设置$id
,所以$id = 1
...
我尝试搜索类似的问题,但没有找到任何东西。一个讨论提到了ID字段,也许它没有正确设置?但我找不到任何解决方案。
答案 0 :(得分:1)
不同的代码排列不是直接与问题相关 - 或者可能只是表明另一个不同的问题=)。
line of code that is failing就是这样:
$this->{$model}->getColumnType($column);
其中$this
是用户模型实例。 可能的含义是,当它失败时,该对象不是您希望检查的类:
debug(get_class($this->User));
在您的控制器中,很可能是AppModel
。
这种情况的典型原因&#34;有时它起作用,有时它不会&#34;问题是有一些使用插件前缀的模型的引用,有一些不是,即
。<?php
App::uses('MyPluginAppModel', 'MyPlugin.Model');
class Group extends MyPluginAppModel {
public $hasMany = array(
'User' => array(
'className' => 'User'
),
#'User' # Or like this
)
}
它应该是这样的:
<?php
App::uses('MyPluginAppModel', 'MyPlugin.Model');
class Group extends MyPluginAppModel {
public $hasMany = array(
'User' => array(
'className' => 'MyPlugin.User'
),
#'MyPlugin.User' # Or like this
)
}
这里发生的是它取决于首次访问相关模型的方式,以及在类注册表中填充User
键的内容,以及为该模型引用的所有后续请求返回的内容。
要解决此问题,请确保始终使用正确的插件前缀引用模型(如果它不是插件模型,则当然没有前缀)。
答案 1 :(得分:1)
我最终发现的(并且应该早先排除,实际上是)在我的AppModel
中定义了一个数组,用于配置插件,命名与我的插件相同是愚蠢的,也许是临界延迟
即。如果您的插件名为MyPlugin
,请不要在AppModel中定义$myplugin
数组。
答案 2 :(得分:0)
试试这个
//控制器
public function edit(){
if (!empty($this->request->data)) {
//if you want to save on User object
$this->User->id = $this->request->data['User']['id'];
if ($this->User->save($this->request->data)) {
.................................
$this->Session->setFlash(_('<strong>Congratulations!</strong> Successfully updated your user account.'), 'default', array('class' => 'alert alert-success'));
$this->redirect(array('action' => 'settings'));
} else {
$this->Session->setFlash(_('<strong>Oops!</strong> Could not update user account.'), 'default', array('class' => 'alert alert-danger'));
}
} else {
$this->request->data = $this->User->read(null, $id);
}
}
//编辑视图
<?php
echo $this->Form->create('User');
echo $this->Form->hidden('id');
echo $this->Form->input('first_name');
..
..
.
echo $this->Form->end(__('Save'));
?>