MDL-41663 output: fix for methods with _renderable suffix
authorSam Hemelryk <sam@moodle.com>
Wed, 2 Jul 2014 01:51:45 +0000 (13:51 +1200)
committerSam Hemelryk <sam@moodle.com>
Wed, 2 Jul 2014 02:59:31 +0000 (14:59 +1200)
lib/outputrenderers.php
lib/upgrade.txt
report/log/classes/renderer.php
report/loglive/classes/renderer.php
report/loglive/classes/renderer_ajax.php
theme/upgrade.txt

index c074283..8b9ef8f 100644 (file)
@@ -225,13 +225,32 @@ class plugin_renderer_base extends renderer_base {
         $classname = get_class($widget);
         // Strip namespaces.
         $classname = preg_replace('/^.*\\\/', '', $classname);
+        // Keep a copy at this point, we may need to look for a deprecated method.
+        $deprecatedmethod = 'render_'.$classname;
         // Remove _renderable suffixes
-        $classname = preg_replace('/_renderable/', '', $classname);
+        $classname = preg_replace('/_renderable$/', '', $classname);
 
         $rendermethod = 'render_'.$classname;
         if (method_exists($this, $rendermethod)) {
             return $this->$rendermethod($widget);
         }
+        if ($rendermethod !== $deprecatedmethod && method_exists($this, $deprecatedmethod)) {
+            // This is exactly where we don't want to be.
+            // If you have arrived here you have a renderable component within your plugin that has the name
+            // blah_renderable, and you have a render method render_blah_renderable on your plugin.
+            // In 2.8 we revamped output, as part of this change we changed slightly how renderables got rendered
+            // and the _renderable suffix now gets removed when looking for a render method.
+            // You need to change your renderers render_blah_renderable to render_blah.
+            // Until you do this it will not be possible for a theme to override the renderer to override your method.
+            // Please do it ASAP.
+            static $debugged = array();
+            if (!isset($debugged[$deprecatedmethod])) {
+                debugging(sprintf('Deprecated call. Please rename your renderables render method from %s to %s.',
+                    $deprecatedmethod, $rendermethod), DEBUG_DEVELOPER);
+                $debugged[$deprecatedmethod] = true;
+            }
+            return $this->$deprecatedmethod($widget);
+        }
         // pass to core renderer if method not found here
         return $this->output->render($widget);
     }
index ae3fe25..04a7c18 100644 (file)
@@ -4,6 +4,9 @@ information provided here is intended especially for developers.
 === 2.8 ===
 
 * lib/excelllib.class.php has been updated. The class MoodleExcelWorkbook will now only produce excel 2007 files.
+* renderers: We now remove the suffix _renderable when looking for a render method for a renderable.
+  If you have a renderable class named like "blah_renderable" and have a method on a renderer named "render_blah_renderable"
+  you will need to change the name of your render method to "render_blah" instead, as renderable at the end is no longer accepted.
 
 === 2.6.4 / 2.7.1 ===
 * setnew_password_and_mail() and update_internal_user_password() will trigger
index dae19be..607737e 100644 (file)
@@ -32,12 +32,24 @@ defined('MOODLE_INTERNAL') || die;
  */
 class report_log_renderer extends plugin_renderer_base {
 
+    /**
+     * This method should never be manually called, it should only be called by process.
+     *
+     * @deprecated since 2.8, to be removed in 2.9
+     * @param report_log_renderable $reportlog
+     * @return string
+     */
+    public function render_report_log_renderable(report_log_renderable $reportlog) {
+        debugging('Do not call this method. Please call $renderer->render($reportlog) instead.', DEBUG_DEVELOPER);
+        return $this->render($reportlog);
+    }
+
     /**
      * Render log report page.
      *
      * @param report_log_renderable $reportlog object of report_log.
      */
-    public function render_report_log_renderable(report_log_renderable $reportlog) {
+    protected function render_report_log(report_log_renderable $reportlog) {
         if (empty($reportlog->selectedlogreader)) {
             echo $this->output->notification(get_string('nologreaderenabled', 'report_log'), 'notifyproblem');
             return;
index a1919e9..5dcf50c 100644 (file)
@@ -33,6 +33,19 @@ defined('MOODLE_INTERNAL') || die;
  */
 class report_loglive_renderer extends plugin_renderer_base {
 
+    /**
+     * This method should never be manually called, it should only be called by process.
+     * Please call the render method instead.
+     *
+     * @deprecated since 2.8, to be removed in 2.9
+     * @param report_loglive_renderable $reportloglive
+     * @return string
+     */
+    public function render_report_loglive_renderable(report_loglive_renderable $reportloglive) {
+        debugging('Do not call this method. Please call $renderer->render($reportloglive) instead.', DEBUG_DEVELOPER);
+        return $this->render($reportloglive);
+    }
+
     /**
      * Return html to render the loglive page..
      *
@@ -40,7 +53,7 @@ class report_loglive_renderer extends plugin_renderer_base {
      *
      * @return string html used to render the page;
      */
-    public function render_report_loglive_renderable(report_loglive_renderable $reportloglive) {
+    protected function render_report_loglive(report_loglive_renderable $reportloglive) {
         if (empty($reportloglive->selectedlogreader)) {
             return $this->output->notification(get_string('nologreaderenabled', 'report_loglive'), 'notifyproblem');
         }
index 123ef15..411fe16 100644 (file)
  */
 class report_loglive_renderer_ajax extends plugin_renderer_base {
 
+    /**
+     * This method should never be manually called, it should only be called by process.
+     * Please call the render method instead.
+     *
+     * @deprecated since 2.8, to be removed in 2.9
+     * @param report_loglive_renderable $reportloglive
+     * @return string
+     */
+    public function render_report_loglive_renderable(report_loglive_renderable $reportloglive) {
+        debugging('Do not call this method. Please call $renderer->render($reportloglive) instead.', DEBUG_DEVELOPER);
+        return $this->render($reportloglive);
+    }
+
     /**
      * Render logs for ajax.
      *
@@ -38,7 +51,7 @@ class report_loglive_renderer_ajax extends plugin_renderer_base {
      *
      * @return string html to be displayed to user.
      */
-    public function render_report_loglive_renderable(report_loglive_renderable $reportloglive) {
+    protected function render_report_loglive(report_loglive_renderable $reportloglive) {
         if (empty($reportloglive->selectedlogreader)) {
             return null;
         }
index f9473c9..92157ef 100644 (file)
@@ -5,6 +5,9 @@ information provided here is intended especially for theme designer.
 
 * All mod_assign CSS selectors have been qualified with ".path-mod-assign". This means any custom CSS
   rules for mod_assign in a theme may need to be updated.
+* The following render methods were renamed, if you have overridden any of these you will need to update your renderer:
+  - report_log_renderer::render_report_log_renderable         => report_log_renderer::render_report_log
+  - report_loglive_renderer::render_report_loglive_renderable => report_loglive_renderer::render_report_log
 
 === 2.7 ===