Adding course rating system in the course catalog see # 4191 (waiting validation to the table field names in order to add the SQL in the migrate file)

skala
Julio Montoya 13 years ago
parent de002f9a97
commit d49099fce7
  1. 1
      main/auth/courses.php
  2. 88
      main/css/base.css
  3. BIN
      main/img/alt_star.gif
  4. 25
      main/inc/ajax/course.ajax.php
  5. 7
      main/inc/ajax/course_home.ajax.php
  6. 42
      main/inc/ajax/link.ajax.php
  7. 31
      main/inc/lib/auth.lib.php
  8. 221
      main/inc/lib/course.lib.php
  9. 30
      main/inc/lib/display.lib.php
  10. 2
      main/inc/lib/events.lib.inc.php
  11. 59
      main/install/db_main.sql
  12. 42
      main/template/default/auth/courses_categories.php

@ -19,7 +19,6 @@ require_once '../inc/global.inc.php';
require_once api_get_path(LIBRARY_PATH).'auth.lib.php';
require_once api_get_path(LIBRARY_PATH).'app_view.php';
require_once 'courses_controller.php';
//require_once api_get_path(LIBRARY_PATH).'debug.lib.inc.php';
require_once api_get_path(LIBRARY_PATH).'mail.lib.inc.php';
if (api_get_setting('show_courses_descriptions_in_catalog') == 'true') {

@ -1851,11 +1851,11 @@ button:hover {
.categories-course-description .course-block-title {
font-family: arial;
font-size: large;
font-size: medium;
margin-bottom: 10px;
color: #222222;
min-height:60px;
}
.categories-course-description .course-block-teacher {
font-size: large;
font-style: italic;
@ -4081,3 +4081,87 @@ div#no-data-view div.controls {
padding-top: 1px;
}
/* styles for the star rater */
.star-rating{
list-style:none;
margin: 0px;
padding:0px;
width: 125px;
height: 25px;
position: relative;
overflow:hidden;
background: url(../img/alt_star.gif) top left repeat-x;
}
.star-rating li{
padding:0px;
margin:0px;
width:25px;
height:25px;
/*\*/
float: left;
/* */
}
.star-rating li a{
display:block;
width:25px;
height: 25px;
line-height:25px;
text-decoration: none;
text-indent: -9000px;
z-index: 20;
position: absolute;
padding: 0px;
overflow:hidden;
}
.star-rating li a:hover{
background: url(../img/alt_star.gif) left bottom;
z-index: 2;
left: 0px;
border:none;
}
.star-rating a.one-star{
left: 0px;
}
.star-rating a.one-star:hover{
width:25px;
}
.star-rating a.two-stars{
left:25px;
}
.star-rating a.two-stars:hover{
width: 50px;
}
.star-rating a.three-stars{
left: 50px;
}
.star-rating a.three-stars:hover{
width: 75px;
}
.star-rating a.four-stars{
left: 75px;
}
.star-rating a.four-stars:hover{
width: 100px;
}
.star-rating a.five-stars{
left: 100px;
}
.star-rating a.five-stars:hover{
width: 125px;
}
.star-rating li.current-rating{
background: url(../img/alt_star.gif) left center;
position: absolute;
height: 25px;
display: block;
text-indent: -9000px;
z-index: 1;
}
/* remove halo effect in firefox */
a:active{
outline: none;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

@ -0,0 +1,25 @@
<?php
/* For licensing terms, see /license.txt */
/**
* Responses to AJAX calls
*/
require_once '../global.inc.php';
$action = $_REQUEST['a'];
$user_id = api_get_user_id();
switch ($action) {
case 'add_course_vote':
if (!api_is_anonymous()) {
$course_id = intval($_REQUEST['course_id']);
$star = intval($_REQUEST['star']);
$result = CourseManager::add_course_vote($user_id, $star, $course_id, 0);
echo $result;
}
break;
default:
echo '';
}
exit;

@ -76,16 +76,15 @@ switch ($action) {
exit;
}
// Get the name of the database course.
$database_course = CourseManager::get_name_database_course($_GET['code']);
$tbl_course_description = Database::get_course_table(TABLE_COURSE_DESCRIPTION, $database_course);
// Get the name of the database course.
$tbl_course_description = Database::get_course_table(TABLE_COURSE_DESCRIPTION);
$course_info = api_get_course_info($_GET['code']);
echo Display::tag('h2', $course_info['name']);
echo '<br />';
$sql = "SELECT * FROM $tbl_course_description WHERE session_id = 0 ORDER BY id";
$sql = "SELECT * FROM $tbl_course_description WHERE c_id = ".$course_info['real_id']." AND session_id = 0 ORDER BY id";
$result = Database::query($sql);
if (Database::num_rows($result) > 0 ) {
while ($description = Database::fetch_object($result)) {

@ -6,43 +6,21 @@
require_once '../global.inc.php';
api_protect_course_script(true);
$action = $_REQUEST['a'];
$user_id = api_get_user_id();
switch ($action) {
case 'check_url':
if (api_is_allowed_to_edit(null, true)) {
$url = $_REQUEST['url'];
//Check if curl is available
if (!in_array('curl', get_loaded_extensions())) {
echo '';
exit;
}
// set URL and other appropriate options
$defaults = array(
CURLOPT_URL => $url,
CURLOPT_HEADER => 0,
CURLOPT_RETURNTRANSFER => TRUE,
CURLOPT_TIMEOUT => 4
);
//create a new cURL resource
$ch = curl_init();
curl_setopt_array($ch, $defaults);
case 'course_vote':
if (!api_is_anonymous()) {
$course_id = intval($_REQUEST['course_id']);
$star = intval($_REQUEST['star']);
// grab URL and pass it to the browser
$result = curl_exec($ch);
// close cURL resource, and free up system resources
curl_close($ch);
if($result) {
echo Display::return_icon('accept.png', get_lang('Ok'));
} else {
echo Display::return_icon('wrong.gif', get_lang('Wrong'));
if (!in_array($star, array(1,2,3,4,5))) {
//trying to hack the star rating ...
exit;
}
CourseManager::add_course_vote($user_id, $course_id, 0);
}
break;
default:

@ -429,6 +429,8 @@ class Auth
$tbl_course = Database::get_main_table(TABLE_MAIN_COURSE);
$TABLE_COURSE_FIELD = Database::get_main_table(TABLE_MAIN_COURSE_FIELD);
$TABLE_COURSE_FIELD_VALUE = Database::get_main_table(TABLE_MAIN_COURSE_FIELD_VALUES);
$table_course_ranking = Database::get_main_table(TABLE_STATISTIC_TRACK_COURSE_RANKING);
// get course list auto-register
$sql = "SELECT course_code FROM $TABLE_COURSE_FIELD_VALUE tcfv INNER JOIN $TABLE_COURSE_FIELD tcf ON tcfv.field_id = tcf.id
@ -449,22 +451,24 @@ class Auth
if (!empty($random_value)) {
$random_value = intval($random_value);
$sql = "SELECT * FROM $tbl_course WHERE 1 $without_special_courses ORDER BY RAND() LIMIT $random_value";
$sql = "SELECT * FROM $tbl_course course, (SELECT CEIL(MAX($tbl_course.id) * RAND()) AS randId FROM $tbl_course ) AS someRandId
WHERE course.id >= someRandId.randId $without_special_courses";
if ($_configuration['multiple_access_urls']) {
$url_access_id = api_get_current_access_url_id();
$tbl_url_rel_course = Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_COURSE);
$sql = "SELECT * FROM $tbl_course as course INNER JOIN $tbl_url_rel_course as url_rel_course
ON (url_rel_course.course_code=course.code)
WHERE access_url_id = $url_access_id $without_special_courses ORDER BY RAND() LIMIT $random_value";
//$table_course_ranking ranking
//AND ranking.c_id
$sql = "SELECT * FROM $tbl_course course, (SELECT CEIL(MAX($tbl_course.id) * RAND()) AS randId FROM $tbl_course INNER JOIN $tbl_url_rel_course as url_rel_course
ON (url_rel_course.course_code=$tbl_course.code) WHERE access_url_id = $url_access_id ) AS someRandId
WHERE course.id AND course.id >= someRandId.randId $without_special_courses $without_special_courses";
}
$sql = "SELECT * FROM $tbl_course course, (SELECT CEIL(MAX($tbl_course.id) * RAND()) AS randId FROM $tbl_course) AS someRandId
WHERE course.id >= someRandId.randId $without_special_courses";
} else {
$category_code = Database::escape_string($category_code);
//$my_category = (empty($category) ? " IS NULL" : "='".$category."'");
$sql = "SELECT * FROM $tbl_course WHERE category_code='$category_code' $without_special_courses ORDER BY title ";
//showing only the courses of the current Chamilo access_url_id
@ -487,7 +491,20 @@ class Auth
if ($row['tutor_name'] == '0') {
$row['tutor_name'] = get_lang('NoManager');
}
$point_info = CourseManager::get_course_ranking($row['id'], 0);
$points = 0;
$users_who_voted = 0;
if (!empty($point_info['users'])) {
$users_who_voted = $point_info['users'];
$points = $point_info['points']/$point_info['users'] * 100 / 5;
}
$courses[] = array(
'real_id' => $row['id'],
'point_average' => $points,
'users_who_voted' => $users_who_voted,
'code' => $row['code'],
'directory' => $row['directory'],
'db' => $row['db_name'],

@ -171,67 +171,6 @@ class CourseManager {
return false;
}
/**
*
* Updates the course ranking
* @param int course id
* @param int session id
* @param id url id
*
**/
public function update_course_ranking($course_id = null, $session_id = null, $url_id = null) {
//Course catalog stats modifications see #4191
$table_course_ranking = Database::get_main_table(TABLE_STATISTIC_TRACK_COURSE_RANKING);
$table_user_course_vote = Database::get_main_table(TABLE_MAIN_USER_REL_COURSE_VOTE);
$now = api_get_utc_datetime();
$course_id = empty($course_id) ? api_get_course_int_id() : intval($course_id);
$session_id = !isset($session_id) ? api_get_session_id() : intval($session_id);
$url_id = empty($url_id) ? api_get_current_access_url_id() : intval($url_id);
$params = array(
'c_id' => $course_id,
'session_id' => $session_id,
'url_id' => $url_id,
'creation_date' => $now,
);
$result = Database::select('*', $table_course_ranking, array('where' => array('c_id = ? AND session_id = ? AND url_id = ?' => $params)), 'first');
// Problem here every thime we load the courses/XXXX/index.php course home page we update the access
if (empty($result)) {
$params['accesses'] = 1;
$result = Database::insert($table_course_ranking, $params);
} else {
$params['accesses'] = intval($result['accesses']) + 1;
$result = Database::update($table_course_ranking, $params, array('c_id = ? AND session_id = ? AND url_id = ?' => $params));
}
return $result;
}
public function remove_course_ranking($course_id, $session_id, $url_id = null) {
$table_course_ranking = Database::get_main_table(TABLE_STATISTIC_TRACK_COURSE_RANKING);
$table_user_course_vote = Database::get_main_table(TABLE_MAIN_USER_REL_COURSE_VOTE);
if (!empty($course_id) && isset($session_id)) {
$url_id = empty($url_id) ? api_get_current_access_url_id() : intval($url_id);
$params = array(
'c_id' => $course_id,
'session_id' => $session_id,
'url_id' => $url_id,
);
Database::delete($table_course_ranking, array('c_id = ? AND session_id = ? AND url_id = ?' => $params));
Database::delete($table_user_course_vote, array('c_id = ? AND session_id = ? AND url_id = ?' => $params));
}
}
/**
* Returns all the information of a given coursecode
* @param string $course_code, the course code
@ -3494,4 +3433,164 @@ class CourseManager {
}
}
public function get_course_ranking($course_id, $session_id = null, $url_id = null) {
$table_course_ranking = Database::get_main_table(TABLE_STATISTIC_TRACK_COURSE_RANKING);
$session_id = !isset($session_id) ? api_get_session_id() : intval($session_id);
$url_id = empty($url_id) ? api_get_current_access_url_id() : intval($url_id);
$params = array(
'c_id' => $course_id,
'session_id' => $session_id,
'url_id' => $url_id,
'creation_date' => $now,
);
$result = Database::select('id, accesses, points, users', $table_course_ranking, array('where' => array('c_id = ? AND session_id = ? AND url_id = ?' => $params)), 'first');
return $result;
}
/**
*
* Updates the course ranking
* @param int course id
* @param int session id
* @param id url id
*
**/
public function update_course_ranking($course_id = null, $session_id = null, $url_id = null, $points_to_add = null, $add_access = true, $add_user = true) {
//Course catalog stats modifications see #4191
$table_course_ranking = Database::get_main_table(TABLE_STATISTIC_TRACK_COURSE_RANKING);
$now = api_get_utc_datetime();
$course_id = empty($course_id) ? api_get_course_int_id() : intval($course_id);
$session_id = !isset($session_id) ? api_get_session_id() : intval($session_id);
$url_id = empty($url_id) ? api_get_current_access_url_id() : intval($url_id);
$params = array(
'c_id' => $course_id,
'session_id' => $session_id,
'url_id' => $url_id,
'creation_date' => $now,
);
$result = Database::select('id, accesses, points, users', $table_course_ranking, array('where' => array('c_id = ? AND session_id = ? AND url_id = ?' => $params)), 'first');
// Problem here every thime we load the courses/XXXX/index.php course home page we update the access
if (empty($result)) {
if ($add_access) {
$params['accesses'] = 1;
}
//The votes and users are empty
if (isset($points_to_add) && !empty($points_to_add)) {
$params['points'] = intval($points_to_add);
}
if ($add_user) {
$params['users'] = 1;
}
$result = Database::insert($table_course_ranking, $params);
} else {
$my_params = array();
if ($add_access) {
$my_params['accesses'] = intval($result['accesses']) + 1;
}
if (isset($points_to_add) && !empty($points_to_add)) {
$my_params['points'] = $result['points'] + $points_to_add;
}
if ($add_user) {
$my_params['users'] = $result['users'] + 1;
}
if (!empty($my_params)) {
$result = Database::update($table_course_ranking, $my_params, array('c_id = ? AND session_id = ? AND url_id = ?' => $params));
}
}
return $result;
}
/**
* Add user vote to a course
*
* @param int user id
* @param int vote [1..5]
* @param int course id
* @param int session id
* @param int url id
*
*/
public function add_course_vote($user_id, $vote, $course_id, $session_id = null, $url_id = null) {
$table_user_course_vote = Database::get_main_table(TABLE_MAIN_USER_REL_COURSE_VOTE);
$course_id = empty($course_id) ? api_get_course_int_id() : intval($course_id);
$session_id = !isset($session_id) ? api_get_session_id() : intval($session_id);
$url_id = empty($url_id) ? api_get_current_access_url_id() : intval($url_id);
$vote = intval($vote);
if (!in_array($vote, array(1,2,3,4,5))) {
return false;
}
$params = array(
'user_id' => intval($user_id),
'c_id' => $course_id,
'session_id' => $session_id,
'url_id' => $url_id,
'vote' => $vote
);
$action_done = false;
$result = Database::select('id, vote', $table_user_course_vote, array('where' => array('user_id = ? AND c_id = ? AND session_id = ? AND url_id = ?' => $params)), 'first');
if (empty($result)) {
$result = Database::insert($table_user_course_vote, $params);
$points_to_add = $vote;
$add_user = true;
$action_done = 'added';
} else {
$my_params = array('vote' => $vote);
$points_to_add = $vote - $result['vote'];
$add_user = false;
$result = Database::update($table_user_course_vote, $my_params, array('user_id = ? AND c_id = ? AND session_id = ? AND url_id = ?' => $params));
$action_done = 'updated';
}
//Current points
if (!empty($points_to_add)) {
self::update_course_ranking($course_id, $session_id, $url_id, $points_to_add, false, $add_user);
}
return $action_done;
}
/**
* Remove course ranking + user votes
*
* @param int course id
* @param int session id
* @param int url id
*
*/
public function remove_course_ranking($course_id, $session_id, $url_id = null) {
$table_course_ranking = Database::get_main_table(TABLE_STATISTIC_TRACK_COURSE_RANKING);
$table_user_course_vote = Database::get_main_table(TABLE_MAIN_USER_REL_COURSE_VOTE);
if (!empty($course_id) && isset($session_id)) {
$url_id = empty($url_id) ? api_get_current_access_url_id() : intval($url_id);
$params = array(
'c_id' => $course_id,
'session_id' => $session_id,
'url_id' => $url_id,
);
Database::delete($table_course_ranking, array('c_id = ? AND session_id = ? AND url_id = ?' => $params));
Database::delete($table_user_course_vote, array('c_id = ? AND session_id = ? AND url_id = ?' => $params));
}
}
} //end class CourseManager

@ -1271,4 +1271,34 @@ class Display {
}
return $output;
}
/**
*
*
* @param int id of the class
* @param int percentage 0-100 %
* @param string url that will be added (for the jquery stuff)
**/
public function return_rating_system($id, $percentage, $url, $number_of_users_who_voted = null) {
$percentage = intval($percentage);
if (!empty($percentage)) {
$percentage = $percentage*125/100;
}
$html = '<ul id = "'.$id.'" class="star-rating">
<li class="current-rating" style="width:'.$percentage.'px;"></li>
<li><a href="javascript:void(0)" rel="'.$url.'&star=1" title="1 star out of 5" class="one-star">1</a></li>
<li><a href="javascript:void(0)" rel="'.$url.'&star=2" title="2 stars out of 5" class="two-stars">2</a></li>
<li><a href="javascript:void(0)" rel="'.$url.'&star=3" title="3 stars out of 5" class="three-stars">3</a></li>
<li><a href="javascript:void(0)" rel="'.$url.'&star=4" title="4 stars out of 5" class="four-stars">4</a></li>
<li><a href="javascript:void(0)" rel="'.$url.'&star=5" title="5 stars out of 5" class="five-stars">5</a></li>
</ul>';
//if (!isset($number_of_users_who_voted)) {
$label = $number_of_users_who_voted == 1 ? get_lang('Vote') : get_lang('Votes');
$html .= Display::span($number_of_users_who_voted.' '.$label, array('id' => 'vote_label_'.$id));
$html .= ' '.Display::span(' ', array('id' => 'vote_label2_'.$id));
//}
return $html;
}
} //end class Display

@ -107,7 +107,7 @@ function event_login() {
* @desc Record information for access event for courses
*/
function event_access_course() {
global $_user, $TABLETRACK_ACCESS, $TABLETRACK_LASTACCESS, $table_course_ranking, $table_user_course_vote;
global $_user, $TABLETRACK_ACCESS, $TABLETRACK_LASTACCESS;
$id_session = api_get_session_id();
$now = api_get_utc_datetime();

@ -2818,35 +2818,34 @@ CREATE TABLE skill_rel_profile (
CREATE TABLE track_course_ranking (
id int unsigned not null PRIMARY KEY AUTO_INCREMENT,
c_id int unsigned not null,
session_id int unsigned not null default 0,
url_id int unsigned not null default 0,
accesses int unsigned not null default 0,
points int unsigned not null default 0,
users int unsigned not null default 0,
creation_date datetime not null
);
ALTER TABLE track_course_ranking ADD INDEX idx_tcc_cid (c_id);
ALTER TABLE track_course_ranking ADD INDEX idx_tcc_sid (session_id);
ALTER TABLE track_course_ranking ADD INDEX idx_tcc_urlid (url_id);
ALTER TABLE track_course_ranking ADD INDEX idx_tcc_creation_date (creation_date);
CREATE TABLE user_course_vote(
id int unsigned not null AUTO_INCREMENT PRIMARY KEY,
c_id int unsigned not null,
user_id int unsigned not null,
session_id int unsigned not null default 0,
url_id int unsigned not null default 0,
vote int unsigned not null default 0
);
ALTER TABLE user_course_vote ADD INDEX idx_ucv_cid (c_id);
ALTER TABLE user_course_vote ADD INDEX idx_ucv_uid (user_id);
ALTER TABLE user_course_vote ADD INDEX idx_ucv_cuid (user_id, c_id);
--
-- Table structure for event alert sending
-- Pending check and approval
-- CREATE TABLE event_type (
-- id int unsigned NOT NULL AUTO_INCREMENT,
-- name varchar(50) NOT NULL,
-- name_lang_var varchar(40) NOT NULL,
-- desc_lang_var varchar(50) NOT NULL,
-- PRIMARY KEY (id)
-- );
--
-- CREATE TABLE event_type_message (
-- id int unsigned NOT NULL AUTO_INCREMENT,
-- event_type_id int NOT NULL,
-- language_id int NOT NULL,
-- message varchar(200) NOT NULL,
-- subject varchar(60) NOT NULL,
-- PRIMARY KEY (id)
-- );
--
-- CREATE TABLE user_rel_event_type (
-- id int NOT NULL AUTO_INCREMENT,
-- user_id int unsigned NOT NULL,
-- event_type_id int unsigned NOT NULL,
-- PRIMARY KEY (id)
-- );
--
-- INSERT INTO event_type VALUES (1, 'course_deleted','courseDeletedTitle','courseDeletedComment'),(2,'course_created','courseCreatedTitle','courseCreatedComment'),(3,'user_deleted','userDeletedTitle','userDeletedComment'),(4,'user_created','userCreatedTitle','userCreatedComment'), (5, 'session_created','sessionCreatedTitle','sessionCreatedComment'), (6,'session_deleted','sessionDeletedTitle','sessionDeletedComment'), (7,'session_category_created','sessionCategoryCreatedTitle','sessionCategoryCreatedComment'),(8,'session_category_deleted','sessionCategoryDeletedTitle','sessionCategoryDeletedComment'),(9,'settings_changed','settingsChangedTitle','settingsChangedComment'),(10,'user_subscribed','userSubscribedTitle','userSubscribedComment'), (11,'user_unsubscribed','userUnsubscribedTitle','userUnsubscribedComment');
--
-- INSERT INTO event_type_message (id,event_type_id,language_id,message,subject) VALUES (1,4,10,'ReportMessageUserCreated',''),(2,1,10,'DeleteCourse',''),(3,2,10,'CreateCourse',''),(4,3,10,'ReportMessageUserDeleted',''),(6,5,10,'CreateSessionTest',''),(7,6,10,'DeleteSession',''),(8,7,10,'CreateSessionCategory',''),(9,8,10,'DeleteSessionCategory',''),(10,9,10,'ChangeSetting',''),(11,10,10,'Subscribe',''),(12,11,10,'Unsubscribe','');

@ -20,7 +20,33 @@ $stok = Security::get_token();
<?php } ?>
*/
if (intval($_GET['hidden_links']) != 1) { ?>
?>
<script>
$(document).ready( function() {
$('.star-rating li a').click(function(){
var id = $(this).parents('ul').attr('id');
$('#vote_label2_' + id).html('<?php echo Display::return_icon('loading1.gif');?>');
$.ajax({
url: $(this).attr('rel'),
success: function(data) {
if(data == 'added') {
//$('#vote_label_' + id).html('Saved');
$('#vote_label2_' + id).html("<?php echo get_lang('Saved')?>");
}
if(data == 'updated') {
$('#vote_label2_' + id).html("<?php echo get_lang('Saved')?>");
}
},
})
});
});
</script>
<?php if (intval($_GET['hidden_links']) != 1) { ?>
<div id="actions" class="actions">
<span id="categories-search">
@ -110,6 +136,9 @@ if (intval($_GET['hidden_links']) != 1) { ?>
if (!empty($search_term)) {
echo "<p><strong>".get_lang('SearchResultsFor')." ".Security::remove_XSS($_POST['search_term'])."</strong><br />";
}
$ajax_url = api_get_path(WEB_AJAX_PATH).'course.ajax.php?a=add_course_vote';
if (!empty($browse_courses_in_category)) {
@ -128,13 +157,18 @@ if (intval($_GET['hidden_links']) != 1) { ?>
} else {
$course_medium_image = api_get_path(WEB_IMG_PATH).'without_picture.png'; // without picture
}
$rating = Display::return_rating_system($course['code'].'_rating', $course['point_average'], $ajax_url.'&course_id='.$course['real_id'], $course['users_who_voted']);
//<div class="course-block-main-item"><div class="left">'.get_lang('Teacher').'</div><div class="course-block-teacher right">'.$tutor_name.'</div></div>
//<div class="course-block-main-item"><div class="left">'.get_lang('CreationDate').'</div><div class="course-block-date">'.api_format_date($creation_date,DATE_FORMAT_SHORT).'</div></div>
echo '<div class="categories-block-course">
<div class="categories-content-course">
<div class="categories-course-description">
<div class="course-block-title">'.$title.'</div>
<div class="course-block-main-item"><div class="left">'.get_lang('Teacher').'</div><div class="course-block-teacher right">'.$tutor_name.'</div></div>
<div class="course-block-main-item"><div class="left">'.get_lang('CreationDate').'</div><div class="course-block-date">'.api_format_date($creation_date,DATE_FORMAT_SHORT).'</div></div>
<div class="course-block-title">'.cut($title, 60).'</div>
'.$rating.'
</div>';
echo '<div class="categories-course-picture"><center>';

Loading…
Cancel
Save