You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

633 lines
31 KiB

<?php
// (c) Copyright by authors of the Tiki Wiki CMS Groupware Project
//
// All Rights Reserved. See copyright.txt for details and a complete list of authors.
// Licensed under the GNU LESSER GENERAL PUBLIC LICENSE. See license.txt for details.
// $Id$
//this script may only be included - so its better to die if called directly.
if (strpos($_SERVER['SCRIPT_NAME'], basename(__FILE__)) !== false) {
header('location: index.php');
exit;
}
/**
* @return array
*/
function module_since_last_visit_new_info()
{
return [
'name' => tra('Since Last Visit'),
'description' => tra('Displays to logged-in users new or updated objects since a point in time, by default their last login date and time.'),
'params' => [
'showuser' => [
'name' => tra('Show users'),
'description' => tra('If set to "n", do not show new users.') . ' ' . tra('Default:') . ' "y"'
],
'showtracker' => [
'name' => tra('Show trackers'),
'description' => tra('If set to "n", do not show tracker changes.') . ' ' . tra('Default:') . ' "y"'
],
'calendar_focus' => [
'name' => tra('Calendar focus'),
'description' => tra('Unless set to "ignore", the module changes the reference point in time from the user\'s last login date and time to a day where users browse to using the calendar.')
],
'date_as_link' => [
'name' => tra('Show date as a calendar link'),
'description' => tra('If set to "n", do not add a link to tiki calendar on the date in the header (even if feature calendar is set).') . ' ' . tra('Default:') . ' "y"'
],
'fold_sections' => [
'name' => tra('Fold sections by default'),
'description' => tra('If set to "y", fold automatically sections and show only the title (user has to click on each section in order to see the details of modifications).') . ' ' . tra('Default:') . ' "n"'
],
'use_jquery_ui' => [
'name' => tra('Use tabbed presentation'),
'description' => tra('If set to "y", use Bootstrap tabs to show the result.') . ' ' . tra('Default:') . ' "n"'
],
'daysAtLeast' => [
'name' => tra('Minimum timespan'),
'description' => tra('Instead of the last login time, go back this minimum time, specified in days, in case the last login time is more recent.') . ' ' . tra('Default value:') . ' "0"',
'filter' => 'int'
],
'commentlength' => [
'name' => tra('Maximum comment length'),
'description' => tra("If comments don't use titles this sets the maximum length for the comment snippet."),
'filter' => 'digits',
'default' => 40,
],
],
'common_params' => ['nonums', 'rows'],
];
}
/**
* @param $mod_reference
* @param null $params
* @return bool
*/
function module_since_last_visit_new($mod_reference, $params = null)
{
global $user;
$smarty = TikiLib::lib('smarty');
include_once('tiki-sefurl.php');
if (! $user) {
return false;
}
if (! isset($params['use_jquery_ui']) || $params['use_jquery_ui'] != 'y') {
$smarty->assign('use_jquery_ui', 'n');
} else {
$smarty->assign('use_jquery_ui', 'y');
}
if (! isset($params['date_as_link']) || $params['date_as_link'] != 'n') {
$smarty->assign('date_as_link', 'y');
} else {
$smarty->assign('date_as_link', 'n');
}
if (! isset($params['fold_sections']) || $params['fold_sections'] != 'y') {
$smarty->assign('default_folding', 'block');
$smarty->assign('opposite_folding', 'none');
} else {
$smarty->assign('default_folding', 'none');
$smarty->assign('opposite_folding', 'block');
}
if (empty($params['commentlength'])) {
$params['commentlength'] = 40;
}
$resultCount = $mod_reference['rows'];
global $prefs;
$userlib = TikiLib::lib('user');
$tikilib = TikiLib::lib('tiki');
$smarty->loadPlugin('smarty_modifier_username');
$ret = [];
if ($params == null) {
$params = [];
}
if (
(empty($params['calendar_focus']) || $params['calendar_focus'] != 'ignore')
&& strpos($_SERVER['SCRIPT_NAME'], 'tiki-calendar.php') !== false
&& ! empty($_REQUEST['todate'])
) {
$last = $_REQUEST['todate'];
$_SESSION['slvn_last_login'] = $last;
$smarty->assign('tpl_module_title', tra('Changes since'));
} elseif (isset($_SESSION['slvn_last_login'])) {
$last = $_SESSION['slvn_last_login'];
$smarty->assign('tpl_module_title', tra('Changes since'));
} else {
$last = $tikilib->getOne('select `lastLogin` from `users_users` where `login`=?', [$user]);
$smarty->assign('tpl_module_title', tra('Since your last visit...'));
if (! $last || ! empty($params['daysAtLeast'])) {
$now = TikiLib::lib('tiki')->now;
if (! $last) {
$last = $now;
}
if (! empty($params['daysAtLeast']) && $now - $last < $params['daysAtLeast'] * 60 * 60 * 24) {
$last = $now - $params['daysAtLeast'] * 60 * 60 * 24;
$smarty->assign('tpl_module_title', tr('In the last %0 days...', $params['daysAtLeast']));
}
}
}
$ret['lastLogin'] = $last;
$ret['items']['comments']['label'] = tra('new comments');
$ret['items']['comments']['cname'] = 'slvn_comments_menu';
//TODO: should be a function on commentslib.php or use one of the existent functions
$query = 'select `object`,`objectType`,`title`,`commentDate`,`userName`,`threadId`, `parentId`, `approved`, `archived`, `data`' .
" from `tiki_comments` where `commentDate`>? and `objectType` != 'forum' and `data` != '' order by `commentDate` desc";
$result = $tikilib->query($query, [(int) $last], $resultCount);
$count = 0;
while ($res = $result->fetchRow()) {
$ret['items']['comments']['list'][$count]['href'] = TikiLib::lib('comments')->getHref($res['objectType'], $res['object'], $res['threadId']);
switch ($res['objectType']) {
case 'article':
$perm = 'tiki_p_read_article';
$ret['items']['comments']['list'][$count]['href'] =
filter_out_sefurl($ret['items']['comments']['list'][$count]['href'], 'article', $res['title']);
break;
case 'post':
$perm = 'tiki_p_read_blog';
$ret['items']['comments']['list'][$count]['href'] =
filter_out_sefurl($ret['items']['comments']['list'][$count]['href'], 'blogpost', $res['title']);
break;
case 'blog':
$perm = 'tiki_p_read_blog';
$ret['items']['comments']['list'][$count]['href'] =
filter_out_sefurl($ret['items']['comments']['list'][$count]['href'], 'blog', $res['title']);
break;
case 'faq':
$perm = 'tiki_p_view_faqs';
break;
case 'file gallery':
$perm = 'tiki_p_view_file_gallery';
break;
case 'poll':
// no perm check for viewing polls, only a perm for taking them
break;
case 'wiki page':
$perm = 'tiki_p_view';
break;
default: // note trackeritem needs more complex perms checking due to status and ownership
$perm = 'tiki_p_read_comments';
break;
}
if ($res['approved'] == 'n' || $res['archived'] == 'y') {
$visible = $userlib->user_has_perm_on_object($user, $res['object'], $res['objectType'], 'tiki_p_admin_comments');
} elseif ($res['objectType'] === 'trackeritem') {
$item = Tracker_Item::fromId($res['object']);
$visible = $item->canView();
} elseif ($res['objectType'] == 'blog post') {
$visible = false;
// Only show new comments related to posts the user is allowed to see
if ($userlib->user_has_perm_on_object($user, $res['object'], $res['objectType'], 'tiki_p_read_comments')) {
$visible = $userlib->user_has_perm_on_object($user, $res['object'], $res['objectType'], $perm);
}
} else {
$visible = ! isset($perm) || $userlib->user_has_perm_on_object($user, $res['object'], $res['objectType'], $perm);
}
if ($visible) {
$ret['items']['comments']['list'][$count]['title'] = $tikilib->get_short_datetime($res['commentDate']) . ' ' . tra('by') . ' ' . smarty_modifier_username($res['userName']);
$ret['items']['comments']['list'][$count]['label'] = TikiLib::lib('comments')->process_comment_title($res, $params['commentlength']);
;
if ($res['archived'] == 'y') {
$ret['items']['comments']['list'][$count]['label'] .= tra(' (archived)');
}
$count++;
} else {
unset($ret['items']['comments']['list'][$count]);
}
}
$ret['items']['comments']['count'] = $count;
/////////////////////////////////////////////////////////////////////////
// FORUMS
if ($prefs['feature_forums'] == 'y') {
$ret['items']['posts']['label'] = tra('new posts');
$ret['items']['posts']['cname'] = 'slvn_posts_menu';
$query = 'select `posts`.`object`,`posts`.`objectType`,`posts`.`title`,`posts`.`commentDate`,' .
' `posts`.`userName`,`posts`.`threadId`, `posts`.`parentId`,`topics`.`title` `topic_title`' .
' from `tiki_comments` `posts`' .
' left join `tiki_comments` `topics` ON `posts`.`parentId` = `topics`.`threadId`' .
" where `posts`.`commentDate`>? and `posts`.`objectType` = 'forum'" .
' order by `posts`.`commentDate` desc';
$result = $tikilib->query($query, [(int) $last], $resultCount);
$count = 0;
while ($res = $result->fetchRow()) {
if ($userlib->user_has_perm_on_object($user, $res['parentId'], 'thread', 'tiki_p_forum_read')) {
$ret['items']['posts']['list'][$count]['href']
= 'tiki-view_forum_thread.php?comments_parentId=';
if ($res['parentId']) {
$ret['items']['posts']['list'][$count]['href'] .= $res['parentId'] . '#threadId=' . $res['threadId'];
} else {
$ret['items']['posts']['list'][$count]['href'] .= $res['threadId'];
}
$ret['items']['posts']['list'][$count]['title'] = $tikilib->get_short_datetime($res['commentDate']) . ' ' . tra('by') . ' ' . smarty_modifier_username($res['userName']);
if ($res['parentId'] == 0 || $prefs['forum_reply_notitle'] != 'y') {
$ret['items']['posts']['list'][$count]['label'] = $res['title'];
} else {
$ret['items']['posts']['list'][$count]['label'] = $res['topic_title'];
}
++$count;
}
}
$ret['items']['posts']['count'] = $count;
}
/////////////////////////////////////////////////////////////////////////
// WIKI PAGES
if ($prefs['feature_wiki'] == 'y') {
$ret['items']['pages']['label'] = tra('wiki pages changed');
$ret['items']['pages']['cname'] = 'slvn_pages_menu';
$query = 'select `pageName`, `user`, `lastModif` from `tiki_pages` where `lastModif`>? order by `lastModif` desc';
$result = $tikilib->query($query, [(int) $last], $resultCount);
$smarty->loadPlugin('smarty_modifier_sefurl');
$count = 0;
while ($res = $result->fetchRow()) {
if ($userlib->user_has_perm_on_object($user, $res['pageName'], 'wiki page', 'tiki_p_view')) {
$ret['items']['pages']['list'][$count]['href'] = smarty_modifier_sefurl($res['pageName']);
$ret['items']['pages']['list'][$count]['title'] = $tikilib->get_short_datetime($res['lastModif']) . ' ' . tra('by') . ' ' . smarty_modifier_username($res['user']);
$ret['items']['pages']['list'][$count]['label'] = $res['pageName'];
$count++;
}
}
$ret['items']['pages']['count'] = $count;
}
/////////////////////////////////////////////////////////////////////////
// ARTICLES
if ($prefs['feature_articles'] == 'y') {
$ret['items']['articles']['label'] = tra('new articles');
$ret['items']['articles']['cname'] = 'slvn_articles_menu';
if ($userlib->user_has_permission($user, 'tiki_p_edit_article')) {
$query = 'select `articleId`,`title`,`publishDate`,`authorName` from `tiki_articles` where `ispublished` = ? and `created`>? and `expireDate`>? order by `articleId` desc';
$bindvars = ['y',(int) $last, time()];
} else {
$query = 'select `articleId`,`title`,`publishDate`,`authorName` from `tiki_articles` where `ispublished` = ? and `publishDate`>? and `publishDate`<=? and `expireDate`>? order by `articleId` desc';
$bindvars = ['y',(int) $last,time(),time()];
}
$result = $tikilib->fetchAll($query, $bindvars, $resultCount);
$articleIds = array_map(
function ($res) {
return $res['articleId'];
},
$result
);
Perms::bulk(['type' => 'article'], 'object', $articleIds);
$count = 0;
foreach ($result as $res) {
if ($userlib->user_has_perm_on_object($user, $res['articleId'], 'article', 'tiki_p_read_article')) {
$ret['items']['articles']['list'][$count]['href'] = filter_out_sefurl('tiki-read_article.php?articleId=' . $res['articleId'], 'article', $res['title']);
$ret['items']['articles']['list'][$count]['title'] = $tikilib->get_short_datetime($res['publishDate']) . ' ' . tra('by') . ' ' . $res['authorName'];
$ret['items']['articles']['list'][$count]['label'] = $res['title'];
$count++;
}
}
$ret['items']['articles']['count'] = $count;
}
/////////////////////////////////////////////////////////////////////////
// FAQs
if ($prefs['feature_faqs'] == 'y') {
$ret['items']['faqs']['label'] = tra('new FAQs');
$ret['items']['faqs']['cname'] = 'slvn_faqs_menu';
$query = 'select `faqId`, `title`, `created` from `tiki_faqs` where `created`>? order by `created` desc';
$result = $tikilib->query($query, [(int) $last], $resultCount);
$count = 0;
while ($res = $result->fetchRow()) {
if ($userlib->user_has_perm_on_object($user, $res['faqId'], 'faq', 'tiki_p_view_faq')) {
$ret['items']['faqs']['list'][$count]['href'] = 'tiki-view_faq.php?faqId=' . $res['faqId'];
$ret['items']['faqs']['list'][$count]['title'] = $tikilib->get_short_datetime($res['created']);
$ret['items']['faqs']['list'][$count]['label'] = $res['title'];
$count++;
}
}
$ret['items']['faqs']['count'] = $count;
}
/////////////////////////////////////////////////////////////////////////
// BLOGS
if ($prefs['feature_blogs'] == 'y') {
$ret['items']['blogs']['label'] = tra('new blogs');
$ret['items']['blogs']['cname'] = 'slvn_blogs_menu';
$query = "select `blogId`, `title`, `user`, `created` from `tiki_blogs` where `created`>? order by `created` desc";
$result = $tikilib->query($query, [(int) $last], $resultCount);
$count = 0;
while ($res = $result->fetchRow()) {
if ($userlib->user_has_perm_on_object($user, $res['blogId'], 'blog', 'tiki_p_read_blog')) {
$ret['items']['blogs']['list'][$count]['href'] = filter_out_sefurl('tiki-view_blog.php?blogId=' . $res['blogId'], 'blog', $res['title']);
$ret['items']['blogs']['list'][$count]['title'] = $tikilib->get_short_datetime($res['created']) . ' ' . tra('by') . ' ' . smarty_modifier_username($res['user']);
$ret['items']['blogs']['list'][$count]['label'] = $res['title'];
$count++;
}
}
$ret['items']['blogs']['count'] = $count;
$ret['items']['blogPosts']['label'] = tra('new blog posts');
$ret['items']['blogPosts']['cname'] = 'slvn_blogPosts_menu';
$query = 'select `postId`, `blogId`, `title`, `user`, `created` from `tiki_blog_posts` where `created`>? order by `created` desc';
$result = $tikilib->query($query, [(int) $last], $resultCount);
$count = 0;
while ($res = $result->fetchRow()) {
if ($userlib->user_has_perm_on_object($user, $res['postId'], 'blog post', 'tiki_p_read_blog')) {
$ret['items']['blogPosts']['list'][$count]['href'] = filter_out_sefurl('tiki-view_blog_post.php?postId=' . $res['postId'], 'blogpost', $res['title']);
$ret['items']['blogPosts']['list'][$count]['title'] = $tikilib->get_short_datetime($res['created']) . ' ' . tra('by') . ' ' . smarty_modifier_username($res['user']);
$ret['items']['blogPosts']['list'][$count]['label'] = $res['title'];
$count++;
}
}
$ret['items']['blogPosts']['count'] = $count;
}
/////////////////////////////////////////////////////////////////////////
// FILE GALLERIES
if ($prefs['feature_file_galleries'] == 'y') {
// file galleries
$ret['items']['fileGalleries']['label'] = tra('new file galleries');
$ret['items']['fileGalleries']['cname'] = 'slvn_fileGalleries_menu';
$query = 'select `galleryId`,`name`,`created`,`user` from `tiki_file_galleries` where `created`>? order by `created` desc';
$result = $tikilib->query($query, [(int) $last], $resultCount);
$count = 0;
while ($res = $result->fetchRow()) {
if ($userlib->user_has_perm_on_object($user, $res['galleryId'], 'file gallery', 'tiki_p_view_file_gallery')) {
$ret['items']['fileGalleries']['list'][$count]['href'] = filter_out_sefurl('tiki-list_file_gallery.php?galleryId=' . $res['galleryId'], 'file gallery');
$ret['items']['fileGalleries']['list'][$count]['title'] = $tikilib->get_short_datetime($res['created']) . ' ' . tra('by') . ' ' . smarty_modifier_username($res['user']);
$ret['items']['fileGalleries']['list'][$count]['label'] = $res['name'];
$count++;
}
}
$ret['items']['fileGalleries']['count'] = $count;
// files
$ret['items']['files']['label'] = tra('new files');//get_strings tra('new files');
$ret['items']['files']['cname'] = 'slvn_files_menu';
$files = TikiLib::lib('filegal')->get_files(-1, $resultCount, 'created_desc', null, -2, false, false, true, true, false, false, true, false, '', true, false, false, ['created' => (int) $last]);
foreach ($files['data'] as $res) {
$ret['items']['files']['list'][] = [
'href' => filter_out_sefurl('tiki-list_file_gallery.php?galleryId=' . $res['galleryId'] . '&fileId=' . $res['fileId'] . '&view=page', 'file gallery'),
'title' => $tikilib->get_short_datetime($res['created']) . ' ' . tra('by') . ' ' . smarty_modifier_username($res['user']),
'label' => $res['name'] . ' (' . $res['filename'] . ')'
];
}
$ret['items']['files']['count'] = $files['cant'];
}
/////////////////////////////////////////////////////////////////////////
// POLLS
if ($prefs['feature_polls'] == 'y') {
$ret['items']['polls']['label'] = tra('new polls');
$ret['items']['polls']['cname'] = 'slvn_polls_menu';
$query = 'select `pollId`, `title`, `publishDate` from `tiki_polls` where `publishDate`>? order by `publishDate` desc';
$result = $tikilib->query($query, [(int) $last], $resultCount);
$count = 0;
while ($res = $result->fetchRow()) {
$ret['items']['polls']['list'][$count]['href'] = 'tiki-poll_results.php?pollId=' . $res['pollId'];
$ret['items']['polls']['list'][$count]['title'] = $tikilib->get_short_datetime($res['publishDate']);
$ret['items']['polls']['list'][$count]['label'] = $res['title'];
$count++;
}
$ret['items']['polls']['count'] = $count;
}
/////////////////////////////////////////////////////////////////////////
// NEW USERS
if (! isset($params['showuser']) || $params['showuser'] != 'n') {
$ret['items']['users']['label'] = tra('new users');
$ret['items']['users']['cname'] = 'slvn_users_menu';
$query = 'select `login`, `registrationDate` from `users_users` where `registrationDate`>? and `provpass`=?';
$result = $tikilib->query($query, [(int) $last, ''], $resultCount);
$count = 0;
$slvn_tmp_href = $userlib->user_has_permission($user, 'tiki_p_admin') ? 'tiki-assignuser.php?assign_user=' : 'tiki-user_information.php?view_user=';
while ($res = $result->fetchRow()) {
$ret['items']['users']['list'][$count]['href'] = $slvn_tmp_href . rawurlencode($res['login']);
$ret['items']['users']['list'][$count]['title'] = $tikilib->get_short_datetime($res['registrationDate']);
$ret['items']['users']['list'][$count]['label'] = smarty_modifier_username($res['login']);
$count++;
}
$ret['items']['users']['count'] = $count;
}
/////////////////////////////////////////////////////////////////////////
// TRACKER ITEMS
// This breaks out tracker updates into sub-sections, by tracker, separating new items and updated items.
// NEW TRACKER ITEMS
if ($prefs['feature_trackers'] == 'y' && (! isset($params['showtracker']) || $params['showtracker'] != 'n')) {
$ret['items']['trackers']['label'] = tra('new tracker items');
$ret['items']['trackers']['cname'] = 'slvn_trackers_menu';
$query = 'select `itemId`, `trackerId`, `created`, `lastModif` from `tiki_tracker_items` where `created`>? order by `created` desc';
$result = $tikilib->query($query, [(int) $last], $resultCount);
$count = 0;
$counta = [];
$tracker_name = [];
$cachelib = TikiLib::lib('cache');
while ($res = $result->fetchRow()) {
$itemObject = Tracker_Item::fromId($res['itemId']);
if ($itemObject->canView()) {
// Initialize tracker counter if needed.
if (! isset($counta[$res['trackerId']])) {
$counta[$res['trackerId']] = 0;
}
// Pull Tracker Name
if ($res['trackerId'] > 0 && ! isset($tracker_name[$res['trackerId']])) {
$query = "select `name` from `tiki_trackers` where `trackerId` = ?";
$tracker_name[$res['trackerId']] = $tikilib->getOne($query, $res['trackerId']);
}
$ret['items']['trackers']['tid'][$res['trackerId']]['label'] = tra('in') . ' ' . tra($tracker_name[$res['trackerId']]);
$ret['items']['trackers']['tid'][$res['trackerId']]['cname'] = 'slvn_tracker' . $res['trackerId'] . '_menu';
$ret['items']['trackers']['tid'][$res['trackerId']]['list'][$counta[$res['trackerId']]]['href'] = filter_out_sefurl(
'tiki-view_tracker_item.php?itemId=' . $res['itemId'],
'trackeritem'
);
$ret['items']['trackers']['tid'][$res['trackerId']]['list'][$counta[$res['trackerId']]]['title'] = $tikilib->get_short_datetime($res['created']);
// routine to verify field in tracker that's used as label
$cacheKey = 'trackerItemLabel' . $res['itemId'];
if (! $label = $cachelib->getCached($cacheKey)) {
$query = 'select `fieldId` from `tiki_tracker_fields` where `isMain` = ? and `trackerId` = ? order by `position`';
$fieldId = $tikilib->getOne($query, ['y',$res['trackerId']]);
$query = 'select `value` from `tiki_tracker_item_fields` where `fieldId` = ? and `itemId` = ?';
$label = $tikilib->getOne($query, [$fieldId,$res['itemId']]);
$cachelib->cacheItem($cacheKey, $label);
}
// If the label is empty (b:0;), then use the item ID
if ($label == 'b:0;' || $label == '') {
$label = 'Trk i' . $res['trackerId'] . ' - ID: ' . $res['itemId'];
}
$ret['items']['trackers']['tid'][$res['trackerId']]['list'][$counta[$res['trackerId']]]['label'] = $label;
$counta[$res['trackerId']]++;
$ret['items']['trackers']['tid'][$res['trackerId']]['count'] = $counta[$res['trackerId']];
$count++;
}
}
$ret['items']['trackers']['count'] = $count;
/////////////////////////////////////////////////////////////////////////
// UPDATED TRACKER ITEMS - ignore updates on same day as creation
$ret['items']['utrackers']['label'] = tra('updated tracker items');
$ret['items']['utrackers']['cname'] = 'slvn_utrackers_menu';
$query = 'select `itemId`, `trackerId`, `created`, `lastModif`' .
' from `tiki_tracker_items` where `lastModif`>? and `lastModif`!=`created`' .
' order by `lastModif` desc';
$result = $tikilib->query($query, [(int) $last], $resultCount);
$count = 0;
$countb = [];
$cachelib = TikiLib::lib('cache');
while ($res = $result->fetchRow()) {
$itemObject = Tracker_Item::fromId($res['itemId']);
if ($itemObject->canView()) {
// Initialize tracker counter if needed.
if (! isset($countb[$res['trackerId']])) {
$countb[$res['trackerId']] = 0;
}
// Pull Tracker Name
if (! isset($tracker_name[$res['trackerId']])) {
$query = 'select `name` from `tiki_trackers` where `trackerId` = ?';
$tracker_name[$res['trackerId']] = $tikilib->getOne($query, $res['trackerId']);
}
$ret['items']['utrackers']['tid'][$res['trackerId']]['label'] = tra('in') . ' ' . tra($tracker_name[$res['trackerId']]);
$ret['items']['utrackers']['tid'][$res['trackerId']]['cname'] = 'slvn_utracker' . $res['trackerId'] . '_menu';
$ret['items']['utrackers']['tid'][$res['trackerId']]['list'][$countb[$res['trackerId']]]['href'] = filter_out_sefurl(
'tiki-view_tracker_item.php?itemId=' . $res['itemId'],
'trackeritem'
);
$ret['items']['utrackers']['tid'][$res['trackerId']]['list'][$countb[$res['trackerId']]]['title'] = $tikilib->get_short_datetime($res['lastModif']);
// routine to verify field in tracker that's used as label
$cacheKey = 'trackerItemLabel' . $res['itemId'];
if (! $label = $cachelib->getCached($cacheKey)) {
$query = 'select `fieldId` from `tiki_tracker_fields` where `isMain` = ? and `trackerId` = ? order by `position`';
$fieldId = $tikilib->getOne($query, ['y',$res['trackerId']]);
$query = 'select `value` from `tiki_tracker_item_fields` where `fieldId` = ? and `itemId` = ?';
$label = $tikilib->getOne($query, [$fieldId,$res['itemId']]);
$cachelib->cacheItem($cacheKey, $label);
}
// If the label is empty (b:0;), then use the item ID
if ($label == 'b:0;' || $label == '') {
$label = 'Trk i' . $res['trackerId'] . ' - ID: ' . $res['itemId'];
}
$ret['items']['utrackers']['tid'][$res['trackerId']]['list'][$countb[$res['trackerId']]]['label'] = $label;
$countb[$res['trackerId']]++;
$ret['items']['utrackers']['tid'][$res['trackerId']]['count'] = $countb[$res['trackerId']];
$count++;
}
}
$ret['items']['utrackers']['count'] = $count;
}
/////////////////////////////////////////////////////////////////////////
// CALENDARS & THEIR EVENTS
if ($prefs['feature_calendar'] == 'y') {
$ret['items']['calendar']['label'] = tra('new calendars');
$ret['items']['calendar']['cname'] = 'slvn_calendar_menu';
$query = "select `calendarId`, `name`, `user`, `created` from `tiki_calendars` where `created`>? order by `created` desc";
$result = $tikilib->query($query, [(int) $last], $resultCount);
$count = 0;
while ($res = $result->fetchRow()) {
if ($userlib->user_has_perm_on_object($user, $res['calendarId'], 'calendar', 'tiki_p_view_calendar')) {
$ret['items']['calendar']['list'][$count]['href'] = filter_out_sefurl('tiki-calendar.php?calIds[]=' . $res['calendarId'], 'calendar', $res['name']);
$ret['items']['calendar']['list'][$count]['title'] = $tikilib->get_short_datetime($res['created']) . ' ' . tra('by') . ' ' . smarty_modifier_username($res['user']);
$ret['items']['calendar']['list'][$count]['label'] = $res['name'];
$count++;
}
}
$ret['items']['calendar']['count'] = $count;
$ret['items']['events']['label'] = tra('new events');
$ret['items']['events']['cname'] = 'slvn_events_menu';
$query = "select `calitemId`, `calendarId`, `name`, `user`, `created`, `start` from `tiki_calendar_items` where `created`>? order by `created` desc";
$result = $tikilib->query($query, [(int) $last], $resultCount);
$count = 0;
while ($res = $result->fetchRow()) {
if ($userlib->user_has_perm_on_object($user, $res['calendarId'], 'calendar', 'tiki_p_view_events')) {
$ret['items']['events']['list'][$count]['href'] = filter_out_sefurl('tiki-calendar_edit_item.php?viewcalitemId=' . $res['calitemId'], 'event', $res['name']);
$ret['items']['events']['list'][$count]['title'] = $tikilib->get_short_datetime($res['created']) . ' ' . tra('by') . ' ' . smarty_modifier_username($res['user']) . ', ' . tra('starting on') . ' ' . $tikilib->get_short_datetime($res['start']) ;
$ret['items']['events']['list'][$count]['label'] = $res['name'];
$count++;
}
}
$ret['items']['events']['count'] = $count;
}
//////////////////////////////////////////////////////////////////////////
// SUMMARY
//get the total of items
$ret['cant'] = 0;
$ret['nonempty'] = 0;
foreach ($ret['items'] as $item) {
$ret['cant'] += $item['count'];
if ($item['count'] > 0) {
$ret['nonempty']++;
}
}
if ($ret['nonempty'] > 0) {
$ret['li_width'] = min(22, (int)90 / $ret['nonempty']);
} else {
$ret['li_width'] = 90;
}
$smarty->assign('slvn_info', $ret);
}