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;
}
$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]) {
}
$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);
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);
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)
/** @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();
}
}
- 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() {
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>";
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;
$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']]]]);