mirror of
https://github.com/Mibew/mibew.git
synced 2025-03-03 18:38:31 +03:00
Add "history" controller
This commit is contained in:
parent
1106a510da
commit
a93517dcf1
@ -578,11 +578,9 @@ function setup_chatview_for_operator(Thread $thread, $operator)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Set history window params
|
// Set history window params
|
||||||
$history_link_params = array("userid" => (string) $thread->userId);
|
$data['chat']['links']['history'] = MIBEW_WEB_ROOT
|
||||||
$data['chat']['links']['history'] = add_params(
|
. '/operator/history/user/'
|
||||||
MIBEW_WEB_ROOT . "/operator/userhistory.php",
|
. ((string) $thread->userId);
|
||||||
$history_link_params
|
|
||||||
);
|
|
||||||
|
|
||||||
// Set tracking params
|
// Set tracking params
|
||||||
if (Settings::get('enabletracking')) {
|
if (Settings::get('enabletracking')) {
|
||||||
|
274
src/mibew/libs/classes/Mibew/Controller/HistoryController.php
Normal file
274
src/mibew/libs/classes/Mibew/Controller/HistoryController.php
Normal file
@ -0,0 +1,274 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
* Copyright 2005-2014 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Mibew\Controller;
|
||||||
|
|
||||||
|
use Mibew\Database;
|
||||||
|
use Mibew\Thread;
|
||||||
|
use Symfony\Component\HttpFoundation\Request;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Contains actions for history-related pages.
|
||||||
|
*/
|
||||||
|
class HistoryController extends AbstractController
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Generate content for "history" route.
|
||||||
|
*
|
||||||
|
* @param Request $request
|
||||||
|
* @return string Rendered page content
|
||||||
|
*/
|
||||||
|
public function indexAction(Request $request)
|
||||||
|
{
|
||||||
|
setlocale(LC_TIME, getstring("time.locale"));
|
||||||
|
|
||||||
|
$page = array();
|
||||||
|
$operator = $request->attributes->get('_operator');
|
||||||
|
$query = $request->query->has('q')
|
||||||
|
? myiconv(getoutputenc(), MIBEW_ENCODING, $request->query->get('q'))
|
||||||
|
: false;
|
||||||
|
|
||||||
|
$search_type = $request->query->get('type');
|
||||||
|
if (!in_array($search_type, array('all', 'message', 'operator', 'visitor'))) {
|
||||||
|
$search_type = 'all';
|
||||||
|
}
|
||||||
|
|
||||||
|
$search_in_system_messages = ($request->query->get('insystemmessages') == 'on') || !$query;
|
||||||
|
|
||||||
|
if ($query !== false) {
|
||||||
|
$db = Database::getInstance();
|
||||||
|
$groups = $db->query(
|
||||||
|
("SELECT {chatgroup}.groupid AS groupid, vclocalname " .
|
||||||
|
"FROM {chatgroup} " .
|
||||||
|
"ORDER BY vclocalname"),
|
||||||
|
null,
|
||||||
|
array('return_rows' => Database::RETURN_ALL_ROWS)
|
||||||
|
);
|
||||||
|
|
||||||
|
$group_name = array();
|
||||||
|
foreach ($groups as $group) {
|
||||||
|
$group_name[$group['groupid']] = $group['vclocalname'];
|
||||||
|
}
|
||||||
|
|
||||||
|
$values = array(
|
||||||
|
':query' => "%{$query}%",
|
||||||
|
':invitation_accepted' => Thread::INVITATION_ACCEPTED,
|
||||||
|
':invitation_not_invited' => Thread::INVITATION_NOT_INVITED,
|
||||||
|
);
|
||||||
|
|
||||||
|
$search_conditions = array();
|
||||||
|
if ($search_type == 'message' || $search_type == 'all') {
|
||||||
|
$search_conditions[] = "({chatmessage}.tmessage LIKE :query"
|
||||||
|
. ($search_in_system_messages
|
||||||
|
? ''
|
||||||
|
: " AND ({chatmessage}.ikind = :kind_user OR {chatmessage}.ikind = :kind_agent)")
|
||||||
|
. ")";
|
||||||
|
if (!$search_in_system_messages) {
|
||||||
|
$values[':kind_user'] = Thread::KIND_USER;
|
||||||
|
$values[':kind_agent'] = Thread::KIND_AGENT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ($search_type == 'operator' || $search_type == 'all') {
|
||||||
|
$search_conditions[] = "({chatthread}.agentName LIKE :query)";
|
||||||
|
}
|
||||||
|
if ($search_type == 'visitor' || $search_type == 'all') {
|
||||||
|
$search_conditions[] = "({chatthread}.userName LIKE :query)";
|
||||||
|
$search_conditions[] = "({chatthread}.remote LIKE :query)";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Load threads
|
||||||
|
list($threads_count) = $db->query(
|
||||||
|
("SELECT COUNT(DISTINCT {chatthread}.dtmcreated) "
|
||||||
|
. "FROM {chatthread}, {chatmessage} "
|
||||||
|
. "WHERE {chatmessage}.threadid = {chatthread}.threadid "
|
||||||
|
. "AND ({chatthread}.invitationstate = :invitation_accepted "
|
||||||
|
. "OR {chatthread}.invitationstate = :invitation_not_invited) "
|
||||||
|
. "AND (" . implode(' OR ', $search_conditions) . ")"),
|
||||||
|
$values,
|
||||||
|
array(
|
||||||
|
'return_rows' => Database::RETURN_ONE_ROW,
|
||||||
|
'fetch_type' => Database::FETCH_NUM,
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
$pagination_info = pagination_info($threads_count);
|
||||||
|
|
||||||
|
if ($threads_count && $pagination_info) {
|
||||||
|
$page['pagination'] = $pagination_info;
|
||||||
|
|
||||||
|
$limit_start = intval($pagination_info['start']);
|
||||||
|
$limit_end = intval($pagination_info['end'] - $pagination_info['start']);
|
||||||
|
|
||||||
|
$threads_list = $db->query(
|
||||||
|
("SELECT DISTINCT {chatthread}.* "
|
||||||
|
. "FROM {chatthread}, {chatmessage} "
|
||||||
|
. "WHERE {chatmessage}.threadid = {chatthread}.threadid "
|
||||||
|
. "AND ({chatthread}.invitationstate = :invitation_accepted "
|
||||||
|
. "OR {chatthread}.invitationstate = :invitation_not_invited) "
|
||||||
|
. "AND (" . implode(' OR ', $search_conditions) . ") "
|
||||||
|
. "ORDER BY {chatthread}.dtmcreated DESC "
|
||||||
|
. "LIMIT " . $limit_start . ", " . $limit_end),
|
||||||
|
$values,
|
||||||
|
array('return_rows' => Database::RETURN_ALL_ROWS)
|
||||||
|
);
|
||||||
|
|
||||||
|
foreach ($threads_list as $item) {
|
||||||
|
$thread = Thread::createFromDbInfo($item);
|
||||||
|
|
||||||
|
$group_name_set = ($thread->groupId
|
||||||
|
&& $thread->groupId != 0
|
||||||
|
&& isset($group_name[$thread->groupId]));
|
||||||
|
|
||||||
|
$page['pagination.items'][] = array(
|
||||||
|
'threadId' => $thread->id,
|
||||||
|
'userName' => to_page($thread->userName),
|
||||||
|
'userAddress' => get_user_addr(to_page($thread->remote)),
|
||||||
|
'agentName' => to_page($thread->agentName),
|
||||||
|
'messageCount' => to_page($thread->messageCount),
|
||||||
|
'groupName' => ($group_name_set
|
||||||
|
? to_page($group_name[$thread->groupId])
|
||||||
|
: false),
|
||||||
|
'chatTime' => $thread->modified - $thread->created,
|
||||||
|
'chatCreated' => $thread->created,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$page['pagination'] = false;
|
||||||
|
$page['pagination.items'] = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$page['formq'] = to_page($query);
|
||||||
|
} else {
|
||||||
|
$page['pagination'] = false;
|
||||||
|
$page['pagination.items'] = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$page['formtype'] = $search_type;
|
||||||
|
$page['forminsystemmessages'] = $search_in_system_messages;
|
||||||
|
$page['title'] = getlocal("page_analysis.search.title");
|
||||||
|
$page['menuid'] = "history";
|
||||||
|
$page['canSearchInSystemMessages'] = ($search_type != 'all')
|
||||||
|
&& ($search_type != 'message');
|
||||||
|
|
||||||
|
$page = array_merge($page, prepare_menu($operator));
|
||||||
|
|
||||||
|
return $this->render('history', $page);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generate content for "history_thread" route.
|
||||||
|
*
|
||||||
|
* @param Request $request
|
||||||
|
* @return string Rendered page content
|
||||||
|
*/
|
||||||
|
public function threadAction(Request $request)
|
||||||
|
{
|
||||||
|
setlocale(LC_TIME, getstring("time.locale"));
|
||||||
|
|
||||||
|
$operator = $request->attributes->get('_operator');
|
||||||
|
$page = array();
|
||||||
|
|
||||||
|
// Load thread info
|
||||||
|
$thread = Thread::load($request->attributes->get('thread_id'));
|
||||||
|
$group = group_by_id($thread->groupId);
|
||||||
|
|
||||||
|
$thread_info = array(
|
||||||
|
'userName' => to_page($thread->userName),
|
||||||
|
'userAddress' => get_user_addr(to_page($thread->remote)),
|
||||||
|
'userAgentVersion' => get_user_agent_version(to_page($thread->userAgent)),
|
||||||
|
'agentName' => to_page($thread->agentName),
|
||||||
|
'chatTime' => ($thread->modified - $thread->created),
|
||||||
|
'chatStarted' => $thread->created,
|
||||||
|
'groupName' => to_page(get_group_name($group)),
|
||||||
|
);
|
||||||
|
$page['threadInfo'] = $thread_info;
|
||||||
|
|
||||||
|
// Build messages list
|
||||||
|
$last_id = -1;
|
||||||
|
$messages = $thread->getMessages(false, $last_id);
|
||||||
|
$page['threadMessages'] = json_encode($messages);
|
||||||
|
$page['title'] = getlocal("thread.chat_log");
|
||||||
|
|
||||||
|
$page = array_merge($page, prepare_menu($operator, false));
|
||||||
|
|
||||||
|
return $this->render('history_thread', $page);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generate content for "history_user" route.
|
||||||
|
*
|
||||||
|
* @param Request $request
|
||||||
|
* @return string Rendered page content
|
||||||
|
*/
|
||||||
|
public function userAction(Request $request)
|
||||||
|
{
|
||||||
|
setlocale(LC_TIME, getstring("time.locale"));
|
||||||
|
|
||||||
|
$operator = $request->attributes->get('_operator');
|
||||||
|
$user_id = $request->attributes->get('user_id', '');
|
||||||
|
$page = array();
|
||||||
|
|
||||||
|
if (!empty($user_id)) {
|
||||||
|
$db = Database::getInstance();
|
||||||
|
|
||||||
|
$query = "SELECT {chatthread}.* "
|
||||||
|
. "FROM {chatthread} "
|
||||||
|
. "WHERE userid=:user_id "
|
||||||
|
. "AND (invitationstate = :invitation_accepted "
|
||||||
|
. "OR invitationstate = :invitation_not_invited) "
|
||||||
|
. "ORDER BY dtmcreated DESC";
|
||||||
|
|
||||||
|
$found = $db->query(
|
||||||
|
$query,
|
||||||
|
array(
|
||||||
|
':user_id' => $user_id,
|
||||||
|
':invitation_accepted' => Thread::INVITATION_ACCEPTED,
|
||||||
|
':invitation_not_invited' => Thread::INVITATION_NOT_INVITED,
|
||||||
|
),
|
||||||
|
array('return_rows' => Database::RETURN_ALL_ROWS)
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
$found = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
$page = array_merge($page, prepare_menu($operator));
|
||||||
|
|
||||||
|
// Setup pagination
|
||||||
|
$pagination = setup_pagination($found, 6);
|
||||||
|
$page['pagination'] = $pagination['info'];
|
||||||
|
$page['pagination.items'] = $pagination['items'];
|
||||||
|
|
||||||
|
if (!empty($page['pagination.items'])) {
|
||||||
|
foreach ($page['pagination.items'] as $key => $item) {
|
||||||
|
$thread = Thread::createFromDbInfo($item);
|
||||||
|
$page['pagination.items'][$key] = array(
|
||||||
|
'threadId' => to_page($thread->id),
|
||||||
|
'userName' => to_page($thread->userName),
|
||||||
|
'userAddress' => get_user_addr(to_page($thread->remote)),
|
||||||
|
'agentName' => to_page($thread->agentName),
|
||||||
|
'chatTime' => ($thread->modified - $thread->created),
|
||||||
|
'chatCreated' => $thread->created,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$page['title'] = getlocal("page.analysis.userhistory.title");
|
||||||
|
$page['menuid'] = "history";
|
||||||
|
|
||||||
|
return $this->render('history_user', $page);
|
||||||
|
}
|
||||||
|
}
|
@ -12,6 +12,28 @@ widget_gateway:
|
|||||||
defaults: { _controller: Mibew\Controller\WidgetController::indexAction }
|
defaults: { _controller: Mibew\Controller\WidgetController::indexAction }
|
||||||
|
|
||||||
# Operators' pages
|
# Operators' pages
|
||||||
|
history:
|
||||||
|
path: /operator/history
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\HistoryController::indexAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\LoggedInCheck
|
||||||
|
|
||||||
|
history_thread:
|
||||||
|
path: /operator/history/thread/{thread_id}
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\HistoryController::threadAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\LoggedInCheck
|
||||||
|
requirements:
|
||||||
|
thread_id: \d{1,9}
|
||||||
|
|
||||||
|
history_user:
|
||||||
|
path: /operator/history/user/{user_id}
|
||||||
|
defaults:
|
||||||
|
_controller: Mibew\Controller\HistoryController::userAction
|
||||||
|
_access_check: Mibew\AccessControl\Check\LoggedInCheck
|
||||||
|
requirements:
|
||||||
|
user_id: .{0,63}
|
||||||
|
|
||||||
updates:
|
updates:
|
||||||
path: /operator/updates
|
path: /operator/updates
|
||||||
defaults:
|
defaults:
|
||||||
|
@ -1,155 +0,0 @@
|
|||||||
<?php
|
|
||||||
/*
|
|
||||||
* Copyright 2005-2014 the original author or authors.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Import namespaces and classes of the core
|
|
||||||
use Mibew\Database;
|
|
||||||
use Mibew\Thread;
|
|
||||||
use Mibew\Style\PageStyle;
|
|
||||||
|
|
||||||
// Initialize libraries
|
|
||||||
require_once(dirname(dirname(__FILE__)) . '/libs/init.php');
|
|
||||||
|
|
||||||
$operator = check_login();
|
|
||||||
force_password($operator);
|
|
||||||
|
|
||||||
setlocale(LC_TIME, getstring("time.locale"));
|
|
||||||
|
|
||||||
$page = array();
|
|
||||||
$query = isset($_GET['q']) ? myiconv(getoutputenc(), MIBEW_ENCODING, $_GET['q']) : false;
|
|
||||||
|
|
||||||
$search_type = verify_param('type', '/^(all|message|operator|visitor)$/', 'all');
|
|
||||||
$search_in_system_messages = (verify_param('insystemmessages', '/^on$/', 'off') == 'on') || !$query;
|
|
||||||
|
|
||||||
if ($query !== false) {
|
|
||||||
$db = Database::getInstance();
|
|
||||||
$groups = $db->query(
|
|
||||||
("SELECT {chatgroup}.groupid AS groupid, vclocalname " .
|
|
||||||
"FROM {chatgroup} " .
|
|
||||||
"ORDER BY vclocalname"),
|
|
||||||
null,
|
|
||||||
array('return_rows' => Database::RETURN_ALL_ROWS)
|
|
||||||
);
|
|
||||||
|
|
||||||
$group_name = array();
|
|
||||||
foreach ($groups as $group) {
|
|
||||||
$group_name[$group['groupid']] = $group['vclocalname'];
|
|
||||||
}
|
|
||||||
|
|
||||||
$values = array(
|
|
||||||
':query' => "%{$query}%",
|
|
||||||
':invitation_accepted' => Thread::INVITATION_ACCEPTED,
|
|
||||||
':invitation_not_invited' => Thread::INVITATION_NOT_INVITED,
|
|
||||||
);
|
|
||||||
|
|
||||||
$search_conditions = array();
|
|
||||||
if ($search_type == 'message' || $search_type == 'all') {
|
|
||||||
$search_conditions[] = "({chatmessage}.tmessage LIKE :query"
|
|
||||||
. ($search_in_system_messages
|
|
||||||
? ''
|
|
||||||
: " AND ({chatmessage}.ikind = :kind_user OR {chatmessage}.ikind = :kind_agent)")
|
|
||||||
. ")";
|
|
||||||
if (!$search_in_system_messages) {
|
|
||||||
$values[':kind_user'] = Thread::KIND_USER;
|
|
||||||
$values[':kind_agent'] = Thread::KIND_AGENT;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ($search_type == 'operator' || $search_type == 'all') {
|
|
||||||
$search_conditions[] = "({chatthread}.agentName LIKE :query)";
|
|
||||||
}
|
|
||||||
if ($search_type == 'visitor' || $search_type == 'all') {
|
|
||||||
$search_conditions[] = "({chatthread}.userName LIKE :query)";
|
|
||||||
$search_conditions[] = "({chatthread}.remote LIKE :query)";
|
|
||||||
}
|
|
||||||
|
|
||||||
// Load threads
|
|
||||||
list($threads_count) = $db->query(
|
|
||||||
("SELECT COUNT(DISTINCT {chatthread}.dtmcreated) "
|
|
||||||
. "FROM {chatthread}, {chatmessage} "
|
|
||||||
. "WHERE {chatmessage}.threadid = {chatthread}.threadid "
|
|
||||||
. "AND ({chatthread}.invitationstate = :invitation_accepted "
|
|
||||||
. "OR {chatthread}.invitationstate = :invitation_not_invited) "
|
|
||||||
. "AND (" . implode(' OR ', $search_conditions) . ")"),
|
|
||||||
$values,
|
|
||||||
array(
|
|
||||||
'return_rows' => Database::RETURN_ONE_ROW,
|
|
||||||
'fetch_type' => Database::FETCH_NUM,
|
|
||||||
)
|
|
||||||
);
|
|
||||||
|
|
||||||
$pagination_info = pagination_info($threads_count);
|
|
||||||
|
|
||||||
if ($threads_count && $pagination_info) {
|
|
||||||
$page['pagination'] = $pagination_info;
|
|
||||||
|
|
||||||
$limit_start = intval($pagination_info['start']);
|
|
||||||
$limit_end = intval($pagination_info['end'] - $pagination_info['start']);
|
|
||||||
|
|
||||||
$threads_list = $db->query(
|
|
||||||
("SELECT DISTINCT {chatthread}.* "
|
|
||||||
. "FROM {chatthread}, {chatmessage} "
|
|
||||||
. "WHERE {chatmessage}.threadid = {chatthread}.threadid "
|
|
||||||
. "AND ({chatthread}.invitationstate = :invitation_accepted "
|
|
||||||
. "OR {chatthread}.invitationstate = :invitation_not_invited) "
|
|
||||||
. "AND (" . implode(' OR ', $search_conditions) . ") "
|
|
||||||
. "ORDER BY {chatthread}.dtmcreated DESC "
|
|
||||||
. "LIMIT " . $limit_start . ", " . $limit_end),
|
|
||||||
$values,
|
|
||||||
array('return_rows' => Database::RETURN_ALL_ROWS)
|
|
||||||
);
|
|
||||||
|
|
||||||
foreach ($threads_list as $item) {
|
|
||||||
$thread = Thread::createFromDbInfo($item);
|
|
||||||
|
|
||||||
$group_name_set = ($thread->groupId
|
|
||||||
&& $thread->groupId != 0
|
|
||||||
&& isset($group_name[$thread->groupId]));
|
|
||||||
|
|
||||||
$page['pagination.items'][] = array(
|
|
||||||
'threadId' => $thread->id,
|
|
||||||
'userName' => to_page($thread->userName),
|
|
||||||
'userAddress' => get_user_addr(to_page($thread->remote)),
|
|
||||||
'agentName' => to_page($thread->agentName),
|
|
||||||
'messageCount' => to_page($thread->messageCount),
|
|
||||||
'groupName' => ($group_name_set
|
|
||||||
? to_page($group_name[$thread->groupId])
|
|
||||||
: false),
|
|
||||||
'chatTime' => $thread->modified - $thread->created,
|
|
||||||
'chatCreated' => $thread->created,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$page['pagination'] = false;
|
|
||||||
$page['pagination.items'] = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
$page['formq'] = to_page($query);
|
|
||||||
} else {
|
|
||||||
$page['pagination'] = false;
|
|
||||||
$page['pagination.items'] = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
$page['formtype'] = $search_type;
|
|
||||||
$page['forminsystemmessages'] = $search_in_system_messages;
|
|
||||||
$page['title'] = getlocal("page_analysis.search.title");
|
|
||||||
$page['menuid'] = "history";
|
|
||||||
$page['canSearchInSystemMessages'] = ($search_type != 'all')
|
|
||||||
&& ($search_type != 'message');
|
|
||||||
|
|
||||||
$page = array_merge($page, prepare_menu($operator));
|
|
||||||
|
|
||||||
$page_style = new PageStyle(PageStyle::getCurrentStyle());
|
|
||||||
$page_style->render('history', $page);
|
|
@ -1,59 +0,0 @@
|
|||||||
<?php
|
|
||||||
/*
|
|
||||||
* Copyright 2005-2014 the original author or authors.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Import namespaces and classes of the core
|
|
||||||
use Mibew\Thread;
|
|
||||||
use Mibew\Style\PageStyle;
|
|
||||||
|
|
||||||
// Initialize libraries
|
|
||||||
require_once(dirname(dirname(__FILE__)) . '/libs/init.php');
|
|
||||||
|
|
||||||
$operator = check_login();
|
|
||||||
|
|
||||||
$page = array();
|
|
||||||
|
|
||||||
setlocale(LC_TIME, getstring("time.locale"));
|
|
||||||
|
|
||||||
if (isset($_GET['threadid'])) {
|
|
||||||
// Load thread info
|
|
||||||
$thread_id = verify_param("threadid", "/^(\d{1,9})?$/", "");
|
|
||||||
$thread = Thread::load($thread_id);
|
|
||||||
$group = group_by_id($thread->groupId);
|
|
||||||
|
|
||||||
$thread_info = array(
|
|
||||||
'userName' => to_page($thread->userName),
|
|
||||||
'userAddress' => get_user_addr(to_page($thread->remote)),
|
|
||||||
'userAgentVersion' => get_user_agent_version(to_page($thread->userAgent)),
|
|
||||||
'agentName' => to_page($thread->agentName),
|
|
||||||
'chatTime' => ($thread->modified - $thread->created),
|
|
||||||
'chatStarted' => $thread->created,
|
|
||||||
'groupName' => to_page(get_group_name($group)),
|
|
||||||
);
|
|
||||||
$page['threadInfo'] = $thread_info;
|
|
||||||
|
|
||||||
// Build messages list
|
|
||||||
$last_id = -1;
|
|
||||||
$messages = $thread->getMessages(false, $last_id);
|
|
||||||
$page['threadMessages'] = json_encode($messages);
|
|
||||||
}
|
|
||||||
|
|
||||||
$page['title'] = getlocal("thread.chat_log");
|
|
||||||
|
|
||||||
$page = array_merge($page, prepare_menu($operator, false));
|
|
||||||
|
|
||||||
$page_style = new PageStyle(PageStyle::getCurrentStyle());
|
|
||||||
$page_style->render('thread_log', $page);
|
|
@ -1,83 +0,0 @@
|
|||||||
<?php
|
|
||||||
/*
|
|
||||||
* Copyright 2005-2014 the original author or authors.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Import namespaces and classes of the core
|
|
||||||
use Mibew\Database;
|
|
||||||
use Mibew\Thread;
|
|
||||||
use Mibew\Style\PageStyle;
|
|
||||||
|
|
||||||
// Initialize libraries
|
|
||||||
require_once(dirname(dirname(__FILE__)) . '/libs/init.php');
|
|
||||||
|
|
||||||
$operator = check_login();
|
|
||||||
|
|
||||||
$page = array();
|
|
||||||
|
|
||||||
setlocale(LC_TIME, getstring("time.locale"));
|
|
||||||
|
|
||||||
$user_id = "";
|
|
||||||
if (isset($_GET['userid'])) {
|
|
||||||
$user_id = verify_param("userid", "/^.{0,63}$/", "");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!empty($user_id)) {
|
|
||||||
$db = Database::getInstance();
|
|
||||||
|
|
||||||
$query = "SELECT {chatthread}.* "
|
|
||||||
. "FROM {chatthread} "
|
|
||||||
. "WHERE userid=:user_id "
|
|
||||||
. "AND (invitationstate = :invitation_accepted "
|
|
||||||
. "OR invitationstate = :invitation_not_invited) "
|
|
||||||
. "ORDER BY dtmcreated DESC";
|
|
||||||
|
|
||||||
$found = $db->query(
|
|
||||||
$query,
|
|
||||||
array(
|
|
||||||
':user_id' => $user_id,
|
|
||||||
':invitation_accepted' => Thread::INVITATION_ACCEPTED,
|
|
||||||
':invitation_not_invited' => Thread::INVITATION_NOT_INVITED,
|
|
||||||
),
|
|
||||||
array('return_rows' => Database::RETURN_ALL_ROWS)
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
$found = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
$page = array_merge($page, prepare_menu($operator));
|
|
||||||
|
|
||||||
// Setup pagination
|
|
||||||
$pagination = setup_pagination($found, 6);
|
|
||||||
$page['pagination'] = $pagination['info'];
|
|
||||||
$page['pagination.items'] = $pagination['items'];
|
|
||||||
|
|
||||||
foreach ($page['pagination.items'] as $key => $item) {
|
|
||||||
$thread = Thread::createFromDbInfo($item);
|
|
||||||
$page['pagination.items'][$key] = array(
|
|
||||||
'threadId' => to_page($thread->id),
|
|
||||||
'userName' => to_page($thread->userName),
|
|
||||||
'userAddress' => get_user_addr(to_page($thread->remote)),
|
|
||||||
'agentName' => to_page($thread->agentName),
|
|
||||||
'chatTime' => ($thread->modified - $thread->created),
|
|
||||||
'chatCreated' => $thread->created,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
$page['title'] = getlocal("page.analysis.userhistory.title");
|
|
||||||
$page['menuid'] = "history";
|
|
||||||
|
|
||||||
$page_style = new PageStyle(PageStyle::getCurrentStyle());
|
|
||||||
$page_style->render('user_history', $page);
|
|
@ -14,7 +14,7 @@
|
|||||||
<ul class="submenu">
|
<ul class="submenu">
|
||||||
<li{{#ifEqual menuid "main"}} class="active"{{/ifEqual}}><a href="{{mibewRoot}}/operator/index.php">{{l10n "topMenu.main"}}</a></li>
|
<li{{#ifEqual menuid "main"}} class="active"{{/ifEqual}}><a href="{{mibewRoot}}/operator/index.php">{{l10n "topMenu.main"}}</a></li>
|
||||||
<li{{#ifEqual menuid "users"}} class="active"{{/ifEqual}}><a href="{{mibewRoot}}/operator/users">{{l10n "topMenu.users"}}</a> <span class="small">(<a class="inner" href="{{mibewRoot}}/operator/users?nomenu">{{l10n "topMenu.users.nomenu"}}</a>)</span></li>
|
<li{{#ifEqual menuid "users"}} class="active"{{/ifEqual}}><a href="{{mibewRoot}}/operator/users">{{l10n "topMenu.users"}}</a> <span class="small">(<a class="inner" href="{{mibewRoot}}/operator/users?nomenu">{{l10n "topMenu.users.nomenu"}}</a>)</span></li>
|
||||||
<li{{#ifEqual menuid "history"}} class="active"{{/ifEqual}}><a href="{{mibewRoot}}/operator/history.php">{{l10n "page_analysis.search.title"}}</a></li>
|
<li{{#ifEqual menuid "history"}} class="active"{{/ifEqual}}><a href="{{mibewRoot}}/operator/history">{{l10n "page_analysis.search.title"}}</a></li>
|
||||||
{{#if showstat}}
|
{{#if showstat}}
|
||||||
<li{{#ifEqual menuid "statistics"}} class="active"{{/ifEqual}}><a href="{{mibewRoot}}/operator/statistics.php">{{l10n "statistics.title"}}</a></li>
|
<li{{#ifEqual menuid "statistics"}} class="active"{{/ifEqual}}><a href="{{mibewRoot}}/operator/statistics.php">{{l10n "statistics.title"}}</a></li>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
|
@ -46,7 +46,7 @@
|
|||||||
{{#each [pagination.items]}}
|
{{#each [pagination.items]}}
|
||||||
<tr>
|
<tr>
|
||||||
<td class="notlast">
|
<td class="notlast">
|
||||||
<a href="{{../mibewRoot}}/operator/history.php?q={{address}}&type=visitor" class="man" id="ti{{banid}}">
|
<a href="{{../mibewRoot}}/operator/history?q={{address}}&type=visitor" class="man" id="ti{{banid}}">
|
||||||
{{address}}
|
{{address}}
|
||||||
</a>
|
</a>
|
||||||
</td>
|
</td>
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
<br />
|
<br />
|
||||||
<br />
|
<br />
|
||||||
|
|
||||||
<form name="searchForm" method="get" action="{{mibewRoot}}/operator/history.php">
|
<form name="searchForm" method="get" action="{{mibewRoot}}/operator/history">
|
||||||
<div class="mform">
|
<div class="mform">
|
||||||
<div class="formtop">
|
<div class="formtop">
|
||||||
<div class="formtopi"></div>
|
<div class="formtopi"></div>
|
||||||
@ -65,7 +65,7 @@
|
|||||||
{{#each [pagination.items]}}
|
{{#each [pagination.items]}}
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td>
|
||||||
<a href="{{../mibewRoot}}/operator/threadprocessor.php?threadid={{threadId}}" target="_blank" onclick="this.newWindow = window.open('{{../mibewRoot}}/operator/threadprocessor.php?threadid={{threadId}}', '', 'toolbar=0,scrollbars=1,location=0,status=1,menubar=0,width=720,height=520,resizable=1');this.newWindow.focus();this.newWindow.opener=window;return false;">{{userName}}</a>
|
<a href="{{../mibewRoot}}/operator/history/thread/{{threadId}}" target="_blank" onclick="this.newWindow = window.open('{{../mibewRoot}}/operator/history/thread/{{threadId}}', '', 'toolbar=0,scrollbars=1,location=0,status=1,menubar=0,width=720,height=520,resizable=1');this.newWindow.focus();this.newWindow.opener=window;return false;">{{userName}}</a>
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
{{{userAddress}}}
|
{{{userAddress}}}
|
||||||
|
@ -92,7 +92,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<br />
|
<br />
|
||||||
<a href="{{mibewRoot}}/operator/history.php">
|
<a href="{{mibewRoot}}/operator/history">
|
||||||
{{l10n "thread.back_to_search"}}
|
{{l10n "thread.back_to_search"}}
|
||||||
</a>
|
</a>
|
||||||
<br />
|
<br />
|
@ -19,7 +19,7 @@
|
|||||||
{{#each [pagination.items]}}
|
{{#each [pagination.items]}}
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td>
|
||||||
<a href="{{../mibewRoot}}/operator/threadprocessor.php?threadid={{threadId}}" target="_blank" onclick="this.newWindow = window.open('{{../mibewRoot}}/operator/threadprocessor.php?threadid={{threadId}}', '', 'toolbar=0,scrollbars=1,location=0,status=1,menubar=0,width=720,height=520,resizable=1');this.newWindow.focus();this.newWindow.opener=window;return false;">{{userName}}</a>
|
<a href="{{../mibewRoot}}/operator/history/thread/{{threadId}}" target="_blank" onclick="this.newWindow = window.open('{{../mibewRoot}}/operator/history/thread/{{threadId}}', '', 'toolbar=0,scrollbars=1,location=0,status=1,menubar=0,width=720,height=520,resizable=1');this.newWindow.focus();this.newWindow.opener=window;return false;">{{userName}}</a>
|
||||||
</td>
|
</td>
|
||||||
<td>{{{userAddress}}}</td>
|
<td>{{{userAddress}}}</td>
|
||||||
<td>{{agentName}}</td>
|
<td>{{agentName}}</td>
|
@ -39,7 +39,7 @@
|
|||||||
<div class="dashitem">
|
<div class="dashitem">
|
||||||
<div class="dashitem-content">
|
<div class="dashitem-content">
|
||||||
<img src="{{stylePath}}/images/dash/history.gif" alt=""/>
|
<img src="{{stylePath}}/images/dash/history.gif" alt=""/>
|
||||||
<a href="{{mibewRoot}}/operator/history.php">
|
<a href="{{mibewRoot}}/operator/history">
|
||||||
{{l10n "page_analysis.search.title"}}
|
{{l10n "page_analysis.search.title"}}
|
||||||
</a>
|
</a>
|
||||||
{{l10n "content.history"}}
|
{{l10n "content.history"}}
|
||||||
|
@ -163,7 +163,7 @@
|
|||||||
<tbody>
|
<tbody>
|
||||||
{{#each reportByAgent}}
|
{{#each reportByAgent}}
|
||||||
<tr>
|
<tr>
|
||||||
<td><a href="{{../mibewRoot}}/operator/history.php?q={{name}}&type=operator">{{name}}</a></td>
|
<td><a href="{{../mibewRoot}}/operator/history?q={{name}}&type=operator">{{name}}</a></td>
|
||||||
<td>{{threads}}</td>
|
<td>{{threads}}</td>
|
||||||
<td>{{msgs}}</td>
|
<td>{{msgs}}</td>
|
||||||
<td>{{avglen}}</td>
|
<td>{{avglen}}</td>
|
||||||
|
Loading…
Reference in New Issue
Block a user