Version: current

      1 <?php
      2
      3 /**
      4  * Запись лога действий в CMS
      5  *
      6  * @author inxo, dvp, kozin
      7  */
      8 class LogItem extends DataObject {
      9
     10     static $db = array(
     11         'Class' => 'Varchar(255)',
     12         'ItemID' => 'Int',
     13         'ItemTitle' => 'Varchar(255)',
     14         'Action' => "Enum('Create,Delete,Modify,Login,Logout,Publish,Unpublish')", // Что
     15         'MemberID' => 'Int', // Кто
     16         'MemberLogin' => 'Varchar(50)',
     17         'IP' => 'Varchar(15)'
     18     );
     19
     20     static $indexes = array(
     21         'Class' => true,
     22         'Created' => true,
     23         'Action' => true,
     24         'MemberID' => true,
     25     );
     26
     27     static $searchable_fields = array('Class', 'ItemTitle', 'ItemID'=>'ExactMatchFilter', 'Action', 'MemberID', 'IP');
     28     static $summary_fields = array('LastEdited', 'MemberTitle', 'ActionTitle', 'ClassTitle', 'ItemTitle', 'ItemID', 'IP');
     29     static $default_sort = 'ID DESC';
     30
     31     /**
     32      * Флаг - разрешено ли протоколирование
     33      */
     34     private static $enabled = false;
     35
     36     /**
     37      * Список запрещенных к протоколированию классов
     38      *
     39      * по-умолчанию: сам класс логгирования и треккинг файлов
     40      */
     41     private static $disabled_classes = array('LogItem', 'DataObjectFileTracking');
     42
     43     /**
     44      * Разрешает/запрещает протоколирование в целом
     45      *
     46      * @param bool $value
     47      */
     48     static function enable($value = true) {
     49         self::$enabled = $value;
     50     }
     51
     52     /**
     53      * Добавляет класс в список исключений для протоколирования
     54      *
     55      * @param string $class
     56      */
     57     static function disable_class($class) {
     58         self::$disabled_classes[] = $class;
     59     }
     60
     61     /**
     62      *  Проверяет можно ли логировать данный объект
     63      *
     64      * @param array $data
     65      *
     66      * @return bool
     67      */
     68     static function check($data = null) {
     69         if (!self::$enabled) return false;
     70         if (is_array($data) && isset($data['Class']) && array_search($data['Class'], self::$disabled_classes) !== false) return false;
     71         return true;
     72     }
     73
     74     /**
     75      * Добавляет запись лога если это разрешено
     76      *
     77      * @param array $data
     78      */
     79     static function add($data) {
     80         if (!self::check($data)) return;
     81
     82         $data['MemberID'] = Member::currentUserID();
     83         $member = Member::currentUser();
     84         if ($member) {
     85             //$loginField = Member::get_unique_identifier_field();
     86             $data['MemberLogin'] = $member->Title;
     87         }
     88         $data['IP'] = self::getUserIP();
     89         $log = new LogItem($data);
     90         $log->write();
     91     }
     92
     93     static function getUserIP() {
     94         // нельзя доверять данным переданным браузером (HTTP_*)
     95         return $_SERVER['REMOTE_ADDR'];
     96     }
     97
     98     static function get_member_name($id) {
     99         if ($id) {
    100             $title = '';
    101             if ($member = DataObject::get_by_id('Member', $id)) {
    102                 $title = $member->getField(Member::get_unique_identifier_field());
    103             }
    104             return $title . ' (#' . $id . ')';
    105         }
    106         return '-';
    107     }
    108
    109     static function get_class_name($class) {
    110         $className = $class;
    111         if (class_exists($class) && $title = singleton($class)->i18n_singular_name()) {
    112             $className = $title;
    113             if (Director::isDev()) $className .= ' (' . $class . ')';
    114         }
    115         return $className;
    116     }
    117
    118     function canEdit($member = NULL) {
    119         return false;
    120     }
    121
    122     function getClassTitle() {
    123         return self::get_class_name($this->Class);
    124     }
    125
    126     function getActionTitle() {
    127         return _t("Logs.Action" . $this->Action, $this->Action);
    128     }
    129
    130     function getMemberTitle() {
    131         return ($this->MemberLogin) ? $this->MemberLogin . ' (#'. $this->MemberID . ')' : self::get_member_name($this->MemberID);
    132     }
    133
    134     function getItemTitle() {
    135         if ($this->getField('ItemTitle')) return $this->getField('ItemTitle');
    136         if ($this->ItemID) {
    137             if ($this->Class && class_exists($this->Class) && $item = DataObject::get_by_id($this->Class, $this->ItemID)) return sprintf('%s (#%d)', $item->Title, $this->ItemID);
    138             return sprintf('(#%d)', $this->ItemID);
    139         }
    140         return '';
    141     }
    142
    143     function fieldLabels($relations = true) {
    144         $labels = parent::fieldLabels($relations);
    145         $labels['ClassTitle'] = _t('LogItem.ClassTitle', 'Class');
    146         $labels['LastEdited'] = _t('LogItem.LastEdited', 'Date');
    147         $labels['ActionTitle'] = _t('LogItem.ActionTitle', 'Action');
    148         $labels['MemberTitle'] = _t('LogItem.MemberTitle', 'Member');
    149         $labels['ItemTitle'] = _t('LogItem.ItemTitle', 'Item');
    150         return $labels;
    151     }
    152 }
    153

[Raise a SilverStripe Framework issue/bug](https://github.com/silverstripe/silverstripe-framework/issues/new)
- [Raise a SilverStripe CMS issue/bug](https://github.com/silverstripe/silverstripe-cms/issues/new)
- Please use the Silverstripe Forums to ask development related questions. -