From 79eecc41ee780ab1e374f51460d5219d619ef1c8 Mon Sep 17 00:00:00 2001 From: Daniel Thies Date: Tue, 30 Jan 2024 11:56:55 -0600 Subject: [PATCH] MED-48: Add tag filter to library --- classes/form/edit_resource.php | 2 +- classes/form/search.php | 6 +++++- classes/media_manager.php | 21 +++++++++++++++++++ classes/output/media_resource.php | 2 +- db/tag.php | 2 +- lang/en/tool_mediatime.php | 1 + source/streamio/classes/manager.php | 6 +++--- .../videotime/classes/form/edit_resource.php | 4 ++++ source/videotime/classes/manager.php | 4 ++-- version.php | 2 +- 10 files changed, 40 insertions(+), 10 deletions(-) diff --git a/classes/form/edit_resource.php b/classes/form/edit_resource.php index e95f13f..2d0645c 100644 --- a/classes/form/edit_resource.php +++ b/classes/form/edit_resource.php @@ -63,7 +63,7 @@ protected function tag_elements() { 'tags', get_string('tags'), [ - 'itemtype' => 'media_resources', + 'itemtype' => 'tool_mediatime', 'component' => 'tool_mediatime', ] ); diff --git a/classes/form/search.php b/classes/form/search.php index 06276b5..97c5a99 100644 --- a/classes/form/search.php +++ b/classes/form/search.php @@ -51,7 +51,11 @@ public function definition() { $mform->addElement('text', 'query', get_string('keyword', 'tool_mediatime')); $mform->setType('query', PARAM_TEXT); + $this->tag_elements(); + $this->add_action_buttons(false, get_string('search')); + $mform->addElement('cancel', 'reset', get_string('reset')); + $mform->disabledIf('reset', 'query', 'eq', ''); } /** @@ -65,7 +69,7 @@ protected function tag_elements() { 'tags', get_string('tags'), [ - 'itemtype' => 'media_resources', + 'itemtype' => 'tool_mediatime', 'component' => 'tool_mediatime', ] ); diff --git a/classes/media_manager.php b/classes/media_manager.php index 39ba5b7..3f16ae9 100644 --- a/classes/media_manager.php +++ b/classes/media_manager.php @@ -25,6 +25,8 @@ namespace tool_mediatime; use context_system; +use core_tag_tag; +use core_tag_area; use moodle_exception; use moodle_url; use renderable; @@ -87,6 +89,11 @@ public function __construct(string $source, ?stdClass $record = null, int $page 'class' => 'form-inline', ]); + if ($this->search->is_cancelled()) { + $url = new moodle_url('/admin/tool/mediatime/index.php'); + redirect($url); + } + $rs = self::search((array)$this->search->get_data()); foreach ($rs as $media) { if (in_array($media->source, $plugins)) { @@ -168,6 +175,7 @@ public static function search($filters = []) { $params = []; + // Require enabled source plugins. if (!$sources = plugininfo\mediatimesrc::get_enabled_plugins()) { return $result; } @@ -176,6 +184,7 @@ public static function search($filters = []) { $sql = "source $sql"; $order = 'timecreated DESC'; + // Filter for text query. if ($query = $filters['query'] ?? '') { $sql .= ' AND ' . $DB->sql_like('content', ':query', false); $params['query'] = "%$query%"; @@ -184,6 +193,18 @@ public static function search($filters = []) { $order = 'CASE WHEN ' . $DB->sql_like('name', ':name', false) . ' THEN 1 ELSE 0 END DESC, timecreated DESC'; } + // Filter by tags. + if ($tags = $filters['tags'] ?? '') { + $tagcollid = core_tag_area::get_collection('tool_mediatime', 'tool_mediatime'); + $tags = core_tag_tag::get_by_name_bulk($tagcollid, $tags); + $tags = array_column($tags, 'id'); + if (!empty($tags)) { + list($tagsql, $tagparams) = $DB->get_in_or_equal($tags, SQL_PARAMS_NAMED, 'tagparams'); + $sql .= " AND id IN (SELECT itemid FROM {tag_instance} WHERE tagid $tagsql)"; + $params += $tagparams; + } + } + return $DB->get_recordset_select( 'tool_mediatime', $sql, diff --git a/classes/output/media_resource.php b/classes/output/media_resource.php index c08d773..8730533 100644 --- a/classes/output/media_resource.php +++ b/classes/output/media_resource.php @@ -84,7 +84,7 @@ public function tags($output) { return $output->tag_list( core_tag_tag::get_item_tags( 'tool_mediatime', - 'media_resources', + 'tool_mediatime', $this->record->id ), null, diff --git a/db/tag.php b/db/tag.php index b1f5d45..b6fdab4 100644 --- a/db/tag.php +++ b/db/tag.php @@ -27,7 +27,7 @@ $tagareas = [ [ - 'itemtype' => 'media_resources', + 'itemtype' => 'tool_mediatime', 'component' => 'tool_mediatime', 'callback' => 'tool_mediatime_get_tagged_resources', 'callbackfile' => '/admin/tool/mediatime/lib.php', diff --git a/lang/en/tool_mediatime.php b/lang/en/tool_mediatime.php index 0e7f54b..285d907 100644 --- a/lang/en/tool_mediatime.php +++ b/lang/en/tool_mediatime.php @@ -42,5 +42,6 @@ $string['resourcename_help'] = 'The name for a resource is used internally in the library to identify the resource, but not displayed when it is used.'; $string['managemediatimesrcplugins'] = 'Manage source plugins'; $string['subplugin_mediatimesrc_plural'] = 'Media sources'; +$string['tagarea_tool_mediatime'] = 'Media resources'; $string['title'] = 'Title'; $string['title_help'] = 'The title may be displayed by the video player when used'; diff --git a/source/streamio/classes/manager.php b/source/streamio/classes/manager.php index 4c80035..34d09aa 100644 --- a/source/streamio/classes/manager.php +++ b/source/streamio/classes/manager.php @@ -84,7 +84,7 @@ public function __construct($record = null) { $context = context_system::instance(); core_tag_tag::set_item_tags( 'tool_mediatime', - 'media_resources', + 'tool_meidatime', $id, $context, json_decode($tags) @@ -100,7 +100,7 @@ public function __construct($record = null) { } if ($edit = optional_param('edit', null, PARAM_INT)) { - $this->content->tags = core_tag_tag::get_item_tags_array('tool_mediatime', 'media_resources', $edit); + $this->content->tags = core_tag_tag::get_item_tags_array('tool_mediatime', 'tool_mediatime', $edit); $this->form->set_data([ 'edit' => $edit, @@ -135,7 +135,7 @@ public function __construct($record = null) { $context = context_system::instance(); core_tag_tag::set_item_tags( 'tool_mediatime', - 'media_resources', + 'tool_mediatime', $data->edit, $context, $data->tags diff --git a/source/videotime/classes/form/edit_resource.php b/source/videotime/classes/form/edit_resource.php index e32993d..700ea79 100644 --- a/source/videotime/classes/form/edit_resource.php +++ b/source/videotime/classes/form/edit_resource.php @@ -41,6 +41,10 @@ class edit_resource extends \tool_mediatime\form\edit_resource { public function definition() { $mform = $this->_form; + $mform->addElement('hidden', 'create'); + $mform->setType('create', PARAM_TEXT); + $mform->setDefault('create', ''); + $mform->addElement('hidden', 'source'); $mform->setType('source', PARAM_TEXT); $mform->setDefault('source', 'videotime'); diff --git a/source/videotime/classes/manager.php b/source/videotime/classes/manager.php index 57bcde7..21fddb1 100644 --- a/source/videotime/classes/manager.php +++ b/source/videotime/classes/manager.php @@ -105,7 +105,7 @@ public function __construct($record = null) { ] ); - $this->content->tags = core_tag_tag::get_item_tags_array('tool_mediatime', 'media_resources', $edit); + $this->content->tags = core_tag_tag::get_item_tags_array('tool_mediatime', 'tool_mediatime', $edit); $this->form->set_data([ 'edit' => $edit, @@ -156,7 +156,7 @@ public function __construct($record = null) { core_tag_tag::set_item_tags( 'tool_mediatime', - 'media_resources', + 'tool_mediatime', $data->edit, $context, $data->tags diff --git a/version.php b/version.php index 89ad511..75c8d33 100644 --- a/version.php +++ b/version.php @@ -26,6 +26,6 @@ $plugin->component = 'tool_mediatime'; $plugin->release = '1.0'; -$plugin->version = 2024010803; +$plugin->version = 2024010804; $plugin->requires = 2022112800; $plugin->maturity = MATURITY_ALPHA;