From 8780396f792a04b8e3cf0a9e45fdfc3a9247878f Mon Sep 17 00:00:00 2001 From: "vincent@cubedesigners.com" Date: Fri, 21 Jun 2013 16:55:33 +0000 Subject: [PATCH] --- .htaccess | 14 ++ fluidbook/back.jpg | Bin 0 -> 76093 bytes inc/commons/class.common.tools.php | 21 +++ inc/ws/Controlleur/class.ws.ajax.php | 128 ++++++++++++++++-- inc/ws/Controlleur/class.ws.services.php | 33 ++++- inc/ws/Controlleur/class.ws.url.php | 27 +++- inc/ws/Util/class.ws.exporter.php | 80 ++++++++++- .../html5/app/class.ws.html5.app.compiler.php | 57 ++++++-- inc/ws/Util/html5/class.ws.html5.compiler.php | 22 ++- .../packager/class.ws.packager.phonegap.php | 14 +- inc/ws/Util/packager/class.ws.packager.php | 6 +- js/common.js | 12 ++ js/ws.js | 2 +- style/ws/style.css | 2 +- 14 files changed, 371 insertions(+), 47 deletions(-) create mode 100644 fluidbook/back.jpg diff --git a/.htaccess b/.htaccess index fcd44da24..e559b86a5 100644 --- a/.htaccess +++ b/.htaccess @@ -14,6 +14,20 @@ AddCharset UTF-8 log Header set Access-Control-Allow-Origin "*" + + SetOutputFilter DEFLATE + SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png|swf|zip|exe|mp3|f4v|ogv|ogg|ogm|webm|mp4|flv|gz|pdf|swc)$ no-gzip dont-vary + + + Header append Vary User-Agent + + + BrowserMatch ^Mozilla/4 gzip-only-text/html + BrowserMatch ^Mozilla/4\.0[678] no-gzip + BrowserMatch \bMSIE !no-gzip !gzip-only-text/html + + + RewriteEngine on RewriteBase / diff --git a/fluidbook/back.jpg b/fluidbook/back.jpg new file mode 100644 index 0000000000000000000000000000000000000000..809d9b3d1d9fc9327b9e1dabb12bbe8945b7a8e3 GIT binary patch literal 76093 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 Ip7q)P0k0FHSpWb4 literal 0 HcmV?d00001 diff --git a/inc/commons/class.common.tools.php b/inc/commons/class.common.tools.php index 9eb896a16..daebf438c 100644 --- a/inc/commons/class.common.tools.php +++ b/inc/commons/class.common.tools.php @@ -836,6 +836,27 @@ class commonTools { } } + public static function copyWsAssets() { + commonDroits::min(5); + global $core; + $res = commonPage::barre(); + $res .= commonPage::tMain(); + $res .= commonPage::bh(); + $res.='
'; + $res.=''; + $res.=''; + $res.=''; + $res.=''; + $res.=''; + $res.=''; + $res.='
' . __("Copie de fichiers entre deux fluidbook") . '
Fluidbook source' . form::field('source', 5, 6) . '
Fluidbook destination' . form::field('dest', 5, 6) . '
Fichiers à transférerEntrez le numéro du fluidbook source pour sélectionner les fichiers à transférer
' . $core->typo->BoutonOK(__('Copier')) . '
'; + $res.='
'; + $res .= ''; + $res .= commonPage::bf(); + $res .= commonPage::bMain(); + return $res; + } + protected static function searchGoogle($q, $cx, $key) { global $core; diff --git a/inc/ws/Controlleur/class.ws.ajax.php b/inc/ws/Controlleur/class.ws.ajax.php index b2ea17c6b..f8b19ef68 100644 --- a/inc/ws/Controlleur/class.ws.ajax.php +++ b/inc/ws/Controlleur/class.ws.ajax.php @@ -24,7 +24,7 @@ class wsAjax extends cubeAjax { public static function saveClient($args, &$x) { global $core; $dao = new commonDAOEntreprise($core->con); - // Creation de l'entreprise +// Creation de l'entreprise if ($_POST['entreprise_id'] == 'new') { if (!isset($_POST['ws_admin']) || !$_POST['ws_admin']) { $_POST['ws_admin'] = $core->user->utilisateur_id; @@ -35,7 +35,7 @@ class wsAjax extends cubeAjax { $_POST['ws_admin'] = $core->user->utilisateur_id; } $entreprise = $dao->sauve($_POST); - // Si c'est une nouvelle entreprise, on crée également le contact +// Si c'est une nouvelle entreprise, on crée également le contact if ($_POST['entreprise_id'] == 'new') { $data = $_POST['contact']; $data['entreprise'] = $entreprise->entreprise_id; @@ -231,10 +231,12 @@ class wsAjax extends cubeAjax { if (isset($_FILES[$t]) && !$_FILES[$t]['error']) { $ext = CubeIT_Files::getExtension($_FILES[$t]['name']); move_uploaded_file($_FILES[$t]['tmp_name'], $wdir . '/' . $t . '.' . $ext); - $_POST['theme'][$t] = $t . '.' . $ext; + $save['theme'][$t] = $t . '.' . $ext; } } + + foreach ($_POST['group'] as $gid => $group) { if ($gid && $gid == 'new_') { continue; @@ -450,13 +452,13 @@ class wsAjax extends cubeAjax { if (!self::valideDemandeDevis($x)) { return; } - // L'utilisateur est-il déjà dans la base ? +// L'utilisateur est-il déjà dans la base ? $daoUtilisateur = new commonDAOUtilisateur($core->con); $utilisateur = $daoUtilisateur->selectByEmail($_POST['email']); if ($utilisateur != null) { $utilisateur_id = $utilisateur->utilisateur_id; } else { - // Création de l'entreprise +// Création de l'entreprise $daoEntreprise = new commonDAOEntreprise($core->con); $datas = array(); $datas['entreprise_id'] = 'new'; @@ -474,7 +476,7 @@ class wsAjax extends cubeAjax { $datas['ws_grade'] = 1; $datas['ws_admin'] = 1; $entreprise = $daoEntreprise->sauve($datas); - // Création de l'utilisateur +// Création de l'utilisateur $datas = array(); $datas['utilisateur_id'] = 'new'; $datas['prenom'] = $_POST['prenom']; @@ -574,7 +576,7 @@ class wsAjax extends cubeAjax { $_POST['site'] = $_POST['site_internet']; } file_put_contents(ROOT . '/cache/demandeDevis.txt', print_r($_POST, true)); - // Validation des champs de formulaires +// Validation des champs de formulaires $ok = true; return $ok; } @@ -643,14 +645,14 @@ class wsAjax extends cubeAjax { } elseif ($demande->status > 1) { $res = __("Cette demande est actuellement en cours de traitement"); } else { - // On place la demande comme en cours d'édition +// On place la demande comme en cours d'édition $dao->setAdministrateur($demande->demande_id, $core->user->utilisateur_id); - // On vérifie que l'utilisateur n'est pas déjà géré par un revendeur +// On vérifie que l'utilisateur n'est pas déjà géré par un revendeur $demandeur = $daoUtilisateur->selectById($demande->utilisateur, 'utilisateurs_entreprise'); $administrateurs = $daoUtilisateur->selectWSAdministrateursId(); if (!is_null($demandeur->ws_admin) && !in_array($demandeur->ws_admin, $administrateurs)) { - // Si déjà géré par un revendeur +// Si déjà géré par un revendeur $revendeur = $daoUtilisateur->selectById($demandeur->ws_admin, 'utilisateurs_entreprise'); $actions[__('Je confie la demande à') . ' ' . $revendeur->rs . ' (' . $revendeur->prenom . ' ' . $revendeur->nom . ')'] = $demandeur->ws_admin; } else { @@ -1053,7 +1055,7 @@ class wsAjax extends cubeAjax { $env = Zend_Mobile_Push_Apns::SERVER_SANDBOX_URI; - // Notifications +// Notifications $apns = new Zend_Mobile_Push_Apns(); if ($env == Zend_Mobile_Push_Apns::SERVER_SANDBOX_URI) { @@ -1077,6 +1079,108 @@ class wsAjax extends cubeAjax { $apns->close(); } -} + public function fluidbookAssets($args, &$x) { + $id = $args[1]; + if (!$id) { + $c = __('Entrez le numéro du fluidbook source pour sélectionner les fichiers à transférer'); + } else { + $dr = opendir(WS_BOOKS . '/working/' . $id); + $files = array(); + while ($f = readdir($dr)) { + if ($f == '.' || $f == '..') { + continue; + } + + $files[$f] = $f; + $checked[] = $f; + } + + ksort($files); + + if (!count($files)) { + $c = __('Aucun fichier à transférer'); + } else { + $c = cubeForm::checkMultiple('files', $files, count($files), $checked); + } + } + + $x->addContent('f', $c); + } + + public function copywsassets($args, &$x) { + if (!isset($_POST['files']) || !count($_POST['files'])) { + $x->addAlert(__('Aucun fichier sélectionné')); + return; + } elseif (!isset($_POST['dest']) || !$_POST['dest']) { + $x->addAlert(__('Destination invalide')); + return; + } + + $d = WS_BOOKS . '/working/' . $_POST['dest']; + if (!file_exists($d)) { + mkdir($d, 0777, true); + } + $s = WS_BOOKS . '/working/' . $_POST['source']; + + foreach ($_POST['files'] as $f) { + copy($s . '/' . $f, $d . '/' . $f); + } + $x->addAlert(__('Copie effectuée')); + } + + public static function collectionVersionCreate($args, &$x) { + global $core; + $id = $args[1]; + $compiler = new wsHTML5AppCompiler($id); + $time = $compiler->createVersion(); + + file_put_contents(WS_COLLECTIONS . '/versions/' . $id . '/' . $time . '/composition.json', json_encode($compiler->collection->datas)); + + $c = $core->con->openCursor('book_collection_compile'); + $c->collection_id = $id; + $c->compile_date = $time; + $c->online = 0; + $c->insert(); + + $x->addReload(); + } + + public static function collectionVersionPublish($args, &$x) { + global $core; + + $id = $args[1]; + $date = $args[2]; + + $c = $core->con->openCursor('book_collection_compile'); + $c->online = 0; + $c->update('WHERE collection_id=\'' . $core->con->escape($id) . '\' AND online=1'); + + $c = $core->con->openCursor('book_collection_compile'); + $c->online = 1; + $c->update('WHERE collection_id=\'' . $core->con->escape($id) . '\' AND compile_date=\'' . $core->con->escape($date) . '\''); + + $cache = WS_COLLECTIONS . '/ws/' . $id . '.json'; + if (file_exists($cache)) { + unlink($cache); + } + + $x->addReload(); + } + + public static function collectionVersionDelete($args, &$x) { + global $core; + + $id = $args[1]; + $date = $args[2]; + + if ($id && $date) { + $d = WS_COLLECTIONS . '/versions/' . $id . '/' . $date; + `rm -rf $d`; + $core->con->execute('DELETE FROM book_collection_compile WHERE collection_id=\'' . $core->con->escape($id) . '\' AND compile_date=\'' . $core->con->escape($date) . '\''); + } + $x->addReload(); + } + +} ?> \ No newline at end of file diff --git a/inc/ws/Controlleur/class.ws.services.php b/inc/ws/Controlleur/class.ws.services.php index a4b65a299..d91e7757d 100644 --- a/inc/ws/Controlleur/class.ws.services.php +++ b/inc/ws/Controlleur/class.ws.services.php @@ -552,9 +552,40 @@ class wsServices extends cubeFlashGateway { } public function collection() { + global $core; + $id = $this->callArgs[0]; $this->outputXML = false; header('Content-type: application/json'); - echo '[]'; + + $cache = WS_COLLECTIONS . '/ws/' . $id . '.json'; + $limit = TIME - 7200; + if (!file_exists($cache) || filemtime($cache) < $limit) { + $r = $core->con->select('SELECT * FROM book_collection_compile WHERE online=1 AND collection_id=\'' . $core->con->escape($id) . '\''); + $r->fetch(); + $version = $r->compile_date; + + $composition = json_decode(file_get_contents(WS_COLLECTIONS . '/versions/' . $id . '/' . $version . '/composition.json')); + + $couvertures = array(); + foreach ($composition as $k => $g) { + foreach ($g->publications as $l => $p) { + $couv = WS_COLLECTIONS . '/versions/' . $id . '/' . $version . '/ios/' . $p->id . '/data/background/36/t1.jpg'; + $couvertures[$p->id] = base64_encode(file_get_contents($couv)); + } + } + + $d = array('id' => $id, 'time' => $version, 'datas' => $composition, 'couvertures' => $couvertures); + + $dao = new wsDAOCollection($core->con); + $col = $dao->selectById($id); + + $json = json_encode($d); + file_put_contents($cache, $json); + echo $json; + } else { + echo file_get_contents($cache); + } + exit; } diff --git a/inc/ws/Controlleur/class.ws.url.php b/inc/ws/Controlleur/class.ws.url.php index 761725406..c08d364af 100644 --- a/inc/ws/Controlleur/class.ws.url.php +++ b/inc/ws/Controlleur/class.ws.url.php @@ -214,7 +214,6 @@ class wsUrl { $collection = $dao->selectById($args[1]); $shortcuts = array(); - $shortcuts[] = '
' . $core->typo->Ajouter('Nouveau groupe') . ''; $res = commonPage::barre(null, null, null, $shortcuts); $res .= commonPage::tMain(); @@ -231,13 +230,13 @@ class wsUrl { global $core; $res = '

Gestion de la collection « ' . $collection->nom . ' » # ' . $collection->collection_id . '

'; - $res.='
'; $res.=''; $res.=''; $res.=''; - $res.='
#' . form::hidden('collection_id', $collection->collection_id) . $collection->collection_id . '
' . __('Nom de la collection') . '' . form::field('nom', 20, 64, $collection->nom) . '
'; $res.='

' . __('Composition') . '

'; + $res.='' . $core->typo->Ajouter(__('Nouveau groupe')) . '

'; $res .= '
    '; @@ -315,8 +314,26 @@ class wsUrl { $res.=''; $res.='

    '; $res.='

    ' . __('Versions') . '

    '; - - $res.='' . $core->typo->Ajouter(__('Publier et notifier les utilisateurs')) . ''; + $res.='' . $core->typo->Ajouter(__('Créer une version')) . '

    '; + $r = $core->con->select('SELECT * FROM book_collection_compile WHERE collection_id=\'' . $collection->collection_id . '\' ORDER BY compile_date DESC'); + if (!$r->count()) { + $res.=__('Aucune version de la collection n\'a été crée'); + } else { + $res.=''; + $res.=''; + while ($r->fetch()) { + if (!$r->online) { + $publish = '
    ' . __('Publier') . '
    '; + $del = '
    ' . __('Effacer') . '
    '; + } else { + $publish = ''; + $del = ''; + } + $res.=''; + } + $res.='
    ' . __('Date') . '' . __('Publiée') . '
    ' . date('Y-m-d H:i:s', $r->compile_date) . '' . ($r->online ? __('Oui') : __('Non')) . '' . $publish . '' . $del . '
    '; + } + $res.='
    ' . $core->typo->Ajouter(__('Publier et notifier les utilisateurs')) . ''; $res.='

    ' . __('Export') . '

    '; $res.='' . $core->typo->Ajouter(__('Exporter pour Android')) . ' ' . $core->typo->Ajouter(__('Exporter pour iOS')) . ''; diff --git a/inc/ws/Util/class.ws.exporter.php b/inc/ws/Util/class.ws.exporter.php index cc3322824..2180570a0 100644 --- a/inc/ws/Util/class.ws.exporter.php +++ b/inc/ws/Util/class.ws.exporter.php @@ -16,17 +16,81 @@ class wsExporter { public function exportCollection($collectionId, $os) { global $core; - $compiler = new wsHTML5AppCompiler($collectionId, $os, 'collection'); - $dir = $compiler->compile(); + $compiler = new wsHTML5AppCompiler($collectionId); + $dir = $compiler->compile($os, 'collection'); $collection = $compiler->collection; $d = str_replace('.', '/', $collection->settings['namespace']); $dest = $d . '/www/'; $this->_createProject($os, $collection->nom, $collection->settings['namespace']); + $this->_collectionAssets($os, $compiler); $this->_transfertPhonegap($os, $dir, $dest); } + /** + * + * @param string $os + * @param wsHTML5AppCompiler $compiler + */ + protected function _collectionAssets($os, $compiler) { + if ($os == 'ios') { + $collection = $compiler->collection; + $src = $compiler->wdir . '/' . $collection->theme['icon']; + // icones + $icons = array(57 => 'icon', 72 => 'icon-72', 114 => 'icon@2x', 144 => 'icon-72@2x'); + $d = WS_COLLECTIONS . '/resources/' . $collection->collection_id . '/' . $os . '/icons/'; + if (!file_exists($d)) { + mkdir($d, 0777, true); + } + foreach ($icons as $s => $n) { + + $dest = $d . $n . '.png'; + if (!$this->_testFile($src, $dest)) { + wsPackagerPhonegap::__makeIcon($src, $dest, $s); + } + } + + // splashs + $splashs = array('320x480' => 'Default~iphone', '640x960' => 'Default@2x~iphone', '1024x748' => 'Default-Landscape~ipad', '768x1004' => 'Default-Portrait~ipad', '2048x1496' => 'Default-Landscape@2x~ipad', '1536x2008' => 'Default-Portrait@2x~ipad', '640x1136' => 'Default-568h@2x~iphone'); + + $d = WS_COLLECTIONS . '/resources/' . $collection->collection_id . '/' . $os . '/splash/'; + if (!file_exists($d)) { + mkdir($d, 0777, true); + } + + $src = $compiler->wdir . '/' . $collection->theme['splash']; + foreach ($splashs as $size => $name) { + list($width, $height) = explode('x', $size); + + $dest = $d . $name . '.png'; + + if (!$this->_testFile($src, $dest)) { + $it = new cubeImageTools(); + $it->loadImage($src); + $it->resize($width, $height, 'crop', false, 'C', 'M', 'transparent'); + $it->output('png', $dest); + } + } + + + // Transfert + `sudo /usr/local/bin/remountmac`; + + $this->_rsync(WS_COLLECTIONS . '/resources/' . $collection->collection_id . '/' . $os, "/mnt/macbox" . $this->_iosProjectDir($collection->settings['namespace']) . '/' . CubeIT_Text::str2URL($collection->nom) . '/Resources', false); + } + } + + protected function _testFile($ref, $dest) { + if (!file_exists($dest)) { + return false; + } + if (filemtime($ref) > filemtime($dest)) { + return false; + } + return true; + } + protected function _createProject($os, $name, $ns) { if ($os == 'ios') { $dir = $this->_iosProjectDir($ns); @@ -101,6 +165,8 @@ class wsExporter { $this->_phonegap(); } else if ($this->metaAction == 'install') { $this->_install(); + } else if ($this->metaAction == 'phonegapcollection') { + $this->_phonegapcollection(); } } @@ -109,6 +175,14 @@ class wsExporter { return in_array($this->version, $yes); } + protected function _phonegapcollection() { + $d = '/' . $this->destinationDir; + + $packager = new wsPackagerPhonegap($this->book_id, $d, true, false, $this->version); + $packager->ignoreCache = false; + return $packager->makePackage(false); + } + protected function _install() { $package = wsPackager::package($this->book_id, $this->version, $this->_haveToZip()); @@ -155,6 +229,7 @@ class wsExporter { } $packager = new wsPackagerPhonegap($this->book_id, null, true, false, $os); + $packager->cleanOnDestruct = false; $package = $packager->makePackage(false); $this->_transfertPhonegap($os, $package, $this->destinationDir); @@ -232,7 +307,6 @@ class wsExporter { list($distServer, $distDir) = explode(':', $dest); } - if (!file_exists($dest)) { if (!$destDistant) { mkdir($dest, 0777, true); diff --git a/inc/ws/Util/html5/app/class.ws.html5.app.compiler.php b/inc/ws/Util/html5/app/class.ws.html5.app.compiler.php index 97644c518..2e930b949 100644 --- a/inc/ws/Util/html5/app/class.ws.html5.app.compiler.php +++ b/inc/ws/Util/html5/app/class.ws.html5.app.compiler.php @@ -8,24 +8,42 @@ class wsHTML5AppCompiler { public $os; public $phonegapVersion; - public function __construct($collectionId, $os, $phonegapVersion = 'latest') { + public function __construct($collectionId) { global $core; $this->collectionId = $collectionId; $dao = new wsDAOCollection($core->con); $this->collection = $dao->selectById($this->collectionId); + } - if ($phonegapVersion == 'collection') { - $phonegapVersion = $this->collection->settings['phonegap']; + public function createVersion() { + $os = array('ios', 'android'); + $time = time(); + + $dir = WS_COLLECTIONS . '/versions/' . $this->collectionId . '/' . $time . '/'; + + $books = array(); + foreach ($this->collection->datas as $group) { + foreach ($group['publications'] as $p) { + $books[] = $p['id']; + } } - $this->phonegapVersion = wsHTML5Compiler::getPhonegapVersion($phonegapVersion); - $this->os = $os; + $exporter = new wsExporter(); + foreach ($os as $o) { + $d = $dir . $o . '/'; + foreach ($books as $bid) { + $dd = $d . $bid; - $this->vdir = $this->dir = WS_COLLECTIONS . '/app/' . $this->collectionId . '/'; - $this->wdir = WS_COLLECTIONS . '/working/' . $this->collectionId; - $this->sdir = WS_COMPILE_ASSETS . '/_html5app/'; + if (!file_exists($dd)) { + mkdir($dd, 0777, true); + } + $exporter->export($bid, $x, 'phonegapcollection', $o, $dd); + } + } + + return $time; } protected function copy($s, $t) { @@ -64,7 +82,18 @@ class wsHTML5AppCompiler { } } - function compile() { + function compile($os, $phonegapVersion = 'latest') { + if ($phonegapVersion == 'collection') { + $phonegapVersion = $this->collection->settings['phonegap']; + } + + $this->phonegapVersion = wsHTML5Compiler::getPhonegapVersion($phonegapVersion); + $this->os = $os; + + $this->vdir = $this->dir = WS_COLLECTIONS . '/app/' . $this->collectionId . '/'; + $this->wdir = WS_COLLECTIONS . '/working/' . $this->collectionId; + $this->sdir = WS_COMPILE_ASSETS . '/_html5app/'; + $this->copyRecursive($this->sdir, $this->vdir); $this->writeStyle(); @@ -88,7 +117,15 @@ class wsHTML5AppCompiler { function writeStyle() { $c = array(); - $c[] = 'body{background-image:url("data/images/' . $this->collection->theme['back'] . '");}'; + + $imagesdir = $this->vdir . '/data/images/'; + if (!file_exists($imagesdir)) { + mkdir($imagesdir, 0777, true); + } + + $this->copy($this->wdir . '/' . $this->collection->theme['back'], $imagesdir . '/' . $this->collection->theme['back']); + + $c[] = 'body{background-image:url("images/' . $this->collection->theme['back'] . '");}'; file_put_contents($this->vdir . '/data/app.css', implode("\n", $c)); } diff --git a/inc/ws/Util/html5/class.ws.html5.compiler.php b/inc/ws/Util/html5/class.ws.html5.compiler.php index 406c36c73..9df43eb93 100644 --- a/inc/ws/Util/html5/class.ws.html5.compiler.php +++ b/inc/ws/Util/html5/class.ws.html5.compiler.php @@ -2,7 +2,7 @@ class wsHTML5Compiler { - public static function factory($book_id, $version = 'stable', $phonegap = false, $phonegapVersion = 'latest', $dir = null, $standalone = false) { + public static function factory($book_id, $version = 'stable', $phonegap = false, $phonegapVersion = 'latest', $dir = null, $standalone = false, $appcache = false) { if (is_null($version)) { global $core; $dao = new wsDAOBook($core->con); @@ -11,9 +11,9 @@ class wsHTML5Compiler { } if ($version == 'stable') { - return new wsHTML5Compiler($book_id, 'stable', $phonegap, $phonegapVersion, $dir, $standalone); + return new wsHTML5Compiler($book_id, 'stable', $phonegap, $phonegapVersion, $dir, $standalone, $appcache); } else { - return new wsHTML5CompilerDev($book_id, 'dev', $phonegap, $phonegapVersion, $dir, $standalone); + return new wsHTML5CompilerDev($book_id, 'dev', $phonegap, $phonegapVersion, $dir, $standalone, $appcache); } } @@ -139,11 +139,13 @@ class wsHTML5Compiler { protected $phonegapVersion; protected $standalone = false; protected $hiddenContents = array(); + protected $appcache; - function __construct($book_id, $version = 'stable', $phonegap = false, $phonegapVersion = 'latest', $dir = null, $standalone = false) { + function __construct($book_id, $version = 'stable', $phonegap = false, $phonegapVersion = 'latest', $dir = null, $standalone = false, $appcache = false) { global $core; $this->phonegapVersion = self::getPhonegapVersion($phonegapVersion); + $this->appcache = $appcache; if ($version == 'stable') { $this->assets = WS_COMPILE_ASSETS . '/_html5prod'; @@ -153,6 +155,7 @@ class wsHTML5Compiler { } $this->phonegap = $phonegap; $this->standalone = $standalone || $this->phonegap; + $this->appcache = $appcache; cubePHP::set_memory('4G'); @@ -344,7 +347,7 @@ class wsHTML5Compiler { } protected function writeCache() { - if ($this->phonegap) { + if (!$this->appcache) { return; } @@ -479,6 +482,11 @@ class wsHTML5Compiler { $pagesContents = ''; + $cache = ''; + if ($this->appcache) { + $cache = ' manifest="cache.appcache"'; + } + $script = ''; if ($this->phonegap) { $script .= '' . "\n"; @@ -542,7 +550,7 @@ class wsHTML5Compiler { } } - $vars = array('titre', 'credits', 'ga', 'style', 'script', 'pagesContents', 'description', 'print', 'hiddenContents', 'splash'); + $vars = array('titre', 'credits', 'ga', 'style', 'script', 'pagesContents', 'description', 'print', 'hiddenContents', 'splash','cache'); foreach ($vars as $v) { $html = str_replace('', $$v, $html); } @@ -570,7 +578,7 @@ class wsHTML5Compiler { $thtml = $uhtml; - $vars = array('titre', 'credits', 'ga', 'style', 'script', 'pagesContents', 'print', 'hiddenContents', 'splash'); + $vars = array('titre', 'credits', 'ga', 'style', 'script', 'pagesContents', 'print', 'hiddenContents', 'splash','cache'); foreach ($vars as $v) { $uhtml = str_replace('', $$v, $uhtml); } diff --git a/inc/ws/Util/packager/class.ws.packager.phonegap.php b/inc/ws/Util/packager/class.ws.packager.phonegap.php index 34ceffbbd..52b5276f1 100644 --- a/inc/ws/Util/packager/class.ws.packager.phonegap.php +++ b/inc/ws/Util/packager/class.ws.packager.phonegap.php @@ -6,6 +6,7 @@ class wsPackagerPhonegap extends wsPackager { protected $makeResources = true; protected $os = 'all'; protected $supportedOS = array('ios', 'android'); + public $ignoreCache = true; public function __construct($book_id, $vdir = null, $whole = true, $makeResources = true, $os = 'all') { $this->makeResources = $makeResources; @@ -29,13 +30,12 @@ class wsPackagerPhonegap extends wsPackager { $vdir.='/' . $os; } - $compiler = wsHTML5Compiler::factory($this->book_id, null, $os, 'latest', $vdir); + $compiler = wsHTML5Compiler::factory($this->book_id, null, $os, 'latest', $vdir,false,!$this->ignoreCache); $compiler->compile(); unlink($vdir . '/indext.html'); unlink($vdir . '/indexu.html'); unlink($vdir . '/widget.html'); - unlink($vdir . '/cache.appcache'); if ($this->makeResources) { $this->makeScreenshots(); @@ -156,7 +156,7 @@ class wsPackagerPhonegap extends wsPackager { if (!file_exists($resources . '/splash')) { mkdir($resources . '/splash', 0777, true); } - if (!file_exists($this->resources . '/icons')) { + if (!file_exists($resources . '/icons')) { mkdir($resources . '/icons', 0777, true); } @@ -203,10 +203,14 @@ class wsPackagerPhonegap extends wsPackager { $base = WS_COMPILE_ASSETS . '/_ico/phonegap.png'; } + self::__makeIcon($base, $dir . '/' . $name . '.png', $size); + } + + public static function __makeIcon($src, $dest, $size) { $it = new cubeImageTools(); - $it->loadImage($base); + $it->loadImage($src); $it->resize($size, $size, 'ratio', false, 'C', 'M', 'transparent'); - $it->output('png', $dir . '/' . $name . '.png'); + $it->output('png', $dest); } protected function _drawBackImage($im, $width, $height) { diff --git a/inc/ws/Util/packager/class.ws.packager.php b/inc/ws/Util/packager/class.ws.packager.php index 9b959dd98..398c5c306 100644 --- a/inc/ws/Util/packager/class.ws.packager.php +++ b/inc/ws/Util/packager/class.ws.packager.php @@ -14,6 +14,7 @@ class wsPackager { protected $zip; protected $workingDir; protected $whole = true; + public $cleanOnDestruct = true; public static function package($book_id, $version, $zip = true) { global $packager; @@ -189,6 +190,7 @@ class wsPackager { protected function cleanVdir() { if (file_exists($this->vdir)) { + return; // Suppression du répertoire si il existe $rm = new cubeCommandLine('rm'); $rm->setArg('r'); @@ -212,13 +214,13 @@ class wsPackager { } public function __destruct() { - if ($this->whole) { + if ($this->whole && $this->cleanOnDestruct) { $this->cleanVdir(); } } public function copy($source, $dest) { - if(!file_exists($source)){ + if (!file_exists($source)) { return; } copy($source, $dest); diff --git a/js/common.js b/js/common.js index b56a7c697..484c33d66 100644 --- a/js/common.js +++ b/js/common.js @@ -68,6 +68,8 @@ function load_common_extranet() { }); }); + + $("#dash .toggle").click(function() { var rel = $(this).attr('rel'); var div = $(this).parents('.dashboard').get(0); @@ -150,6 +152,16 @@ function load_common_extranet() { return true; }); + $("#copywsassets").off('change blur').on('change blur', "#source", function() { + $.ajax({ + url: SITE_PATH + 'ajax/fluidbookAssets/' + $(this).val(), + success: function(data) { + MyAjax(data); + } + }); + }); + + $(window).resize(function() { resize(); }); diff --git a/js/ws.js b/js/ws.js index d5b869c1f..c2237326c 100644 --- a/js/ws.js +++ b/js/ws.js @@ -3,7 +3,7 @@ TO_LOAD_ONCE[TO_LOAD_ONCE.length] = 'load_ws_once();'; FIRST_LOAD = true; function load_ws_once() { - $(document).on('change', 'form[action="exportbook"] select, form[action="exportbookExe"] select', function() { + $(document).on('change', 'form[action="exportbook"] select, form[action="exportbookExe"] select', function() { var form = $(this).parents('form'); $(form).find('#changed').val($(this).attr('name')); $(form).attr('action', 'exportbook').submit().attr('action', 'exportbookExe'); diff --git a/style/ws/style.css b/style/ws/style.css index 0bcf1ad5e..14dca5dfc 100644 --- a/style/ws/style.css +++ b/style/ws/style.css @@ -550,7 +550,7 @@ a.btbook{ a.btbook>div{ display:inline-block; width:16px; - height:16px; + height:16px !important; background-position: 0 0; } -- 2.39.5