From 7a2675e88956d716fa35b48239a1da5d3671c801 Mon Sep 17 00:00:00 2001 From: Mark Nelson Date: Wed, 11 Mar 2015 00:24:51 -0700 Subject: [PATCH] Moved internal functions to locallib.php --- edit.php | 2 +- edit_element_form.php | 1 + index.php | 2 +- lib.php | 679 +--------------------------------------- load_template.php | 2 +- locallib.php | 700 ++++++++++++++++++++++++++++++++++++++++++ mod_form.php | 2 +- report.php | 2 +- save_template.php | 2 +- upload_image.php | 2 +- view.php | 2 +- 11 files changed, 711 insertions(+), 685 deletions(-) create mode 100644 locallib.php diff --git a/edit.php b/edit.php index e082d8b..dd3109f 100644 --- a/edit.php +++ b/edit.php @@ -23,7 +23,7 @@ */ require_once('../../config.php'); -require_once($CFG->dirroot . '/mod/customcert/lib.php'); +require_once($CFG->dirroot . '/mod/customcert/locallib.php'); require_once($CFG->dirroot . '/mod/customcert/edit_form.php'); require_once($CFG->dirroot . '/mod/customcert/load_template_form.php'); require_once($CFG->dirroot . '/mod/customcert/save_template_form.php'); diff --git a/edit_element_form.php b/edit_element_form.php index 442867f..5924802 100644 --- a/edit_element_form.php +++ b/edit_element_form.php @@ -17,6 +17,7 @@ defined('MOODLE_INTERNAL') || die('Direct access to this script is forbidden.'); require_once($CFG->dirroot . '/course/moodleform_mod.php'); +require_once($CFG->dirroot.'/mod/customcert/locallib.php'); require_once($CFG->dirroot . '/mod/customcert/includes/colourpicker.php'); MoodleQuickForm::registerElementType('customcert_colourpicker', diff --git a/index.php b/index.php index 1f2ed9a..84f09eb 100644 --- a/index.php +++ b/index.php @@ -23,7 +23,7 @@ */ require_once('../../config.php'); -require_once('lib.php'); +require_once($CFG->dirroot . '/mod/customcert/locallib.php'); $id = required_param('id', PARAM_INT); // Course ID. diff --git a/lib.php b/lib.php index ce45d18..5fb517c 100644 --- a/lib.php +++ b/lib.php @@ -15,7 +15,7 @@ // along with Moodle. If not, see . /** - * Customcert module core interaction API. + * Customcert module core interaction API * * @package mod_customcert * @copyright 2013 Mark Nelson @@ -24,32 +24,6 @@ defined('MOODLE_INTERNAL') || die('Direct access to this script is forbidden.'); -/** - * @var string the print protection variable - */ -define('PROTECTION_PRINT', 'print'); - -/** - * @var string the modify protection variable - */ -define('PROTECTION_MODIFY', 'modify'); - -/** - * @var string the copy protection variable - */ -define('PROTECTION_COPY', 'copy'); - -/** - * @var int the number of issues that will be displayed on each page in the report - * If you want to display all customcerts on a page set this to 0. - */ -define('CUSTOMCERT_PER_PAGE', 20); - -/** - * @var int the max number of issues to display - */ -define('CUSTOMCERT_MAX_PER_PAGE', 300); - /** * Add customcert instance. * @@ -88,29 +62,6 @@ function customcert_update_instance($data, $mform) { return $DB->update_record('customcert', $data); } -/** - * Handles setting the protection field for the customcert - * - * @param stdClass $data - * @return string the value to insert into the protection field - */ -function customcert_set_protection($data) { - $protection = array(); - - if (!empty($data->protection_print)) { - $protection[] = PROTECTION_PRINT; - } - if (!empty($data->protection_modify)) { - $protection[] = PROTECTION_MODIFY; - } - if (!empty($data->protection_copy)) { - $protection[] = PROTECTION_COPY; - } - - // Return the protection string. - return implode(', ', $protection); -} - /** * Given an ID of an instance of this module, * this function will permanently delete the instance @@ -322,7 +273,7 @@ function customcert_get_post_actions() { /** * Function to be run periodically according to the moodle cron. */ -function customcert_cron () { +function customcert_cron() { return true; } @@ -357,629 +308,3 @@ function customcert_extend_settings_navigation(settings_navigation $settings, na return $customcertnode->trim_if_empty(); } - -/** - * Handles uploading an image for the customcert module. - * - * @param int $draftitemid the draft area containing the files - * @param int $contextid the context we are storing this image in - */ -function customcert_upload_imagefiles($draftitemid, $contextid) { - // Save the file if it exists that is currently in the draft area. - file_save_draft_area_files($draftitemid, $contextid, 'mod_customcert', 'image', 0); -} - -/** - * Return the list of possible elements to add. - * - * @return array the list of images that can be used. - */ -function customcert_get_elements() { - global $CFG; - - // Array to store the element types. - $options = array(); - - // Check that the directory exists. - $elementdir = "$CFG->dirroot/mod/customcert/element"; - if (file_exists($elementdir)) { - // Get directory contents. - $elementfolders = new DirectoryIterator($elementdir); - // Loop through the elements folder. - foreach ($elementfolders as $elementfolder) { - // If it is not a directory or it is '.' or '..', skip it. - if (!$elementfolder->isDir() || $elementfolder->isDot()) { - continue; - } - // Check that the standard class file exists, if not we do - // not want to display it as an option as it will not work. - $foldername = $elementfolder->getFilename(); - $classfile = "$elementdir/$foldername/lib.php"; - if (file_exists($classfile)) { - // Need to require this file in case if we choose to add this element. - require_once($classfile); - $component = "customcertelement_{$foldername}"; - $options[$foldername] = get_string('pluginname', $component); - } - } - } - - customcert_perform_asort($options); - return $options; -} - -/** - * Return the list of possible fonts to use. - */ -function customcert_get_fonts() { - global $CFG; - - // Array to store the available fonts. - $options = array(); - - // Location of fonts in Moodle. - $fontdir = "$CFG->dirroot/lib/tcpdf/fonts"; - // Check that the directory exists. - if (file_exists($fontdir)) { - // Get directory contents. - $fonts = new DirectoryIterator($fontdir); - // Loop through the font folder. - foreach ($fonts as $font) { - // If it is not a file, or either '.' or '..', or - // the extension is not php, or we can not open file, - // skip it. - if (!$font->isFile() || $font->isDot() || ($font->getExtension() != 'php')) { - continue; - } - // Set the name of the font to null, the include next should then set this - // value, if it is not set then the file does not include the necessary data. - $name = null; - // Some files include a display name, the include next should then set this - // value if it is present, if not then $name is used to create the display name. - $displayname = null; - // Some of the TCPDF files include files that are not present, so we have to - // suppress warnings, this is the TCPDF libraries fault, grrr. - @include("$fontdir/$font"); - // If no $name variable in file, skip it. - if (is_null($name)) { - continue; - } - // Remove the extension of the ".php" file that contains the font information. - $filename = basename($font, ".php"); - // Check if there is no display name to use. - if (is_null($displayname)) { - // Format the font name, so "FontName-Style" becomes "Font Name - Style". - $displayname = preg_replace("/([a-z])([A-Z])/", "$1 $2", $name); - $displayname = preg_replace("/([a-zA-Z])-([a-zA-Z])/", "$1 - $2", $displayname); - } - $options[$filename] = $displayname; - } - ksort($options); - } - - return $options; -} - -/** - * Return the list of possible font sizes to use. - */ -function customcert_get_font_sizes() { - // Array to store the sizes. - $sizes = array(); - - for ($i = 1; $i <= 60; $i++) { - $sizes[$i] = $i; - } - - return $sizes; -} - -/** - * Handles saving page data. - * - * @param stdClass $data the customcert data - */ -function customcert_save_page_data($data) { - global $DB; - - // Set the time to a variable. - $time = time(); - - // Get the existing pages and save the page data. - if ($pages = $DB->get_records('customcert_pages', array('customcertid' => $data->id))) { - // Loop through existing pages. - foreach ($pages as $page) { - // Get the name of the fields we want from the form. - $width = 'pagewidth_' . $page->id; - $height = 'pageheight_' . $page->id; - // Create the page data to update the DB with. - $p = new stdClass(); - $p->id = $page->id; - $p->width = $data->$width; - $p->height = $data->$height; - $p->timemodified = $time; - // Update the page. - $DB->update_record('customcert_pages', $p); - } - } -} - -/** - * Returns an instance of the element class. - * - * @param stdClass $element the element - * @return stdClass|bool returns the instance of the element class, or false if element - * class does not exists. - */ -function customcert_get_element_instance($element) { - global $CFG; - - $classfile = "$CFG->dirroot/mod/customcert/element/{$element->element}/lib.php"; - // Ensure this necessary file exists. - if (file_exists($classfile)) { - require_once($classfile); - $classname = "customcert_element_{$element->element}"; - return new $classname($element); - } - - return false; -} - -/** - * Handles adding another page to the customcert. - * - * @param stdClass $data the form data - */ -function customcert_add_page($data) { - global $DB; - - // Set the page number to 1 to begin with. - $pagenumber = 1; - // Get the max page number. - $sql = "SELECT MAX(pagenumber) as maxpage - FROM {customcert_pages} cp - WHERE cp.customcertid = :customcertid"; - if ($maxpage = $DB->get_record_sql($sql, array('customcertid' => $data->id))) { - $pagenumber = $maxpage->maxpage + 1; - } - - // Store time in a variable. - $time = time(); - - // New page creation. - $page = new stdClass(); - $page->customcertid = $data->id; - $page->width = '210'; - $page->height = '297'; - $page->pagenumber = $pagenumber; - $page->timecreated = $time; - $page->timemodified = $time; - - // Insert the page. - $DB->insert_record('customcert_pages', $page); -} - -/** - * Handles deleting a page from the customcert. - * - * @param int $pageid the customcert page - */ -function customcert_delete_page($pageid) { - global $DB; - - // Get the page. - $page = $DB->get_record('customcert_pages', array('id' => $pageid), '*', MUST_EXIST); - - // Delete this page. - $DB->delete_records('customcert_pages', array('id' => $page->id)); - - // The element may have some extra tasks it needs to complete to completely delete itself. - if ($elements = $DB->get_records('customcert_elements', array('pageid' => $page->id))) { - foreach ($elements as $element) { - // Get an instance of the element class. - if ($e = customcert_get_element_instance($element)) { - $e->delete_element(); - } - } - } - - // Now we want to decrease the page number values of - // the pages that are greater than the page we deleted. - $sql = "UPDATE {customcert_pages} - SET pagenumber = pagenumber - 1 - WHERE customcertid = :customcertid - AND pagenumber > :pagenumber"; - $DB->execute($sql, array('customcertid' => $page->customcertid, - 'pagenumber' => $page->pagenumber)); -} - -/** - * Returns a list of all the templates. - * - * @return bool returns true if success, false otherwise - */ -function customcert_get_templates() { - global $DB; - - return $DB->get_records_menu('customcert_template', array(), 'name ASC', 'id, name'); -} - -/** - * Get the time the user has spent in the course. - * - * @param int $courseid - * @return int the total time spent in seconds - */ -function customcert_get_course_time($courseid) { - global $CFG, $USER; - - set_time_limit(0); - - $totaltime = 0; - $sql = "l.course = :courseid AND l.userid = :userid"; - if ($logs = get_logs($sql, array('courseid' => $courseid, 'userid' => $USER->id), 'l.time ASC', '', '', $totalcount)) { - foreach ($logs as $log) { - if (!isset($login)) { - // For the first time $login is not set so the first log is also the first login. - $login = $log->time; - $lasthit = $log->time; - $totaltime = 0; - } - $delay = $log->time - $lasthit; - if ($delay > ($CFG->sessiontimeout * 60)) { - // The difference between the last log and the current log is more than - // the timeout register session value meaning we have found a session. - $login = $log->time; - } else { - $totaltime += $delay; - } - // Now the actual log became the previous log for the next cycle. - $lasthit = $log->time; - } - - return $totaltime; - } - - return 0; -} - - -/** - * Returns a list of issued customcerts. - * - * @param int $customcertid - * @param bool $groupmode are we in group mode - * @param stdClass $cm the course module - * @param int $page offset - * @param int $perpage total per page - * @return stdClass the users - */ -function customcert_get_issues($customcertid, $groupmode, $cm, $page, $perpage) { - global $DB; - - // Get the conditional SQL. - list($conditionssql, $conditionsparams) = customcert_get_conditional_issues_sql($cm, $groupmode); - - // Add the conditional SQL and the customcertid to form all used parameters. - $allparams = $conditionsparams + array('customcertid' => $customcertid); - - // Return the issues. - return $DB->get_records_sql("SELECT u.*, ci.code, ci.timecreated - FROM {user} u - INNER JOIN {customcert_issues} ci - ON u.id = ci.userid - WHERE u.deleted = 0 - AND ci.customcertid = :customcertid - $conditionssql - ORDER BY " . $DB->sql_fullname(), - $allparams, - $page * $perpage, - $perpage); -} - -/** - * Returns the total number of issues for a given customcert. - * - * @param int $customcertid - * @param stdClass $cm the course module - * @param bool $groupmode the group mode - * @return int the number of issues - */ -function customcert_get_number_of_issues($customcertid, $cm, $groupmode) { - global $DB; - - // Get the conditional SQL. - list($conditionssql, $conditionsparams) = customcert_get_conditional_issues_sql($cm, $groupmode); - - // Add the conditional SQL and the customcertid to form all used parameters. - $allparams = $conditionsparams + array('customcertid' => $customcertid); - - // Return the number of issues. - return $DB->count_records_sql("SELECT COUNT(u.id) as count - FROM {user} u - INNER JOIN {customcert_issues} ci - ON u.id = ci.userid - WHERE u.deleted = 0 - AND ci.customcertid = :customcertid - $conditionssql", - $allparams); -} - -/** - * Returns an array of the conditional variables to use in the get_issues SQL query. - * - * @param stdClass $cm the course module - * @param bool $groupmode are we in group mode ? - * @return array the conditional variables - */ -function customcert_get_conditional_issues_sql($cm, $groupmode) { - global $CFG, $DB; - - // Get all users that can manage this customcert to exclude them from the report. - $context = context_module::instance($cm->id); - $conditionssql = ''; - $conditionsparams = array(); - if ($certmanagers = array_keys(get_users_by_capability($context, 'mod/customcert:manage', 'u.id'))) { - list($sql, $params) = $DB->get_in_or_equal($certmanagers, SQL_PARAMS_NAMED, 'cert'); - $conditionssql .= "AND NOT u.id $sql \n"; - $conditionsparams += $params; - } - - $restricttogroup = false; - if ($groupmode) { - $currentgroup = groups_get_activity_group($cm); - if ($currentgroup) { - $restricttogroup = true; - $groupusers = array_keys(groups_get_members($currentgroup, 'u.*')); - if (empty($groupusers)) { - return array(); - } - } - } - - $restricttogrouping = false; - - // If groupmembersonly used, remove users who are not in any group. - if (!empty($CFG->enablegroupings) and $cm->groupmembersonly) { - if ($groupingusers = groups_get_grouping_members($cm->groupingid, 'u.id', 'u.id')) { - $restricttogrouping = true; - } else { - return array(); - } - } - - if ($restricttogroup || $restricttogrouping) { - if ($restricttogroup) { - $allowedusers = $groupusers; - } else if ($restricttogroup && $restricttogrouping) { - $allowedusers = array_intersect($groupusers, $groupingusers); - } else { - $allowedusers = $groupingusers; - } - - list($sql, $params) = $DB->get_in_or_equal($allowedusers, SQL_PARAMS_NAMED, 'grp'); - $conditionssql .= "AND u.id $sql \n"; - $conditionsparams += $params; - } - - return array($conditionssql, $conditionsparams); -} - -/** - * Generates a 10-digit code of random letters and numbers. - * - * @return string - */ -function customcert_generate_code() { - global $DB; - - $uniquecodefound = false; - $code = random_string(10); - while (!$uniquecodefound) { - if (!$DB->record_exists('customcert_issues', array('code' => $code))) { - $uniquecodefound = true; - } else { - $code = random_string(10); - } - } - - return $code; -} - -/** - * Generate the grid PDF to show the layout of the PDF. - * - * @param int $pageid the customcert page - */ -function customcert_generate_grid_pdf($pageid) { - global $CFG, $DB; - - require_once($CFG->libdir . '/pdflib.php'); - - // Get the page. - $page = $DB->get_record('customcert_pages', array('id' => $pageid), '*', MUST_EXIST); - - // Set the PDF name. - $pdfname = get_string('gridpdfname', 'customcert', $page->id); - - // Create the pdf object. - $pdf = new pdf(); - $pdf->setPrintHeader(false); - $pdf->setPrintFooter(false); - $pdf->SetTitle($pdfname); - $pdf->SetMargins(0, 0); - $pdf->SetAutoPageBreak(true, 0); - - // Add the page to the PDF. - if ($page->width > $page->height) { - $orientation = 'L'; - } else { - $orientation = 'P'; - } - $pdf->AddPage($orientation, array($page->width, $page->height)); - - // The cell width. - $cellwidth = 10; - $cellheight = 10; - - // The increments we want to go up in. - $inc = 20; - $decpos = 4; - - // Draw first lines before we increment from here. - $pdf->Line(($inc / 2) + 2, 0, ($inc / 2) + 2, $page->height); - $pdf->Line(0, ($inc / 2), $page->width, ($inc / 2)); - - // Now we want to start drawing the lines to make the grid. - // Draw the horizontal lines. - for ($h = $inc; $h <= $page->height; $h += $inc) { - // Dirty hack cause the printer keeps cutting off characters - // near the end of the page for some BS reason. - if (strlen($h) <= 2) { - $lmargin = 5; - } else { - $lmargin = 4; - } - // Write the distance we are at. - $pdf->writeHTMLCell($cellwidth, $cellheight, $lmargin, $h - $decpos, $h); - - // Get the location we are going to draw the line and then draw it. - $hline = $h + ($inc / 2); - $pdf->Line(0, $hline, $page->width, $hline); - } - - // Draw the vertical lines. - for ($w = $inc; $w <= $page->width; $w += $inc) { - // Write the distance we are at. - $pdf->writeHTMLCell($cellwidth, $cellheight, $w - $decpos, 3, $w); - - // Get the location we are going to draw the line and then draw it. - $wline = $w + ($inc / 2); - $pdf->Line($wline, 0, $wline, $page->height); - } - - $pdf->Output($pdfname . '.pdf', 'D'); - exit(); -} - -/** - * Generate the PDF for the specified customcert and user. - * - * @param stdClass $customcert - * @param bool $preview true if it is a preview, false otherwise - */ -function customcert_generate_pdf($customcert, $preview = false) { - global $CFG, $DB; - - require_once($CFG->libdir . '/pdflib.php'); - - // Get the pages for the customcert, there should always be at least one page for each customcert. - if ($pages = $DB->get_records('customcert_pages', array('customcertid' => $customcert->id), 'pagenumber ASC')) { - // Create the pdf object. - $pdf = new pdf(); - if (!empty($customcert->protection)) { - $protection = explode(', ', $customcert->protection); - $pdf->SetProtection($protection); - } - $pdf->setPrintHeader(false); - $pdf->setPrintFooter(false); - $pdf->SetTitle($customcert->name); - $pdf->SetMargins(0, 0); - $pdf->SetAutoPageBreak(true, 0); - // Remove full-stop at the end, if it exists, to avoid "..pdf" being created and being filtered by clean_filename. - $filename = rtrim($customcert->name, '.'); - $filename = clean_filename($filename . '.pdf'); - // Loop through the pages and display their content. - foreach ($pages as $page) { - // Add the page to the PDF. - if ($page->width > $page->height) { - $orientation = 'L'; - } else { - $orientation = 'P'; - } - $pdf->AddPage($orientation, array($page->width, $page->height)); - // Get the elements for the page. - if ($elements = $DB->get_records('customcert_elements', array('pageid' => $page->id), 'sequence ASC')) { - // Loop through and display. - foreach ($elements as $element) { - // Get an instance of the element class. - if ($e = customcert_get_element_instance($element)) { - $e->render($pdf, $preview); - } - } - } - } - $pdf->Output($filename, 'D'); - } -} - -/** - * Generate the report. - * - * @param stdClass $customcert - * @param stdClass $users the list of users who have had a customcert issued - * @param string $type - */ -function customcert_generate_report_file($customcert, $users, $type) { - global $CFG, $COURSE; - - if ($type == 'ods') { - require_once($CFG->libdir . '/odslib.class.php'); - $workbook = new MoodleODSWorkbook('-'); - } else if ($type == 'xls') { - require_once($CFG->libdir . '/excellib.class.php'); - $workbook = new MoodleExcelWorkbook('-'); - } - - $filename = clean_filename($COURSE->shortname . ' ' . rtrim($customcert->name, '.') . '.' . $type); - - // Send HTTP headers. - $workbook->send($filename); - - // Creating the first worksheet. - $myxls = $workbook->add_worksheet(get_string('report', 'customcert')); - - // Print names of all the fields. - $myxls->write_string(0, 0, get_string('lastname')); - $myxls->write_string(0, 1, get_string('firstname')); - $myxls->write_string(0, 2, get_string('idnumber')); - $myxls->write_string(0, 3, get_string('group')); - $myxls->write_string(0, 4, get_string('receiveddate', 'customcert')); - $myxls->write_string(0, 5, get_string('code', 'customcert')); - - // Generate the data for the body of the spreadsheet. - $row = 1; - if ($users) { - foreach ($users as $user) { - $myxls->write_string($row, 0, $user->lastname); - $myxls->write_string($row, 1, $user->firstname); - $studentid = (!empty($user->idnumber)) ? $user->idnumber : ' '; - $myxls->write_string($row, 2, $studentid); - $ug2 = ''; - if ($usergrps = groups_get_all_groups($COURSE->id, $user->id)) { - foreach ($usergrps as $ug) { - $ug2 = $ug2 . $ug->name; - } - } - $myxls->write_string($row, 3, $ug2); - $myxls->write_string($row, 4, userdate($user->timecreated)); - $myxls->write_string($row, 5, $user->code); - $row++; - } - } - // Close the workbook. - $workbook->close(); -} - -/** - * Perform asort on a given array. - * - * @param array $fields - */ -function customcert_perform_asort(&$fields) { - if (class_exists('core_collator')) { - core_collator::asort($fields); - } else { - collatorlib::asort($fields); - } -} diff --git a/load_template.php b/load_template.php index 6b2d8c3..bbc9aa2 100644 --- a/load_template.php +++ b/load_template.php @@ -23,7 +23,7 @@ */ require_once('../../config.php'); -require_once($CFG->dirroot . '/mod/customcert/lib.php'); +require_once($CFG->dirroot . '/mod/customcert/locallib.php'); require_once($CFG->dirroot . '/mod/customcert/save_template_form.php'); $cmid = required_param('cmid', PARAM_INT); diff --git a/locallib.php b/locallib.php new file mode 100644 index 0000000..7b42a4b --- /dev/null +++ b/locallib.php @@ -0,0 +1,700 @@ +. + +/** + * Customcert module internal API. + * + * @package mod_customcert + * @copyright 2013 Mark Nelson + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +defined('MOODLE_INTERNAL') || die(); + +/** + * @var string the print protection variable + */ +define('PROTECTION_PRINT', 'print'); + +/** + * @var string the modify protection variable + */ +define('PROTECTION_MODIFY', 'modify'); + +/** + * @var string the copy protection variable + */ +define('PROTECTION_COPY', 'copy'); + +/** + * @var int the number of issues that will be displayed on each page in the report + * If you want to display all customcerts on a page set this to 0. + */ +define('CUSTOMCERT_PER_PAGE', 20); + +/** + * @var int the max number of issues to display + */ +define('CUSTOMCERT_MAX_PER_PAGE', 300); + +/** + * Handles setting the protection field for the customcert + * + * @param stdClass $data + * @return string the value to insert into the protection field + */ +function customcert_set_protection($data) { + $protection = array(); + + if (!empty($data->protection_print)) { + $protection[] = PROTECTION_PRINT; + } + if (!empty($data->protection_modify)) { + $protection[] = PROTECTION_MODIFY; + } + if (!empty($data->protection_copy)) { + $protection[] = PROTECTION_COPY; + } + + // Return the protection string. + return implode(', ', $protection); +} + +/** + * Handles uploading an image for the customcert module. + * + * @param int $draftitemid the draft area containing the files + * @param int $contextid the context we are storing this image in + */ +function customcert_upload_imagefiles($draftitemid, $contextid) { + // Save the file if it exists that is currently in the draft area. + file_save_draft_area_files($draftitemid, $contextid, 'mod_customcert', 'image', 0); +} + +/** + * Return the list of possible elements to add. + * + * @return array the list of images that can be used. + */ +function customcert_get_elements() { + global $CFG; + + // Array to store the element types. + $options = array(); + + // Check that the directory exists. + $elementdir = "$CFG->dirroot/mod/customcert/element"; + if (file_exists($elementdir)) { + // Get directory contents. + $elementfolders = new DirectoryIterator($elementdir); + // Loop through the elements folder. + foreach ($elementfolders as $elementfolder) { + // If it is not a directory or it is '.' or '..', skip it. + if (!$elementfolder->isDir() || $elementfolder->isDot()) { + continue; + } + // Check that the standard class file exists, if not we do + // not want to display it as an option as it will not work. + $foldername = $elementfolder->getFilename(); + $classfile = "$elementdir/$foldername/lib.php"; + if (file_exists($classfile)) { + // Need to require this file in case if we choose to add this element. + require_once($classfile); + $component = "customcertelement_{$foldername}"; + $options[$foldername] = get_string('pluginname', $component); + } + } + } + + customcert_perform_asort($options); + return $options; +} + +/** + * Return the list of possible fonts to use. + */ +function customcert_get_fonts() { + global $CFG; + + // Array to store the available fonts. + $options = array(); + + // Location of fonts in Moodle. + $fontdir = "$CFG->dirroot/lib/tcpdf/fonts"; + // Check that the directory exists. + if (file_exists($fontdir)) { + // Get directory contents. + $fonts = new DirectoryIterator($fontdir); + // Loop through the font folder. + foreach ($fonts as $font) { + // If it is not a file, or either '.' or '..', or + // the extension is not php, or we can not open file, + // skip it. + if (!$font->isFile() || $font->isDot() || ($font->getExtension() != 'php')) { + continue; + } + // Set the name of the font to null, the include next should then set this + // value, if it is not set then the file does not include the necessary data. + $name = null; + // Some files include a display name, the include next should then set this + // value if it is present, if not then $name is used to create the display name. + $displayname = null; + // Some of the TCPDF files include files that are not present, so we have to + // suppress warnings, this is the TCPDF libraries fault, grrr. + @include("$fontdir/$font"); + // If no $name variable in file, skip it. + if (is_null($name)) { + continue; + } + // Remove the extension of the ".php" file that contains the font information. + $filename = basename($font, ".php"); + // Check if there is no display name to use. + if (is_null($displayname)) { + // Format the font name, so "FontName-Style" becomes "Font Name - Style". + $displayname = preg_replace("/([a-z])([A-Z])/", "$1 $2", $name); + $displayname = preg_replace("/([a-zA-Z])-([a-zA-Z])/", "$1 - $2", $displayname); + } + $options[$filename] = $displayname; + } + ksort($options); + } + + return $options; +} + +/** + * Return the list of possible font sizes to use. + */ +function customcert_get_font_sizes() { + // Array to store the sizes. + $sizes = array(); + + for ($i = 1; $i <= 60; $i++) { + $sizes[$i] = $i; + } + + return $sizes; +} + +/** + * Handles saving page data. + * + * @param stdClass $data the customcert data + */ +function customcert_save_page_data($data) { + global $DB; + + // Set the time to a variable. + $time = time(); + + // Get the existing pages and save the page data. + if ($pages = $DB->get_records('customcert_pages', array('customcertid' => $data->id))) { + // Loop through existing pages. + foreach ($pages as $page) { + // Get the name of the fields we want from the form. + $width = 'pagewidth_' . $page->id; + $height = 'pageheight_' . $page->id; + // Create the page data to update the DB with. + $p = new stdClass(); + $p->id = $page->id; + $p->width = $data->$width; + $p->height = $data->$height; + $p->timemodified = $time; + // Update the page. + $DB->update_record('customcert_pages', $p); + } + } +} + +/** + * Returns an instance of the element class. + * + * @param stdClass $element the element + * @return stdClass|bool returns the instance of the element class, or false if element + * class does not exists. + */ +function customcert_get_element_instance($element) { + global $CFG; + + $classfile = "$CFG->dirroot/mod/customcert/element/{$element->element}/lib.php"; + // Ensure this necessary file exists. + if (file_exists($classfile)) { + require_once($classfile); + $classname = "customcert_element_{$element->element}"; + return new $classname($element); + } + + return false; +} + +/** + * Handles adding another page to the customcert. + * + * @param stdClass $data the form data + */ +function customcert_add_page($data) { + global $DB; + + // Set the page number to 1 to begin with. + $pagenumber = 1; + // Get the max page number. + $sql = "SELECT MAX(pagenumber) as maxpage + FROM {customcert_pages} cp + WHERE cp.customcertid = :customcertid"; + if ($maxpage = $DB->get_record_sql($sql, array('customcertid' => $data->id))) { + $pagenumber = $maxpage->maxpage + 1; + } + + // Store time in a variable. + $time = time(); + + // New page creation. + $page = new stdClass(); + $page->customcertid = $data->id; + $page->width = '210'; + $page->height = '297'; + $page->pagenumber = $pagenumber; + $page->timecreated = $time; + $page->timemodified = $time; + + // Insert the page. + $DB->insert_record('customcert_pages', $page); +} + +/** + * Handles deleting a page from the customcert. + * + * @param int $pageid the customcert page + */ +function customcert_delete_page($pageid) { + global $DB; + + // Get the page. + $page = $DB->get_record('customcert_pages', array('id' => $pageid), '*', MUST_EXIST); + + // Delete this page. + $DB->delete_records('customcert_pages', array('id' => $page->id)); + + // The element may have some extra tasks it needs to complete to completely delete itself. + if ($elements = $DB->get_records('customcert_elements', array('pageid' => $page->id))) { + foreach ($elements as $element) { + // Get an instance of the element class. + if ($e = customcert_get_element_instance($element)) { + $e->delete_element(); + } + } + } + + // Now we want to decrease the page number values of + // the pages that are greater than the page we deleted. + $sql = "UPDATE {customcert_pages} + SET pagenumber = pagenumber - 1 + WHERE customcertid = :customcertid + AND pagenumber > :pagenumber"; + $DB->execute($sql, array('customcertid' => $page->customcertid, + 'pagenumber' => $page->pagenumber)); +} + +/** + * Returns a list of all the templates. + * + * @return bool returns true if success, false otherwise + */ +function customcert_get_templates() { + global $DB; + + return $DB->get_records_menu('customcert_template', array(), 'name ASC', 'id, name'); +} + +/** + * Get the time the user has spent in the course. + * + * @param int $courseid + * @return int the total time spent in seconds + */ +function customcert_get_course_time($courseid) { + global $CFG, $USER; + + set_time_limit(0); + + $totaltime = 0; + $sql = "l.course = :courseid AND l.userid = :userid"; + if ($logs = get_logs($sql, array('courseid' => $courseid, 'userid' => $USER->id), 'l.time ASC', '', '', $totalcount)) { + foreach ($logs as $log) { + if (!isset($login)) { + // For the first time $login is not set so the first log is also the first login. + $login = $log->time; + $lasthit = $log->time; + $totaltime = 0; + } + $delay = $log->time - $lasthit; + if ($delay > ($CFG->sessiontimeout * 60)) { + // The difference between the last log and the current log is more than + // the timeout register session value meaning we have found a session. + $login = $log->time; + } else { + $totaltime += $delay; + } + // Now the actual log became the previous log for the next cycle. + $lasthit = $log->time; + } + + return $totaltime; + } + + return 0; +} + + +/** + * Returns a list of issued customcerts. + * + * @param int $customcertid + * @param bool $groupmode are we in group mode + * @param stdClass $cm the course module + * @param int $page offset + * @param int $perpage total per page + * @return stdClass the users + */ +function customcert_get_issues($customcertid, $groupmode, $cm, $page, $perpage) { + global $DB; + + // Get the conditional SQL. + list($conditionssql, $conditionsparams) = customcert_get_conditional_issues_sql($cm, $groupmode); + + // Add the conditional SQL and the customcertid to form all used parameters. + $allparams = $conditionsparams + array('customcertid' => $customcertid); + + // Return the issues. + return $DB->get_records_sql("SELECT u.*, ci.code, ci.timecreated + FROM {user} u + INNER JOIN {customcert_issues} ci + ON u.id = ci.userid + WHERE u.deleted = 0 + AND ci.customcertid = :customcertid + $conditionssql + ORDER BY " . $DB->sql_fullname(), + $allparams, + $page * $perpage, + $perpage); +} + +/** + * Returns the total number of issues for a given customcert. + * + * @param int $customcertid + * @param stdClass $cm the course module + * @param bool $groupmode the group mode + * @return int the number of issues + */ +function customcert_get_number_of_issues($customcertid, $cm, $groupmode) { + global $DB; + + // Get the conditional SQL. + list($conditionssql, $conditionsparams) = customcert_get_conditional_issues_sql($cm, $groupmode); + + // Add the conditional SQL and the customcertid to form all used parameters. + $allparams = $conditionsparams + array('customcertid' => $customcertid); + + // Return the number of issues. + return $DB->count_records_sql("SELECT COUNT(u.id) as count + FROM {user} u + INNER JOIN {customcert_issues} ci + ON u.id = ci.userid + WHERE u.deleted = 0 + AND ci.customcertid = :customcertid + $conditionssql", + $allparams); +} + +/** + * Returns an array of the conditional variables to use in the get_issues SQL query. + * + * @param stdClass $cm the course module + * @param bool $groupmode are we in group mode ? + * @return array the conditional variables + */ +function customcert_get_conditional_issues_sql($cm, $groupmode) { + global $CFG, $DB; + + // Get all users that can manage this customcert to exclude them from the report. + $context = context_module::instance($cm->id); + $conditionssql = ''; + $conditionsparams = array(); + if ($certmanagers = array_keys(get_users_by_capability($context, 'mod/customcert:manage', 'u.id'))) { + list($sql, $params) = $DB->get_in_or_equal($certmanagers, SQL_PARAMS_NAMED, 'cert'); + $conditionssql .= "AND NOT u.id $sql \n"; + $conditionsparams += $params; + } + + $restricttogroup = false; + if ($groupmode) { + $currentgroup = groups_get_activity_group($cm); + if ($currentgroup) { + $restricttogroup = true; + $groupusers = array_keys(groups_get_members($currentgroup, 'u.*')); + if (empty($groupusers)) { + return array(); + } + } + } + + $restricttogrouping = false; + + // If groupmembersonly used, remove users who are not in any group. + if (!empty($CFG->enablegroupings) and $cm->groupmembersonly) { + if ($groupingusers = groups_get_grouping_members($cm->groupingid, 'u.id', 'u.id')) { + $restricttogrouping = true; + } else { + return array(); + } + } + + if ($restricttogroup || $restricttogrouping) { + if ($restricttogroup) { + $allowedusers = $groupusers; + } else if ($restricttogroup && $restricttogrouping) { + $allowedusers = array_intersect($groupusers, $groupingusers); + } else { + $allowedusers = $groupingusers; + } + + list($sql, $params) = $DB->get_in_or_equal($allowedusers, SQL_PARAMS_NAMED, 'grp'); + $conditionssql .= "AND u.id $sql \n"; + $conditionsparams += $params; + } + + return array($conditionssql, $conditionsparams); +} + +/** + * Generates a 10-digit code of random letters and numbers. + * + * @return string + */ +function customcert_generate_code() { + global $DB; + + $uniquecodefound = false; + $code = random_string(10); + while (!$uniquecodefound) { + if (!$DB->record_exists('customcert_issues', array('code' => $code))) { + $uniquecodefound = true; + } else { + $code = random_string(10); + } + } + + return $code; +} + +/** + * Generate the grid PDF to show the layout of the PDF. + * + * @param int $pageid the customcert page + */ +function customcert_generate_grid_pdf($pageid) { + global $CFG, $DB; + + require_once($CFG->libdir . '/pdflib.php'); + + // Get the page. + $page = $DB->get_record('customcert_pages', array('id' => $pageid), '*', MUST_EXIST); + + // Set the PDF name. + $pdfname = get_string('gridpdfname', 'customcert', $page->id); + + // Create the pdf object. + $pdf = new pdf(); + $pdf->setPrintHeader(false); + $pdf->setPrintFooter(false); + $pdf->SetTitle($pdfname); + $pdf->SetMargins(0, 0); + $pdf->SetAutoPageBreak(true, 0); + + // Add the page to the PDF. + if ($page->width > $page->height) { + $orientation = 'L'; + } else { + $orientation = 'P'; + } + $pdf->AddPage($orientation, array($page->width, $page->height)); + + // The cell width. + $cellwidth = 10; + $cellheight = 10; + + // The increments we want to go up in. + $inc = 20; + $decpos = 4; + + // Draw first lines before we increment from here. + $pdf->Line(($inc / 2) + 2, 0, ($inc / 2) + 2, $page->height); + $pdf->Line(0, ($inc / 2), $page->width, ($inc / 2)); + + // Now we want to start drawing the lines to make the grid. + // Draw the horizontal lines. + for ($h = $inc; $h <= $page->height; $h += $inc) { + // Dirty hack cause the printer keeps cutting off characters + // near the end of the page for some BS reason. + if (strlen($h) <= 2) { + $lmargin = 5; + } else { + $lmargin = 4; + } + // Write the distance we are at. + $pdf->writeHTMLCell($cellwidth, $cellheight, $lmargin, $h - $decpos, $h); + + // Get the location we are going to draw the line and then draw it. + $hline = $h + ($inc / 2); + $pdf->Line(0, $hline, $page->width, $hline); + } + + // Draw the vertical lines. + for ($w = $inc; $w <= $page->width; $w += $inc) { + // Write the distance we are at. + $pdf->writeHTMLCell($cellwidth, $cellheight, $w - $decpos, 3, $w); + + // Get the location we are going to draw the line and then draw it. + $wline = $w + ($inc / 2); + $pdf->Line($wline, 0, $wline, $page->height); + } + + $pdf->Output($pdfname . '.pdf', 'D'); + exit(); +} + +/** + * Generate the PDF for the specified customcert and user. + * + * @param stdClass $customcert + * @param bool $preview true if it is a preview, false otherwise + */ +function customcert_generate_pdf($customcert, $preview = false) { + global $CFG, $DB; + + require_once($CFG->libdir . '/pdflib.php'); + + // Get the pages for the customcert, there should always be at least one page for each customcert. + if ($pages = $DB->get_records('customcert_pages', array('customcertid' => $customcert->id), 'pagenumber ASC')) { + // Create the pdf object. + $pdf = new pdf(); + if (!empty($customcert->protection)) { + $protection = explode(', ', $customcert->protection); + $pdf->SetProtection($protection); + } + $pdf->setPrintHeader(false); + $pdf->setPrintFooter(false); + $pdf->SetTitle($customcert->name); + $pdf->SetMargins(0, 0); + $pdf->SetAutoPageBreak(true, 0); + // Remove full-stop at the end, if it exists, to avoid "..pdf" being created and being filtered by clean_filename. + $filename = rtrim($customcert->name, '.'); + $filename = clean_filename($filename . '.pdf'); + // Loop through the pages and display their content. + foreach ($pages as $page) { + // Add the page to the PDF. + if ($page->width > $page->height) { + $orientation = 'L'; + } else { + $orientation = 'P'; + } + $pdf->AddPage($orientation, array($page->width, $page->height)); + // Get the elements for the page. + if ($elements = $DB->get_records('customcert_elements', array('pageid' => $page->id), 'sequence ASC')) { + // Loop through and display. + foreach ($elements as $element) { + // Get an instance of the element class. + if ($e = customcert_get_element_instance($element)) { + $e->render($pdf, $preview); + } + } + } + } + $pdf->Output($filename, 'D'); + } +} + +/** + * Generate the report. + * + * @param stdClass $customcert + * @param stdClass $users the list of users who have had a customcert issued + * @param string $type + */ +function customcert_generate_report_file($customcert, $users, $type) { + global $CFG, $COURSE; + + if ($type == 'ods') { + require_once($CFG->libdir . '/odslib.class.php'); + $workbook = new MoodleODSWorkbook('-'); + } else if ($type == 'xls') { + require_once($CFG->libdir . '/excellib.class.php'); + $workbook = new MoodleExcelWorkbook('-'); + } + + $filename = clean_filename($COURSE->shortname . ' ' . rtrim($customcert->name, '.') . '.' . $type); + + // Send HTTP headers. + $workbook->send($filename); + + // Creating the first worksheet. + $myxls = $workbook->add_worksheet(get_string('report', 'customcert')); + + // Print names of all the fields. + $myxls->write_string(0, 0, get_string('lastname')); + $myxls->write_string(0, 1, get_string('firstname')); + $myxls->write_string(0, 2, get_string('idnumber')); + $myxls->write_string(0, 3, get_string('group')); + $myxls->write_string(0, 4, get_string('receiveddate', 'customcert')); + $myxls->write_string(0, 5, get_string('code', 'customcert')); + + // Generate the data for the body of the spreadsheet. + $row = 1; + if ($users) { + foreach ($users as $user) { + $myxls->write_string($row, 0, $user->lastname); + $myxls->write_string($row, 1, $user->firstname); + $studentid = (!empty($user->idnumber)) ? $user->idnumber : ' '; + $myxls->write_string($row, 2, $studentid); + $ug2 = ''; + if ($usergrps = groups_get_all_groups($COURSE->id, $user->id)) { + foreach ($usergrps as $ug) { + $ug2 = $ug2 . $ug->name; + } + } + $myxls->write_string($row, 3, $ug2); + $myxls->write_string($row, 4, userdate($user->timecreated)); + $myxls->write_string($row, 5, $user->code); + $row++; + } + } + // Close the workbook. + $workbook->close(); +} + +/** + * Perform asort on a given array. + * + * @param array $fields + */ +function customcert_perform_asort(&$fields) { + if (class_exists('core_collator')) { + core_collator::asort($fields); + } else { + collatorlib::asort($fields); + } +} diff --git a/mod_form.php b/mod_form.php index a12c689..7e41305 100644 --- a/mod_form.php +++ b/mod_form.php @@ -17,7 +17,7 @@ defined('MOODLE_INTERNAL') || die('Direct access to this script is forbidden.'); require_once($CFG->dirroot.'/course/moodleform_mod.php'); -require_once($CFG->dirroot.'/mod/customcert/lib.php'); +require_once($CFG->dirroot.'/mod/customcert/locallib.php'); /** * Instance add/edit form. diff --git a/report.php b/report.php index b565cc5..f61b1a0 100644 --- a/report.php +++ b/report.php @@ -23,7 +23,7 @@ */ require_once('../../config.php'); -require_once('lib.php'); +require_once($CFG->dirroot . '/mod/customcert/locallib.php'); $id = required_param('id', PARAM_INT); $download = optional_param('download', '', PARAM_ALPHA); diff --git a/save_template.php b/save_template.php index 472c393..2b720e6 100644 --- a/save_template.php +++ b/save_template.php @@ -23,7 +23,7 @@ */ require_once('../../config.php'); -require_once($CFG->dirroot . '/mod/customcert/lib.php'); +require_once($CFG->dirroot . '/mod/customcert/locallib.php'); require_once($CFG->dirroot . '/mod/customcert/save_template_form.php'); $cmid = required_param('cmid', PARAM_INT); diff --git a/upload_image.php b/upload_image.php index 0a20c59..dc9a41b 100644 --- a/upload_image.php +++ b/upload_image.php @@ -23,7 +23,7 @@ */ require('../../config.php'); -require_once($CFG->dirroot.'/mod/customcert/lib.php'); +require_once($CFG->dirroot.'/mod/customcert/locallib.php'); require_once($CFG->dirroot.'/mod/customcert/upload_image_form.php'); require_login(); diff --git a/view.php b/view.php index e29c55f..c946d86 100644 --- a/view.php +++ b/view.php @@ -23,7 +23,7 @@ */ require_once('../../config.php'); -require_once($CFG->dirroot . '/mod/customcert/lib.php'); +require_once($CFG->dirroot . '/mod/customcert/locallib.php'); $id = required_param('id', PARAM_INT); $action = optional_param('action', '', PARAM_ALPHA);