Sfoglia il codice sorgente

Fix migration from 1.11.x to v2

Julio Montoya 6 anni fa
parent
commit
ea927109c9

+ 1 - 1
.env.dist

@@ -31,7 +31,7 @@ APP_SECRET=141af65f23c7935a37b504c422f113b0
 APP_INSTALLED={{APP_INSTALLED}}
 APP_ENCRYPT_METHOD={{APP_ENCRYPT_METHOD}}
 APP_LOCALE=en
-APP_URL_APPEND=''
+APP_URL_APPEND='{{APP_URL_APPEND}}'
 APP_MULTIPLE_ACCESS_URL=''
 
 ###< chamilo ###

+ 3 - 20
app/Migrations/Schema/V200/Version20.php

@@ -21,6 +21,9 @@ class Version20 extends AbstractMigrationChamilo
     {
         // Use $schema->createTable
         $this->addSql('set sql_mode=""');
+        $this->addSql('ALTER TABLE access_url_rel_user MODIFY COLUMN access_url_id INT NOT NULL');
+        $this->addSql('ALTER TABLE access_url_rel_user MODIFY COLUMN user_id INT NOT NULL');
+
         $this->addSql('ALTER TABLE access_url_rel_user DROP PRIMARY KEY');
         $this->addSql('ALTER TABLE access_url_rel_session DROP PRIMARY KEY');
 
@@ -207,26 +210,6 @@ class Version20 extends AbstractMigrationChamilo
         $this->addSql("INSERT INTO settings_options (variable, value, display_text) VALUES ('show_glossary_in_extra_tools', 'lp', 'LearningPath')");
         $this->addSql("INSERT INTO settings_options (variable, value, display_text) VALUES ('show_glossary_in_extra_tools', 'exercise_and_lp', 'ExerciseAndLearningPath')");
 
-
-        $table = $schema->getTable('sys_announcement');
-        if (!$table->hasColumn('visible_drh')) {
-            $this->addSql(
-                "ALTER TABLE sys_announcement ADD COLUMN visible_drh INT DEFAULT 0;"
-            );
-        }
-
-        if (!$table->hasColumn('visible_session_admin')) {
-            $this->addSql(
-                "ALTER TABLE sys_announcement ADD COLUMN visible_session_admin INT DEFAULT 0;"
-            );
-        }
-
-        if (!$table->hasColumn('visible_boss')) {
-            $this->addSql(
-                "ALTER TABLE sys_announcement ADD COLUMN visible_boss INT DEFAULT 0;"
-            );
-        }
-
         $cSurvey = $schema->getTable('c_survey');
 
         if (!$cSurvey->hasColumn('is_mandatory')) {

+ 1 - 1
config/bundles.php

@@ -67,6 +67,6 @@ return [
     Liip\ThemeBundle\LiipThemeBundle::class => ['all' => true],
     A2lix\AutoFormBundle\A2lixAutoFormBundle::class => ['all' => true],
     A2lix\TranslationFormBundle\A2lixTranslationFormBundle::class => ['all' => true],
-    Ivory\CKEditorBundle\IvoryCKEditorBundle::class => ['all' => true],
     Lunetics\LocaleBundle\LuneticsLocaleBundle::class => ['all' => true],
+    Ivory\CKEditorBundle\IvoryCKEditorBundle::class => ['all' => true],
 ];

+ 7 - 2
main/inc/lib/api.lib.php

@@ -2847,6 +2847,7 @@ function api_get_setting_in_list($variable, $option)
 function api_get_plugin_setting($plugin, $variable)
 {
     $variableName = $plugin.'_'.$variable;
+
     $params = [
         'category = ? AND subkey = ? AND variable = ?' => [
             'Plugins',
@@ -2862,9 +2863,13 @@ function api_get_plugin_setting($plugin, $variable)
         'one'
     );
     if ($result) {
-        $result = $result['selected_value'];
+        $value = $result['selected_value'];
+        $serializedValue = @unserialize($result['selected_value'], []);
+        if ($serializedValue !== false) {
+            $value = $serializedValue;
+        }
 
-        return $result;
+        return $value;
     }
 
     return null;

+ 7 - 5
main/inc/lib/display.lib.php

@@ -416,7 +416,8 @@ class Display
      * @param array $query_vars      Additional variables to add in the query-string
      * @param array $column_show     Array of binaries 1= show columns 0. hide a column
      * @param array $column_order    An array of integers that let us decide how the columns are going to be sort.
-     *                               i.e:  $column_order=array('1''4','3','4'); The 2nd column will be order like the 4th column
+     *                               i.e:  $column_order=array('1''4','3','4'); The 2nd column will be order like the
+     *                               4th column
      * @param array $form_actions    Set optional forms actions
      *
      * @author Julio Montoya
@@ -1755,13 +1756,14 @@ class Display
 
             $entityManager = Database::getManager();
             $fieldValuesRepo = $entityManager->getRepository('ChamiloCoreBundle:ExtraFieldValues');
-            $extraFieldValues = $fieldValuesRepo->getVisibleValues(
-                ExtraField::SESSION_FIELD_TYPE,
-                $session_id
-            );
+            $extraFieldValues = $fieldValuesRepo->getVisibleValues(ExtraField::SESSION_FIELD_TYPE, $session_id);
 
             $session['extra_fields'] = [];
+            /** @var \Chamilo\CoreBundle\Entity\ExtraFieldValues $value */
             foreach ($extraFieldValues as $value) {
+                if (empty($value)) {
+                    continue;
+                }
                 $session['extra_fields'][] = [
                     'field' => [
                         'variable' => $value->getField()->getVariable(),

+ 22 - 3
main/install/index.php

@@ -118,7 +118,6 @@ $dbUsernameForm = 'root';
 $dbPassForm = '';
 $dbNameForm = 'chamilo';
 $dbPortForm = 3306;
-$allowSelfReg = '';
 $allowSelfReg = 'approval';
 $allowSelfRegProf = 1;
 $adminLastName = get_lang('DefaultInstallAdminLastname');
@@ -507,7 +506,7 @@ if (@$_POST['step2']) {
 } elseif (@$_POST['step4']) {
     //STEP 5 : CONFIGURATION SETTINGS
     //if update, try getting settings from the database...
-    if ($installType == 'update') {
+    if ($installType === 'update') {
         $db_name = $dbNameForm;
 
         $database = connectToDatabase(
@@ -748,7 +747,7 @@ if (@$_POST['step2']) {
         if (!empty($f)) {
             ob_flush(); //#5565
         }
-        if ($installType == 'update') {
+        if ($installType === 'update') {
             $database = connectToDatabase(
                 $dbHostForm,
                 $dbUsernameForm,
@@ -773,10 +772,29 @@ if (@$_POST['step2']) {
                 '{{DATABASE_PASSWORD}}' => $dbPassForm,
                 '{{APP_INSTALLED}}' => 1,
                 '{{APP_ENCRYPT_METHOD}}' => $encryptPassForm,
+                '{{APP_URL_APPEND}}' => $urlAppendPath,
             ];
 
             updateEnvFile($distFile, $envFile, $params);
             (new Dotenv())->load($envFile);
+
+            // Load Symfony Kernel
+            $kernel = new Kernel('dev', true);
+            $application = new Application($kernel);
+
+            // Create database
+            /*$input = new ArrayInput([]);
+            $command = $application->find('doctrine:schema:create');
+            $result = $command->run($input, new ConsoleOutput());*/
+
+            // No errors
+            //if ($result == 0) {
+                // Boot kernel and get the doctrine from Symfony container
+                $kernel->boot();
+                $containerDatabase = $kernel->getContainer();
+                $sysPath = api_get_path(SYS_PATH);
+                updateWithContainer($containerDatabase);
+            //}
         } else {
             set_file_folder_permissions();
             $database = connectToDatabase(
@@ -813,6 +831,7 @@ if (@$_POST['step2']) {
                 '{{DATABASE_PASSWORD}}' => $dbPassForm,
                 '{{APP_INSTALLED}}' => 1,
                 '{{APP_ENCRYPT_METHOD}}' => $encryptPassForm,
+                '{{APP_URL_APPEND}}' => $urlAppendPath,
             ];
 
             updateEnvFile($distFile, $envFile, $params);

+ 217 - 171
main/install/install.lib.php

@@ -9,6 +9,7 @@ use Chamilo\TicketBundle\Entity\Priority as TicketPriority;
 use Chamilo\TicketBundle\Entity\Project as TicketProject;
 use Doctrine\ORM\EntityManager;
 use Sonata\PageBundle\Entity\PageManager;
+use Symfony\Component\DependencyInjection\Container as SymfonyContainer;
 
 /**
  * Chamilo LMS
@@ -2155,7 +2156,9 @@ function migrate($chamiloVersion, EntityManager $manager)
     // Namespace of your migration classes, do not forget escape slashes, do not add last slash
     $config->setMigrationsNamespace('Application\Migrations\Schema\V'.$chamiloVersion);
     // Directory where your migrations are located
-    $config->setMigrationsDirectory(api_get_path(SYS_PATH).'app/Migrations/Schema/V'.$chamiloVersion);
+    $versionPath = api_get_path(SYS_PATH).'app/Migrations/Schema/V'.$chamiloVersion;
+    error_log("Reading files from dir: $versionPath");
+    $config->setMigrationsDirectory($versionPath);
     // Load your migrations
     $config->registerMigrationsFromDirectory($config->getMigrationsDirectory());
 
@@ -2989,150 +2992,11 @@ function updateEnvFile($distFile, $envFile, $params)
 }
 
 /**
- * After the schema was created (table creation), the function adds
- * admin/platform information.
- *
- * @param \Psr\Container\ContainerInterface $container
- * @param string                            $sysPath
- * @param string                            $encryptPassForm
- * @param string                            $passForm
- * @param string                            $adminLastName
- * @param string                            $adminFirstName
- * @param string                            $loginForm
- * @param string                            $emailForm
- * @param string                            $adminPhoneForm
- * @param string                            $languageForm
- * @param string                            $institutionForm
- * @param string                            $institutionUrlForm
- * @param string                            $siteName
- * @param string                            $allowSelfReg
- * @param string                            $allowSelfRegProf
- * @param string                            $installationProfile Installation profile, if any was provided
+ * @param SymfonyContainer $container
+ * @param EntityManager $manager
  */
-function finishInstallationWithContainer(
-    $container,
-    $sysPath,
-    $encryptPassForm,
-    $passForm,
-    $adminLastName,
-    $adminFirstName,
-    $loginForm,
-    $emailForm,
-    $adminPhoneForm,
-    $languageForm,
-    $institutionForm,
-    $institutionUrlForm,
-    $siteName,
-    $allowSelfReg,
-    $allowSelfRegProf,
-    $installationProfile = ''
-) {
-    $sysPath = !empty($sysPath) ? $sysPath : api_get_path(SYS_PATH);
-    Container::setContainer($container);
-    Container::setLegacyServices($container);
-
-    $manager = Database::getManager();
-    $connection = $manager->getConnection();
-    $siteManager = Container::getSiteManager();
-    $settingsManager = Container::getSettingsManager();
-
-    $sql = getVersionTable();
-
-    // Add version table
-    $connection->executeQuery($sql);
-
-    // Add tickets defaults
-    $ticketProject = new TicketProject();
-    $ticketProject
-        ->setId(1)
-        ->setName('Ticket System')
-        ->setInsertUserId(1);
-
-    $manager->persist($ticketProject);
-    $manager->flush();
-
-    $categories = [
-        get_lang('TicketEnrollment') => get_lang('TicketsAboutEnrollment'),
-        get_lang('TicketGeneralInformation') => get_lang('TicketsAboutGeneralInformation'),
-        get_lang('TicketRequestAndPapework') => get_lang('TicketsAboutRequestAndPapework'),
-        get_lang('TicketAcademicIncidence') => get_lang('TicketsAboutAcademicIncidence'),
-        get_lang('TicketVirtualCampus') => get_lang('TicketsAboutVirtualCampus'),
-        get_lang('TicketOnlineEvaluation') => get_lang('TicketsAboutOnlineEvaluation'),
-    ];
-
-    $i = 1;
-    foreach ($categories as $category => $description) {
-        // Online evaluation requires a course
-        $ticketCategory = new TicketCategory();
-        $ticketCategory
-            ->setId($i)
-            ->setName($category)
-            ->setDescription($description)
-            ->setProject($ticketProject)
-            ->setInsertUserId(1);
-
-        $isRequired = $i == 6;
-        $ticketCategory->setCourseRequired($isRequired);
-
-        $manager->persist($ticketCategory);
-        $manager->flush();
-
-        $i++;
-    }
-
-    // Default Priorities
-    $defaultPriorities = [
-        TicketManager::PRIORITY_NORMAL => get_lang('PriorityNormal'),
-        TicketManager::PRIORITY_HIGH => get_lang('PriorityHigh'),
-        TicketManager::PRIORITY_LOW => get_lang('PriorityLow'),
-    ];
-
-    $i = 1;
-    foreach ($defaultPriorities as $code => $priority) {
-        $ticketPriority = new TicketPriority();
-        $ticketPriority
-            ->setId($i)
-            ->setName($priority)
-            ->setCode($code)
-            ->setInsertUserId(1);
-
-        $manager->persist($ticketPriority);
-        $manager->flush();
-        $i++;
-    }
-
-    $table = Database::get_main_table(TABLE_TICKET_STATUS);
-
-    // Default status
-    $defaultStatus = [
-        TicketManager::STATUS_NEW => get_lang('StatusNew'),
-        TicketManager::STATUS_PENDING => get_lang('StatusPending'),
-        TicketManager::STATUS_UNCONFIRMED => get_lang('StatusUnconfirmed'),
-        TicketManager::STATUS_CLOSE => get_lang('StatusClose'),
-        TicketManager::STATUS_FORWARDED => get_lang('StatusForwarded'),
-    ];
-
-    $i = 1;
-    foreach ($defaultStatus as $code => $status) {
-        $attributes = [
-            'id' => $i,
-            'code' => $code,
-            'name' => $status,
-        ];
-        Database::insert($table, $attributes);
-        $i++;
-    }
-
-    // Creating AccessUrl
-    $accessUrl = new AccessUrl();
-    $accessUrl
-        ->setUrl('http://localhost/')
-        ->setDescription('')
-        ->setActive(1)
-    ;
-    $manager->persist($accessUrl);
-    $manager->flush();
-
+function installGroups($container, $manager)
+{
     // Creating fos_group (groups and roles)
     $groupManager = $container->get('fos_user.group_manager');
     $groups = [
@@ -3179,27 +3043,27 @@ function finishInstallationWithContainer(
     ];
 
     foreach ($groups as $groupData) {
-        $group = $groupManager->createGroup($groupData['title']);
-        $group->setCode($groupData['code']);
-        foreach ($groupData['roles'] as $role) {
-            $group->addRole($role);
+        $criteria = ['code' => $groupData['code']];
+        $groupExists = $groupManager->findGroupBy($criteria);
+        if (!$groupExists) {
+            $group = $groupManager->createGroup($groupData['title']);
+            $group->setCode($groupData['code']);
+            foreach ($groupData['roles'] as $role) {
+                $group->addRole($role);
+            }
+            $manager->persist($group);
+            $groupManager->updateGroup($group, true);
         }
-        $manager->persist($group);
-        $groupManager->updateGroup($group, true);
     }
+}
 
-    // Install course tools (table "tool")
-    $toolChain = $container->get('chamilo_course.tool_chain');
-    $toolChain->createTools($manager);
-
-    // Installing schemas (filling settings_current table)
-    $settingsManager->installSchemas($accessUrl);
-
-    // Inserting data
-    $data = file_get_contents($sysPath.'main/install/data.sql');
-    $result = $manager->getConnection()->prepare($data);
-    $result->execute();
-    $result->closeCursor();
+/**
+ * @param SymfonyContainer $container
+ *
+ */
+function installPages($container)
+{
+    $siteManager = Container::getSiteManager();
 
     // Create site
     /** @var Chamilo\PageBundle\Entity\Site $site */
@@ -3291,6 +3155,194 @@ function finishInstallationWithContainer(
     $myBlock->setParent($parentBlock);
     $pageWelcome->addBlocks($myBlock);
     $pageManager->save($pageWelcome);
+}
+
+/**
+ * @param SymfonyContainer $container
+ * @param EntityManager $manager
+ */
+function installSchemas($container, $manager)
+{
+    $settingsManager = Container::getSettingsManager();
+
+    $accessUrl = $manager->getRepository('ChamiloCoreBundle:AccessUrl')->find(1);
+    if (!$accessUrl) {
+        // Creating AccessUrl
+        $accessUrl = new AccessUrl();
+        $accessUrl
+            ->setUrl('http://localhost/')
+            ->setDescription('')
+            ->setActive(1)
+        ;
+        $manager->persist($accessUrl);
+        $manager->flush();
+    }
+
+    // Install course tools (table "tool")
+    $toolChain = $container->get('chamilo_course.tool_chain');
+    $toolChain->createTools($manager);
+
+    // Installing schemas (filling settings_current table)
+    $settingsManager->installSchemas($accessUrl);
+}
+
+/**
+ * @param SymfonyContainer $container
+ */
+function updateWithContainer($container)
+{
+    Container::setContainer($container);
+    Container::setLegacyServices($container);
+
+    $manager = Database::getManager();
+
+    installGroups($container, $manager);
+    installSchemas($container, $manager);
+    installPages($container);
+}
+
+/**
+ * After the schema was created (table creation), the function adds
+ * admin/platform information.
+ *
+ * @param \Psr\Container\ContainerInterface $container
+ * @param string                            $sysPath
+ * @param string                            $encryptPassForm
+ * @param string                            $passForm
+ * @param string                            $adminLastName
+ * @param string                            $adminFirstName
+ * @param string                            $loginForm
+ * @param string                            $emailForm
+ * @param string                            $adminPhoneForm
+ * @param string                            $languageForm
+ * @param string                            $institutionForm
+ * @param string                            $institutionUrlForm
+ * @param string                            $siteName
+ * @param string                            $allowSelfReg
+ * @param string                            $allowSelfRegProf
+ * @param string                            $installationProfile Installation profile, if any was provided
+ */
+function finishInstallationWithContainer(
+    $container,
+    $sysPath,
+    $encryptPassForm,
+    $passForm,
+    $adminLastName,
+    $adminFirstName,
+    $loginForm,
+    $emailForm,
+    $adminPhoneForm,
+    $languageForm,
+    $institutionForm,
+    $institutionUrlForm,
+    $siteName,
+    $allowSelfReg,
+    $allowSelfRegProf,
+    $installationProfile = ''
+) {
+    $sysPath = !empty($sysPath) ? $sysPath : api_get_path(SYS_PATH);
+    Container::setContainer($container);
+    Container::setLegacyServices($container);
+
+    $manager = Database::getManager();
+    $connection = $manager->getConnection();
+
+    $sql = getVersionTable();
+
+    // Add version table
+    $connection->executeQuery($sql);
+
+    // Add tickets defaults
+    $ticketProject = new TicketProject();
+    $ticketProject
+        ->setId(1)
+        ->setName('Ticket System')
+        ->setInsertUserId(1);
+
+    $manager->persist($ticketProject);
+    $manager->flush();
+
+    $categories = [
+        get_lang('TicketEnrollment') => get_lang('TicketsAboutEnrollment'),
+        get_lang('TicketGeneralInformation') => get_lang('TicketsAboutGeneralInformation'),
+        get_lang('TicketRequestAndPapework') => get_lang('TicketsAboutRequestAndPapework'),
+        get_lang('TicketAcademicIncidence') => get_lang('TicketsAboutAcademicIncidence'),
+        get_lang('TicketVirtualCampus') => get_lang('TicketsAboutVirtualCampus'),
+        get_lang('TicketOnlineEvaluation') => get_lang('TicketsAboutOnlineEvaluation'),
+    ];
+
+    $i = 1;
+    foreach ($categories as $category => $description) {
+        // Online evaluation requires a course
+        $ticketCategory = new TicketCategory();
+        $ticketCategory
+            ->setId($i)
+            ->setName($category)
+            ->setDescription($description)
+            ->setProject($ticketProject)
+            ->setInsertUserId(1);
+
+        $isRequired = $i == 6;
+        $ticketCategory->setCourseRequired($isRequired);
+
+        $manager->persist($ticketCategory);
+        $manager->flush();
+
+        $i++;
+    }
+
+    // Default Priorities
+    $defaultPriorities = [
+        TicketManager::PRIORITY_NORMAL => get_lang('PriorityNormal'),
+        TicketManager::PRIORITY_HIGH => get_lang('PriorityHigh'),
+        TicketManager::PRIORITY_LOW => get_lang('PriorityLow'),
+    ];
+
+    $i = 1;
+    foreach ($defaultPriorities as $code => $priority) {
+        $ticketPriority = new TicketPriority();
+        $ticketPriority
+            ->setId($i)
+            ->setName($priority)
+            ->setCode($code)
+            ->setInsertUserId(1);
+
+        $manager->persist($ticketPriority);
+        $manager->flush();
+        $i++;
+    }
+
+    $table = Database::get_main_table(TABLE_TICKET_STATUS);
+
+    // Default status
+    $defaultStatus = [
+        TicketManager::STATUS_NEW => get_lang('StatusNew'),
+        TicketManager::STATUS_PENDING => get_lang('StatusPending'),
+        TicketManager::STATUS_UNCONFIRMED => get_lang('StatusUnconfirmed'),
+        TicketManager::STATUS_CLOSE => get_lang('StatusClose'),
+        TicketManager::STATUS_FORWARDED => get_lang('StatusForwarded'),
+    ];
+
+    $i = 1;
+    foreach ($defaultStatus as $code => $status) {
+        $attributes = [
+            'id' => $i,
+            'code' => $code,
+            'name' => $status,
+        ];
+        Database::insert($table, $attributes);
+        $i++;
+    }
+
+    installGroups($container, $manager);
+    installSchemas($container, $manager);
+    installPages($container);
+
+    // Inserting default data
+    $data = file_get_contents($sysPath.'main/install/data.sql');
+    $result = $manager->getConnection()->prepare($data);
+    $result->execute();
+    $result->closeCursor();
 
     UserManager::setPasswordEncryption($encryptPassForm);
 
@@ -3629,10 +3681,7 @@ function migrateSwitch($fromVersion, $manager, $processFiles = true)
             $database->setManager($manager);
             // Migrate using the migration files located in:
             // src/Chamilo/CoreBundle/Migrations/Schema/V111
-            $result = migrate(
-                111,
-                $manager
-            );
+            $result = migrate(111, $manager);
 
             if ($result) {
                 error_log('Migrations files were executed ('.date('Y-m-d H:i:s').')');
@@ -3664,10 +3713,7 @@ function migrateSwitch($fromVersion, $manager, $processFiles = true)
             $database->setManager($manager);
             // Migrate using the migration files located in:
             // src/Chamilo/CoreBundle/Migrations/Schema/V111
-            $result = migrate(
-                200,
-                $manager
-            );
+            $result = migrate(200, $manager);
 
             if ($result) {
                 error_log('Migrations files were executed ('.date('Y-m-d H:i:s').')');
@@ -3675,7 +3721,7 @@ function migrateSwitch($fromVersion, $manager, $processFiles = true)
                 $connection->executeQuery($sql);
                 if ($processFiles) {
                     error_log('Update config files');
-                    $fromVersionShort = '1.10';
+                    $fromVersionShort = '1.11';
                     include __DIR__.'/update-files-1.11.0-2.0.0.inc.php';
                     // Only updates the configuration.inc.php with the new version
                     include __DIR__.'/update-configuration.inc.php';

+ 5 - 5
src/CoreBundle/Entity/Course.php

@@ -32,11 +32,11 @@ use Symfony\Component\Validator\Constraints as Assert;
  */
 class Course
 {
-    const CLOSED = 0;
-    const REGISTERED = 1;
-    const OPEN_PLATFORM = 2;
-    const OPEN_WORLD = 3;
-    const HIDDEN = 4;
+    public const CLOSED = 0;
+    public const REGISTERED = 1;
+    public const OPEN_PLATFORM = 2;
+    public const OPEN_WORLD = 3;
+    public const HIDDEN = 4;
 
     /**
      * @var int

+ 20 - 0
src/CoreBundle/Entity/ExtraFieldValues.php

@@ -190,4 +190,24 @@ class ExtraFieldValues // extends BaseAttributeValue
     {
         return $this->id;
     }
+
+    /**
+     * @return string
+     */
+    public function getValue(): string
+    {
+        return $this->value;
+    }
+
+    /**
+     * @param string $value
+     *
+     * @return ExtraFieldValues
+     */
+    public function setValue(string $value): ExtraFieldValues
+    {
+        $this->value = $value;
+
+        return $this;
+    }
 }

+ 4 - 3
src/CoreBundle/Settings/CourseSettingsSchema.php

@@ -11,6 +11,7 @@ use Chamilo\CourseBundle\ToolChain;
 use Chamilo\SettingsBundle\Transformer\ArrayToIdentifierTransformer;
 use Sylius\Bundle\ResourceBundle\Form\DataTransformer\ResourceToIdentifierTransformer;
 use Sylius\Bundle\SettingsBundle\Schema\SettingsBuilderInterface;
+use Symfony\Bridge\Doctrine\Form\Type\EntityType;
 use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
 use Symfony\Component\Form\FormBuilderInterface;
 
@@ -230,12 +231,12 @@ class CourseSettingsSchema extends AbstractSettingsSchema
             ->add('allow_lp_return_link', YesNoType::class)
             ->add(
                 'course_creation_use_template',
-                'entity',
+                EntityType::class,
                 [
-                    //'choices' => $courses,
-                    'class' => 'Chamilo\CoreBundle\Entity\Course',
+                    'class' => Course::class,
                     'placeholder' => 'Choose ...',
                     'empty_data' => null,
+                    'data' => null,
                 ]
             )
             ->add('hide_scorm_export_link', YesNoType::class)

+ 2 - 2
src/CourseBundle/Admin/CourseAdmin.php

@@ -141,7 +141,7 @@ class CourseAdmin extends AbstractAdmin
                 'urls',
                 'sonata_type_collection',
                 [
-                    'cascade_validation' => true,
+                    //'cascade_validation' => true,
                 ],
                 [
                     'allow_delete' => true,
@@ -159,7 +159,7 @@ class CourseAdmin extends AbstractAdmin
                 'users',
                 'sonata_type_collection',
                 [
-                    'cascade_validation' => true,
+                    //'cascade_validation' => true,
                 ],
                 [
                     'allow_delete' => true,

+ 1 - 1
src/PageBundle/Controller/PageController.php

@@ -6,7 +6,7 @@ namespace Chamilo\PageBundle\Controller;
 use Chamilo\CoreBundle\Controller\BaseController;
 use Chamilo\PageBundle\Entity\Page;
 use Chamilo\PageBundle\Entity\Snapshot;
-use Ivory\CKEditorBundle\Form\Type\CKEditorType;
+use FOS\CKEditorBundle\Form\Type\CKEditorType;
 use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
 use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
 use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;

+ 7 - 1
src/SettingsBundle/Manager/SettingsManager.php

@@ -727,7 +727,13 @@ class SettingsManager implements SettingsManagerInterface
 
         foreach ($settingsBuilder->getTransformers() as $parameter => $transformer) {
             if (array_key_exists($parameter, $parameters)) {
-                $parameters[$parameter] = $transformer->reverseTransform($parameters[$parameter]);
+                if ($parameter === 'course_creation_use_template') {
+                    if (empty($parameters[$parameter])) {
+                        $parameters[$parameter] = null;
+                    }
+                } else {
+                    $parameters[$parameter] = $transformer->reverseTransform($parameters[$parameter]);
+                }
             }
         }