MDL-50346 core: Allow sub-directories in template names

This commit is contained in:
Andrew Nicols 2019-07-24 09:31:17 +08:00
parent 414eca8923
commit 0261d1effa
15 changed files with 209 additions and 64 deletions

View file

@ -1,2 +1,2 @@
define ("tool_templatelibrary/display",["jquery","core/ajax","core/log","core/notification","core/templates","core/config","core/str"],function(a,b,c,d,e,f,g){var h=function(a,b){if(!a){return!1}var c="@template "+b,d=0,e=[];e=a.match(/{{!([\s\S]*?)}}/g);if(null!==e){for(d=0;d<e.length;d++){var f=e[d],g=f.indexOf(c);if(-1!==g){var h=g+c.length+1;f=f.substr(h,f.length-2-h);return f}}}return!1},i=function(b,f,i){g.get_string("templateselected","tool_templatelibrary",b).done(function(b){a("[data-region=\"displaytemplateheader\"]").text(b)}).fail(d.exception);var j=h(f,b);if(!1===j){j=h(i,b)}if(j){f=j}a("[data-region=\"displaytemplatesource\"]").text(f);var k=f.match(/Example context \(json\):([\s\S]*)/),l=!1;if(k){var m=k[1].trim();try{l=a.parseJSON(m)}catch(a){c.debug("Could not parse json example context for template.");c.debug(a)}}if(l){e.render(b,l).done(function(b,c){e.replaceNodeContents(a("[data-region=\"displaytemplateexample\"]"),b,c)}).fail(d.exception)}else{g.get_string("templatehasnoexample","tool_templatelibrary").done(function(b){a("[data-region=\"displaytemplateexample\"]").text(b)}).fail(d.exception)}},j=function(c){var e=c.split("/"),g=e.shift(),h=e.shift(),j=b.call([{methodname:"core_output_load_template",args:{component:g,template:h,themename:f.theme,includecomments:!0}},{methodname:"tool_templatelibrary_load_canonical_template",args:{component:g,template:h}}],!0,!1);a.when.apply(a,j).done(function(a,b){i(c,a,b)}).fail(d.exception)};a("[data-region=\"list-templates\"]").on("click","[data-templatename]",function(b){var c=a(this).data("templatename");b.preventDefault();j(c)});return{}});
define ("tool_templatelibrary/display",["jquery","core/ajax","core/log","core/notification","core/templates","core/config","core/str"],function(a,b,c,d,e,f,g){var h=function(a,b){if(!a){return!1}var c="@template "+b,d=0,e=[];e=a.match(/{{!([\s\S]*?)}}/g);if(null!==e){for(d=0;d<e.length;d++){var f=e[d],g=f.indexOf(c);if(-1!==g){var h=g+c.length+1;f=f.substr(h,f.length-2-h);return f}}}return!1},i=function(b,f,i){g.get_string("templateselected","tool_templatelibrary",b).done(function(b){a("[data-region=\"displaytemplateheader\"]").text(b)}).fail(d.exception);var j=h(f,b);if(!1===j){j=h(i,b)}if(j){f=j}a("[data-region=\"displaytemplatesource\"]").text(f);var k=f.match(/Example context \(json\):([\s\S]*)/),l=!1;if(k){var m=k[1].trim();try{l=a.parseJSON(m)}catch(a){c.debug("Could not parse json example context for template.");c.debug(a)}}if(l){e.render(b,l).done(function(b,c){e.replaceNodeContents(a("[data-region=\"displaytemplateexample\"]"),b,c)}).fail(d.exception)}else{g.get_string("templatehasnoexample","tool_templatelibrary").done(function(b){a("[data-region=\"displaytemplateexample\"]").text(b)}).fail(d.exception)}},j=function(c){var e=c.split("/"),g=e.shift(),h=e.join("/"),j=b.call([{methodname:"core_output_load_template",args:{component:g,template:h,themename:f.theme,includecomments:!0}},{methodname:"tool_templatelibrary_load_canonical_template",args:{component:g,template:h}}],!0,!1);a.when.apply(a,j).done(function(a,b){i(c,a,b)}).fail(d.exception)};a("[data-region=\"list-templates\"]").on("click","[data-templatename]",function(b){var c=a(this).data("templatename");b.preventDefault();j(c)});return{}});
//# sourceMappingURL=display.min.js.map

File diff suppressed because one or more lines are too long

View file

@ -119,7 +119,7 @@ define(['jquery', 'core/ajax', 'core/log', 'core/notification', 'core/templates'
var loadTemplate = function(templateName) {
var parts = templateName.split('/');
var component = parts.shift();
var name = parts.shift();
var name = parts.join('/');
var promises = ajax.call([{
methodname: 'core_output_load_template',

View file

@ -99,13 +99,34 @@ class api {
foreach ($templatedirs as $templatecomponent => $dirs) {
foreach ($dirs as $dir) {
if (!is_dir($dir) || !is_readable($dir)) {
continue;
}
$dir = realpath($dir);
// List it.
$files = glob($dir . '/*.mustache');
$directory = new \RecursiveDirectoryIterator($dir);
$files = new \RecursiveIteratorIterator($directory);
foreach ($files as $file) {
$templatename = basename($file, '.mustache');
if ($search == '' || strpos($templatename, $search) !== false) {
$results[$templatecomponent . '/' . $templatename] = 1;
if (!$file->isFile()) {
continue;
}
$filename = substr($file->getRealpath(), strlen($dir) + 1);
if (strpos($templatecomponent, 'theme_') === 0) {
if (strpos($filename, '/') !== false && strpos($filename, 'local/') !== 0) {
// Skip any template in a sub-directory of a theme which is not in a local directory.
// These are theme overrides of core templates.
// Note: There is a rare edge case where a theme may override a template and then have additional
// dependant templates and these will not be shown.
continue;
}
}
$templatename = str_replace('.mustache', '', $filename);
$componenttemplatename = "{$templatecomponent}/{$templatename}";
if ($search == '' || strpos($componenttemplatename, $search) !== false) {
$results[$componenttemplatename] = 1;
}
}
}
@ -152,5 +173,4 @@ class api {
return $templatestr;
}
}

View file

@ -105,7 +105,7 @@ class external extends external_api {
public static function load_canonical_template_parameters() {
return new external_function_parameters(
array('component' => new external_value(PARAM_COMPONENT, 'component containing the template'),
'template' => new external_value(PARAM_ALPHANUMEXT, 'name of the template'))
'template' => new external_value(PARAM_SAFEPATH, 'name of the template'))
);
}

View file

@ -21,6 +21,6 @@
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
$plugin->version = 2019052000; // The current plugin version (Date: YYYYMMDDXX).
$plugin->version = 2019052002; // The current plugin version (Date: YYYYMMDDXX).
$plugin->requires = 2019051100; // Requires this Moodle version.
$plugin->component = 'tool_templatelibrary'; // Full name of the plugin (used for diagnostics).