From 4bfbf72aa9a640676c24b5b064bddddabd3d9d9e Mon Sep 17 00:00:00 2001 From: Angel Fernando Quiroz Campos Date: Mon, 10 Feb 2020 17:35:11 -0500 Subject: [PATCH] MigrationMoodle: Fix LP items order - refs BT#15992 --- plugin/migrationmoodle/admin.php | 4 + plugin/migrationmoodle/lang/english.php | 2 + .../src/Loader/CourseModulesLessonLoader.php | 2 +- .../src/Loader/CourseModulesQuizLoader.php | 7 +- .../src/Loader/CourseModulesUrlLoader.php | 20 +---- .../src/Loader/CourseSectionsLoader.php | 31 +++----- .../src/Loader/SortSectionModuleLoader.php | 27 +++++++ .../migrationmoodle/src/Loader/UrlLoader.php | 43 ++++++++++ .../src/Task/CourseModulesLessonTask.php | 11 +-- .../src/Task/CourseModulesQuizTask.php | 7 +- .../src/Task/CourseModulesUrlTask.php | 10 +-- .../src/Task/SortSectionModulesTask.php | 78 ++++++++++++++++++ plugin/migrationmoodle/src/Task/UrlsTask.php | 79 +++++++++++++++++++ .../Property/LoadedCourseModulesUrlLookup.php | 22 ++++++ .../Transformer/Property/LoadedKeyLookup.php | 2 +- .../Property/LoadedLpDirLookup.php | 44 ----------- .../Property/LoadedLpItemInSequenceLookup.php | 67 ---------------- .../Property/SectionSequenceLookup.php | 73 +++++++++++++++++ 18 files changed, 352 insertions(+), 177 deletions(-) create mode 100644 plugin/migrationmoodle/src/Loader/SortSectionModuleLoader.php create mode 100644 plugin/migrationmoodle/src/Loader/UrlLoader.php create mode 100644 plugin/migrationmoodle/src/Task/SortSectionModulesTask.php create mode 100644 plugin/migrationmoodle/src/Task/UrlsTask.php create mode 100644 plugin/migrationmoodle/src/Transformer/Property/LoadedCourseModulesUrlLookup.php delete mode 100644 plugin/migrationmoodle/src/Transformer/Property/LoadedLpDirLookup.php delete mode 100644 plugin/migrationmoodle/src/Transformer/Property/LoadedLpItemInSequenceLookup.php create mode 100644 plugin/migrationmoodle/src/Transformer/Property/SectionSequenceLookup.php diff --git a/plugin/migrationmoodle/admin.php b/plugin/migrationmoodle/admin.php index 1b017b577a..0e438b301d 100644 --- a/plugin/migrationmoodle/admin.php +++ b/plugin/migrationmoodle/admin.php @@ -37,6 +37,7 @@ $menu = [ 'course_modules_quiz', 'course_modules_url', 'c_quiz', + 'sort_section_modules', ], 'course_modules_lesson' => [ 'lesson_pages', @@ -84,6 +85,9 @@ $menu = [ 'course_introductions' => [ 'files_for_course_introductions', ], + 'course_modules_url' => [ + 'urls', + ], ]; Display::display_header($plugin->get_title()); diff --git a/plugin/migrationmoodle/lang/english.php b/plugin/migrationmoodle/lang/english.php index c4e7ffc454..a6ca5b6a59 100644 --- a/plugin/migrationmoodle/lang/english.php +++ b/plugin/migrationmoodle/lang/english.php @@ -45,3 +45,5 @@ $strings['CourseIntroductionsTask'] = 'Course introductions'; $strings['FilesForCourseIntroductionsTask'] = 'Files for course introductions'; $strings['FilesForCourseSectionsTask'] = 'Files for course sections'; $strings['CourseModulesUrlTask'] = 'Course modules: URLs'; +$strings['UrlsTask'] = 'URLs'; +$strings['SortSectionModulesTask'] = 'Sort modules in section'; diff --git a/plugin/migrationmoodle/src/Loader/CourseModulesLessonLoader.php b/plugin/migrationmoodle/src/Loader/CourseModulesLessonLoader.php index 61e2bd3c10..0b1e9c9079 100644 --- a/plugin/migrationmoodle/src/Loader/CourseModulesLessonLoader.php +++ b/plugin/migrationmoodle/src/Loader/CourseModulesLessonLoader.php @@ -30,7 +30,7 @@ class CourseModulesLessonLoader implements LoaderInterface ); $itemId = $lp->add_item( 0, - $incomingData['previous'], + 0, 'dir', 0, $incomingData['title'], diff --git a/plugin/migrationmoodle/src/Loader/CourseModulesQuizLoader.php b/plugin/migrationmoodle/src/Loader/CourseModulesQuizLoader.php index 1cc7d7189d..ae6eac4c33 100644 --- a/plugin/migrationmoodle/src/Loader/CourseModulesQuizLoader.php +++ b/plugin/migrationmoodle/src/Loader/CourseModulesQuizLoader.php @@ -29,15 +29,14 @@ class CourseModulesQuizLoader implements LoaderInterface $incomingData['lp_id'], api_get_user_id() ); - $itemId = $lp->add_item( + + return $lp->add_item( + 0, 0, - $incomingData['previous'], 'quiz', 0, $incomingData['title'], '' ); - - return $itemId; } } diff --git a/plugin/migrationmoodle/src/Loader/CourseModulesUrlLoader.php b/plugin/migrationmoodle/src/Loader/CourseModulesUrlLoader.php index 33aef9da1c..c3969f6705 100644 --- a/plugin/migrationmoodle/src/Loader/CourseModulesUrlLoader.php +++ b/plugin/migrationmoodle/src/Loader/CourseModulesUrlLoader.php @@ -17,22 +17,6 @@ class CourseModulesUrlLoader implements LoaderInterface */ public function load(array $incomingData) { - $courseId = api_get_course_int_id($incomingData['c_code']); - - $link = new \Link(); - $linkId = $link->save( - [ - 'c_id' => $courseId, - 'url' => $incomingData['url'], - 'title' => $incomingData['title'], - 'description' => null, - 'category_id' => null, - 'on_homepage' => '0', - 'target' => '_self', - 'session_id' => 0, - ] - ); - $lp = new \learnpath( $incomingData['c_code'], $incomingData['lp_id'], @@ -41,9 +25,9 @@ class CourseModulesUrlLoader implements LoaderInterface return $lp->add_item( 0, - $incomingData['previous'], + 0, 'link', - $linkId, + 0, $incomingData['title'], '' ); diff --git a/plugin/migrationmoodle/src/Loader/CourseSectionsLoader.php b/plugin/migrationmoodle/src/Loader/CourseSectionsLoader.php index cf2de00e27..3c95256d84 100644 --- a/plugin/migrationmoodle/src/Loader/CourseSectionsLoader.php +++ b/plugin/migrationmoodle/src/Loader/CourseSectionsLoader.php @@ -35,27 +35,20 @@ class CourseSectionsLoader implements LoaderInterface $incomingData['description'] = trim($incomingData['description']); - if (empty($incomingData['description'])) { - return $lpId; + if (!empty($incomingData['description'])) { + $lp = new \learnpath( + $incomingData['course_code'], + $lpId, + api_get_user_id() + ); + $lp->generate_lp_folder($courseInfo); + + $itemTitle = get_lang('Description'); + + $documentId = $lp->create_document($courseInfo, $incomingData['description'], $itemTitle); + $lp->add_item(0, 0, 'document', $documentId, $itemTitle, ''); } - $lp = new \learnpath( - $incomingData['course_code'], - $lpId, - api_get_user_id() - ); - $lp->generate_lp_folder($courseInfo); - - $itemTitle = get_lang('Description'); - - $itemId = $lp->add_item(0, 0, 'document', 0, $itemTitle, ''); - $documentId = $lp->create_document($courseInfo, $incomingData['description'], $itemTitle); - - \Database::getManager() - ->createQuery('UPDATE ChamiloCourseBundle:CLpItem i SET i.path = :path WHERE i.iid = :id') - ->setParameters(['path' => $documentId, 'id' => $itemId]) - ->execute(); - return $lpId; } } diff --git a/plugin/migrationmoodle/src/Loader/SortSectionModuleLoader.php b/plugin/migrationmoodle/src/Loader/SortSectionModuleLoader.php new file mode 100644 index 0000000000..9ae7e7b883 --- /dev/null +++ b/plugin/migrationmoodle/src/Loader/SortSectionModuleLoader.php @@ -0,0 +1,27 @@ + $incomingData['c_id'], + 'url' => $incomingData['url'], + 'title' => $incomingData['title'], + 'description' => null, + 'category_id' => null, + 'on_homepage' => '0', + 'target' => '_self', + 'session_id' => 0, + ]; + + $link = new \Link(); + $linkId = $link->save($params); + + \Database::getManager() + ->createQuery('UPDATE ChamiloCourseBundle:CLpItem i SET i.path = :path WHERE i.iid = :id') + ->setParameters(['path' => $linkId, 'id' => $incomingData['item_id']]) + ->execute(); + + return $linkId; + } +} diff --git a/plugin/migrationmoodle/src/Task/CourseModulesLessonTask.php b/plugin/migrationmoodle/src/Task/CourseModulesLessonTask.php index 8afd3d1de6..d4e2768ef5 100644 --- a/plugin/migrationmoodle/src/Task/CourseModulesLessonTask.php +++ b/plugin/migrationmoodle/src/Task/CourseModulesLessonTask.php @@ -7,7 +7,6 @@ use Chamilo\PluginBundle\MigrationMoodle\Extractor\CourseExtractor; use Chamilo\PluginBundle\MigrationMoodle\Loader\CourseModulesLessonLoader; use Chamilo\PluginBundle\MigrationMoodle\Transformer\BaseTransformer; use Chamilo\PluginBundle\MigrationMoodle\Transformer\Property\LoadedCourseCodeLookup; -use Chamilo\PluginBundle\MigrationMoodle\Transformer\Property\LoadedLpDirLookup; use Chamilo\PluginBundle\MigrationMoodle\Transformer\Property\LoadedLpLookup; /** @@ -19,7 +18,6 @@ use Chamilo\PluginBundle\MigrationMoodle\Transformer\Property\LoadedLpLookup; */ class CourseModulesLessonTask extends BaseTask { - /** * @return array */ @@ -27,12 +25,13 @@ class CourseModulesLessonTask extends BaseTask { return [ 'class' => CourseExtractor::class, - 'query' => "SELECT cm.id, l.course, l.name, cs.sequence, cm.section FROM mdl_lesson l + 'query' => "SELECT cm.id, l.course, l.name, cm.section + FROM mdl_lesson l INNER JOIN mdl_course_modules cm ON (l.course = cm.course AND cm.instance = l.id) INNER JOIN mdl_modules m ON cm.module = m.id INNER JOIN mdl_course_sections cs ON (cm.course = cs.course AND cm.section = cs.id ) WHERE m.name = 'lesson' - ORDER BY FIND_IN_SET(cm.id, cs.sequence)", + ORDER BY cs.id, FIND_IN_SET(cm.id, cs.sequence)", ]; } @@ -52,10 +51,6 @@ class CourseModulesLessonTask extends BaseTask 'class' => LoadedLpLookup::class, 'properties' => ['section'], ], - 'previous' => [ - 'class' => LoadedLpDirLookup::class, - 'properties' => ['id', 'sequence'] - ], 'title' => 'name', ], ]; diff --git a/plugin/migrationmoodle/src/Task/CourseModulesQuizTask.php b/plugin/migrationmoodle/src/Task/CourseModulesQuizTask.php index 00d6bb2c12..01272a3396 100644 --- a/plugin/migrationmoodle/src/Task/CourseModulesQuizTask.php +++ b/plugin/migrationmoodle/src/Task/CourseModulesQuizTask.php @@ -7,7 +7,6 @@ use Chamilo\PluginBundle\MigrationMoodle\Extractor\CourseExtractor; use Chamilo\PluginBundle\MigrationMoodle\Loader\CourseModulesQuizLoader; use Chamilo\PluginBundle\MigrationMoodle\Transformer\BaseTransformer; use Chamilo\PluginBundle\MigrationMoodle\Transformer\Property\LoadedCourseCodeLookup; -use Chamilo\PluginBundle\MigrationMoodle\Transformer\Property\LoadedLpItemInSequenceLookup; use Chamilo\PluginBundle\MigrationMoodle\Transformer\Property\LoadedLpLookup; /** @@ -26,7 +25,7 @@ class CourseModulesQuizTask extends BaseTask { return [ 'class' => CourseExtractor::class, - 'query' => "SELECT cm.id, q.course, q.name, cm.section, cs.sequence + 'query' => "SELECT cm.id, q.course, q.name, cm.section FROM mdl_quiz q INNER JOIN mdl_course_modules cm ON (q.course = cm.course AND cm.instance = q.id) INNER JOIN mdl_modules m ON cm.module = m.id @@ -52,10 +51,6 @@ class CourseModulesQuizTask extends BaseTask 'class' => LoadedLpLookup::class, 'properties' => ['section'] ], - 'previous' => [ - 'class' => LoadedLpItemInSequenceLookup::class, - 'properties' => ['id', 'sequence'], - ], 'title' => 'name', ], ]; diff --git a/plugin/migrationmoodle/src/Task/CourseModulesUrlTask.php b/plugin/migrationmoodle/src/Task/CourseModulesUrlTask.php index 727c0f13c7..0d5ba02768 100644 --- a/plugin/migrationmoodle/src/Task/CourseModulesUrlTask.php +++ b/plugin/migrationmoodle/src/Task/CourseModulesUrlTask.php @@ -7,7 +7,6 @@ use Chamilo\PluginBundle\MigrationMoodle\Extractor\CourseExtractor; use Chamilo\PluginBundle\MigrationMoodle\Loader\CourseModulesUrlLoader; use Chamilo\PluginBundle\MigrationMoodle\Transformer\BaseTransformer; use Chamilo\PluginBundle\MigrationMoodle\Transformer\Property\LoadedCourseCodeLookup; -use Chamilo\PluginBundle\MigrationMoodle\Transformer\Property\LoadedLpItemInSequenceLookup; use Chamilo\PluginBundle\MigrationMoodle\Transformer\Property\LoadedLpLookup; /** @@ -15,8 +14,6 @@ use Chamilo\PluginBundle\MigrationMoodle\Transformer\Property\LoadedLpLookup; * * Task to create a Chamilo Link from a Moodle URL module. * - * The Link created is added in a learning path (from a Moodle course section). - * * @package Chamilo\PluginBundle\MigrationMoodle\Task */ class CourseModulesUrlTask extends BaseTask @@ -28,7 +25,7 @@ class CourseModulesUrlTask extends BaseTask { return [ 'class' => CourseExtractor::class, - 'query' => "SELECT cm.id, u.course, u.name, u.externalurl, cm.section, cs.sequence + 'query' => "SELECT cm.id, u.course, u.name, cm.section FROM mdl_url u INNER JOIN mdl_course_modules cm ON (u.course = cm.course AND cm.instance = u.id) INNER JOIN mdl_modules m ON cm.module = m.id @@ -61,12 +58,7 @@ class CourseModulesUrlTask extends BaseTask 'class' => LoadedLpLookup::class, 'properties' => ['section'], ], - 'previous' => [ - 'class' => LoadedLpItemInSequenceLookup::class, - 'properties' => ['id', 'sequence'], - ], 'title' => 'name', - 'url' => 'externalurl', ], ]; } diff --git a/plugin/migrationmoodle/src/Task/SortSectionModulesTask.php b/plugin/migrationmoodle/src/Task/SortSectionModulesTask.php new file mode 100644 index 0000000000..a801340d12 --- /dev/null +++ b/plugin/migrationmoodle/src/Task/SortSectionModulesTask.php @@ -0,0 +1,78 @@ + CourseExtractor::class, + 'query' => "SELECT cm.id, cs.course, cm.section, cs.sequence + FROM mdl_course_modules cm + INNER JOIN mdl_modules m ON cm.module = m.id + INNER JOIN mdl_course_sections cs ON (cm.course = cs.course AND cm.section = cs.id ) + WHERE cs.course NOT IN ( + SELECT sco.course + FROM mdl_scorm sco + INNER JOIN mdl_course_modules cm ON (sco.course = cm.course AND cm.instance = sco.id) + INNER JOIN mdl_modules m ON cm.module = m.id + INNER JOIN mdl_course_sections cs ON (cm.course = cs.course AND cm.section = cs.id ) + WHERE m.name = 'scorm' + ) + ORDER BY cs.course, cs.section, FIND_IN_SET(cm.id, cs.sequence)", + ]; + } + + /** + * @inheritDoc + */ + public function getTransformConfiguration() + { + return [ + 'class' => BaseTransformer::class, + 'map' => [ + 'c_id' => [ + 'class' => LoadedCourseLookup::class, + 'properties' => ['course'], + ], + 'lp_id' => [ + 'class' => LoadedLpLookup::class, + 'properties' => ['section'], + ], + 'order_list' => [ + 'class' => SectionSequenceLookup::class, + 'properties' => ['sequence'], + ], + ], + ]; + } + + /** + * @inheritDoc + */ + public function getLoadConfiguration() + { + return [ + 'class' => SortSectionModuleLoader::class, + ]; + } +} diff --git a/plugin/migrationmoodle/src/Task/UrlsTask.php b/plugin/migrationmoodle/src/Task/UrlsTask.php new file mode 100644 index 0000000000..eeeb2d83bf --- /dev/null +++ b/plugin/migrationmoodle/src/Task/UrlsTask.php @@ -0,0 +1,79 @@ + CourseExtractor::class, + 'query' => "SELECT u.id, u.course, u.name, u.externalurl, cm.section, cm.id cm_id + FROM mdl_url u + INNER JOIN mdl_course_modules cm ON (u.course = cm.course AND cm.instance = u.id) + INNER JOIN mdl_modules m ON cm.module = m.id + INNER JOIN mdl_course_sections cs ON (cm.course = cs.course AND cm.section = cs.id ) + WHERE m.name = 'url' + AND u.course NOT IN ( + SELECT sco.course + FROM mdl_scorm sco + INNER JOIN mdl_course_modules cm ON (sco.course = cm.course AND cm.instance = sco.id) + INNER JOIN mdl_modules m ON cm.module = m.id + INNER JOIN mdl_course_sections cs ON (cm.course = cs.course AND cm.section = cs.id ) + WHERE m.name = 'scorm' + )", + ]; + } + + /** + * @inheritDoc + */ + public function getTransformConfiguration() + { + return [ + 'class' => BaseTransformer::class, + 'map' => [ + 'c_id' => [ + 'class' => LoadedCourseLookup::class, + 'properties' => ['course'], + ], + 'lp_id' => [ + 'class' => LoadedLpLookup::class, + 'properties' => ['section'], + ], + 'item_id' => [ + 'class' => LoadedCourseModulesUrlLookup::class, + 'properties' => ['cm_id'], + ], + 'title' => 'name', + 'url' => 'externalurl', + ], + ]; + } + + /** + * @inheritDoc + */ + public function getLoadConfiguration() + { + return [ + 'class' => UrlLoader::class, + ]; + } +} diff --git a/plugin/migrationmoodle/src/Transformer/Property/LoadedCourseModulesUrlLookup.php b/plugin/migrationmoodle/src/Transformer/Property/LoadedCourseModulesUrlLookup.php new file mode 100644 index 0000000000..d1d4e7fdf8 --- /dev/null +++ b/plugin/migrationmoodle/src/Transformer/Property/LoadedCourseModulesUrlLookup.php @@ -0,0 +1,22 @@ +calledClass = CourseModulesUrlTask::class; + } +} diff --git a/plugin/migrationmoodle/src/Transformer/Property/LoadedKeyLookup.php b/plugin/migrationmoodle/src/Transformer/Property/LoadedKeyLookup.php index 1a6bead12b..fdc7bdfca2 100644 --- a/plugin/migrationmoodle/src/Transformer/Property/LoadedKeyLookup.php +++ b/plugin/migrationmoodle/src/Transformer/Property/LoadedKeyLookup.php @@ -20,7 +20,7 @@ abstract class LoadedKeyLookup implements TransformPropertyInterface * * @throws \Exception * - * @return int + * @return mixed */ public function transform(array $data) { diff --git a/plugin/migrationmoodle/src/Transformer/Property/LoadedLpDirLookup.php b/plugin/migrationmoodle/src/Transformer/Property/LoadedLpDirLookup.php deleted file mode 100644 index 090395197b..0000000000 --- a/plugin/migrationmoodle/src/Transformer/Property/LoadedLpDirLookup.php +++ /dev/null @@ -1,44 +0,0 @@ -calledClass = CourseModulesLessonTask::class; - } - - /** - * @param array $data - * - * @return mixed - * @throws \Exception - */ - public function transform(array $data) - { - list($cmId, $sequenceStr) = array_values($data); - - $sequence = explode(',', $sequenceStr); - $index = array_search($cmId, $sequence); - - if (empty($index)) { - return 0; - } - - $previous = $sequence[$index - 1]; - - return parent::transform([$previous]); - } -} diff --git a/plugin/migrationmoodle/src/Transformer/Property/LoadedLpItemInSequenceLookup.php b/plugin/migrationmoodle/src/Transformer/Property/LoadedLpItemInSequenceLookup.php deleted file mode 100644 index 91f8f7e006..0000000000 --- a/plugin/migrationmoodle/src/Transformer/Property/LoadedLpItemInSequenceLookup.php +++ /dev/null @@ -1,67 +0,0 @@ -getConnection(); - } catch (DBALException $e) { - throw new Exception('Unable to start connection.', 0, $e); - } - - try { - $query = "SELECT m.name - FROM mdl_course_modules cm - INNER JOIN mdl_modules m ON cm.module = m.id - WHERE cm.id = ?"; - - $result = $connection->fetchAssoc($query, [$mPreviousId]); - } catch (DBALException $e) { - throw new Exception("Unable to execute query \"{$this->query}\".", 0, $e); - } - - $connection->close(); - - switch ($result['name']) { - case 'lesson': - $this->calledClass = CourseModulesLessonTask::class; - - return parent::transform([$mPreviousId]); - } - - return 0; - } -} diff --git a/plugin/migrationmoodle/src/Transformer/Property/SectionSequenceLookup.php b/plugin/migrationmoodle/src/Transformer/Property/SectionSequenceLookup.php new file mode 100644 index 0000000000..0e240e113f --- /dev/null +++ b/plugin/migrationmoodle/src/Transformer/Property/SectionSequenceLookup.php @@ -0,0 +1,73 @@ +getConnection(); + } catch (DBALException $exception) { + throw new \Exception('Unable to start connection.', 0, $exception); + } + + $mSequence = explode(',', $data['sequence']); + $lpOrderList = []; + + foreach ($mSequence as $mModuleId) { + try { + $query = "SELECT m.name + FROM mdl_course_modules cm + INNER JOIN mdl_modules m ON cm.module = m.id + WHERE cm.id = ?"; + + $result = $connection->fetchAssoc($query, [$mModuleId]); + } catch (DBALException $exception) { + throw new \Exception("Unable to execute query \"{$this->query}\".", 0, $exception); + } + + if (empty($result)) { + continue; + } + + switch ($result['name']) { + case 'lesson': + $this->calledClass = CourseModulesLessonTask::class; + break; + case 'quiz': + $this->calledClass = CourseModulesQuizTask::class; + break; + default: + continue; + } + + $lpItemId = parent::transform([$mModuleId]); + + $lpOrderList[$lpItemId] = 0; + } + + $connection->close(); + + return $lpOrderList; + } +}