Merge branch 'MDL-55191_master' of git://github.com/dmonllao/moodle
authorAndrew Nicols <andrew@nicols.co.uk>
Tue, 20 Sep 2016 03:41:03 +0000 (11:41 +0800)
committerAndrew Nicols <andrew@nicols.co.uk>
Tue, 20 Sep 2016 03:41:03 +0000 (11:41 +0800)
lang/en/moodle.php
lib/classes/event/search_results_viewed.php [new file with mode: 0644]
search/classes/manager.php
search/index.php
search/tests/events_test.php [new file with mode: 0644]

index 1c8532f..4e5ab49 100644 (file)
@@ -750,6 +750,7 @@ $string['eventemailfailed'] = 'Email failed to send';
 $string['eventname'] = 'Event name';
 $string['eventrecentactivityviewed'] = 'Recent activity viewed';
 $string['eventsearchindexed'] = 'Search data indexed';
+$string['eventsearchresultsviewed'] = 'Search results viewed';
 $string['eventunknownlogged'] = 'Unknown event';
 $string['eventusercreated'] = 'User created';
 $string['eventuserdeleted'] = 'User deleted';
@@ -2035,4 +2036,4 @@ $string['maxbytesforfile'] = 'The file {$a} is larger than the maximum size allo
 
 // Deprecated since Moodle 3.2.
 $string['modchooserenable'] = 'Activity chooser on';
-$string['modchooserdisable'] = 'Activity chooser off';
\ No newline at end of file
+$string['modchooserdisable'] = 'Activity chooser off';
diff --git a/lib/classes/event/search_results_viewed.php b/lib/classes/event/search_results_viewed.php
new file mode 100644 (file)
index 0000000..84d470e
--- /dev/null
@@ -0,0 +1,114 @@
+<?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/>.
+
+/**
+ * Search results viewed.
+ *
+ * @package    core
+ * @copyright  2016 David Monllao {@link http://www.davidmonllao.com}
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+namespace core\event;
+
+defined('MOODLE_INTERNAL') || die();
+
+/**
+ * Search results viewed.
+ *
+ * @property-read array $other {
+ *      Extra information about event.
+ *      - string q: (required) The search query.
+ *      - int page: (required) The page number.
+ *      - string title: (optional) Title filter.
+ *      - string[] areaids: (optional) Search areas filter.
+ *      - int[] courseids: (optional) Courses filter.
+ *      - int timestart: (optional) Results from timestamp.
+ *      - int timeend: (optional) Results to timestamp.
+ * }
+ *
+ * @package    core
+ * @copyright  2016 David Monllao {@link http://www.davidmonllao.com}
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+class search_results_viewed extends base {
+
+    /**
+     * Init method.
+     *
+     * @return void
+     */
+    protected function init() {
+        $this->data['crud'] = 'r';
+        $this->data['edulevel'] = self::LEVEL_OTHER;
+    }
+
+    /**
+     * Returns localised general event name.
+     *
+     * @return string
+     */
+    public static function get_name() {
+        return get_string('eventsearchresultsviewed');
+    }
+
+    /**
+     * Returns description of what happened.
+     *
+     * @return string
+     */
+    public function get_description() {
+        return "The user with id '$this->userid' viewed page '{$this->other['page']}' of " .
+            "'{$this->other['q']}' search results";
+    }
+
+    /**
+     * Returns relevant URL.
+     *
+     * @return \moodle_url
+     */
+    public function get_url() {
+        $params = $this->other;
+
+        // Skip search area and course filters (MDL-33188).
+        if (isset($params['areaids'])) {
+            unset($params['areaids']);
+        }
+        if (isset($params['courseids'])) {
+            unset($params['courseids']);
+        }
+        return new \moodle_url('/search/index.php', $params);
+    }
+
+    /**
+     * Custom validations.
+     *
+     * @throws \coding_exception
+     * @return void
+     */
+    protected function validate_data() {
+        parent::validate_data();
+
+        if (!isset($this->other['q'])) {
+            throw new \coding_exception('\'other\'[\'q\'] must be set.');
+        }
+
+        if (!isset($this->other['page'])) {
+            throw new \coding_exception('\'other\'[\'page\'] must be set.');
+        }
+
+    }
+}
index 662a264..cfbab0b 100644 (file)
@@ -728,6 +728,32 @@ class manager {
         return $configsettings;
     }
 
+    /**
+     * Triggers search_results_viewed event
+     *
+     * Other data required:
+     * - q: The query string
+     * - page: The page number
+     * - title: Title filter
+     * - areaids: Search areas filter
+     * - courseids: Courses filter
+     * - timestart: Time start filter
+     * - timeend: Time end filter
+     *
+     * @since Moodle 3.2
+     * @param array $other Other info for the event.
+     * @return \core\event\search_results_viewed
+     */
+    public static function trigger_search_results_viewed($other) {
+        $event = \core\event\search_results_viewed::create([
+            'context' => \context_system::instance(),
+            'other' => $other
+        ]);
+        $event->trigger();
+
+        return $event;
+    }
+
     /**
      * Checks whether a classname is of an actual search area.
      *
index 92a3a0c..9c67e3d 100644 (file)
@@ -27,7 +27,6 @@ require_once(__DIR__ . '/../config.php');
 $page = optional_param('page', 0, PARAM_INT);
 $q = optional_param('q', '', PARAM_NOTAGS);
 $title = optional_param('title', '', PARAM_NOTAGS);
-$areaid = optional_param('areaid', false, PARAM_ALPHANUMEXT);
 // Moving areaids, courseids, timestart, and timeend further down as they might come as an array if they come from the form.
 
 $context = context_system::instance();
@@ -117,6 +116,17 @@ $mform->display();
 
 if (!empty($results)) {
     echo $searchrenderer->render_results($results->results, $results->actualpage, $results->totalcount, $url);
+
+    \core_search\manager::trigger_search_results_viewed([
+        'q' => $data->q,
+        'page' => $page,
+        'title' => $data->title,
+        'areaids' => !empty($data->areaids) ? $data->areaids : array(),
+        'courseids' => !empty($data->courseids) ? $data->courseids : array(),
+        'timestart' => isset($data->timestart) ? $data->timestart : 0,
+        'timeend' => isset($data->timeend) ? $data->timeend : 0
+    ]);
+
 }
 
 echo $OUTPUT->footer();
diff --git a/search/tests/events_test.php b/search/tests/events_test.php
new file mode 100644 (file)
index 0000000..0f0c9aa
--- /dev/null
@@ -0,0 +1,85 @@
+<?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/>.
+
+/**
+ * Unit tests for search events.
+ *
+ * @package    core_search
+ * @category   phpunit
+ * @copyright  2016 David Monllao {@link http://www.davidmonllao.com}
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+defined('MOODLE_INTERNAL') || die();
+
+/**
+ * Unit tests for search events.
+ *
+ * @package    core_search
+ * @category   phpunit
+ * @copyright  2016 David Monllao {@link http://www.davidmonllao.com}
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+class core_search_events_testcase extends advanced_testcase {
+
+    /**
+     * test_search_results_viewed
+     *
+     * @return void
+     */
+    public function test_search_results_viewed() {
+
+        $this->resetAfterTest();
+
+        $user = $this->getDataGenerator()->create_user();
+        $this->setUser($user);
+
+        $sink = $this->redirectEvents();
+
+        // Basic event.
+        \core_search\manager::trigger_search_results_viewed([
+            'q' => 'I am a query',
+            'page' => 0,
+        ]);
+
+        $events = $sink->get_events();
+        $event = reset($events);
+        $sink->clear();
+
+        $this->assertEquals(context_system::instance(), $event->get_context());
+
+        $urlparams = ['q' => 'I am a query', 'page' => 0];
+        $this->assertEquals($urlparams, $event->get_url()->params());
+
+        \core_search\manager::trigger_search_results_viewed([
+            'q' => 'I am a query',
+            'page' => 2,
+            'title' => 'I am the title',
+            'areaids' => array(3,4,5),
+            'courseids' => array(2,3),
+            'timestart' => 1445644800,
+            'timeend' => 1477267200
+        ]);
+
+        $events = $sink->get_events();
+        $event = reset($events);
+        $this->assertEquals(context_system::instance(), $event->get_context());
+
+        $urlparams = ['q' => 'I am a query', 'page' => 2, 'title' => 'I am the title', 'timestart' => 1445644800, 'timeend' => 1477267200];
+        $this->assertEquals($urlparams, $event->get_url()->params());
+
+    }
+}