, 2010 * @package chamilo.gradebook */ class SurveyLink extends AbstractLink { private $survey_table = null; /** * Constructor */ public function __construct() { parent::__construct(); $this->set_type(LINK_SURVEY); } public function get_name() { $this->get_survey_data(); return $this->survey_data['code'].': '.self::html_to_text($this->survey_data['title']); } public function get_description() { $this->get_survey_data(); return $this->survey_data['subtitle']; } public function get_type_name() { return get_lang('Survey'); } public function is_allowed_to_change_name() { return false; } public function needs_name_and_description() { return false; } public function needs_max() { return false; } public function needs_results() { return false; } /** * Generates an array of all surveys available. * @return array 2-dimensional array - every element contains 2 subelements (id, name) */ public function get_all_links() { if (empty($this->course_code)) { die('Error in get_all_links() : course code not set'); } $tbl_survey = $this->get_survey_table(); $session_id = api_get_session_id(); $course_id = api_get_course_int_id(); $sql = 'SELECT survey_id, title, code FROM '.$tbl_survey.' WHERE c_id = '.$course_id.' AND session_id = '.intval($session_id).''; $result = Database::query($sql); while ($data = Database::fetch_array($result)) { $links[] = array( $data['survey_id'], api_trunc_str( $data['code'] . ': ' . self::html_to_text($data['title']), 80 ) ); } return isset($links) ? $links : null; } /** * Generates an array of surveys that a teacher hasn't created a link for. * @return array 2-dimensional array - every element contains 2 subelements (id, name) */ public function get_not_created_links() { if (empty($this->course_code)) { die('Error in get_not_created_links() : course code not set'); } $tbl_grade_links = Database :: get_main_table(TABLE_MAIN_GRADEBOOK_LINK); $sql = 'SELECT survey_id, title, code FROM '.$this->get_survey_table().' AS srv WHERE survey_id NOT IN ( SELECT ref_id FROM '.$tbl_grade_links.' WHERE type = '.LINK_SURVEY.' AND course_code = "'.$this->get_course_code().'" ) AND srv.session_id = '.api_get_session_id(); $result = Database::query($sql); $links = array(); while ($data = Database::fetch_array($result)) { $links[] = array( $data['survey_id'], api_trunc_str($data['code'].': '.self::html_to_text($data['title']), 80) ); } return $links; } /** * Has anyone done this survey yet? */ public function has_results($stud_id=null) { $ref_id = intval($this->get_ref_id()); $session_id = api_get_session_id(); $tbl_survey = Database::get_course_table(TABLE_SURVEY); $tbl_survey_invitation = Database::get_course_table(TABLE_SURVEY_INVITATION); $sql = "SELECT COUNT(i.answered) FROM $tbl_survey AS s JOIN $tbl_survey_invitation AS i ON s.code = i.survey_code WHERE s.c_id = {$this->course_id} AND i.c_id = {$this->course_id} AND s.survey_id = $ref_id AND i.session_id = $session_id"; $sql_result = Database::query($sql); $data = Database::fetch_array($sql_result); return ($data[0] != 0); } /** * @param int $stud_id * @return array|null */ public function calc_score($stud_id = null, $type = null) { // Note: Max score is assumed to be always 1 for surveys, // only student's participation is to be taken into account. $max_score = 1; $ref_id = intval($this->get_ref_id()); $session_id = api_get_session_id(); $tbl_survey = Database::get_course_table(TABLE_SURVEY); $tbl_survey_invitation = Database::get_course_table(TABLE_SURVEY_INVITATION); $get_individual_score = !is_null($stud_id); $sql = "SELECT i.answered FROM $tbl_survey AS s JOIN $tbl_survey_invitation AS i ON s.code = i.survey_code WHERE s.c_id = {$this->course_id} AND i.c_id = {$this->course_id} AND s.survey_id = $ref_id AND i.session_id = $session_id "; if ($get_individual_score) { $sql .= ' AND i.user = '.intval($stud_id); } $sql_result = Database::query($sql); if ($get_individual_score) { // for 1 student if ($data = Database::fetch_array($sql_result)) { return array($data['answered'] ? $max_score : 0, $max_score); } return array(0, $max_score); } else { // for all the students -> get average $rescount = 0; $sum = 0; $bestResult = 0; $weight = 0; while ($data = Database::fetch_array($sql_result)) { $sum += $data['answered'] ? $max_score : 0; $rescount++; if ($data['answered'] > $bestResult) { $bestResult = $data['answered']; $weight = $assignment['qualification']; } } $sum = $sum / $max_score; if ($rescount == 0) { return null; } switch ($type) { case 'best': return array($bestResult, $rescount); break; case 'average': return array($sum, $rescount); break; case 'ranking': return null; break; default: return array($sum, $rescount); break; } } } /** * Lazy load function to get the database table of the surveys */ private function get_survey_table() { $this->survey_table = Database :: get_course_table(TABLE_SURVEY); return $this->survey_table; } /** * Check if this still links to a survey */ public function is_valid_link() { $session_id = api_get_session_id(); $sql = 'SELECT count(survey_id) FROM '.$this->get_survey_table().' WHERE c_id = '.$this->course_id.' AND survey_id = '.intval($this->get_ref_id()).' AND session_id='.intval($session_id).''; $result = Database::query($sql); $number = Database::fetch_row($result); return ($number[0] != 0); } public function get_test_id() { return 'DEBUG:ID'; } public function get_link() { if (api_is_allowed_to_edit()) { // Let students make access only through "Surveys" tool. $tbl_name = $this->get_survey_table(); $session_id = api_get_session_id(); if ($tbl_name != '') { $sql = 'SELECT survey_id FROM '.$this->get_survey_table().' WHERE c_id = '.$this->course_id.' AND survey_id = '.intval($this->get_ref_id()).' AND session_id = '.intval($session_id).' '; $result = Database::query($sql); $row = Database::fetch_array($result, 'ASSOC'); $survey_id = $row['survey_id']; return api_get_path(WEB_PATH).'main/survey/reporting.php?cidReq='.$this->get_course_code().'&survey_id='.$survey_id; } } return null; } private function get_survey_data() { $tbl_name = $this->get_survey_table(); $session_id = api_get_session_id(); if ($tbl_name == '') { return false; } elseif (!isset($this->survey_data)) { $sql = 'SELECT * FROM '.$tbl_name.' WHERE c_id = '.$this->course_id.' AND survey_id = '.intval($this->get_ref_id()).' AND session_id='.intval($session_id).''; $query = Database::query($sql); $this->survey_data = Database::fetch_array($query); } return $this->survey_data; } public function get_icon_name() { return 'survey'; } private static function html_to_text($string) { return strip_tags($string); //return trim(api_html_entity_decode(strip_tags(str_ireplace(array('
', '
', '