. /** * lib.php * * @package theme_klass * @copyright 2015 LMSACE Dev Team, lmsace.com * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ defined('MOODLE_INTERNAL') || die(); /** * Load the Jquery and migration files * Load the our theme js file * * @param moodle_page $page [description] */ function theme_klass_page_init(moodle_page $page) { $page->requires->jquery(); $page->requires->js('/theme/klass/javascript/theme.js'); } /** * Loads the CSS Styles and replace the background images. * If background image not available in the settings take the default images. * * @param string $css * @param string $theme * @return string */ function theme_klass_process_css($css, $theme) { // Set the background image for the logo. $logo = $theme->setting_file_url('logo', 'logo'); $css = theme_klass_set_logo($css, $logo); // Set custom CSS. if (!empty($theme->settings->customcss)) { $customcss = $theme->settings->customcss; } else { $customcss = null; } $css = theme_klass_set_customcss($css, $customcss); $css = theme_klass_pre_css_set_fontwww($css); return $css; } /** * Adds the logo to CSS. * * @param string $scss The CSS. * @param string $logo The URL of the logo. * @return string The parsed CSS */ function theme_klass_set_logo($scss, $logo) { $tag = '$logo: '; $replacement = $logo; if (is_null($replacement)) { $replacement = ''; } $scss = str_replace($tag, $replacement, $scss); return $scss; } /** * Serves any files associated with the theme settings. * * @param stdClass $course * @param stdClass $cm * @param context $context * @param string $filearea * @param array $args * @param bool $forcedownload * @param array $options * @return bool */ function theme_klass_pluginfile($course, $cm, $context, $filearea, $args, $forcedownload, array $options = array()) { static $theme; if (empty($theme)) { $theme = theme_config::load('klass'); } if ($context->contextlevel == CONTEXT_SYSTEM) { if ($filearea === 'logo') { return $theme->setting_file_serve('logo', $args, $forcedownload, $options); } else if ($filearea === 'footerlogo') { return $theme->setting_file_serve('footerlogo', $args, $forcedownload, $options); } else if ($filearea === 'style') { theme_klass_serve_css($args[1]); } else if ($filearea === 'pagebackground') { return $theme->setting_file_serve('pagebackground', $args, $forcedownload, $options); } else if (preg_match("/slide[1-9][0-9]*image/", $filearea) !== false) { return $theme->setting_file_serve($filearea, $args, $forcedownload, $options); } else { send_file_not_found(); } } else { send_file_not_found(); } } /** * Serves CSS for image file updated to styles. * * @param string $filename * @return string */ function theme_klass_serve_css($filename) { global $CFG; if (!empty($CFG->themedir)) { $thestylepath = $CFG->themedir . '/klass/style/'; } else { $thestylepath = $CFG->dirroot . '/theme/klass/style/'; } $thesheet = $thestylepath . $filename; $etagfile = md5_file($thesheet); // File. $lastmodified = filemtime($thesheet); // Header. $ifmodifiedsince = (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) ? $_SERVER['HTTP_IF_MODIFIED_SINCE'] : false); $etagheader = (isset($_SERVER['HTTP_IF_NONE_MATCH']) ? trim($_SERVER['HTTP_IF_NONE_MATCH']) : false); if ((($ifmodifiedsince) && (strtotime($ifmodifiedsince) == $lastmodified)) || $etagheader == $etagfile) { theme_klass_send_unmodified($lastmodified, $etagfile); } theme_klass_send_cached_css($thestylepath, $filename, $lastmodified, $etagfile); } /** * Set browser cache used in php header. * * @param string $lastmodified * @param string $etag */ function theme_klass_send_unmodified($lastmodified, $etag) { $lifetime = 60 * 60 * 24 * 60; header('HTTP/1.1 304 Not Modified'); header('Expires: ' . gmdate('D, d M Y H:i:s', time() + $lifetime) . ' GMT'); header('Cache-Control: public, max-age=' . $lifetime); header('Content-Type: text/css; charset=utf-8'); header('Etag: "' . $etag . '"'); if ($lastmodified) { header('Last-Modified: ' . gmdate('D, d M Y H:i:s', $lastmodified) . ' GMT'); } die; } /** * Cached css. * @param string $path * @param string $filename * @param int $lastmodified * @param string $etag */ function theme_klass_send_cached_css($path, $filename, $lastmodified, $etag) { global $CFG; require_once($CFG->dirroot . '/lib/configonlylib.php'); // 60 days only - the revision may get incremented quite often. $lifetime = 60 * 60 * 24 * 60; header('Etag: "' . $etag . '"'); header('Content-Disposition: inline; filename="'.$filename.'"'); header('Last-Modified: ' . gmdate('D, d M Y H:i:s', $lastmodified) . ' GMT'); header('Expires: ' . gmdate('D, d M Y H:i:s', time() + $lifetime) . ' GMT'); header('Pragma: '); header('Cache-Control: public, max-age=' . $lifetime); header('Accept-Ranges: none'); header('Content-Type: text/css; charset=utf-8'); if (!min_enable_zlib_compression()) { header('Content-Length: ' . filesize($path . $filename)); } readfile($path . $filename); die; } /** * Adds any custom CSS to the CSS before it is cached. * * @param string $css The original CSS. * @param string $customcss The custom CSS to add. * @return string The CSS which now contains our custom CSS. */ function theme_klass_set_customcss($css, $customcss) { $tag = '[[setting:customcss]]'; $replacement = $customcss; if (is_null($replacement)) { $replacement = ''; } $css = str_replace($tag, $replacement, $css); return $css; } /** * Returns an object containing HTML for the areas affected by settings. * * Do not add Clean specific logic in here, child themes should be able to * rely on that function just by declaring settings with similar names. * * @param renderer_base $output Pass in $OUTPUT. * @param moodle_page $page Pass in $PAGE. * @return stdClass An object with the following properties: * - navbarclass A CSS class to use on the navbar. By default ''. * - heading HTML to use for the heading. A logo if one is selected or the default heading. * - footnote HTML to use as a footnote. By default ''. */ function theme_klass_get_html_for_settings(renderer_base $output, moodle_page $page) { global $CFG; $return = new stdClass; $return->navbarclass = ''; if (!empty($page->theme->settings->invert)) { $return->navbarclass .= ' navbar-inverse'; } if (!empty($page->theme->settings->logo)) { $return->heading = html_writer::link($CFG->wwwroot, '', array('title' => get_string('home'), 'class' => 'logo')); } else { $return->heading = $output->page_heading(); } $return->footnote = ''; if (!empty($page->theme->settings->footnote)) { $return->footnote = '