我要做的事情:
我想在Cakephp中安装Alkemann的LogableBehavior。
我得到的错误:
当我想进行编辑时,会返回一个错误:
错误:
注意(8):未定义的变量:logData[APP''Model''ABehavior''LogableBehavior.php,第431行]
标准结块错误中给出的上下文:
LogableBehavior::afterSave()-APP''Model''Behavior''LogableBehBehavior.php,第431行ObjectCollection::trigger()-CORE''Cake''Utility''ObjectCollection.php,第130行call_user_func-[内部],行??CakeEventManager::dispatch()-CORE''Cake''Event''CakeEventManager.php,第246行Model::save()-CORE''Cake''Model''Model.php,第1755行Model::saveField()-CORE''Cake''Model''Model.php,第1582行ChantiersController::inPlaceDateUpdate()-APP''Controller''ChantiersController.php,第370行ReflectionMethod::invokeArgs()-[interal],行??控制器::invokeAction()-CORE''Cake''Controller''Controller.php,第485行Dispatcher::_invoke()-CORE''Cake''Routing''Dispatcher.php,第186行Dispatcher::dispatch()-CORE''Cake''Routing''Dispatcher.php,第161行[main]-APP''webroot''index.php,第92行
标准结块错误中给出的代码:
$Model = object(Chantier) {}
$created = false
$keys = array(
(int) 0 => 'id',
(int) 1 => 'Date_de_debut_MOA',
(int) 2 => 'modified'
)
$diff = array(
(int) 1 => 'Date_de_debut_MOA',
(int) 2 => 'modified'
)
$id = '126'
我尝试做的事情:
我检查了所有的安装步骤,根据文件有三个:
Requires the following to work as intended :
*
* - "Log" model ( empty but for a order variable [created DESC]
* - "logs" table with these fields required :
* - id [int] :
* - title [string] : automagically filled with the display field of the model that was modified.
* - created [date/datetime] : filled by cake in normal way
*
* - actsAs = array("Logable"); on models that should be logged
在我看来,我做得很好:
我的日志表
CREATE TABLE IF NOT EXISTS `logs` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(100) NOT NULL,
`created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`description` varchar(400) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=45 ;
我的日志模型:
<?php
App::uses('AppModel', 'Model');
class Log extends AppModel {
var $order=array("Log.created"=>"DESC");
}
在应用程序/模型/Chantier:
var $actsAs = array('Containable','Logable');
然后我搜索有类似问题的人:
- Github
- 谷歌代码
- 面包店
- stackoverflow
一无所获。
让我们深入了解代码:
这是代码。
错误谈到错误线431:
$this->_saveLog($Model, $logData); //line 431
$logData似乎尚未声明。
这一行在一个函数中,afterSave(&$Model,$created)
:
这个函数是一系列的测试,其中第431行被称为最末端。$logData有许多声明,但总是嵌套在if语句中。
function afterSave(&$Model,$created) {
if (isset($this->settings[$Model->alias]['skip']['add']) && $this->settings[$Model->alias]['skip']['add'] && $created) {
return true;
} elseif (isset($this->settings[$Model->alias]['skip']['edit']) && $this->settings[$Model->alias]['skip']['edit'] && !$created) {
return true;
}
$keys = array_keys($Model->data[$Model->alias]);
$diff = array_diff($keys,$this->settings[$Model->alias]['ignore']);
if (sizeof($diff) == 0 && empty($Model->logableAction)) {
return false;
}
if ($Model->id) {
$id = $Model->id;
} elseif ($Model->insertId) {
$id = $Model->insertId;
}
if (isset($this->Log->_schema[$this->settings[$Model->alias]['foreignKey']])) {
$logData['Log'][$this->settings[$Model->alias]['foreignKey']] = $id;
}
if (isset($this->Log->_schema['description'])) {
$logData['Log']['description'] = $Model->alias.' ';
if (isset($Model->data[$Model->alias][$Model->displayField]) && $Model->displayField != $Model->primaryKey) {
$logData['Log']['description'] .= '"'.$Model->data[$Model->alias][$Model->displayField].'" ';
}
if ($this->settings[$Model->alias]['description_ids']) {
$logData['Log']['description'] .= '('.$id.') ';
}
if ($created) {
$logData['Log']['description'] .= __('added',TRUE);
} else {
$logData['Log']['description'] .= __('updated',TRUE);
}
}
if (isset($this->Log->_schema['action'])) {
if ($created) {
$logData['Log']['action'] = 'add';
} else {
$logData['Log']['action'] = 'edit';
}
}
if (isset($this->Log->_schema['change'])) {
$logData['Log']['change'] = '';
$db_fields = array_keys($Model->_schema);
$changed_fields = array();
foreach ($Model->data[$Model->alias] as $key => $value) {
if (isset($Model->data[$Model->alias][$Model->primaryKey]) && !empty($this->old) && isset($this->old[$Model->alias][$key])) {
$old = $this->old[$Model->alias][$key];
} else {
$old = '';
}
if ($key != 'modified'
&& !in_array($key, $this->settings[$Model->alias]['ignore'])
&& $value != $old && in_array($key,$db_fields) )
{
if ($this->settings[$Model->alias]['change'] == 'full') {
$changed_fields[] = $key . ' ('.$old.') => ('.$value.')';
} else if ($this->settings[$Model->alias]['change'] == 'serialize') {
$changed_fields[$key] = array('old'=>$old, 'value'=>$value);
} else {
$changed_fields[] = $key;
}
}
}
$changes = sizeof($changed_fields);
if ($changes == 0) {
return true;
}
if ($this->settings[$Model->alias]['change'] == 'serialize') {
$logData['Log']['change'] = serialize($changed_fields);
} else {
$logData['Log']['change'] = implode(', ',$changed_fields);
}
$logData['Log']['changes'] = $changes;
}
$this->_saveLog($Model, $logData);//line 431
}
我的问题:
理想情况下,我希望了解Behabior的人能就如何修复错误提供一些建议,但任何关于如何调试的通用方法都会被欣然接受。
编辑:我使用Cakephp 2.2.0
您似乎使用了一个非常旧的版本。从那以后,它得到了很大的改进。如果您使用的是cake2.x,这里有一个工作的cake2.x应该是最新的(并且所有测试用例都通过了):https://github.com/dereuromark/tools/blob/2.0/Model/Behavior/LogableBehavior.php
它使用自己的日志表/模型。但除此之外,它应该是非常直接的。logs表的sql在Config / sql / log.sql
中,但可能与您的相同。
这是一个小缺陷,您可以向脚本的制作者报告。
为了防止通知,快速解决方法是在431行之前添加以下内容:
<?php
$logData = (!isset($logData) ? array() : $logData );
$this->_saveLog($Model, $logData);
?>
或者在函数声明之后添加$logData,如下所示:
<?php
function afterSave(&$Model,$created) {
$logData = array();
请记住,通知通常在实时网站上不可见,但修复它们是一个很好的做法:堆栈溢出回答