MDL-64505 theme_classic: Created the classic theme
[moodle.git] / theme / classic / lib.php
1 <?php
2 // This file is part of Moodle - http://moodle.org/
3 //
4 // Moodle is free software: you can redistribute it and/or modify
5 // it under the terms of the GNU General Public License as published by
6 // the Free Software Foundation, either version 3 of the License, or
7 // (at your option) any later version.
8 //
9 // Moodle is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 // GNU General Public License for more details.
13 //
14 // You should have received a copy of the GNU General Public License
15 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
17 /**
18  * Classic theme callbacks.
19  *
20  * @package    theme_classic
21  * @copyright  2018 Bas Brands
22  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
23  */
25 // This line protects the file from being accessed by a URL directly.
26 defined('MOODLE_INTERNAL') || die();
28 /**
29  * Returns the main SCSS content.
30  *
31  * @param theme_config $theme The theme config object.
32  * @return string
33  */
34 function theme_classic_get_main_scss_content($theme) {
35     global $CFG;
37     $scss = '';
38     $filename = !empty($theme->settings->preset) ? $theme->settings->preset : null;
39     $fs = get_file_storage();
41     $context = context_system::instance();
42     $scss .= file_get_contents($CFG->dirroot . '/theme/classic/scss/classic/pre.scss');
43     if ($filename && ($presetfile = $fs->get_file($context->id, 'theme_classic', 'preset', 0, '/', $filename))) {
44         $scss .= $presetfile->get_content();
45     } else {
46         // Safety fallback - maybe new installs etc.
47         $scss .= file_get_contents($CFG->dirroot . '/theme/classic/scss/preset/default.scss');
48     }
49     $scss .= file_get_contents($CFG->dirroot . '/theme/classic/scss/classic/post.scss');
51     return $scss;
52 }
54 /**
55  * Get SCSS to prepend.
56  *
57  * @param theme_config $theme The theme config object.
58  * @return array
59  */
60 function theme_classic_get_pre_scss($theme) {
61     $scss = '';
62     $configurable = [
63         // Config key => [variableName, ...].
64         'brandcolor' => ['primary'],
65     ];
67     // Prepend variables first.
68     foreach ($configurable as $configkey => $targets) {
69         $value = isset($theme->settings->{$configkey}) ? $theme->settings->{$configkey} : null;
70         if (empty($value)) {
71             continue;
72         }
73         array_map(function($target) use (&$scss, $value) {
74             $scss .= '$' . $target . ': ' . $value . ";\n";
75         }, (array) $targets);
76     }
78     // Prepend pre-scss.
79     if (!empty($theme->settings->scsspre)) {
80         $scss .= $theme->settings->scsspre;
81     }
83     return $scss;
84 }
86 /**
87  * Inject additional SCSS.
88  *
89  * @param theme_config $theme The theme config object.
90  * @return string
91  */
92 function theme_classic_get_extra_scss($theme) {
93     global $CFG;
94     $content = '';
96     // Set the page background image.
97     $imageurl = $theme->setting_file_url('backgroundimage', 'backgroundimage');
98     if (!empty($imageurl)) {
99         $content .= '$imageurl: "' . $imageurl . '";';
100         $content .= file_get_contents($CFG->dirroot .
101             '/theme/classic/scss/classic/body-background.scss');
102     }
104     if (!empty($theme->settings->navbardark)) {
105         $content .= file_get_contents($CFG->dirroot .
106             '/theme/classic/scss/classic/navbar-dark.scss');
107     } else {
108         $content .= file_get_contents($CFG->dirroot .
109             '/theme/classic/scss/classic/navbar-light.scss');
110     }
111     if (!empty($theme->settings->scss)) {
112         $content .= $theme->settings->scss;
113     }
114     return $content;
117 /**
118  * Get compiled css.
119  *
120  * @return string compiled css
121  */
122 function theme_classic_get_precompiled_css() {
123     global $CFG;
124     return file_get_contents($CFG->dirroot . '/theme/classic/style/moodle.css');
127 /**
128  * Serves any files associated with the theme settings.
129  *
130  * @param stdClass $course
131  * @param stdClass $cm
132  * @param context $context
133  * @param string $filearea
134  * @param array $args
135  * @param bool $forcedownload
136  * @param array $options
137  * @return bool
138  */
139 function theme_classic_pluginfile($course, $cm, $context, $filearea, $args, $forcedownload, array $options = array()) {
140     if ($context->contextlevel == CONTEXT_SYSTEM && ($filearea === 'backgroundimage')) {
141         $theme = theme_config::load('classic');
142         // By default, theme files must be cache-able by both browsers and proxies.
143         if (!array_key_exists('cacheability', $options)) {
144             $options['cacheability'] = 'public';
145         }
146         return $theme->setting_file_serve($filearea, $args, $forcedownload, $options);
147     } else {
148         send_file_not_found();
149     }