私がやろうとしていること:
Cakephp にAlkemannによる LogableBehaviorをインストールしたいと考えています。
私が得るエラー:
編集しようとすると、エラーが返されます。
エラー:
注(8): 未定義の変数: logData [APP\Model\Behavior\LogableBehavior.php, line 431]
標準のcakephpエラーで与えられたコンテキスト:
LogableBehavior::afterSave() - APP\Model\Behavior\LogableBehavior.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() - [内部]、行 ?? Controller::invokeAction() - CORE\Cake\Controller\Controller.php、485行目 Dispatcher::_invoke() - CORE\Cake\Routing\Dispatcher.php、186行目 Dispatcher::dispatch() - CORE\Cake\Routing \Dispatcher.php、161 行目 [メイン] - APP\webroot\index.php、92 行目
標準のcakephpエラーで与えられたコード:
$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'
私がやろうとしたこと:
ドキュメントによると、3つのインストール手順が適切に実行されていることを確認しました。
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");
}
アプリ/モデル/シャンティエ:
var $actsAs = array('Containable','Logable');
次に、同様の問題を抱えている人を検索します。
- ギットハブ
- Google コード
- パン屋
- スタックオーバーフロー
何も見つかりませんでした。
コードに飛び込みましょう:
ここにコードがあります。
エラーは、エラー行 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
}
私の質問:
理想的には、エラーを修正する方法についてこの動作を知っている人からのアドバイスが欲しいのですが、それをデバッグする方法に関する一般的な方法は喜んで受け入れられます。
編集:Cakephp 2.2.0を使用しています