First attempt to implement the user tags (interests) see DT#5508 (partial)

skala
Julio Montoya 16 years ago
parent 60d1025069
commit 1942167c0f
  1. 22
      main/admin/user_fields.php
  2. 25
      main/admin/user_fields_add.php
  3. 106
      main/auth/profile.php
  4. 8
      main/inc/lib/database.lib.php
  5. BIN
      main/inc/lib/javascript/tag/close.gif
  6. 662
      main/inc/lib/javascript/tag/jquery.fcbkcomplete.js
  7. 52
      main/inc/lib/javascript/tag/jquery.fcbkcomplete.min.js
  8. BIN
      main/inc/lib/javascript/tag/loading.gif
  9. 51
      main/inc/lib/javascript/tag/style.css
  10. 294
      main/inc/lib/usermanager.lib.php
  11. 23
      main/install/dokeos_main.sql
  12. 6
      main/install/migrate-db-1.8.6.1-1.8.6.2-pre.sql
  13. 64
      main/social/profile.php
  14. 285
      main/social/search.php
  15. 7
      main/user/tags.php
  16. 7
      main/user/tags/tags.php

@ -1,23 +1,5 @@
<?php // $Id: $
/*
==============================================================================
Dokeos - elearning and course management software
Copyright (c) 2008 Dokeos SPRL
For a full list of contributors, see "credits.txt".
The full license can be read in "license.txt".
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
See the GNU General Public License for more details.
Contact: Dokeos, rue du Corbeau, 108, B-1030 Brussels, Belgium, info@dokeos.com
==============================================================================
*/
/* For licensing terms, see /dokeos_license.txt */
/**
==============================================================================
* @package dokeos.admin
@ -229,7 +211,7 @@ function type_filter($type)
$types[USER_FIELD_TYPE_DATETIME] = get_lang('FieldTypeDatetime');
$types[USER_FIELD_TYPE_DOUBLE_SELECT] = get_lang('FieldTypeDoubleSelect');
$types[USER_FIELD_TYPE_DIVIDER] = get_lang('FieldTypeDivider');
$types[USER_FIELD_TYPE_TAG] = get_lang('FieldTypeTag');
return $types[$type];
}

@ -1,23 +1,5 @@
<?php // $Id: user_fields_add.php 20845 2009-05-19 17:27:22Z cfasanando $
/*
==============================================================================
Dokeos - elearning and course management software
Copyright (c) 2008 Dokeos SPRL
For a full list of contributors, see "credits.txt".
The full license can be read in "license.txt".
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
See the GNU General Public License for more details.
Contact: Dokeos, rue du Corbeau, 108, B-1030 Brussels, Belgium, info@dokeos.com
==============================================================================
*/
/* For licensing terms, see /dokeos_license.txt */
/**
==============================================================================
* @package dokeos.admin
@ -123,6 +105,9 @@ $types[USER_FIELD_TYPE_DATE] = get_lang('FieldTypeDate');
$types[USER_FIELD_TYPE_DATETIME] = get_lang('FieldTypeDatetime');
$types[USER_FIELD_TYPE_DOUBLE_SELECT] = get_lang('FieldTypeDoubleSelect');
$types[USER_FIELD_TYPE_DIVIDER] = get_lang('FieldTypeDivider');
$types[USER_FIELD_TYPE_TAG] = get_lang('FieldTypeTag');
$form->addElement('select','fieldtype',get_lang('FieldType'),$types,array('onchange'=>'change_image_user_field(this.value)'));
$form->addRule('fieldtype', get_lang('ThisFieldIsRequired'), 'required');
// Field display name
@ -172,7 +157,7 @@ $form->setDefaults($defaults);
if(isset($_GET['field_id']) && !empty($_GET['field_id'])) {
$class="save";
$text=get_lang('buttonEditUserField');
} else {
} else {
$class="add";
$text=get_lang('buttonAddUserField');
}

@ -39,6 +39,11 @@ if (!(isset($_user['user_id']) && $_user['user_id']) || api_is_anonymous($_user[
}
$htmlHeadXtra[] = '<script src="../inc/lib/javascript/jquery.js" type="text/javascript" language="javascript"></script>'; //jQuery
$htmlHeadXtra[] = '<script src="../inc/lib/javascript/tag/jquery.fcbkcomplete.js" type="text/javascript" language="javascript"></script>'; //jQuery
$htmlHeadXtra[] = '<link href="'.api_get_path(WEB_LIBRARY_PATH).'javascript/tag/style.css" rel="stylesheet" type="text/css" />';
$htmlHeadXtra[] = '<script type="text/javascript">
function confirmation(name) {
if (confirm("'.get_lang('AreYouSureToDelete', '').' " + name + " ?"))
@ -52,33 +57,7 @@ function show_image(image,width,height) {
window_x = window.open(image,\'windowX\',\'width=\'+ width + \', height=\'+ height + \'\');
}
</script>';
if (api_get_setting('allow_message_tool') == 'true') {
$htmlHeadXtra[] ='<script type="text/javascript">
$(document).ready(function(){
$(".message-content .message-delete").click(function(){
$(this).parents(".message-content").animate({ opacity: "hide" }, "slow");
$(".message-view").animate({ opacity: "show" }, "slow");
});
});
</script>';
}
$htmlHeadXtra[] ='<script type="text/javascript">
function generate_open_id_form() {
$.ajax({
contentType: "application/x-www-form-urlencoded",
beforeSend: function(objeto) {
/*$("#div_api_key").html("Loading...");*/ },
type: "POST",
url: "../auth/generate_api_key.inc.php",
data: "num_key_id="+"",
success: function(datos) {
$("#div_api_key").html(datos);
}
});
}
</script>';
$interbreadcrumb[] = array('url' => '../auth/profile.php', 'name' => get_lang('ModifyProfile'));
@ -94,6 +73,16 @@ if (!empty($_GET['fe'])) {
$_GET['fe'] = null;
}
$jquery_ready_content = '';
if (api_get_setting('allow_message_tool') == 'true') {
$jquery_ready_content = <<<EOF
$(".message-content .message-delete").click(function(){
$(this).parents(".message-content").animate({ opacity: "hide" }, "slow");
$(".message-view").animate({ opacity: "show" }, "slow");
});
EOF;
}
/*
-----------------------------------------------------------
Configuration file
@ -392,8 +381,52 @@ foreach ($extra as $id => $field_details) {
case USER_FIELD_TYPE_DIVIDER:
$form->addElement('static', $field_details[1], '<br /><strong>'.$field_details[3].'</strong>');
break;
case USER_FIELD_TYPE_TAG:
//the magic should be here
$user_tags = UserManager::get_user_tags(api_get_user_id(),$field_details[0]);
$pre_html = '<div class="row">
<div class="label">'.$field_details[3].'</div>
<div class="formw">';
$post = '</div></div>';
$tag_list = '';
if (is_array($user_tags) && count($user_tags)> 0) {
foreach ($user_tags as $tag) {
$tag_list .= '<option value="'.$tag[0].'" class="selected">'.$tag[0].'</option>';
}
}
$multi_select = '<select id="extra_'.$field_details[1].'" name="extra_'.$field_details[1].'">
'.$tag_list.'
</select>';
$form->addElement('html',$pre_html.$multi_select.$post );
$url = api_get_path(WEB_CODE_PATH).'user';
//if cache is set to true the jquery will be called 1 time
$jquery_ready_content.= <<<EOF
$("#extra_$field_details[1]").fcbkcomplete({
json_url: "$url/$field_details[1].php?field_id=$field_details[0]",
cache: false,
filter_case: true,
filter_hide: true,
firstselected: true,
//onremove: "testme",
//onselect: "testme",
filter_selected: true,
newel: true
});
EOF;
break;
}
}
// the $jquery_ready_content variable collects all functions that will be load in the $(document).ready javascript function
$htmlHeadXtra[] ='<script type="text/javascript">
$(document).ready(function(){
'.$jquery_ready_content.'
});
</script>';
if (api_get_setting('profile', 'apikeys') == 'true') {
$form->addElement('html', '<div id="div_api_key">');
$form->addElement('text', 'api_key_generate', get_lang('MyApiKey'), array('size' => 40, 'id' => 'id_api_key_generate'));
@ -548,8 +581,8 @@ if (!empty($_SESSION['production_uploaded'])) {
} elseif ($form->validate()) {
$wrong_current_password = false;
$user_data = $form->exportValues();
// $user_data = $form->exportValues();
$user_data = $form->getSubmitValues();
// set password if a new one was provided
if (!empty($user_data['password0'])) {
if (check_user_password($user_data['password0'])) {
@ -635,8 +668,19 @@ if (!empty($_SESSION['production_uploaded'])) {
$sql .= " WHERE user_id = '".$_user['user_id']."'";
//var_dump($sql); exit();
Database::query($sql, __FILE__, __LINE__);
//update the extra fields
foreach ($extras as $key => $value) {
// User tag process
//1. Deleting all user tags
$list_extra_field_type_tag = UserManager::get_all_extra_field_by_type(USER_FIELD_TYPE_TAG);
if (is_array($list_extra_field_type_tag) && count($list_extra_field_type_tag)>0) {
foreach ($list_extra_field_type_tag as $id) {
UserManager::delete_user_tags(api_get_user_id(), $id);
}
}
//2. Update the extra fields and user tags if available
foreach ($extras as $key => $value) {
//3. Tags are process in the UserManager::update_extra_field_value by the UserManager::process_tags function
$myres = UserManager::update_extra_field_value($_user['user_id'], $key, $value);
}
@ -738,7 +782,7 @@ $big_image_width = $big_image_size[0];
$big_image_height = $big_image_size[1];
$url_big_image = $big_image.'?rnd='.time();
// Style position:absolute has been removed for Opera-compatibility.
// Style position:absolute has been removed for Opera-compatibility.
//echo '<div id="image-message-container" style="float:right;display:inline;position:absolute;padding:3px;width:250px;" >';
echo '<div id="image-message-container" style="float:right;display:inline;padding:3px;width:250px;" >';

@ -62,6 +62,14 @@ define('TABLE_MAIN_USER_FIELD', 'user_field');
define('TABLE_MAIN_USER_FIELD_OPTIONS', 'user_field_options');
define('TABLE_MAIN_USER_FIELD_VALUES', 'user_field_values');
//User tags
define('TABLE_MAIN_USER_TAG', 'user_tag');
define('TABLE_MAIN_USER_REL_TAG', 'user_rel_tag');
//User group
define('TABLE_MAIN_USER_GROUP', 'user_group');
define('TABLE_MAIN_USER_GROUP_VALUES', 'user_group_values');
// Search engine
define('TABLE_MAIN_SPECIFIC_FIELD', 'specific_field');
define('TABLE_MAIN_SPECIFIC_FIELD_VALUES', 'specific_field_values');

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 B

@ -0,0 +1,662 @@
/*
FCBKcomplete 2.6
- Jquery version required: 1.2.x, 1.3.x
Changelog:
- 2.00 new version of fcbkcomplete
- 2.01 fixed bugs & added features
fixed filter bug for preadded items
focus on the input after selecting tag
the element removed pressing backspace when the element is selected
input tag in the control has a border in IE7
added iterate over each match and apply the plugin separately
set focus on the input after selecting tag
- 2.02 fixed fist element selected bug
fixed defaultfilter error bug
- 2.5 removed selected="selected" attribute due ie bug
element search algorithm changed
better performance fix added
fixed many small bugs
onselect event added
onremove event added
- 2.6 ie6/7 support fix added
added new public method addItem due request
added new options "firstselected" that you can set true/false to select first element on dropdown list
autoexpand input element added
removeItem bug fixed
and many more bug fixed
*/
/* Coded by: emposha <admin@emposha.com> */
/* Copyright: Emposha.com <http://www.emposha.com/> - Distributed under MIT - Keep this message! */
/*
* json_url - url to fetch json object
* cache - use cache
* height - maximum number of element shown before scroll will apear
* newel - show typed text like a element
* firstselected - automaticly select first element from dropdown
* filter_case - case sensitive filter
* filter_selected - filter selected items from list
* complete_text - text for complete page
* maxshownitems - maximum numbers that will be shown at dropdown list (less better performance)
* onselect - fire event on item select
* onremove - fire event on item remove
*/
jQuery(
function ($)
{
$.fn.fcbkcomplete = function (opt)
{
return this.each(function()
{
function init()
{
createFCBK();
preSet();
addInput(0);
}
function createFCBK()
{
element.hide();
element.attr("multiple","multiple");
if (element.attr("name").indexOf("[]") == -1)
{
element.attr("name",element.attr("name")+"[]");
}
holder = $(document.createElement("ul"));
holder.attr("class", "holder");
element.after(holder);
complete = $(document.createElement("div"));
complete.addClass("facebook-auto");
complete.append('<div class="default">'+ options.complete_text +"</div>");
if (browser_msie)
{
complete.append('<iframe class="ie6fix" scrolling="no" frameborder="0"></iframe>');
browser_msie_frame = complete.children('.ie6fix');
//$("input:checkbox").parent().css("z-index","-1");
}
feed = $(document.createElement("ul"));
feed.attr("id", elemid + "_feed");
complete.prepend(feed);
holder.after(complete);
feed.css("width",complete.width());
}
function preSet()
{
element.children("option").each(
function(i,option)
{
option = $(option);
if (option.hasClass("selected"))
{
addItem (option.text(), option.val(), true);
option.attr("selected","selected");
}
else
{
option.removeAttr("selected");
}
cache.push({
caption: option.text(),
value: option.val()
});
search_string += "" + (cache.length - 1) + ":" + option.text() + ";";
}
);
}
//public method to add new item
this.addItem = function(title, value)
{
addItem(title, value);
}
function addItem (title, value, preadded)
{
var li = document.createElement("li");
var txt = document.createTextNode(title);
var aclose = document.createElement("a");
$(li).attr({"class": "bit-box","rel": value});
$(li).prepend(txt);
$(aclose).attr({"class": "closebutton","href": "#"});
li.appendChild(aclose);
holder.append(li);
$(aclose).click(
function(){
$(this).parent("li").fadeOut("fast",
function(){
removeItem($(this));
}
);
return false;
}
);
if (!preadded)
{
$("#"+elemid + "_annoninput").remove();
var _item;
addInput(1);
if (element.children("option[value=" + value + "]").length)
{
_item = element.children("option[value=" + value + "]");
_item.get(0).setAttribute("selected", "selected");
if (!_item.hasClass("selected"))
{
_item.addClass("selected");
}
}
else
{
var _item = $(document.createElement("option"));
_item.attr("value", value).get(0).setAttribute("selected", "selected");
_item.attr("value", value).addClass("selected");
_item.text(title);
element.append(_item);
}
if (options.onselect.length)
{
funCall(options.onselect,_item)
}
}
holder.children("li.bit-box.deleted").removeClass("deleted");
feed.hide();
browser_msie?browser_msie_frame.hide():'';
}
function removeItem(item)
{
if (options.onremove.length)
{
var _item = element.children("option[value=" + item.attr("rel") + "]");
funCall(options.onremove,_item)
}
element.children("option[value=" + item.attr("rel") + "]").removeAttr("selected");
element.children("option[value=" + item.attr("rel") + "]").removeClass("selected");
item.remove();
deleting = 0;
}
function addInput(focusme)
{
var li = $(document.createElement("li"));
var input = $(document.createElement("input"));
li.attr({"class": "bit-input","id": elemid + "_annoninput"});
input.attr({"type": "text","class": "maininput","size": "1"});
holder.append(li.append(input));
input.focus(
function()
{
complete.fadeIn("fast");
}
);
input.blur(
function()
{
complete.fadeOut("fast");
}
);
holder.click(
function()
{
input.focus();
if (feed.length && input.val().length)
{
feed.show();
}
else
{
feed.hide();
browser_msie?browser_msie_frame.hide():'';
complete.children(".default").show();
}
}
);
input.keypress(
function(event)
{
if (event.keyCode == 13)
{
return false;
}
//auto expand input
input.attr("size",input.val().length + 1);
}
);
input.keydown(
function(event)
{
//prevent to enter some bad chars when input is empty
if(event.keyCode == 191)
{
event.preventDefault();
return false;
}
}
);
input.keyup(
function(event)
{
var etext = xssPrevent(input.val());
if (event.keyCode == 8 && etext.length == 0)
{
feed.hide();
browser_msie?browser_msie_frame.hide():'';
if (holder.children("li.bit-box.deleted").length == 0)
{
holder.children("li.bit-box:last").addClass("deleted");
return false;
}
else
{
if (deleting)
{
return;
}
deleting = 1;
holder.children("li.bit-box.deleted").fadeOut("fast", function()
{
removeItem($(this));
return false;
});
}
}
if (event.keyCode != 40 && event.keyCode != 38 && etext.length != 0)
{
counter = 0;
if (options.json_url)
{
if (options.cache && json_cache)
{
addMembers(etext);
bindEvents();
}
else
{
//search texts > 1 fix by >J.montoya
if (etext.length > 0) {
$.getJSON(options.json_url + "&tag=" + etext, null, function(data){
addMembers(etext, data);
json_cache = true;
bindEvents();
});
}
}
}
else
{
addMembers(etext);
bindEvents();
}
complete.children(".default").hide();
feed.show();
}
}
);
if (focusme)
{
setTimeout(function(){
input.focus();
complete.children(".default").show();
},1);
}
}
function addMembers(etext, data)
{
feed.html('');
if (!options.cache)
{
cache = new Array();
search_string = "";
}
addTextItem(etext);
if (data != null && data.length)
{
$.each(data,
function(i, val)
{
cache.push (
{
caption: val.caption,
value: val.value
}
);
search_string += "" + (cache.length - 1) + ":" + val.caption + ";";
}
);
}
var maximum = options.maxshownitems<cache.length?options.maxshownitems:cache.length;
var filter = "i";
if (options.filter_case)
{
filter = "";
}
var myregexp, match;
try {
myregexp = eval('/(?:^|;)\\s*(\\d+)\\s*:[^;]*?' + etext + '[^;]*/g' + filter);
match = myregexp.exec(search_string);
} catch(ex){};
var content = '';
while (match != null && maximum > 0)
{
var id = match[1];
var object = cache[id];
if (options.filter_selected && element.children("option[value=" + object.value + "]").hasClass("selected"))
{
//nothing here...
}
else
{
content += '<li rel="' + object.value + '">' + itemIllumination(object.caption, etext) + '</li>';
counter++;
maximum--;
}
match = myregexp.exec(search_string);
}
feed.append(content);
if (options.firstselected)
{
focuson = feed.children("li:visible:first");
focuson.addClass("auto-focus");
}
if (counter > options.height)
{
feed.css({"height": (options.height * 24) + "px","overflow": "auto"});
if (browser_msie)
{
browser_msie_frame.css({"height": (options.height * 24) + "px", "width": feed.width() + "px"}).show();
}
}
else
{
feed.css("height", "auto");
if (browser_msie)
{
browser_msie_frame.css({"height": feed.height() + "px", "width": feed.width() + "px"}).show();
}
}
}
function itemIllumination(text, etext)
{
if (options.filter_case)
{
try {
eval("var text = text.replace(/(.*)(" + etext + ")(.*)/gi,'$1<em>$2</em>$3');");
} catch(ex){};
}
else
{
try {
eval("var text = text.replace(/(.*)(" + etext.toLowerCase() + ")(.*)/gi,'$1<em>$2</em>$3');");
}catch(ex){};
}
return text;
}
function bindFeedEvent()
{
feed.children("li").mouseover(
function()
{
feed.children("li").removeClass("auto-focus");
$(this).addClass("auto-focus");
focuson = $(this);
}
);
feed.children("li").mouseout(
function()
{
$(this).removeClass("auto-focus");
focuson = null;
}
);
}
function removeFeedEvent()
{
feed.children("li").unbind("mouseover");
feed.children("li").unbind("mouseout");
feed.mousemove(
function ()
{
bindFeedEvent();
feed.unbind("mousemove");
}
);
}
function bindEvents()
{
var maininput = $("#"+elemid + "_annoninput").children(".maininput");
bindFeedEvent();
feed.children("li").unbind("mousedown");
feed.children("li").mousedown(
function()
{
//click in the list
var option = $(this);
addItem(option.text(),option.attr("rel"));
feed.hide();
browser_msie?browser_msie_frame.hide():'';
complete.hide();
}
);
maininput.unbind("keydown");
maininput.keydown(
function(event)
{
if(event.keyCode == 191)
{
event.preventDefault();
return false;
}
if (event.keyCode != 8)
{
holder.children("li.bit-box.deleted").removeClass("deleted");
}
if (event.keyCode == 13 && checkFocusOn())
{
var option = focuson;
addItem(option.text(), option.attr("rel"));
complete.hide();
event.preventDefault();
focuson = null;
return false;
}
if (event.keyCode == 13 && !checkFocusOn())
{
if (options.newel)
{
var value = xssPrevent($(this).val());
addItem(value, value);
complete.hide();
event.preventDefault();
focuson = null;
}
return false;
}
if (event.keyCode == 40)
{
removeFeedEvent();
if (focuson == null || focuson.length == 0)
{
focuson = feed.children("li:visible:first");
feed.get(0).scrollTop = 0;
}
else
{
focuson.removeClass("auto-focus");
focuson = focuson.nextAll("li:visible:first");
var prev = parseInt(focuson.prevAll("li:visible").length,10);
var next = parseInt(focuson.nextAll("li:visible").length,10);
if ((prev > Math.round(options.height /2) || next <= Math.round(options.height /2)) && typeof(focuson.get(0)) != "undefined")
{
feed.get(0).scrollTop = parseInt(focuson.get(0).scrollHeight,10) * (prev - Math.round(options.height /2));
}
}
feed.children("li").removeClass("auto-focus");
focuson.addClass("auto-focus");
}
if (event.keyCode == 38)
{
removeFeedEvent();
if (focuson == null || focuson.length == 0)
{
focuson = feed.children("li:visible:last");
feed.get(0).scrollTop = parseInt(focuson.get(0).scrollHeight,10) * (parseInt(feed.children("li:visible").length,10) - Math.round(options.height /2));
}
else
{
focuson.removeClass("auto-focus");
focuson = focuson.prevAll("li:visible:first");
var prev = parseInt(focuson.prevAll("li:visible").length,10);
var next = parseInt(focuson.nextAll("li:visible").length,10);
if ((next > Math.round(options.height /2) || prev <= Math.round(options.height /2)) && typeof(focuson.get(0)) != "undefined")
{
feed.get(0).scrollTop = parseInt(focuson.get(0).scrollHeight,10) * (prev - Math.round(options.height /2));
}
}
feed.children("li").removeClass("auto-focus");
focuson.addClass("auto-focus");
}
}
);
}
function addTextItem(value)
{
if (options.newel)
{
feed.children("li[fckb=1]").remove();
if (value.length == 0)
{
return;
}
var li = $(document.createElement("li"));
li.attr({"rel": value,"fckb": "1"}).html(value);
feed.prepend(li);
counter++;
} else
{
return;
}
}
function funCall(func,item)
{
var _object = "";
for(i=0;i < item.get(0).attributes.length;i++)
{
if (item.get(0).attributes[i].nodeValue != null)
{
_object += "\"_" + item.get(0).attributes[i].nodeName + "\": \"" + item.get(0).attributes[i].nodeValue + "\",";
}
}
_object = "{"+ _object + " notinuse: 0}";
try {
eval(func + "(" + _object + ")");
}catch(ex){};
}
function checkFocusOn()
{
if (focuson == null)
{
return false;
}
if (focuson.length == 0)
{
return false;
}
return true;
}
function xssPrevent(string)
{
string = string.replace(/[\"\'][\s]*javascript:(.*)[\"\']/g, "\"\"");
string = string.replace(/script(.*)/g, "");
string = string.replace(/eval\((.*)\)/g, "");
string = string.replace('/([\x00-\x08,\x0b-\x0c,\x0e-\x19])/', '');
return string;
}
var options = $.extend({
json_url: null,
cache: false,
height: "10",
newel: false,
firstselected: false,
filter_case: false,
filter_hide: false,
complete_text: "Start to type...",
maxshownitems: 30,
onselect: "",
onremove: ""
}, opt);
//system variables
var holder = null;
var feed = null;
var complete = null;
var counter = 0;
var cache = new Array();
var json_cache = false;
var search_string = "";
var focuson = null;
var deleting = 0;
var browser_msie = "\v"=="v";
var browser_msie_frame;
var element = $(this);
var elemid = element.attr("id");
init();
return this;
});
};
}
);

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

@ -0,0 +1,51 @@
/* TextboxList sample CSS */
ul.holder { margin: 0; border: 1px solid #999; overflow: hidden; height: auto !important; height: 1%; padding: 4px 5px 0; }
*:first-child+html ul.holder { padding-bottom: 2px; } * html ul.holder { padding-bottom: 2px; } /* ie7 and below */
ul.holder li { float: left; list-style-type: none; margin: 0 5px 4px 0; white-space:nowrap;}
ul.holder li.bit-box, ul.holder li.bit-input input { font: 11px "Lucida Grande", "Verdana"; }
ul.holder li.bit-box { -moz-border-radius: 6px; -webkit-border-radius: 6px; border-radius: 6px; border: 1px solid #CAD8F3; background: #DEE7F8; padding: 1px 5px 2px; }
ul.holder li.bit-box-focus { border-color: #598BEC; background: #598BEC; color: #fff; }
ul.holder li.bit-input input { width: auto; overflow:visible; margin: 0; border: 0px; outline: 0; padding: 3px 0px 2px; } /* no left/right padding here please */
ul.holder li.bit-input input.smallinput { width: 20px; }
/* Facebook demo CSS */
#add { border: 1px solid #999; width: 550px; margin: 50px; padding: 20px 30px 10px; }
form ol li { list-style-type: none; }
form ol { font: 11px "Lucida Grande", "Verdana"; margin: 0; padding: 0; }
form ol li.input-text { margin-bottom: 10px; list-style-type: none; padding-bottom: 10px; }
form ol li.input-text label { font-weight: bold; cursor: pointer; display: block; font-size: 13px; margin-bottom: 10px; }
form ol li.input-text input { background-image:none; width: 500px; padding: 5px 5px 6px; font: 11px "Lucida Grande", "Verdana"; border: 1px solid #999; }
/* This hide the shadow.gid image of dokeos*/
ul.holder input[type="text"]:focus, ul.holder input-text input[type="password"]:focus {
background-image:none;
}
form ul.holder { width: 500px; }
form ul { margin: 0 !important }
ul.holder li.bit-box, #apple-list ul.holder li.bit-box { padding-right: 15px; position: relative; z-index:1000;}
#apple-list ul.holder li.bit-input { margin: 0; }
#apple-list ul.holder li.bit-input input.smallinput { width: 5px; }
ul.holder li.bit-hover { background: #BBCEF1; border: 1px solid #6D95E0; }
ul.holder li.bit-box-focus { border-color: #598BEC; background: #598BEC; color: #fff; }
ul.holder li.bit-box a.closebutton { position: absolute; right: 4px; top: 5px; display: block; width: 7px; height: 7px; font-size: 1px; background: url('close.gif'); }
ul.holder li.bit-box a.closebutton:hover { background-position: 7px; }
ul.holder li.bit-box-focus a.closebutton, ul.holder li.bit-box-focus a.closebutton:hover { background-position: bottom; }
/* Autocompleter */
.facebook-auto { z-index:2000; display: none; position: absolute; width: 512px; background: #eee; }
.facebook-auto .default { z-index:2000; padding: 5px 7px; border: 1px solid #ccc; border-width: 0 1px 1px;font-family:"Lucida Grande","Verdana"; font-size:11px; }
.facebook-auto ul { display: none; margin: 0; padding: 0; overflow: auto; position:absolute; z-index:9999}
.facebook-auto ul li { padding: 5px 12px; z-index: 1000; cursor: pointer; margin: 0; list-style-type: none; border: 1px solid #ccc; border-width: 0 1px 1px; font: 11px "Lucida Grande", "Verdana"; background-color: #eee }
.facebook-auto ul li em { font-weight: bold; font-style: normal; background: #ccc; }
.facebook-auto ul li.auto-focus { background: #4173CC; color: #fff; }
.facebook-auto ul li.auto-focus em { background: none; }
.deleted { background-color:#4173CC !important; color:#ffffff !important;}
.hidden { display:none;}
#demo ul.holder li.bit-input input { padding: 2px 0 1px; border: 1px solid #999; }
.ie6fix {height:1px;width:1px; position:absolute;top:0px;left:0px;z-index:1;}

@ -19,6 +19,7 @@ define('USER_FIELD_TYPE_DATE', 6);
define('USER_FIELD_TYPE_DATETIME', 7);
define('USER_FIELD_TYPE_DOUBLE_SELECT', 8);
define('USER_FIELD_TYPE_DIVIDER', 9);
define('USER_FIELD_TYPE_TAG', 10);
class UserManager
{
@ -893,6 +894,7 @@ class UserManager
if ($user_id != strval(intval($user_id))) return false;
if ($user_id === false) return false;
$fvalues = '';
//echo '<pre>'; print_r($fvalue);
if (is_array($fvalue)) {
foreach($fvalue as $val) {
$fvalues .= Database::escape_string($val).';';
@ -910,6 +912,11 @@ class UserManager
// Check if enumerated field, if the option is available
$rowuf = Database::fetch_array($resuf);
switch ($rowuf['field_type']) {
case 10 :
//Tags are process here
UserManager::process_tags(explode(';', $fvalues), $user_id, $rowuf['id']);
return true;
break;
case 3:
case 4:
case 5:
@ -932,7 +939,7 @@ class UserManager
}
break;
case 1:
case 2:
case 2:
default:
break;
}
@ -1433,6 +1440,19 @@ class UserManager
}
return $return;
}
public static function get_all_extra_field_by_type($field_type) {
// database table definition
$table_field = Database::get_main_table(TABLE_MAIN_USER_FIELD);
// all the information of the field
$sql = "SELECT * FROM $table_field WHERE field_type='".Database::escape_string($field_type)."'";
$result = Database::query($sql, __FILE__, __LINE__);
while ($row = Database::fetch_array($result)) {
$return[] = $row['id'];
}
return $return;
}
/**
* Get all the extra field information of a certain field (also the options)
@ -1460,7 +1480,7 @@ class UserManager
}
return $return;
}
/** Get extra user data by value
* @param string the internal variable name of the field
* @param string the internal value of the field
@ -2223,4 +2243,274 @@ class UserManager
$rs = Database::query($sql_insert_outbox, __FILE__, __LINE__);
}
}
/*
*
* USER TAGS
*
* Intructions to create a new user tag
*
* 1. Create a new extra field in main/admin/user_fields.php with the "TAG" field type make it available and visible. Called it "books" for example.
* 2. Go to profile main/auth/profile.php There you will see a special input (facebook style) that will show suggestions of tags.
* 3. Step 2 will not work since this special input needs a file called "main/user/books.php" In this case. In order to have this file copy and paste from this file main/user/tag.php
* 4. All the tags are registered in the user_tag table and the relationship between user and tags is in the user_rel_tag table
* 5. Test and enjoy.
*
*/
/**
* Gets the tags of a specific field_id
*
* @param int field_id
* @param string how we are going to result value in array or in a string (json)
* @return mixed
*/
public static function get_tags($tag, $field_id, $return_format='json',$limit=10) {
// database table definition
$table_user_tag = Database::get_main_table(TABLE_MAIN_USER_TAG);
$table_user_tag_values = Database::get_main_table(TABLE_MAIN_USER_REL_TAG);
$field_id = intval($field_id); //like '%$tag%'
$limit = intval($limit);
$tag = Database::escape_string($tag);
// all the information of the field
$sql = "SELECT id, tag from $table_user_tag
WHERE field_id = $field_id AND tag LIKE '$tag%' ORDER BY tag LIMIT $limit";
$result = Database::query($sql, __FILE__, __LINE__);
$return = array();
if (Database::num_rows($result)>0) {
while ($row = Database::fetch_array($result,'ASSOC')) {
$return[] = array('caption'=>$row['tag'], 'value'=>$row['tag']);
}
}
if ($return_format=='json') {
$return = json_encode($return);
}
return $return;
}
public static function get_top_tags($field_id, $limit=100) {
// database table definition
$table_user_tag = Database::get_main_table(TABLE_MAIN_USER_TAG);
$table_user_tag_values = Database::get_main_table(TABLE_MAIN_USER_REL_TAG);
$field_id = intval($field_id);
$limit = intval($limit);
// all the information of the field
$sql = "SELECT count(*) count, tag FROM $table_user_tag_values uv INNER JOIN $table_user_tag ut ON(ut.id = uv.tag_id)
WHERE field_id = $field_id GROUP BY tag_id ORDER BY count DESC LIMIT $limit";
$result = Database::query($sql, __FILE__, __LINE__);
$return = array();
if (Database::num_rows($result)>0) {
while ($row = Database::fetch_array($result,'ASSOC')) {
$return[] = $row;
}
}
return $return;
}
/**
* Get user's tags
* @param int field_id
* @param int user_id
* @return array
*/
public static function get_user_tags($user_id,$field_id) {
// database table definition
$table_user_tag = Database::get_main_table(TABLE_MAIN_USER_TAG);
$table_user_tag_values = Database::get_main_table(TABLE_MAIN_USER_REL_TAG);
$field_id = intval($field_id);
$user_id = intval($user_id);
// all the information of the field
$sql = "SELECT ut.id, tag,count FROM $table_user_tag ut INNER JOIN $table_user_tag_values uv ON (uv.tag_id=ut.ID)
WHERE field_id = $field_id AND user_id = $user_id ORDER BY tag";
$result = Database::query($sql, __FILE__, __LINE__);
$return = array();
if (Database::num_rows($result)> 0) {
while ($row = Database::fetch_array($result,'ASSOC')) {
$return[$row['id']] = array($row['tag'],$row['count']);
}
}
return $return;
}
/**
* Searchs user with a specific tag
* @param string the tag
* @param int field id of the tag
* @return array
*/
public static function get_all_user_tags($tag, $field_id, $from, $number_of_items) {
// database table definition
$table_user_tag = Database::get_main_table(TABLE_MAIN_USER_TAG);
$table_user_tag_values = Database::get_main_table(TABLE_MAIN_USER_REL_TAG);
$field_id = intval($field_id);
$tag = Database::escape_string($tag);
$from = intval($from);
$number_of_items = intval($number_of_items);
// all the information of the field
$sql = "SELECT u.user_id,u.username,firstname, lastname, tag FROM $table_user_tag ut INNER JOIN $table_user_tag_values uv ON (uv.tag_id=ut.ID)
INNER JOIN user u ON(uv.user_id =u.user_id)
WHERE field_id = $field_id AND tag LIKE '$tag%' ORDER BY tag";
$sql .= " LIMIT $from,$number_of_items";
$result = Database::query($sql, __FILE__, __LINE__);
$return = array();
if (Database::num_rows($result)> 0) {
while ($row = Database::fetch_array($result,'ASSOC')) {
$return[$row['user_id']] = $row;
}
}
return $return;
}
/**
* Get the tag id
* @param int $tag
* @param int $field_id
* @return int 0 if fails otherwise the tag id
*/
public function get_tag_id($tag, $field_id) {
$table_user_tag = Database::get_main_table(TABLE_MAIN_USER_TAG);
$tag = Database::escape_string($tag);
$field_id = intval($field_id);
//with COLLATE latin1_bin to select query in a case sensitive mode
$sql = "SELECT id FROM $table_user_tag WHERE tag COLLATE latin1_bin LIKE '$tag' AND field_id = $field_id";
$result = Database::query($sql, __FILE__, __LINE__);
if (Database::num_rows($result)>0) {
$row = Database::fetch_array($result,'ASSOC');
return $row['id'];
} else {
return 0;
}
}
/**
* Get the tag id
* @param int $tag
* @param int $field_id
* @return int 0 if fails otherwise the tag id
*/
public function get_tag_id_from_id($tag_id, $field_id) {
$table_user_tag = Database::get_main_table(TABLE_MAIN_USER_TAG);
$tag_id = intval($tag_id);
$field_id = intval($field_id);
$sql = "SELECT id FROM $table_user_tag WHERE id = '$tag_id' AND field_id = $field_id";
$result = Database::query($sql, __FILE__, __LINE__);
if (Database::num_rows($result)>0) {
$row = Database::fetch_array($result,'ASSOC');
return $row['id'];
} else {
return false;
}
}
/**
* Adds a user-tag value
* @param mixed $tag
* @param int $user_id
* @param int $field_id
* @return bool
*/
public function add_tag($tag, $user_id, $field_id) {
// database table definition
$table_user_tag = Database::get_main_table(TABLE_MAIN_USER_TAG);
$table_user_tag_values = Database::get_main_table(TABLE_MAIN_USER_REL_TAG);
$tag = Database::escape_string($tag);
$user_id = intval($user_id);
$field_id = intval($field_id);
//&& (substr($tag,strlen($tag)-1) == '@')
/*$sent_by_user = false;
if ( substr($tag,0,1) == '@') {
//is a value sent by the list
$sent_by_user = true;
$tag = substr($tag,1,strlen($tag)-2);
}
*/
$tag_id = UserManager::get_tag_id($tag,$field_id);
//@todo we don't create tags with numbers
if (is_numeric($tag)) {
//the form is sending an id this means that the user select it from the list so it MUST exists
/*$new_tag_id = UserManager::get_tag_id_from_id($tag,$field_id);
if ($new_tag_id !== false) {
$sql = "UPDATE $table_user_tag SET count = count + 1 WHERE id = $new_tag_id";
$result = Database::query($sql, __FILE__, __LINE__);
$last_insert_id = $new_tag_id;
} else {
$sql = "INSERT INTO $table_user_tag (tag, field_id,count) VALUES ('$tag','$field_id', count + 1)";
$result = Database::query($sql, __FILE__, __LINE__);
$last_insert_id = Database::get_last_insert_id();
}*/
} else {
//this is a new tag
if ($tag_id == 0) {
//the tag doesn't exist
$sql = "INSERT INTO $table_user_tag (tag, field_id,count) VALUES ('$tag','$field_id', count + 1)";
$result = Database::query($sql, __FILE__, __LINE__);
$last_insert_id = Database::get_last_insert_id();
} else {
//the tag exists we update it
$sql = "UPDATE $table_user_tag SET count = count + 1 WHERE id = $tag_id";
$result = Database::query($sql, __FILE__, __LINE__);
$last_insert_id = $tag_id;
}
}
if (!empty($last_insert_id) && ($last_insert_id!=0)) {
//we insert the relationship user-tag
$sql_select ="SELECT tag_id FROM $table_user_tag_values WHERE user_id = $user_id AND tag_id = $last_insert_id ";
$result = Database::query($sql_select, __FILE__, __LINE__);
//if the relationship does not exist we create it
if (Database::num_rows($result)==0) {
$sql = "INSERT INTO $table_user_tag_values SET user_id = $user_id, tag_id = $last_insert_id";
$result = Database::query($sql, __FILE__, __LINE__);
}
}
}
/**
* Deletes an user tag
* @param int user id
* @param int field id
*
*/
public function delete_user_tags($user_id, $field_id) {
// database table definition
$table_user_tag = Database::get_main_table(TABLE_MAIN_USER_TAG);
$table_user_tag_values = Database::get_main_table(TABLE_MAIN_USER_REL_TAG);
$tags = UserManager::get_user_tags($user_id, $field_id);
//echo '<pre>';var_dump($tags);
if(is_array($tags) && count($tags)>0) {
foreach ($tags as $key=>$tag) {
if ($tag[1]>'0') {
$sql = "UPDATE $table_user_tag SET count = count - 1 WHERE id = $key ";
$result = Database::query($sql, __FILE__, __LINE__);
}
$sql = "DELETE FROM $table_user_tag_values WHERE user_id = $user_id AND tag_id = $key";
$result = Database::query($sql, __FILE__, __LINE__);
}
}
}
/**
* Process the tag list comes from the UserManager::update_extra_field_value() function
* @param array the tag list that will be added
* @param int user id
* @param int field id
* @return bool
*/
public function process_tags($tags, $user_id, $field_id) {
//We loop the tags and add it to the DB
if (is_array($tags)) {
foreach($tags as $tag) {
UserManager::add_tag($tag, $user_id, $field_id);
}
} else {
UserManager::add_tag($tags,$user_id, $field_id);
}
return true;
}
}

@ -2259,3 +2259,26 @@ CREATE TABLE session_category (
date_end date default NULL,
PRIMARY KEY (id)
);
--
-- Table structure for table user tag
--
CREATE TABLE user_tag (
id int NOT NULL auto_increment,
tag varchar(255) NOT NULL,
field_id int NOT NULL,
count int NOT NULL,
PRIMARY KEY (id)
);
CREATE TABLE user_rel_tag (
id int NOT NULL auto_increment,
user_id int NOT NULL,
tag_id int NOT NULL,
PRIMARY KEY (id)
);

@ -20,7 +20,6 @@ ALTER TABLE session_rel_course_rel_user ADD COLUMN visibility int NOT NULL defau
ALTER TABLE session_rel_course_rel_user ADD COLUMN status int NOT NULL default 0;
CREATE TABLE session_category (id int(11) NOT NULL auto_increment, name varchar(100) default NULL, date_start date default NULL, date_end date default NULL, PRIMARY KEY (id));
INSERT INTO settings_current (variable, subkey, type, category, selected_value, title, comment, scope, subkeytext, access_url_changeable) VALUES ('allow_coach_to_edit_course_session', NULL, 'radio', 'Course', 'false', 'AllowCoachsToEditInsideTrainingSessions', 'AllowCoachsToEditInsideTrainingSessionsComment', NULL, NULL, 0);
INSERT INTO settings_current (variable, subkey, type, category, selected_value, title, comment, scope, subkeytext, access_url, access_url_changeable) VALUES ('show_courses_descriptions_in_catalog', NULL, 'radio', 'Course', 'true', 'ShowCoursesDescriptionsInCatalogTitle', 'ShowCoursesDescriptionsInCatalogComment', NULL, NULL, 1, 1);
@ -30,6 +29,11 @@ INSERT INTO settings_options (variable, value, display_text) VALUES ('show_cours
INSERT INTO settings_options (variable, value, display_text) VALUES ('allow_coach_to_edit_course_session', 'true', 'Yes');
INSERT INTO settings_options (variable, value, display_text) VALUES ('allow_coach_to_edit_course_session', 'false', 'No');
CREATE TABLE user_tag (id int NOT NULL auto_increment, tag varchar(255) NOT NULL, field_id int NOT NULL, count int NOT NULL, PRIMARY KEY (id));
CREATE TABLE user_rel_tag (id int NOT NULL auto_increment,user_id int NOT NULL,tag_id int NOT NULL, PRIMARY KEY (id));
-- xxSTATSxx
-- xxUSERxx

@ -731,38 +731,46 @@ echo '<div id="social-profile-container">';
$extra_information .= get_lang('ExtraInformation');
$extra_information .= '</div><br />';
$extra_information .='<div class="social-content-information">';
$extra_information_value = '';
$extra_information_value = '';
foreach($extra_user_data as $key=>$data) {
// get display text, visibility and type from user_field table
$field_variable = str_replace('extra_','',$key);
$sql = "SELECT field_display_text,field_visible,field_type FROM $t_uf WHERE field_variable ='$field_variable'";
$res_field = Database::query($sql,__FILE__,__LINE__);
$row_field = Database::fetch_row($res_field);
$field_display_text = $row_field[0];
$field_visible = $row_field[1];
$field_type = $row_field[2];
if ($field_visible == 1) {
if (is_array($data)) {
$extra_information_value .= '<strong>'.ucfirst($field_display_text).':</strong> '.implode(',',$data).'<br />';
} else {
if ($field_type == 8) {
$id_options = explode(';',$data);
$value_options = array();
// get option display text from user_field_options table
foreach ($id_options as $id_option) {
$sql = "SELECT option_display_text FROM $t_ufo WHERE id = '$id_option'";
$res_options = Database::query($sql,__FILE__,__LINE__);
$row_options = Database::fetch_row($res_options);
$value_options[] = $row_options[0];
// get display text, visibility and type from user_field table
$field_variable = str_replace('extra_','',$key);
$sql = "SELECT field_display_text,field_visible,field_type,id FROM $t_uf WHERE field_variable ='$field_variable'";
$res_field = Database::query($sql,__FILE__,__LINE__);
$row_field = Database::fetch_row($res_field);
$field_display_text = $row_field[0];
$field_visible = $row_field[1];
$field_type = $row_field[2];
$field_id = $row_field[3];
if ($field_visible == 1) {
if (is_array($data)) {
$extra_information_value .= '<strong>'.ucfirst($field_display_text).':</strong> '.implode(',',$data).'<br />';
} else {
if ($field_type == 8) {
$id_options = explode(';',$data);
$value_options = array();
// get option display text from user_field_options table
foreach ($id_options as $id_option) {
$sql = "SELECT option_display_text FROM $t_ufo WHERE id = '$id_option'";
$res_options = Database::query($sql,__FILE__,__LINE__);
$row_options = Database::fetch_row($res_options);
$value_options[] = $row_options[0];
}
$extra_information_value .= '<strong>'.ucfirst($field_display_text).':</strong> '.implode(' ',$value_options).'<br />';
} elseif($field_type == 10) {
$user_tags = UserManager::get_user_tags($user_id, $field_id);
$tag_tmp = array();
foreach ($user_tags as $tags) {
$tag_tmp[] = $tags[0];
}
if (is_array($user_tags) && count($user_tags)>0) {
$extra_information_value .= '<strong>'.ucfirst($field_display_text).':</strong> '.implode(', ',$tag_tmp).'<br />';
}
} else {
$extra_information_value .= '<strong>'.ucfirst($field_display_text).':</strong> '.$data.'<br />';
}
$extra_information_value .= '<strong>'.ucfirst($field_display_text).':</strong> '.implode(' ',$value_options).'<br />';
}
else {
$extra_information_value .= '<strong>'.ucfirst($field_display_text).':</strong> '.$data.'<br />';
}
}
}
}
// if there are information to show
if (!empty($extra_information_value)) {

@ -0,0 +1,285 @@
<?php
/* For licensing terms, see /dokeos_license.txt */
// name of the language file that needs to be included
$language_file = array ('registration','admin');
require_once '../inc/global.inc.php';
require_once (api_get_path(LIBRARY_PATH).'sortabletable.class.php');
require_once (api_get_path(LIBRARY_PATH).'formvalidator/FormValidator.class.php');
require_once (api_get_path(LIBRARY_PATH).'security.lib.php');
require_once (api_get_path(LIBRARY_PATH).'usermanager.lib.php');
$tool_name = get_lang('SearchAUser');
Display :: display_header($tool_name);
// Build search-form
$form = new FormValidator('search_user', 'get', '', '', null, false);
$renderer = & $form->defaultRenderer();
$renderer->setElementTemplate('<span>{element}</span> ');
$form->add_textfield('keyword', '', false);
$form->addElement('style_submit_button', 'submit', get_lang('SearchButton'), 'class="search"');
$form->addElement('static', 'additionalactions', null, $actions);
$form->display();
if (isset ($_GET['keyword'])) {
if (isset ($_GET['keyword'])) {
$parameters = array ('keyword' => Security::remove_XSS($_GET['keyword']));
}
// Create a sortable table with user-data
$parameters['sec_token'] = Security::get_token();
$table = new SortableTable('users', 'get_number_of_users', 'get_user_data', (api_is_western_name_order() xor api_sort_by_first_name()) ? 3 : 2);
$table->set_additional_parameters($parameters);
$table->set_header(0, '', false);
$table->set_header(1, get_lang('OfficialCode'));
if (api_is_western_name_order()) {
$table->set_header(2, get_lang('FirstName'));
$table->set_header(3, get_lang('LastName'));
} else {
$table->set_header(2, get_lang('LastName'));
$table->set_header(3, get_lang('FirstName'));
}
$table->set_header(4, get_lang('LoginName'));
$table->set_header(5, get_lang('Email'));
//tag
$table_tag = new SortableTable('tags', 'get_number_of_user_tags', 'get_user_tag_data');
$table_tag->set_additional_parameters($parameters);
$table_tag->set_header(0, '', false);
$table->set_header(1, get_lang('OfficialCode'));
if (api_is_western_name_order()) {
$table_tag->set_header(2, get_lang('FirstName'));
$table_tag->set_header(3, get_lang('LastName'));
} else {
$table_tag->set_header(2, get_lang('LastName'));
$table_tag->set_header(3, get_lang('FirstName'));
}
/*
//groups
$table_tag = new SortableTable('groups', 'get_number_of_user_tags', 'get_user_tag_data');
$table_tag->set_additional_parameters($parameters);
$table_tag->set_header(0, '', false);
$table->set_header(1, get_lang('OfficialCode'));
if (api_is_western_name_order()) {
$table_tag->set_header(2, get_lang('FirstName'));
$table_tag->set_header(3, get_lang('LastName'));
} else {
$table_tag->set_header(2, get_lang('LastName'));
$table_tag->set_header(3, get_lang('FirstName'));
}
*/
echo get_lang('Users');
$table->display_grid();
echo get_lang('Tags');
$table_tag->display_grid();
/*
echo get_lang('Groups');
$table_group->display_grid();
*/
}
/**
* Get the users to display on the current page (fill the sortable-table)
* @param int offset of first user to recover
* @param int Number of users to get
* @param int Column to sort on
* @param string Order (ASC,DESC)
* @see SortableTable#get_table_data($from)
*/
function get_user_tag_data($from, $number_of_items, $column, $direction)
{
if (isset ($_GET['keyword'])) {
$keyword = Database::escape_string($_GET['keyword']);
}
$user_tags = UserManager::get_all_user_tags($keyword,'5',$from, $number_of_items);
return $user_tags;
}
/**
* Get the total number of users on the platform
* @see SortableTable#get_total_number_of_items()
*/
function get_number_of_user_tags()
{
$tag_table = Database :: get_main_table(TABLE_MAIN_USER_TAG);
$sql = "SELECT COUNT(tag) AS total_number_of_items FROM $tag_table u";
if (isset ($_GET['keyword'])) {
$keyword = Database::escape_string($_GET['keyword']);
$sql .= " WHERE (tag LIKE '%".$keyword."%' )";
}
$res = Database::query($sql, __FILE__, __LINE__);
$obj = Database::fetch_object($res);
return $obj->total_number_of_items;
}
/**
* Get the users to display on the current page (fill the sortable-table)
* @param int offset of first user to recover
* @param int Number of users to get
* @param int Column to sort on
* @param string Order (ASC,DESC)
* @see SortableTable#get_table_data($from)
*/
function get_user_data($from, $number_of_items, $column, $direction)
{
$user_table = Database :: get_main_table(TABLE_MAIN_USER);
$sql = "SELECT
u.user_id AS col0,
u.official_code AS col1,
".(api_is_western_name_order()
? "u.firstname AS col2,
u.lastname AS col3,"
: "u.lastname AS col2,
u.firstname AS col3,")."
u.username AS col4,
u.email AS col5
FROM $user_table u ";
// adding the filter to see the user's only of the current access_url
global $_configuration;
if ((api_is_platform_admin() || api_is_session_admin()) && $_configuration['multiple_access_urls']==true && api_get_current_access_url_id()!=-1) {
$access_url_rel_user_table= Database :: get_main_table(TABLE_MAIN_ACCESS_URL_REL_USER);
$sql.= " INNER JOIN $access_url_rel_user_table url_rel_user ON (u.user_id=url_rel_user.user_id)";
}
if (isset ($_GET['keyword'])) {
$keyword = Database::escape_string($_GET['keyword']);
$sql .= " WHERE (u.firstname LIKE '%".$keyword."%' OR u.lastname LIKE '%".$keyword."%' OR u.username LIKE '%".$keyword."%' OR u.official_code LIKE '%".$keyword."%' OR u.email LIKE '%".$keyword."%' )";
} elseif (isset ($_GET['keyword_firstname'])) {
$admin_table = Database :: get_main_table(TABLE_MAIN_ADMIN);
$keyword_firstname = Database::escape_string($_GET['keyword_firstname']);
$keyword_lastname = Database::escape_string($_GET['keyword_lastname']);
$keyword_email = Database::escape_string($_GET['keyword_email']);
$keyword_officialcode = Database::escape_string($_GET['keyword_officialcode']);
$keyword_username = Database::escape_string($_GET['keyword_username']);
$keyword_status = Database::escape_string($_GET['keyword_status']);
$query_admin_table = '';
$keyword_admin = '';
if ($keyword_status == SESSIONADMIN) {
$keyword_status = '%';
$query_admin_table = " , $admin_table a ";
$keyword_admin = ' AND a.user_id = u.user_id ';
}
$keyword_active = isset($_GET['keyword_active']);
$keyword_inactive = isset($_GET['keyword_inactive']);
$sql .= $query_admin_table." WHERE (u.firstname LIKE '%".$keyword_firstname."%' " .
"AND u.lastname LIKE '%".$keyword_lastname."%' " .
"AND u.username LIKE '%".$keyword_username."%' " .
"AND u.email LIKE '%".$keyword_email."%' " .
"AND u.official_code LIKE '%".$keyword_officialcode."%' " .
"AND u.status LIKE '".$keyword_status."'" .
$keyword_admin;
if ($keyword_active && !$keyword_inactive) {
$sql .= " AND u.active='1'";
} elseif($keyword_inactive && !$keyword_active) {
$sql .= " AND u.active='0'";
}
$sql .= " ) ";
}
// adding the filter to see the user's only of the current access_url
if ((api_is_platform_admin() || api_is_session_admin()) && $_configuration['multiple_access_urls']==true && api_get_current_access_url_id()!=-1) {
$sql.= " AND url_rel_user.access_url_id=".api_get_current_access_url_id();
}
if (!in_array($direction, array('ASC','DESC'))) {
$direction = 'ASC';
}
$column = intval($column);
$from = intval($from);
$number_of_items = intval($number_of_items);
$sql .= " ORDER BY col$column $direction ";
$sql .= " LIMIT $from,$number_of_items";
$res = Database::query($sql, __FILE__, __LINE__);
$users = array ();
$t = time();
while ($user = Database::fetch_row($res)) {
if ($user[7] == 1 && $user[9] != '0000-00-00 00:00:00') {
// check expiration date
$expiration_time = convert_mysql_date($user[9]);
// if expiration date is passed, store a special value for active field
if ($expiration_time < $t) {
$user[7] = '-1';
}
}
// forget about the expiration date field
$users[] = array($user[0],$user[1],$user[2],$user[3],$user[4],$user[5]);
}
return $users;
}
/**
* Get the total number of users on the platform
* @see SortableTable#get_total_number_of_items()
*/
function get_number_of_users()
{
$user_table = Database :: get_main_table(TABLE_MAIN_USER);
$sql = "SELECT COUNT(u.user_id) AS total_number_of_items FROM $user_table u";
// adding the filter to see the user's only of the current access_url
global $_configuration;
if ((api_is_platform_admin() || api_is_session_admin()) && $_configuration['multiple_access_urls']==true && api_get_current_access_url_id()!=-1) {
$access_url_rel_user_table= Database :: get_main_table(TABLE_MAIN_ACCESS_URL_REL_USER);
$sql.= " INNER JOIN $access_url_rel_user_table url_rel_user ON (u.user_id=url_rel_user.user_id)";
}
if ( isset ($_GET['keyword'])) {
$keyword = Database::escape_string($_GET['keyword']);
$sql .= " WHERE (u.firstname LIKE '%".$keyword."%' OR u.lastname LIKE '%".$keyword."%' OR u.username LIKE '%".$keyword."%' OR u.email LIKE '%".$keyword."%' OR u.official_code LIKE '%".$keyword."%') ";
} elseif (isset ($_GET['keyword_firstname'])) {
$admin_table = Database :: get_main_table(TABLE_MAIN_ADMIN);
$keyword_firstname = Database::escape_string($_GET['keyword_firstname']);
$keyword_lastname = Database::escape_string($_GET['keyword_lastname']);
$keyword_email = Database::escape_string($_GET['keyword_email']);
$keyword_officialcode = Database::escape_string($_GET['keyword_officialcode']);
$keyword_username = Database::escape_string($_GET['keyword_username']);
$keyword_status = Database::escape_string($_GET['keyword_status']);
$query_admin_table = '';
$keyword_admin = '';
if ($keyword_status == SESSIONADMIN) {
$keyword_status = '%';
$query_admin_table = " , $admin_table a ";
$keyword_admin = ' AND a.user_id = u.user_id ';
}
$keyword_active = isset($_GET['keyword_active']);
$keyword_inactive = isset($_GET['keyword_inactive']);
$sql .= $query_admin_table .
" WHERE (u.firstname LIKE '%".$keyword_firstname."%' " .
"AND u.lastname LIKE '%".$keyword_lastname."%' " .
"AND u.username LIKE '%".$keyword_username."%' " .
"AND u.email LIKE '%".$keyword_email."%' " .
"AND u.official_code LIKE '%".$keyword_officialcode."%' " .
"AND u.status LIKE '".$keyword_status."'" .
$keyword_admin;
if($keyword_active && !$keyword_inactive) {
$sql .= " AND u.active='1'";
} elseif($keyword_inactive && !$keyword_active) {
$sql .= " AND u.active='0'";
}
$sql .= " ) ";
}
// adding the filter to see the user's only of the current access_url
if ((api_is_platform_admin() || api_is_session_admin()) && $_configuration['multiple_access_urls']==true && api_get_current_access_url_id()!=-1) {
$sql.= " AND url_rel_user.access_url_id=".api_get_current_access_url_id();
}
$res = Database::query($sql, __FILE__, __LINE__);
$obj = Database::fetch_object($res);
return $obj->total_number_of_items;
}

@ -0,0 +1,7 @@
<?php
/* For licensing terms, see /dokeos_license.txt */
require_once '../inc/global.inc.php';
require_once api_get_path(LIBRARY_PATH).'usermanager.lib.php';
$field_id = intval($_GET['field_id']);
$tag = $_GET['tag'];
echo UserManager::get_tags($tag, $field_id,'json','10');

@ -0,0 +1,7 @@
<?php
/* For licensing terms, see /dokeos_license.txt */
require_once '../inc/global.inc.php';
require_once api_get_path(LIBRARY_PATH).'usermanager.lib.php';
$field_id = intval($_GET['field_id']);
$tag = $_GET['tag'];
echo UserManager::get_tags($tag,$field_id,'json');
Loading…
Cancel
Save