0

私がやろうとしていること:

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');

次に、同様の問題を抱えている人を検索します。

何も見つかりませんでした。

コードに飛び込みましょう:

ここにコードがあります。

エラーは、エラー行 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を使用しています

4

2 に答える 2

1

非常に古いバージョンを使用しているようです。それ以来、大幅に改善されました。Cake2.x を使用している場合は、最新の動作するものを次に示します (すべてのテスト ケースに合格します): https://github.com/dereuromark/tools/blob/2.0/Model/Behavior/LogableBehavior.php

独自のログ テーブル/モデルを使用します。それ以外はかなり簡単です。ログテーブルのSQLは入っていますが、Config / sql / log.sqlおそらくあなたのものと同じはずです。

于 2012-08-17T09:06:37.113 に答える
0

これは、スクリプトの作成者に対処できる小さな欠陥です。

通知を防ぐための簡単な修正は、行 431 の直前に次を追加することです。

<?php     
     $logData = (!isset($logData) ? array() : $logData );
     $this->_saveLog($Model, $logData);
?>

または、次のように関数宣言の直後に $logData を追加します。

<?php
    function afterSave(&$Model,$created) {
        $logData = array();

通常、通知はライブ Web サイトでは表示されませんが、修正することをお勧めします: Stackoverflow の回答

于 2012-08-17T08:56:09.300 に答える