From c475fe410f9652cd6918f2adc8cd5c9bca7d8ee4 Mon Sep 17 00:00:00 2001 From: Peter Date: Mon, 8 Apr 2019 10:18:28 +0800 Subject: [PATCH] MDL-65032 mod_forum: Pass the the entity factories into the vaults --- mod/forum/amd/src/repository.js | 2 +- mod/forum/classes/local/container.php | 3 ++- .../local/factories/legacy_data_mapper.php | 20 +++++++++++++++ mod/forum/classes/local/factories/vault.php | 25 +++++++++++++------ .../classes/local/vaults/db_table_vault.php | 16 +++++++++++- mod/forum/classes/local/vaults/discussion.php | 7 +++--- mod/forum/externallib.php | 9 ++----- mod/forum/lib.php | 5 ---- .../templates/discussion_lock_toggle.mustache | 5 ++-- 9 files changed, 65 insertions(+), 27 deletions(-) diff --git a/mod/forum/amd/src/repository.js b/mod/forum/amd/src/repository.js index 547fdb1714f..fcd10afa3d6 100644 --- a/mod/forum/amd/src/repository.js +++ b/mod/forum/amd/src/repository.js @@ -14,7 +14,7 @@ // along with Moodle. If not, see . /** - * Forum repository class to encapsulate all of the AJAX requests thatsubscribe or unsubscribe + * Forum repository class to encapsulate all of the AJAX requests that subscribe or unsubscribe * can be sent for forum. * * @module mod_forum/repository diff --git a/mod/forum/classes/local/container.php b/mod/forum/classes/local/container.php index b8703c87595..b8997e5bef5 100644 --- a/mod/forum/classes/local/container.php +++ b/mod/forum/classes/local/container.php @@ -98,7 +98,8 @@ class container { return new vault_factory( $DB, self::get_entity_factory(), - get_file_storage() + get_file_storage(), + self::get_legacy_data_mapper_factory() ); } diff --git a/mod/forum/classes/local/factories/legacy_data_mapper.php b/mod/forum/classes/local/factories/legacy_data_mapper.php index 1801bdd75ba..816e25af26a 100644 --- a/mod/forum/classes/local/factories/legacy_data_mapper.php +++ b/mod/forum/classes/local/factories/legacy_data_mapper.php @@ -30,6 +30,7 @@ use mod_forum\local\data_mappers\legacy\author as author_data_mapper; use mod_forum\local\data_mappers\legacy\discussion as discussion_data_mapper; use mod_forum\local\data_mappers\legacy\forum as forum_data_mapper; use mod_forum\local\data_mappers\legacy\post as post_data_mapper; +use mod_forum\local\entities\forum; /** * Legacy data mapper factory. @@ -76,4 +77,23 @@ class legacy_data_mapper { public function get_author_data_mapper() : author_data_mapper { return new author_data_mapper(); } + + /** + * Get the corresponding entity based on the supplied value + * + * @param string $entity + * @return author_data_mapper|discussion_data_mapper|forum_data_mapper|post_data_mapper + */ + public function get_legacy_data_mapper_for_vault($entity) { + switch($entity) { + case 'forum': + return $this->get_forum_data_mapper(); + case 'discussion': + return $this->get_discussion_data_mapper(); + case 'post': + return $this->get_post_data_mapper(); + case 'author': + return $this->get_author_data_mapper(); + } + } } diff --git a/mod/forum/classes/local/factories/vault.php b/mod/forum/classes/local/factories/vault.php index a120edc0ba7..1f1f9e2eaa1 100644 --- a/mod/forum/classes/local/factories/vault.php +++ b/mod/forum/classes/local/factories/vault.php @@ -49,6 +49,8 @@ use moodle_database; class vault { /** @var entity_factory $entityfactory Entity factory */ private $entityfactory; + /** @var legacy_data_mapper $legacymapper Entity factory */ + private $legacymapper; /** @var moodle_database $db A moodle database */ private $db; /** @var file_storage $filestorage A file storage instance */ @@ -60,11 +62,14 @@ class vault { * @param moodle_database $db A moodle database * @param entity_factory $entityfactory Entity factory * @param file_storage $filestorage A file storage instance + * @param legacy_data_mapper $legacyfactory Datamapper */ - public function __construct(moodle_database $db, entity_factory $entityfactory, file_storage $filestorage) { + public function __construct(moodle_database $db, entity_factory $entityfactory, + file_storage $filestorage, legacy_data_mapper $legacyfactory) { $this->db = $db; $this->entityfactory = $entityfactory; $this->filestorage = $filestorage; + $this->legacymapper = $legacyfactory; } /** @@ -75,7 +80,8 @@ class vault { public function get_forum_vault() : forum_vault { return new forum_vault( $this->db, - $this->entityfactory + $this->entityfactory, + $this->legacymapper->get_legacy_data_mapper_for_vault('forum') ); } @@ -87,7 +93,8 @@ class vault { public function get_discussion_vault() : discussion_vault { return new discussion_vault( $this->db, - $this->entityfactory + $this->entityfactory, + $this->legacymapper->get_legacy_data_mapper_for_vault('discussion') ); } @@ -99,7 +106,8 @@ class vault { public function get_discussions_in_forum_vault() : discussion_list_vault { return new discussion_list_vault( $this->db, - $this->entityfactory + $this->entityfactory, + $this->legacymapper->get_legacy_data_mapper_for_vault('discussion') ); } @@ -111,7 +119,8 @@ class vault { public function get_post_vault() : post_vault { return new post_vault( $this->db, - $this->entityfactory + $this->entityfactory, + $this->legacymapper->get_legacy_data_mapper_for_vault('post') ); } @@ -123,7 +132,8 @@ class vault { public function get_author_vault() : author_vault { return new author_vault( $this->db, - $this->entityfactory + $this->entityfactory, + $this->legacymapper->get_legacy_data_mapper_for_vault('author') ); } @@ -135,7 +145,8 @@ class vault { public function get_post_read_receipt_collection_vault() : post_read_receipt_collection_vault { return new post_read_receipt_collection_vault( $this->db, - $this->entityfactory + $this->entityfactory, + $this->legacymapper->get_legacy_data_mapper_for_vault('post') ); } diff --git a/mod/forum/classes/local/vaults/db_table_vault.php b/mod/forum/classes/local/vaults/db_table_vault.php index 9beb5b27522..dd05c0a4adb 100644 --- a/mod/forum/classes/local/vaults/db_table_vault.php +++ b/mod/forum/classes/local/vaults/db_table_vault.php @@ -40,19 +40,24 @@ abstract class db_table_vault { private $db; /** @var entity_factory $entityfactory Entity factory */ private $entityfactory; + /** @var legacy_factor $legacyfactory Entity->legacy factory */ + private $legacyfactory; /** * Constructor. * * @param moodle_database $db A moodle database * @param entity_factory $entityfactory Entity factory + * @param object $legacyfactory Legacy factory */ public function __construct( moodle_database $db, - entity_factory $entityfactory + entity_factory $entityfactory, + $legacyfactory ) { $this->db = $db; $this->entityfactory = $entityfactory; + $this->legacyfactory = $legacyfactory; } /** @@ -116,6 +121,15 @@ abstract class db_table_vault { return $this->entityfactory; } + /** + * Get the legacy factory + * + * @return object + */ + protected function get_legacy_factory() { + return $this->legacyfactory; + } + /** * Execute the defined preprocessors on the DB record results and then convert * them into entities. diff --git a/mod/forum/classes/local/vaults/discussion.php b/mod/forum/classes/local/vaults/discussion.php index ca77c0adca4..00d4e97fd7d 100644 --- a/mod/forum/classes/local/vaults/discussion.php +++ b/mod/forum/classes/local/vaults/discussion.php @@ -132,9 +132,10 @@ class discussion extends db_table_vault { * @param discussion_entity $discussion * @return discussion_entity|null */ - public function update_discussion($discussion) : ?discussion_entity { - if ($this->get_db()->update_record('forum_discussions', $discussion)) { - $records = $this->transform_db_records_to_entities([$discussion]); + public function update_discussion(discussion_entity $discussion) : ?discussion_entity { + $discussionrecord = $this->get_legacy_factory()->to_legacy_object($discussion); + if ($this->get_db()->update_record('forum_discussions', $discussionrecord)) { + $records = $this->transform_db_records_to_entities([$discussionrecord]); return count($records) ? array_shift($records) : null; } diff --git a/mod/forum/externallib.php b/mod/forum/externallib.php index e28bcc772b8..56319323696 100644 --- a/mod/forum/externallib.php +++ b/mod/forum/externallib.php @@ -1512,7 +1512,6 @@ class mod_forum_external extends external_api { return \mod_forum\local\exporters\discussion::get_read_structure(); } - /** * Set the lock state. * @@ -1541,16 +1540,12 @@ class mod_forum_external extends external_api { $capabilitymanager = $managerfactory->get_capability_manager($forum); $discussionvault = $vaultfactory->get_discussion_vault(); $discussion = $discussionvault->get_from_id($params['discussionid']); - $legacydatamapperfactory = mod_forum\local\container::get_legacy_data_mapper_factory(); - $forumrecord = $legacydatamapperfactory->get_forum_data_mapper()->to_legacy_object($forum); - // If the current state doesn't equal the desired state then update the current + // If the current state doesn't equal the desired state then update the current. // state to the desired state. if ($capabilitymanager->can_manage_forum($USER)) { $discussion->toggle_locked_state($targetstate); - $discussionrecord = $legacydatamapperfactory->get_discussion_data_mapper()->to_legacy_object($discussion); - $response = $discussionvault->update_discussion($discussionrecord); - + $response = $discussionvault->update_discussion($discussion); $discussion = !$response ? $response : $discussion; } diff --git a/mod/forum/lib.php b/mod/forum/lib.php index fff7f1f42fb..5015625b46e 100644 --- a/mod/forum/lib.php +++ b/mod/forum/lib.php @@ -2600,7 +2600,6 @@ function forum_get_lock_discussion_icon($forum, $discussion, $returnurl = null, $returnurl = $PAGE->url->out(); } - $o = ''; $discussionid = $discussion->id; $lockstatus = forum_discussion_is_locked($forum, $discussion); $subscriptionlink = new moodle_url('/mod/forum/lockdiscussion.php', array( @@ -2610,10 +2609,6 @@ function forum_get_lock_discussion_icon($forum, $discussion, $returnurl = null, 'returnurl' => $returnurl, )); - if ($includetext) { - $o .= $lockstatus ? get_string('locked', 'mod_forum') : get_string('notlocked', 'mod_forum'); - } - if ($lockstatus) { $output = $OUTPUT->pix_icon('t/unlock', get_string('clicktounlockdiscussion', 'forum'), 'core'); if ($includetext) { diff --git a/mod/forum/templates/discussion_lock_toggle.mustache b/mod/forum/templates/discussion_lock_toggle.mustache index dbdf4ef792f..679ee53122c 100644 --- a/mod/forum/templates/discussion_lock_toggle.mustache +++ b/mod/forum/templates/discussion_lock_toggle.mustache @@ -26,7 +26,7 @@ * none Context variables required for this template: - * TODO + * none Example context (json): { @@ -39,7 +39,8 @@ data-action="toggle" data-discussionid="{{id}}" data-forumid="{{forumid}}" - data-state="{{times.locked}}" href="#" + data-state="{{times.locked}}" + tabindex="-1" {{#userstate.locked}} title="{{#str}}locked, forum{{/str}}" {{/userstate.locked}}