. namespace core_courseformat; use action_menu; use renderer_base; use section_info; use core_courseformat\stateupdates; use core_courseformat\output\local\content\section\controlmenu; use core_courseformat\base as course_format; /** * Section delegate base class. * * Plugins using delegate sections must extend this class into * their PLUGINNAME\courseformat\sectiondelegate class. * * @package core_courseformat * @copyright 2023 Ferran Recio * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ abstract class sectiondelegate { /** * Constructor. * @param section_info $sectioninfo */ public function __construct( protected section_info $sectioninfo ) { } /** * Get the section info instance if available. * * @param section_info $sectioninfo * @return section_info|null */ public static function instance(section_info $sectioninfo): ?self { if (empty($sectioninfo->component)) { return null; } $classname = self::get_delegate_class_name($sectioninfo->component); if ($classname === null) { return null; } return new $classname($sectioninfo); } /** * Return the delgate class name of a plugin, if any. * @param string $pluginname * @return string|null the delegate class name or null if not found. */ protected static function get_delegate_class_name(string $pluginname): ?string { $classname = $pluginname . '\courseformat\sectiondelegate'; if (!class_exists($classname)) { return null; } return $classname; } /** * Check if a plugin has a delegate class. * @param string $pluginname * @return bool */ public static function has_delegate_class(string $pluginname): bool { return self::get_delegate_class_name($pluginname) !== null; } /** * Define the section final name. * * This method can process the section name and return the validated new name. * * @param section_info $section * @param string|null $newname the new name value to store in the database * @return string|null the name value to store in the database */ public function preprocess_section_name(section_info $section, ?string $newname): ?string { return $newname; } /** * Add extra state updates when put or create a section. * * This method is called every time the backend sends a delegated section * state update to the UI. * * @param section_info $section the affected section. * @param stateupdates $updates the state updates object to notify the UI. */ public function put_section_state_extra_updates(section_info $section, stateupdates $updates): void { // By default, do nothing. } /** * Allow delegate plugin to modify the available section menu. * * @param course_format $format The course format instance. * @param controlmenu $controlmenu The control menu instance. * @param renderer_base $output The renderer instance. * @return action_menu|null The new action menu with the list of edit control items or null if no action menu is available. */ public function get_section_action_menu( course_format $format, controlmenu $controlmenu, renderer_base $output, ): ?action_menu { return $controlmenu->get_default_action_menu($output); } }