]> _ Git - fluidbook-toolbox.git/commitdiff
wip #6203 @3.5
authorVincent Vanwaelscappel <vincent@cubedesigners.com>
Tue, 29 Aug 2023 17:08:39 +0000 (19:08 +0200)
committerVincent Vanwaelscappel <vincent@cubedesigners.com>
Tue, 29 Aug 2023 17:08:39 +0000 (19:08 +0200)
app/Jobs/FluidbookCollectionDownload.php
app/Models/FluidbookCollection.php

index 99dea9cbf9d0406ec12cb4c0ea7c21009147b6da..31d7d3fe7ab1164880ede06c72646a329d3a5adb 100644 (file)
@@ -107,12 +107,12 @@ class FluidbookCollectionDownload extends DownloadBase
     protected function getCollectionGlobalSettings()
     {
         $options = [];
-        foreach ($this->entry->getPageData()->override_settings as $setting) {
-            if (!$setting || !isset($setting['key']) || !$setting['key']) {
-                continue;
-            }
-            $options[$setting['key']] = $setting['value'];
-        }
+//        foreach ($this->entry->getPageData()->override_settings as $setting) {
+//            if (!$setting || !isset($setting['key']) || !$setting['key']) {
+//                continue;
+//            }
+//            $options[$setting['key']] = $setting['value'];
+//        }
 
         return $options;
     }
@@ -137,12 +137,19 @@ class FluidbookCollectionDownload extends DownloadBase
             $fluidbooks[$fbid] = FluidbookPublication::syncPublicationFromWorkshop($fbid);
             $langs[$fbid] = $fluidbooks[$fbid]->locale;
             $countries[$fbid] = $fluidbooks[$fbid]->country;
+            $devices[$fbid] = $fluidbooks[$fbid]->mobileNavigationType === 'mobilefirst' ? 'mf' : 'd';
         }
 
+        // We have at least one desktop and one mobile first
+        $multipleDevices = count(array_unique($devices)) > 1;
+
         $options = $this->getCollectionGlobalSettings();
         $options['scorm_enable'] = $scorm;
+        // We don't want an hybrid fluidbook in a collection
+        $options['mobilefirstFluidbookId'] = '';
 
-        if ($data->locale_switch) {
+        // Switch is disabled for multidevices packages
+        if (!$multipleDevices && $data->locale_switch) {
             $multilang = [];
             foreach ($langs as $fbid => $lang) {
                 if ($countries[$fbid]) {
@@ -165,8 +172,27 @@ class FluidbookCollectionDownload extends DownloadBase
         }
 
         $jobs = [];
+        $versionsByLanguage = [];
+        $versionsByDevice = [];
+        $allVersions = [];
         foreach ($fluidbooks as $fbid => $publication) {
-            $jobs[] = $this->_jobDownloadFluidbook($fbid, $scorm ? 'scorm' : 'online', $path . $langs[$fbid], $options);
+            $dir = $langs[$fbid];
+            if ($multipleDevices) {
+                $dir .= '_' . $devices[$fbid];
+                if (!isset($versionsByDevice[$devices[$fbid]])) {
+                    $versionsByDevice[$devices[$fbid]] = [];
+                }
+                if (!isset($versionsByLanguage[$langs[$fbid]])) {
+                    $versionsByLanguage[$langs[$fbid]] = [];
+                }
+                $versionsByDevice[$devices[$fbid]][$langs[$fbid]] = $dir;
+                $versionsByLanguage[$langs[$fbid]][$devices[$fbid]] = $dir;
+            } else {
+                $versionsByLanguage[$langs[$fbid]] = $dir;
+            }
+            $allVersions[] = $dir;
+
+            $jobs[] = $this->_jobDownloadFluidbook($fbid, $scorm ? 'scorm' : 'online', $path . $dir, $options);
         }
         $this->_waitJobs($jobs);
 
@@ -178,9 +204,9 @@ class FluidbookCollectionDownload extends DownloadBase
 
         if ($scorm) {
             $manifestFile = $path . 'imsmanifest.xml';
-            foreach ($langs as $lang) {
-                $manifest = $path . $lang . '/imsmanifest.xml';
-                if ($lang === $default) {
+            foreach ($allVersions as $k => $dir) {
+                $manifest = $path . $dir . '/imsmanifest.xml';
+                if ($k === 0) {
                     rename($manifest, $manifestFile);
                 } else if (file_exists($manifest)) {
                     unlink($manifest);
@@ -192,7 +218,17 @@ class FluidbookCollectionDownload extends DownloadBase
             file_put_contents($manifestFile, $manifestContent);
         }
 
-        file_put_contents($path . '/index.html', self::getRedirectScript($langs, $default));
+        if ($multipleDevices) {
+            if ($data->redirection_algorithm === 'language') {
+                $redirectScript = self::getMultiDevicesRedirectScript($versionsByLanguage, $default, $data->redirection_algorithm);
+            } else {
+                $redirectScript = self::getMultiDevicesRedirectScript($versionsByDevice, $default, $data->redirection_algorithm);
+            }
+        } else {
+            $redirectScript = self::getRedirectScript($versionsByLanguage, $default);
+        }
+
+        file_put_contents($path . '/index.html', $redirectScript);
     }
 
     protected function package($fbid, $version, $options, $path)
@@ -244,7 +280,11 @@ class FluidbookCollectionDownload extends DownloadBase
         /** @var $job FluidbookPackage */
         if ($compilerVersion == 2) {
             $job = new FluidbookWS2Download();
-            $job->setCredentials([$this->user->email, $this->user->api_token]);
+            if (null === $this->user) {
+                $job->setCredentials(['api@fluidbook.com', 'Dxsm2nqsvbV4ubH8KUEMRpbfsRrsDZagJkCZV2Nvuy83oPqsSEKC6ircWdC2']);
+            } else {
+                $job->setCredentials([$this->user->email, $this->user->api_token]);
+            }
         } else if ($compilerVersion == 3) {
             $job = new FluidbookPackage();
         }
@@ -331,32 +371,76 @@ class FluidbookCollectionDownload extends DownloadBase
     }
 
 
-    public static function getRedirectScript($langs, $default = 'en')
+    public static function getRedirectScript($versions, $default = 'en')
+    {
+        return self::_getRedirectScript("var dir=guessPreferredLanguageVersion(" . json_encode($versions) . ",'" . $default . "');");
+    }
+
+    public static function getMultiDevicesRedirectScript($versions, $default = 'en', $priority = 'language')
+    {
+        return self::_getRedirectScript("var dir=guessPreferredVersion('" . $priority . "'," . json_encode($versions) . ",'" . $default . "');");
+    }
+
+    protected static function _getRedirectScript($code)
     {
         return "<html>
 <head></head>
 <body>
 <script type=\"text/javascript\">
-function guessPreferedLanguage(available, defaultLanguage) {
-    if (defaultLanguage == undefined) {
-        defaultLanguage = available[0];
-    }
 
+function guessPreferredLanguageVersion(versions, defaultLanguage) {
    var browserLanguages = getLanguagesFromBrowser();
-    var res = null;
+   var res = null;
 
    for (var i = 0; i < browserLanguages.length; i++) {
+        var bl = browserLanguages[i];
+        if (versions[bl] !== undefined) {
+            res = versions[bl];
+            break;
+        }
+    }
+    if (res == null) {
+        return versions[defaultLanguage];
+    }
+
+   return res;
+}
+
+function guessPreferredLanguage(available, defaultLanguage){
+    var browserLanguages = getLanguagesFromBrowser();
+    var res = null;
+
+    for (var i = 0; i < browserLanguages.length; i++) {
         var bl = browserLanguages[i];
         if (available.indexOf(bl) >= 0) {
             res = bl;
             break;
         }
     }
+
     if (res == null) {
         return defaultLanguage;
     }
+    return res;
 
-   return res;
+}
+
+function getPreferredDevice(){
+    return window.matchMedia('(min-device-width: 640px) and (min-device-height: 640px)').matches?'d':'mf';
+}
+
+function guessPreferredVersion(priority, versions, defaultLanguage){
+    if(priority==='language'){
+        var language=guessPreferredLanguage(versions.keys(),defaultLanguage);
+        var device=getPreferredDevice();
+        if(versions[language][device]!==undefined){
+            return versions[language][device];
+        }
+        device=device==='mf'?'d':'mf';
+        return versions[language][device];
+    }else{
+        return guessPreferredLanguageVersion(versions[getPreferredDevice()],defaultLanguage);
+    }
 }
 
 function getLanguagesFromBrowser() {
@@ -374,8 +458,8 @@ function getLanguagesFromBrowser() {
    return res;
 }
 
-var locale=guessPreferedLanguage(" . json_encode(array_values($langs)) . ",'" . $default . "');
-window.location='./' + locale + '/index.html';
+$code
+window.location='./' + dir + '/index.html';
 </script>
 </body>
 </html>";
index 498c76d76da9cf215c6ff87286d81cfd81a10dbe..ce9d86d1a355912229fdc907a72071c9ddbe61e3 100644 (file)
@@ -10,7 +10,6 @@ use App\Models\Base\ToolboxModel;
 use App\Models\Traits\CheckHash;
 use App\Slack\Slack;
 use App\SubForms\CollectionPublication;
-use App\SubForms\Fluidbook_Setting;
 use Cubist\Backpack\Magic\Fields\BunchOfFieldsMultiple;
 use Cubist\Backpack\Magic\Fields\Checkbox;
 use Cubist\Backpack\Magic\Fields\ExternalPath;
@@ -45,6 +44,13 @@ class FluidbookCollection extends ToolboxModel
         $this->addField('hash', Hidden::class);
         $this->addField('type', SelectFromArray::class, __('Type'), ['can' => 'fluidbook-collection:write', 'column' => true, 'options' => ['export' => __('Export'), 'export_multilang' => __('Export multilingue'), 'scorm_multilang' => __('SCORM multilingue')]]);
         $this->addField('locale_switch', Checkbox::class, __('Permettre le changement de langue'), ['when' => ['type' => ['scorm_multilang', 'export_multilang']], 'default' => true]);
+        $this->addField('redirection_algorithm', SelectFromArray::class, __('Algorithme de choix de la version'),
+            [
+                'when' => ['type' => ['scorm_multilang', 'export_multilang']],
+                'default' => 'language', 'databaseDefault' => 'language',
+                'options' => ['language' => __('La langue de l\'utilisateur est prioritaire sur l\'appareil'), 'device' => __('L\'appareil est prioritaire sur la langue')],
+            ]
+        );
         $this->addField('version', FluidbookExportVersion::class, __('Version'), ['when' => ['type' => 'export']]);
         $this->addField('publications', BunchOfFieldsMultiple::class, __('Publications'), ['bunch' => CollectionPublication::class, 'edit_label' => '%fluidbook > %dir']);
         $this->addField('install', ExternalPath::class, 'Installer sur un serveur externe', ['default' => '', 'fake' => true, 'translatable' => false, 'store_in' => 'settings', 'servers_model' => FluidbookExternalInstallServer::class, ['when' => ['type' => ['export', 'export_multilang']]]]);