Файл: core/classes/actions.class.php
Строк: 404
<?php
/******************************************************************************/
// //
// InstantCMS v1.10 //
// http://www.instantcms.ru/ //
// //
// written by InstantCMS Team, 2007-2012 //
// produced by InstantSoft, (www.instantsoft.ru) //
// //
// LICENSED BY GNU/GPL v2 //
// //
/******************************************************************************/
class cmsActions {
private static $instance;
private static $defaultLogArray = array('pubdate'=>'','user_id'=>'','object'=>'','object_url'=>'','object_id'=>'','target'=>'','target_url'=>'','target_id'=>'','description'=>'','is_friends_only'=>'','is_users_only'=>'');
private $show_targets = true;
private $only_friends = false;
// ============================================================================ //
// ============================================================================ //
private function __construct() {
$this->inDB = cmsDatabase::getInstance();
}
private function __clone() {}
public static function getInstance() {
if (self::$instance === null) {
self::$instance = new self;
}
return self::$instance;
}
// ============================================================================ //
// ============================================================================ //
public static function checkLogArrayValues($input_array = array()) {
if(!$input_array || !is_array($input_array)) { return array(); }
// убираем ненужные ячейки массива
foreach($input_array as $k=>$v){
if (!isset(self::$defaultLogArray[$k])) { unset($input_array[$k]); continue; }
$input_array[$k] = cmsDatabase::getInstance()->escape_string(str_replace(array('r', 'n'), ' ', $input_array[$k]));
$input_array[$k] = preg_replace('/[hide(.*?)](.*?)[/hide]/sui', '', $input_array[$k]);
$input_array[$k] = preg_replace('/[hide(.*?)](.*?)$/sui', '', $input_array[$k]);
}
return $input_array;
}
// ============================================================================ //
// ============================================================================ //
/**
* Регистрирует новый тип действия
* @param str $component
* @param array $action (name, title, message)
* @return bool
*/
public static function registerAction($component, $action){
$action['is_tracked'] = 1;
$action['is_visible'] = 1;
$action['component'] = $component;
cmsDatabase::getInstance()->insert('cms_actions', $action);
return true;
}
// ============================================================================ //
// ============================================================================ //
/**
* Находит описание действия по его названию
* @param str $action_name
* @param bool $only_tracked
* @return array | false
*/
public static function getAction($action_name, $only_tracked=true){
$tracked = $only_tracked ? 'AND is_tracked=1' : '';
$action = cmsDatabase::getInstance()->get_fields('cms_actions', "name='{$action_name}' {$tracked}", '*');
return is_array($action) ? cmsCore::callEvent('GET_ACTION', $action) : false;
}
// ============================================================================ //
// ============================================================================ //
/**
* Добавляет действие в ленту активности
* @param str $action_name
* @param array $params (object, object_url, target, target_url, description)
* @return bool
*/
public static function log($action_name, $params){
$params = self::checkLogArrayValues($params);
if(!$params) { return false; }
$inUser = cmsUser::getInstance();
if (!$inUser->id && $action_name != 'add_user'){ return false; }
$action = self::getAction($action_name);
if (!$action) { return false; }
$params['user_id'] = !empty($params['user_id']) ? $params['user_id'] : $inUser->id;
$params['action_id'] = $action['id'];
$params['pubdate'] = date("Y-m-d H:i:s");
cmsDatabase::getInstance()->insert('cms_actions_log', cmsCore::callEvent('LOG_ACTION', $params));
return true;
}
/**
* Удаляет из ленты активности все события определенного типа для указанного объекта
* @param string $action_name Тип события
* @param int $object_id Идентификатор объекта
* @return bool
*/
public static function removeObjectLog($action_name, $object_id, $user_id = false){
$arg = func_get_args();
cmsCore::callEvent('DELETE_OBJECT_LOG', $arg);
$action = self::getAction($action_name);
$usr_sql = $user_id ? "AND user_id = {$user_id}" : '';
cmsDatabase::getInstance()->delete('cms_actions_log', "action_id = '{$action['id']}' AND object_id = '{$object_id}' $usr_sql");
return true;
}
/**
* Удаляет из ленты активности все события определенного типа для указанной цели
* @param string $action_name Тип события
* @param int $target_id Идентификатор цели
* @return bool
*/
public static function removeTargetLog($action_name, $target_id, $user_id = false){
$arg = func_get_args();
cmsCore::callEvent('DELETE_TARGET_LOG', $arg);
$action = self::getAction($action_name);
$usr_sql = $user_id ? "AND user_id = {$user_id}" : '';
cmsDatabase::getInstance()->delete('cms_actions_log', "action_id = '{$action['id']}' AND target_id = '{$target_id}' $usr_sql");
return true;
}
public static function removeLogById($id){
cmsCore::callEvent('DELETE_LOG', $id);
return cmsDatabase::getInstance()->delete('cms_actions_log', "id = '{$id}'");
}
/**
* Обновляет запись ленты
* @return bool
*/
public static function updateLog($action_name, $params, $object_id=0, $target_id=0){
$inDB = cmsDatabase::getInstance();
$params = self::checkLogArrayValues($params);
if(!$params) { return false; }
if(!$object_id && !$target_id) { return false; }
$arg = func_get_args();
cmsCore::callEvent('UPDATE_LOG', $arg);
// Получаем id записи
$action = self::getAction($action_name);
if (!$action) { return false; }
$set = '';
// формируем запрос на вставку в базу
foreach($params as $field=>$value){
$set .= "{$field} = '{$value}',";
}
$set = rtrim($set, ',');
// если обновляем сам объект
if($object_id){
$inDB->query("UPDATE cms_actions_log SET {$set} WHERE action_id='{$action['id']}' AND object_id='{$object_id}' LIMIT 1");
}
// если обновляем все место назначения
if($target_id){
$inDB->query("UPDATE cms_actions_log SET {$set} WHERE action_id='{$action['id']}' AND target_id='{$target_id}'");
}
return true;
}
// ============================================================================ //
// ============================================================================ //
/**
* Управляет показом категорий, в которых находятся объекты вызвавшие события
* @param bool $show Показывать категории?
*
*/
public function showTargets($show) {
$this->show_targets = $show;
return;
}
/**
* Включает режим показа только событий друзей
*
*/
public function onlyMyFriends(){
$inUser = cmsUser::getInstance();
$friends = cmsUser::getFriends($inUser->id);
if (!$friends){ $this->inDB->where('1=0'); return; }
$f_list = array();
foreach($friends as $friend){
$f_list[] = $friend['id'];
}
$f_list = rtrim(implode(',', $f_list), ',');
if ($f_list){
$this->inDB->where("log.user_id IN ({$f_list})");
} else {
$this->inDB->where('1=0');
}
$this->only_friends = true;
return;
}
/**
* Показывает события определенного юзера
*
*/
public function whereUserIs($user_id){
if ($user_id){
$this->inDB->where("log.user_id = '$user_id'");
} else {
$this->inDB->where('1=0');
}
return;
}
public function onlySelectedTypes($types) {
if (!is_array($types)){ $this->inDB->where('1=0'); return; }
$t_list = array();
foreach($types as $type){
$t_list[] = $type;
}
$t_list = rtrim(implode(',', $t_list), ',');
$this->inDB->where("a.id IN ({$t_list})");
return;
}
// ============================================================================ //
// ============================================================================ //
/**
* Возвращает количество записей по условиям
* @return int
*/
public function getCountActions() {
$inUser = cmsUser::getInstance();
if (!$this->only_friends){ $this->inDB->where('log.is_friends_only = 0'); }
if (!$inUser->id) { $this->inDB->where('log.is_users_only = 0'); }
$sql = "SELECT 1
FROM cms_actions_log log
LEFT JOIN cms_actions a ON a.id = log.action_id AND a.is_visible = 1
WHERE 1=1 {$this->inDB->where}
";
$result = $this->inDB->query($sql);
return $this->inDB->num_rows($result);
}
// ============================================================================ //
// ============================================================================ //
/**
* Возвращает массив событий для ленты активности
* @return array
*/
public function getActionsLog(){
$inUser = cmsUser::getInstance();
if (!$this->only_friends){ $this->inDB->where('log.is_friends_only = 0'); }
if (!$inUser->id) { $this->inDB->where('log.is_users_only = 0'); }
$sql = "SELECT log.id as id,
log.user_id,
log.object as object,
log.object_url as object_url,
log.target as target,
log.target_url as target_url,
log.pubdate as pubdate,
log.description as description,
a.message as message,
a.name as name,
u.nickname as user_nickname,
u.login as user_login
FROM cms_actions_log log
LEFT JOIN cms_actions a ON a.id = log.action_id AND a.is_visible = 1
LEFT JOIN cms_users u ON u.id = log.user_id
WHERE 1=1 {$this->inDB->where}
ORDER BY log.id DESC
";
if ($this->inDB->limit){
$sql .= "LIMIT {$this->inDB->limit}";
}
$result = $this->inDB->query($sql);
// Сбрасываем условия
$this->inDB->resetConditions();
if (!$this->inDB->num_rows($result)){ return false; }
$actions = array();
while($action = $this->inDB->fetch_assoc($result)){
$action['object_link'] = $action['target_link'] = '';
if ($this->show_targets){
$action['message'] = str_replace('|', '', $action['message']);
} else {
$action['message'] = mb_substr($action['message'], 0, mb_strpos($action['message'], '|'));
}
if ($action['object']){
$action['object_link'] = $action['object_url'] ? '<a href="'.$action['object_url'].'" class="act_obj_'.$action['name'].'">'.$action['object'].'</a>' : $action['object'];
}
if ($action['target']){
$action['target_link'] = '<a href="'.$action['target_url'].'" class="act_tgt_'.$action['name'].'">'.$action['target'].'</a>';
}
if ($action['message']){
$action['message'] = sprintf($action['message'], $action['object_link'], $action['target_link']);
}
$action['is_new'] = (bool)(strtotime($action['pubdate']) > strtotime($inUser->logdate));
$action['user_url'] = cmsUser::getProfileURL($action['user_login']);
$action['pubdate'] = cmsCore::dateDiffNow($action['pubdate']);
$actions[] = $action;
}
return cmsCore::callEvent('GET_ACTIONS', $actions);
}
// ============================================================================ //
// ============================================================================ //
/**
* Удаляет старые записи ленты
* @param int $pubdays
* @return bool
*/
public static function removeOldLog($pubdays = 60){
return cmsDatabase::getInstance()->delete('cms_actions_log', "DATEDIFF(NOW(), pubdate) > '{$pubdays}'");
}
// ============================================================================ //
// ============================================================================ //
/**
* Удаляет из ленты записи одного пользователя
* @param int $user_id
* @return bool
*/
public static function removeUserLog($user_id){
if (!$user_id) { return false; }
return cmsDatabase::getInstance()->delete('cms_actions_log', "user_id = '$user_id'");
}
// ============================================================================ //
// ============================================================================ //
/**
* Получает массив компонентов, зарегистрированных в ленте активности
* @return array
*/
public static function getActionsComponents(){
return cmsDatabase::getInstance()->get_table('cms_components com INNER JOIN cms_actions act ON act.component = com.link', 'com.internal=0 AND com.published=1 GROUP BY com.link', 'com.title, com.link');
}
}
?>