Search moodle.org's
Developer Documentation

See Release Notes

  • Bug fixes for general core bugs in 4.2.x will end 22 April 2024 (12 months).
  • Bug fixes for security issues in 4.2.x will end 7 October 2024 (18 months).
  • PHP version: minimum PHP 8.0.0 Note: minimum PHP version has increased since Moodle 4.1. PHP 8.1.x is supported too.

Differences Between: [Versions 401 and 402]

   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/>.
  16  
  17  namespace mod_data\output;
  18  
  19  use templatable;
  20  use renderable;
  21  use core_tag_tag;
  22  use mod_data\manager;
  23  
  24  /**
  25   * Renderable class for template editor tools.
  26   *
  27   * @package    mod_data
  28   * @copyright  2022 Ferran Recio <ferran@moodle.com>
  29   * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  30   */
  31  class template_editor_tools implements templatable, renderable {
  32  
  33      /** @var manager manager instance. */
  34      private $manager;
  35  
  36      /** @var string the template name. */
  37      private $templatename;
  38  
  39      /**
  40       * The class constructor.
  41       *
  42       * @param manager $manager the activity instance manager
  43       * @param string $templatename the template to edit
  44       */
  45      public function __construct(manager $manager, string $templatename) {
  46          $this->manager = $manager;
  47          $this->templatename = $templatename;
  48      }
  49  
  50      /**
  51       * Export the data for the mustache template.
  52       *
  53       * @param \renderer_base $output renderer to be used to render the action bar elements.
  54       * @return array
  55       */
  56      public function export_for_template(\renderer_base $output): array {
  57          $tools = [
  58              $this->get_field_tags($this->templatename),
  59              $this->get_field_info_tags($this->templatename),
  60              $this->get_action_tags($this->templatename),
  61              $this->get_other_tags($this->templatename),
  62          ];
  63          $tools = array_filter($tools, static function ($value) {
  64              return !empty($value['tags']);
  65          });
  66          return [
  67              'toolshelp' => $output->help_icon('availabletags', 'data'),
  68              'hastools' => !empty($tools),
  69              'tools' => array_values($tools),
  70          ];
  71      }
  72  
  73      /**
  74       * Return the field template tags.
  75       *
  76       * @param string $templatename the template name
  77       * @return array|null array of tags.
  78       */
  79      protected function get_field_tags(string $templatename): array {
  80          $name = get_string('fields', 'data');
  81          if ($templatename == 'csstemplate' || $templatename == 'jstemplate') {
  82              return $this->get_optgroup_data($name, []);
  83          }
  84          $taglist = [];
  85          $fields = $this->manager->get_fields();
  86          foreach ($fields as $field) {
  87              if ($field->type === 'unknown') {
  88                  continue;
  89              }
  90              $fieldname = $field->get_name();
  91              $taglist["[[$fieldname]]"] = $fieldname;
  92          }
  93          $taglist['##otherfields##'] = get_string('otherfields', 'data');
  94          return $this->get_optgroup_data($name, $taglist);
  95      }
  96  
  97      /**
  98       * Return the field information template tags.
  99       *
 100       * @param string $templatename the template name
 101       * @return array|null array of tags.
 102       */
 103      protected function get_field_info_tags(string $templatename): array {
 104          $name = get_string('fieldsinformationtags', 'data');
 105          $taglist = [];
 106          $fields = $this->manager->get_fields();
 107          foreach ($fields as $field) {
 108              if ($field->type === 'unknown') {
 109                  continue;
 110              }
 111              $fieldname = $field->get_name();
 112              if ($templatename == 'addtemplate') {
 113                  $taglist["[[$fieldname#id]]"] = get_string('fieldtagid', 'mod_data', $fieldname);
 114              }
 115              $taglist["[[$fieldname#name]]"] = get_string('fieldtagname', 'mod_data', $fieldname);
 116              $taglist["[[$fieldname#description]]"] = get_string('fieldtagdescription', 'mod_data', $fieldname);
 117          }
 118          return $this->get_optgroup_data($name, $taglist);
 119      }
 120  
 121      /**
 122       * Return the field action tags.
 123       *
 124       * @param string $templatename the template name
 125       * @return array|null array of tags.
 126       */
 127      protected function get_action_tags(string $templatename): array {
 128          $name = get_string('actions');
 129          if ($templatename == 'addtemplate' || $templatename == 'asearchtemplate') {
 130              return $this->get_optgroup_data($name, []);
 131          }
 132          $taglist = [
 133              '##actionsmenu##' => get_string('actionsmenu', 'data'),
 134              '##edit##' => get_string('edit', 'data'),
 135              '##delete##' => get_string('delete', 'data'),
 136              '##approve##' => get_string('approve', 'data'),
 137              '##disapprove##' => get_string('disapprove', 'data'),
 138          ];
 139          if ($templatename != 'rsstemplate') {
 140              $taglist['##export##'] = get_string('export', 'data');
 141          }
 142          if ($templatename != 'singletemplate') {
 143              $taglist['##more##'] = get_string('more', 'data');
 144              $taglist['##moreurl##'] = get_string('moreurl', 'data');
 145              $taglist['##delcheck##'] = get_string('delcheck', 'data');
 146          }
 147          return $this->get_optgroup_data($name, $taglist);
 148      }
 149  
 150      /**
 151       * Return the available other tags
 152       *
 153       * @param string $templatename the template name
 154       * @return array associative array of tags => tag name
 155       */
 156      protected function get_other_tags(string $templatename): array {
 157          $name = get_string('other', 'data');
 158          $taglist = [];
 159          if ($templatename == 'asearchtemplate') {
 160              $taglist['##firstname##'] = get_string('firstname');
 161              $taglist['##lastname##'] = get_string('lastname');
 162              return $this->get_optgroup_data($name, $taglist);
 163          }
 164          if (core_tag_tag::is_enabled('mod_data', 'data_records')) {
 165              $taglist['##tags##'] = get_string('tags');
 166          }
 167          if ($templatename == 'addtemplate') {
 168              return $this->get_optgroup_data($name, $taglist);
 169          }
 170          $taglist['##timeadded##'] = get_string('timeadded', 'data');
 171          $taglist['##timemodified##'] = get_string('timemodified', 'data');
 172          $taglist['##user##'] = get_string('user');
 173          $taglist['##userpicture##'] = get_string('userpic');
 174          $taglist['##approvalstatus##'] = get_string('approvalstatus', 'data');
 175          $taglist['##id##'] = get_string('id', 'data');
 176  
 177          if ($templatename == 'singletemplate') {
 178              return $this->get_optgroup_data($name, $taglist);
 179          }
 180  
 181          $taglist['##comments##'] = get_string('comments', 'data');
 182  
 183          return $this->get_optgroup_data($name, $taglist);
 184      }
 185  
 186      /**
 187       * Generate a valid optgroup data.
 188       *
 189       * @param string $name the optgroup name
 190       * @param array $taglist the indexed array of taglists ($tag => $tagname)
 191       * @return array of optgroup data
 192       */
 193      protected function get_optgroup_data (string $name, array $taglist): array {
 194          $tags = [];
 195          foreach ($taglist as $tag => $tagname) {
 196              $tags[] = [
 197                  'tag' => "$tag",
 198                  'tagname' => $tagname . ' - ' . $tag,
 199              ];
 200          }
 201          return [
 202              'name' => $name,
 203              'tags' => $tags,
 204          ];
 205      }
 206  }