From cfc1cc43039125aef1670ff6b33d29bc11cff584 Mon Sep 17 00:00:00 2001
From: Justus Flerlage <flerlage@math.tu-berlin.de>
Date: Tue, 21 Nov 2017 15:02:06 +0000
Subject: [PATCH] Added callbacks for course edit form

---
 course/edit.php      |  7 +++++++
 course/edit_form.php | 56 +++++++++++++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 62 insertions(+), 1 deletion(-)

diff --git a/course/edit.php b/course/edit.php
index 727a1f7..193c02a 100644
--- a/course/edit.php
+++ b/course/edit.php
@@ -188,6 +188,13 @@ if ($editform->is_cancelled()) {
         $courseurl = new moodle_url('/course/view.php', array('id' => $course->id));
     }
 
+    $callbacks = get_plugins_with_function('course_edit_process_data', 'lib.php');
+    foreach ($callbacks as $type => $plugins) {
+        foreach ($plugins as $plugin => $pluginfunction) {
+            $pluginfunction($course, $editform);
+        }
+    }
+
     if (isset($data->saveanddisplay)) {
         // Redirect user to newly created/updated course.
         redirect($courseurl);
diff --git a/course/edit_form.php b/course/edit_form.php
index 4c03e2d..a1b850f 100644
--- a/course/edit_form.php
+++ b/course/edit_form.php
@@ -316,6 +316,8 @@ class course_edit_form extends moodleform {
                     array('itemtype' => 'course', 'component' => 'core'));
         }
 
+        $this->plugin_extend_course_edit_definition();
+
         // When two elements we need a group.
         $buttonarray = array();
         $classarray = array('class' => 'form-submit');
@@ -379,6 +381,8 @@ class course_edit_form extends moodleform {
                 $mform->removeElement('newsitems');
             }
         }
+
+        $this->plugin_extend_course_edit_definition_after_data();
     }
 
     /**
@@ -421,7 +425,57 @@ class course_edit_form extends moodleform {
             $errors = array_merge($errors, $formaterrors);
         }
 
+        $pluginerrors = $this->plugin_extend_course_edit_validation($data, $files);
+        if (!empty($pluginerrors)) {
+            $errors = array_merge($errors, $pluginerrors);
+        }
+
         return $errors;
     }
-}
 
+    /**
+     * Plugins can extend the settings form.
+     */
+    protected function plugin_extend_course_edit_definition() {
+        $callbacks = get_plugins_with_function('course_edit_definition', 'lib.php');
+        foreach ($callbacks as $type => $plugins) {
+            foreach ($plugins as $plugin => $pluginfunction) {
+                $pluginfunction($this, $this->_form);
+            }
+        }
+    }
+
+    /**
+     * Plugins can extend the settings form.
+     */
+    protected function plugin_extend_course_edit_definition_after_data() {
+        $callbacks = get_plugins_with_function('course_edit_definition_after_data', 'lib.php');
+        foreach ($callbacks as $type => $plugins) {
+            foreach ($plugins as $plugin => $pluginfunction) {
+                $pluginfunction($this, $this->_form);
+            }
+        }
+    }
+
+    /**
+     * Extend the validation function from any other plugin.
+     *
+     * @param stdClass $data The form data.
+     * @param array $files
+     * @return array $errors The list of errors keyed by element name.
+     */
+    protected function plugin_extend_course_edit_validation($data, $files) {
+        $errors = array();
+
+        $callbacks = get_plugins_with_function('course_edit_validation', 'lib.php');
+        foreach ($callbacks as $type => $plugins) {
+            foreach ($plugins as $plugin => $pluginfunction) {
+                $pluginerrors = $pluginfunction($this, $data);
+                if (!empty($pluginerrors)) {
+                    $errors = array_merge($errors, $pluginerrors);
+                }
+            }
+        }
+        return $errors;
+    }
+}
-- 
2.1.4

