MDL-73679 courseformat: Add support for course format templating

This commit is contained in:
Andrew Nicols
2022-03-01 12:03:46 +08:00
parent b43d729c85
commit d6052154a6
19 changed files with 164 additions and 84 deletions
@@ -24,10 +24,10 @@
namespace core_courseformat\output\local;
use core\output\named_templatable;
use core_courseformat\base as course_format;
use course_modinfo;
use renderable;
use templatable;
/**
* Base class to render a course format.
@@ -36,7 +36,8 @@ use templatable;
* @copyright 2020 Ferran Recio <[email protected]>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class content implements renderable, templatable {
class content implements named_templatable, renderable {
use courseformat_named_templatable;
/** @var core_courseformat\base the course format class */
protected $format;
@@ -24,10 +24,11 @@
namespace core_courseformat\output\local\content;
use core\output\named_templatable;
use core_courseformat\base as course_format;
use renderable;
use templatable;
use core_courseformat\output\local\courseformat_named_templatable;
use moodle_url;
use renderable;
use stdClass;
/**
@@ -37,7 +38,9 @@ use stdClass;
* @copyright 2020 Ferran Recio <[email protected]>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class addsection implements renderable, templatable {
class addsection implements named_templatable, renderable {
use courseformat_named_templatable;
/** @var course_format the course format class */
protected $format;
@@ -26,15 +26,16 @@ namespace core_courseformat\output\local\content;
use cm_info;
use core\activity_dates;
use core\output\named_templatable;
use core_availability\info_module;
use core_completion\cm_completion_details;
use core_courseformat\base as course_format;
use core_course\output\activity_information;
use core_courseformat\base as course_format;
use core_courseformat\output\local\courseformat_named_templatable;
use renderable;
use renderer_base;
use section_info;
use stdClass;
use templatable;
/**
* Base class to render a course module inside a course format.
@@ -43,7 +44,8 @@ use templatable;
* @copyright 2020 Ferran Recio <[email protected]>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class cm implements renderable, templatable {
class cm implements named_templatable, renderable {
use courseformat_named_templatable;
/** @var course_format the course format */
protected $format;
@@ -25,13 +25,16 @@
namespace core_courseformat\output\local\content\cm;
use cm_info;
use context_module;
use core\output\inplace_editable;
use core\output\named_templatable;
use core_courseformat\base as course_format;
use core_courseformat\output\local\courseformat_named_templatable;
use external_api;
use lang_string;
use renderable;
use section_info;
use stdClass;
use context_module;
use lang_string;
use external_api;
use core\output\inplace_editable;
/**
* Base class to render a course module inplace editable header.
@@ -40,7 +43,9 @@ use core\output\inplace_editable;
* @copyright 2020 Ferran Recio <[email protected]>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class cmname extends inplace_editable {
class cmname extends inplace_editable implements named_templatable, renderable {
use courseformat_named_templatable;
/** @var course_format the course format */
protected $format;
@@ -24,14 +24,15 @@
namespace core_courseformat\output\local\content\cm;
use action_menu;
use action_menu_link;
use cm_info;
use core\output\named_templatable;
use core_courseformat\base as course_format;
use core_courseformat\output\local\courseformat_named_templatable;
use renderable;
use section_info;
use stdClass;
use templatable;
use action_menu;
use action_menu_link;
/**
* Base class to render a course module menu inside a course format.
@@ -40,7 +41,9 @@ use action_menu_link;
* @copyright 2020 Ferran Recio <[email protected]>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class controlmenu implements renderable, templatable {
class controlmenu implements named_templatable, renderable {
use courseformat_named_templatable;
/** @var course_format the course format */
protected $format;
@@ -27,12 +27,13 @@
namespace core_courseformat\output\local\content\cm;
use cm_info;
use core\output\named_templatable;
use core_courseformat\base as course_format;
use core_courseformat\output\local\courseformat_named_templatable;
use core_text;
use renderable;
use section_info;
use stdClass;
use templatable;
use core_text;
/**
* Base class to render a course module title inside a course format.
@@ -41,7 +42,9 @@ use core_text;
* @copyright 2020 Ferran Recio <[email protected]>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class title implements renderable, templatable {
class title implements named_templatable, renderable {
use courseformat_named_templatable;
/** @var course_format the course format */
protected $format;
@@ -26,12 +26,13 @@
namespace core_courseformat\output\local\content;
use core_courseformat\base as course_format;
use renderable;
use templatable;
use section_info;
use context_course;
use core\output\named_templatable;
use core_courseformat\base as course_format;
use core_courseformat\output\local\courseformat_named_templatable;
use moodle_url;
use renderable;
use section_info;
use stdClass;
/**
@@ -41,7 +42,9 @@ use stdClass;
* @copyright 2020 Ferran Recio <[email protected]>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class frontpagesection implements renderable, templatable {
class frontpagesection implements named_templatable, renderable {
use courseformat_named_templatable;
/** @var course_format the course format class */
protected $format;
@@ -24,13 +24,14 @@
namespace core_courseformat\output\local\content;
use core_courseformat\base as course_format;
use context_course;
use core\output\named_templatable;
use core_courseformat\base as course_format;
use core_courseformat\output\local\courseformat_named_templatable;
use renderable;
use renderer_base;
use section_info;
use stdClass;
use templatable;
/**
* Base class to render a course section.
@@ -39,7 +40,8 @@ use templatable;
* @copyright 2020 Ferran Recio <[email protected]>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class section implements renderable, templatable {
class section implements named_templatable, renderable {
use courseformat_named_templatable;
/** @var course_format the course format */
protected $format;
@@ -221,7 +223,6 @@ class section implements renderable, templatable {
$cmlist = new $this->cmlistclass($format, $section);
$data->cmlist = $cmlist->export_for_template($output);
$result = true;
}
return $result;
}
@@ -24,13 +24,14 @@
namespace core_courseformat\output\local\content\section;
use core_courseformat\base as course_format;
use section_info;
use renderable;
use templatable;
use core_availability\info_section;
use core_availability\info;
use context_course;
use core\output\named_templatable;
use core_availability\info;
use core_availability\info_section;
use core_courseformat\base as course_format;
use core_courseformat\output\local\courseformat_named_templatable;
use renderable;
use section_info;
use stdClass;
/**
@@ -40,7 +41,9 @@ use stdClass;
* @copyright 2020 Ferran Recio <[email protected]>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class availability implements renderable, templatable {
class availability implements named_templatable, renderable {
use courseformat_named_templatable;
/** @var course_format the course format class */
protected $format;
@@ -24,12 +24,13 @@
namespace core_courseformat\output\local\content\section;
use cm_info;
use core\output\named_templatable;
use core_courseformat\base as course_format;
use core_courseformat\output\local\courseformat_named_templatable;
use renderable;
use renderer_base;
use section_info;
use renderable;
use templatable;
use cm_info;
use stdClass;
/**
@@ -39,7 +40,9 @@ use stdClass;
* @copyright 2020 Ferran Recio <[email protected]>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class cmitem implements renderable, templatable {
class cmitem implements named_templatable, renderable {
use courseformat_named_templatable;
/** @var course_format the course format class */
protected $format;
@@ -24,11 +24,12 @@
namespace core_courseformat\output\local\content\section;
use core\output\named_templatable;
use core_courseformat\base as course_format;
use section_info;
use renderable;
use templatable;
use core_courseformat\output\local\courseformat_named_templatable;
use moodle_url;
use renderable;
use section_info;
use stdClass;
/**
@@ -38,7 +39,9 @@ use stdClass;
* @copyright 2020 Ferran Recio <[email protected]>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class cmlist implements renderable, templatable {
class cmlist implements named_templatable, renderable {
use courseformat_named_templatable;
/** @var course_format the course format class */
protected $format;
@@ -129,4 +132,3 @@ class cmlist implements renderable, templatable {
return $data;
}
}
@@ -24,11 +24,12 @@
namespace core_courseformat\output\local\content\section;
use core_courseformat\base as course_format;
use section_info;
use completion_info;
use core\output\named_templatable;
use core_courseformat\base as course_format;
use core_courseformat\output\local\courseformat_named_templatable;
use renderable;
use templatable;
use section_info;
use stdClass;
/**
@@ -38,7 +39,9 @@ use stdClass;
* @copyright 2020 Ferran Recio <[email protected]>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class cmsummary implements renderable, templatable {
class cmsummary implements named_templatable, renderable {
use courseformat_named_templatable;
/** @var course_format the course format class */
protected $format;
@@ -24,15 +24,16 @@
namespace core_courseformat\output\local\content\section;
use core_courseformat\base as course_format;
use section_info;
use renderable;
use templatable;
use action_menu;
use action_menu_link_secondary;
use context_course;
use core\output\named_templatable;
use core_courseformat\base as course_format;
use core_courseformat\output\local\courseformat_named_templatable;
use moodle_url;
use pix_icon;
use action_menu_link_secondary;
use action_menu;
use renderable;
use section_info;
use stdClass;
/**
@@ -42,7 +43,9 @@ use stdClass;
* @copyright 2020 Ferran Recio <[email protected]>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class controlmenu implements renderable, templatable {
class controlmenu implements named_templatable, renderable {
use courseformat_named_templatable;
/** @var course_format the course format class */
protected $format;
@@ -24,10 +24,11 @@
namespace core_courseformat\output\local\content\section;
use core\output\named_templatable;
use core_courseformat\base as course_format;
use section_info;
use core_courseformat\output\local\courseformat_named_templatable;
use renderable;
use templatable;
use section_info;
use stdClass;
/**
@@ -37,7 +38,9 @@ use stdClass;
* @copyright 2020 Ferran Recio <[email protected]>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class header implements renderable, templatable {
class header implements named_templatable, renderable {
use courseformat_named_templatable;
/** @var course_format the course format class */
protected $format;
@@ -24,11 +24,12 @@
namespace core_courseformat\output\local\content\section;
use core_courseformat\base as course_format;
use section_info;
use renderable;
use templatable;
use context_course;
use core\output\named_templatable;
use core_courseformat\base as course_format;
use core_courseformat\output\local\courseformat_named_templatable;
use renderable;
use section_info;
use stdClass;
/**
@@ -38,7 +39,9 @@ use stdClass;
* @copyright 2020 Ferran Recio <[email protected]>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class summary implements renderable, templatable {
class summary implements named_templatable, renderable {
use courseformat_named_templatable;
/** @var course_format the course format class */
protected $format;
@@ -24,10 +24,11 @@
namespace core_courseformat\output\local\content;
use core_courseformat\base as course_format;
use renderable;
use templatable;
use context_course;
use core\output\named_templatable;
use core_courseformat\base as course_format;
use core_courseformat\output\local\courseformat_named_templatable;
use renderable;
use stdClass;
/**
@@ -37,7 +38,9 @@ use stdClass;
* @copyright 2020 Ferran Recio <[email protected]>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class sectionnavigation implements renderable, templatable {
class sectionnavigation implements named_templatable, renderable {
use courseformat_named_templatable;
/** @var course_format the course format class */
protected $format;
@@ -24,11 +24,12 @@
namespace core_courseformat\output\local\content;
use core\output\named_templatable;
use core_courseformat\base as course_format;
use core_courseformat\output\local\courseformat_named_templatable;
use renderable;
use templatable;
use url_select;
use stdClass;
use url_select;
/**
* Represents the section selector.
@@ -37,7 +38,9 @@ use stdClass;
* @copyright 2020 Ferran Recio <[email protected]>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class sectionselector implements renderable, templatable {
class sectionselector implements named_templatable, renderable {
use courseformat_named_templatable;
/** @var course_format the course format class */
protected $format;
@@ -0,0 +1,46 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
namespace core_courseformat\output\local;
/**
* Base templatable class for coursformat templateables which are typically overridden by course formats.
*
* @package core_courseformat
* @copyright 2022 Andrew Lyons <[email protected]>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
trait courseformat_named_templatable {
/**
* Get the name of the template to use for this templatable.
*
* @param \renderer_base $renderer The renderer requesting the template name
* @return string
*/
public function get_template_name(\renderer_base $renderer): string {
$fullpath = str_replace('\\', '/', get_class($this));
$specialrenderers = '@^.*/output/(local|courseformat)/(?<template>.+)$@';
$matches = null;
if (preg_match($specialrenderers, $fullpath, $matches)) {
return "core_courseformat/local/{$matches['template']}";
}
throw new \coding_exception("Unable to determine template name for class " . get_class($this));
}
}
@@ -103,20 +103,7 @@ abstract class section_renderer extends core_course_renderer {
if (method_exists($this, $rendermethod)) {
return $this->$rendermethod($widget);
}
// Check for special course format templatables.
if ($widget instanceof templatable) {
// Templatables from both core_courseformat\output\xxx_format\* and format_xxx\output\xxx_format\*
// use core_crouseformat/local/xxx_format templates by default.
$corepath = 'core_courseformat\/output\/local';
$pluginpath = 'format_.+\/output\/courseformat';
$specialrenderers = '/^(?<componentpath>' . $corepath . '|' . $pluginpath . ')\/(?<template>.+)$/';
$matches = null;
if (preg_match($specialrenderers, $fullpath, $matches)) {
$data = $widget->export_for_template($this);
return $this->render_from_template('core_courseformat/local/' . $matches['template'], $data);
}
}
// If nothing works, let the parent class decide.
return parent::render($widget);
}