From: Vincent Vanwaelscappel Date: Tue, 29 Aug 2023 17:08:39 +0000 (+0200) Subject: wip #6203 @3.5 X-Git-Url: http://git.cubedesigners.com/?a=commitdiff_plain;h=bb1fe101434d50e7a1a117fa6873125837b7c8e9;p=fluidbook-toolbox.git wip #6203 @3.5 --- diff --git a/app/Jobs/FluidbookCollectionDownload.php b/app/Jobs/FluidbookCollectionDownload.php index 99dea9cbf..31d7d3fe7 100644 --- a/app/Jobs/FluidbookCollectionDownload.php +++ b/app/Jobs/FluidbookCollectionDownload.php @@ -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 " "; diff --git a/app/Models/FluidbookCollection.php b/app/Models/FluidbookCollection.php index 498c76d76..ce9d86d1a 100644 --- a/app/Models/FluidbookCollection.php +++ b/app/Models/FluidbookCollection.php @@ -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']]]]);