desgnl Posted March 10, 2015 Share Posted March 10, 2015 Bonjour à tous, je découvre Prestashop et j'essaie de créer mon premier thème: j'ai donc fait une copie du thème par défaut et j'ai commencé à bidouiller. J'ai compris le système de hooks et les templates des modules qui sont chacun associés à un fichier css et js. Maintenant je ne souhaite pas utiliser bootstrap.css, ni les javascripts du thème par défaut. j'ai réussi à remplacer bootstrap.css par ma css et à customiser le html des templates, mais c'est beaucoup plus embrouillé au niveau du javascript. (pour la page product.js p.e. il y a plus de 1000 lignes de js qui sont à peine commentées. Il n'y a pas de séparation entre ce qui gère les appels ajax et le slideshow par exemple…) est ce que je dois fouiller dans ces fichiers javascript pour comprendre ce qui se passe ? quelle est la bonne méthodologie pour créer un thème "from scratch" ? merci pour votre aide Link to comment Share on other sites More sharing options...
desgnl Posted March 14, 2015 Author Share Posted March 14, 2015 (edited) Bon… malgré le manque de popularité de mon post précédent, je ne désespère pas: comment puis je supprimer sur le thème les appels à ces trois fichiers : • /js/jquery/jquery-1.11.0.min.js • js/jquery/jquery-migrate-1.2.1.min.js • js/jquery/plugins/jquery.easing.js je ne souhaite pas les utiliser dans mon thème, mais je ne vois pas de moyen de supprimer les appels ? merci Edited March 14, 2015 by desgnl (see edit history) Link to comment Share on other sites More sharing options...
desgnl Posted March 15, 2015 Author Share Posted March 15, 2015 (edited) je continue mon monologue… Pour supprimer les liens vers les fichiers sus-cités et ajouter mes fichiers, j'ai créé un module qui contient cette fonction: public function hookHeader() { $this->context->controller->removeJS(_PS_ROOT_DIR_.'/js/jquery/jquery-1.11.0.min.js'); $this->context->controller->removeJS(_PS_ROOT_DIR_.'/js/jquery/jquery-migrate-1.2.1.min.js'); $this->context->controller->removeJS(_PS_ROOT_DIR_.'/js/jquery/plugins/jquery.easing.js'); $this->context->controller->addCSS('http://mydomain.com/my-css-framework.css', 'all'); $this->context->controller->addJS('http://mydomain.com/my-libs.js'); } Ça marche bien, mais il reste un problème: le fichier `my-libs.js` est chargé à la suite des autres fichiers javascript. Comment le charger avant les autres fichiers js ? merci Edited March 15, 2015 by desgnl (see edit history) Link to comment Share on other sites More sharing options...
Alexandre Carette Posted March 16, 2015 Share Posted March 16, 2015 Salut, jette un oeil dans classes/controller/FrontController.php vers la ligne 766, public function setMedia() { // if website is accessed by mobile device // @see FrontControllerCore::setMobileMedia() if ($this->useMobileTheme()) { $this->setMobileMedia(); return true; } $this->addCSS(_THEME_CSS_DIR_.'grid_prestashop.css', 'all'); // retro compat themes 1.5 $this->addCSS(_THEME_CSS_DIR_.'global.css', 'all'); $this->addjquery(); $this->addjqueryPlugin('easing'); $this->addJS(_PS_JS_DIR_.'tools.js'); $this->addJS(_THEME_JS_DIR_.'global.js'); // Automatically add js files from js/autoload directory in the template if (@filemtime($this->getThemeDir().'js/autoload/')) foreach (scandir($this->getThemeDir().'js/autoload/', 0) as $file) if (preg_match('/^[^.].*\.js$/', $file)) $this->addJS($this->getThemeDir().'js/autoload/'.$file); // Automatically add css files from css/autoload directory in the template if (@filemtime($this->getThemeDir().'css/autoload/')) foreach (scandir($this->getThemeDir().'css/autoload', 0) as $file) if (preg_match('/^[^.].*\.css$/', $file)) $this->addCSS($this->getThemeDir().'css/autoload/'.$file); if (Tools::isSubmit('live_edit') && Tools::getValue('ad') && Tools::getAdminToken('AdminModulesPositions'.(int)Tab::getIdFromClassName('AdminModulesPositions').(int)Tools::getValue('id_employee'))) { $this->addJqueryUI('ui.sortable'); $this->addjqueryPlugin('fancybox'); $this->addJS(_PS_JS_DIR_.'hookLiveEdit.js'); } if (Configuration::get('PS_QUICK_VIEW')) $this->addjqueryPlugin('fancybox'); if (Configuration::get('PS_COMPARATOR_MAX_ITEM') > 0) $this->addJS(_THEME_JS_DIR_.'products-comparison.js'); // Execute Hook FrontController SetMedia Hook::exec('actionFrontControllerSetMedia', array()); } 1 Link to comment Share on other sites More sharing options...
desgnl Posted March 16, 2015 Author Share Posted March 16, 2015 Merci pour ta réponse Alexandre, c'est bien dans ce fichiers que sont appelés tous les scripts, mais je ne vois pas ce qui permet d'en determiner l'ordre de chargement ? Link to comment Share on other sites More sharing options...
Alexandre Carette Posted March 16, 2015 Share Posted March 16, 2015 tu es en CCC ? Link to comment Share on other sites More sharing options...
desgnl Posted March 16, 2015 Author Share Posted March 16, 2015 que ce soit en CCC ou pas, les fichiers externes sont chargés à la fin. et je voudrais qu'ils soient chargés avant les autres. Link to comment Share on other sites More sharing options...
Alexandre Carette Posted March 16, 2015 Share Posted March 16, 2015 essaye ca: I don know if this bug still on the 1.6, But with 1.5.X if we Adding jQuery via Google CDN and use CCC issu appear as Jquery is call after the ccc's Js File. So I puprose the change in Classe/media function cccJS change array_merge(array($protocol_link.Tools::getMediaServer($url).$url), $js_external_files); by array_merge($js_external_files,array($protocol_link.Tools::getMediaServer($url).$url)); 1 Link to comment Share on other sites More sharing options...
desgnl Posted March 16, 2015 Author Share Posted March 16, 2015 (edited) ça marche, merci ! deux autres questions: • dans quel fichier peut on faire la même modif lorsqu'on est pas en CCC ? • est ce qu'on peut faire cette modification sans toucher au core (on a le droit de rêver :-)) ? Edited March 16, 2015 by desgnl (see edit history) 1 Link to comment Share on other sites More sharing options...
Alexandre Carette Posted March 16, 2015 Share Posted March 16, 2015 1) Quand on est pas en CCC il devrait afficher logiquement dans l'ordre du code 2) Oui en créant un override 1 Link to comment Share on other sites More sharing options...
desgnl Posted March 16, 2015 Author Share Posted March 16, 2015 (edited) ok! 1. En fait j'ai coché "Move JavaScript to the end", du coup l'ordre des scripts est modifié par rapport au code source… 2. je suis en train de me renseigner sur l'override: du coup j'ai créé un fichier `Media.php` dans `mon-module/override/classes/`. est ce que tu peux me dire ce que je dois mettre dans ce fichier exactement stp ? merci beaucoup pour ton aide précieuse Edited March 16, 2015 by desgnl (see edit history) Link to comment Share on other sites More sharing options...
Alexandre Carette Posted March 16, 2015 Share Posted March 16, 2015 (edited) 2. pour l'override, il faut garder la meme hiérarchie de dossier que dans le core, ensuite tu crée un fichier avec le meme nom. Donc la pour le moment tu es bon. Dans ton Media.php <?php class Media extends MediaCore //Je declare que cette classe est une extension de la classe MediaCore { /* Mon code ici */ //Debut de la fonction que j override public static function cccJS($js_files) { //inits $compressed_js_files_not_found = array(); $js_files_infos = array(); $js_files_date = 0; $compressed_js_filename = ''; $js_external_files = array(); $protocol_link = Tools::getCurrentUrlProtocolPrefix(); $cache_path = _PS_THEME_DIR_.'cache/'; // get js files infos foreach ($js_files as $filename) { if (Validate::isAbsoluteUrl($filename)) $js_external_files[] = $filename; else { $infos = array(); $infos['uri'] = $filename; $url_data = parse_url($filename); $infos['path'] = _PS_ROOT_DIR_.Tools::str_replace_once(__PS_BASE_URI__, '/', $url_data['path']); if (!@filemtime($infos['path'])) $infos['path'] = _PS_CORE_DIR_.Tools::str_replace_once(__PS_BASE_URI__, '/', $url_data['path']); $js_files_infos[] = $infos; $js_files_date = max( file_exists($infos['path']) ? @filemtime($infos['path']) : 0, $js_files_date ); $compressed_js_filename .= $filename; } } // get compressed js file infos $compressed_js_filename = md5($compressed_js_filename); $version = (int)Configuration::get('PS_CCCJS_VERSION'); $compressed_js_path = $cache_path.'v_'.$version.'_'.$compressed_js_filename.'.js'; $compressed_js_file_date = file_exists($compressed_js_path) ? @filemtime($compressed_js_path) : 0; // aggregate and compress js files content, write new caches files if ($js_files_date > $compressed_js_file_date) { if ($compressed_js_file_date) Configuration::updateValue('PS_CCCJS_VERSION', ++$version); $compressed_js_path = $cache_path.'v_'.$version.'_'.$compressed_js_filename.'.js'; $content = ''; foreach ($js_files_infos as $file_infos) { if (file_exists($file_infos['path'])) { $tmp_content = file_get_contents($file_infos['path']); if (preg_match('@\.(min|pack)\.[^/]+$@', $file_infos['path'], $matches)) $content .= preg_replace('/\/\/@\ssourceMappingURL\=[_a-zA-Z0-9-.]+\.'.$matches[1].'\.map\s+/', '', $tmp_content); else $content .= Media::packJS($tmp_content); } else $compressed_js_files_not_found[] = $file_infos['path']; } if (!empty($compressed_js_files_not_found)) $content = '/* WARNING ! file(s) not found : "'. implode(',', $compressed_js_files_not_found). '" */'."\n".$content; file_put_contents($compressed_js_path, $content); chmod($compressed_js_path, 0777); } // rebuild the original js_files array if (strpos($compressed_js_path, _PS_ROOT_DIR_) !== false) $url = str_replace(_PS_ROOT_DIR_.'/', __PS_BASE_URI__, $compressed_js_path); if (strpos($compressed_js_path, _PS_CORE_DIR_) !== false) $url = str_replace(_PS_CORE_DIR_.'/', __PS_BASE_URI__, $compressed_js_path); // Je modifie le code pour mettre les JS externes au debut return array_merge($js_external_files, array($protocol_link.Tools::getMediaServer($url).$url));[/font] } // Fin de la fonction que j override } } Edited March 16, 2015 by Alexandre-KM (see edit history) Link to comment Share on other sites More sharing options...
Alexandre Carette Posted March 16, 2015 Share Posted March 16, 2015 Pour ton 1) faudrait faire une recherche plus approfondi, mais ca doit pouvoir se resoudre Link to comment Share on other sites More sharing options...
desgnl Posted March 16, 2015 Author Share Posted March 16, 2015 tu m'as permis de comprendre plein de choses, merci beaucoup ! si tu trouves ou s'organise l'ordre des fichiers js lorsqu'ils sont envoyé à la fin, fait moi signe :-) 1 Link to comment Share on other sites More sharing options...
Alexandre Carette Posted March 16, 2015 Share Posted March 16, 2015 mais de rien, n'hésite pas a poster ta solution ici pour le 1), désolé mais je suis sur autre chose (pas la foi de fouiner dans les fichiers de presta...) Link to comment Share on other sites More sharing options...
desgnl Posted March 16, 2015 Author Share Posted March 16, 2015 J'ai un souci avec l'override… j'ai bien copié la function et modifié la ligne correspondante, mais il n'est pas pris en compte… Link to comment Share on other sites More sharing options...
Alexandre Carette Posted March 16, 2015 Share Posted March 16, 2015 ah oui j'ai oublié un truc important avec les overrides, il faut effacer le class_index.php du dossier cache pour que les modifs soit prises en compte Link to comment Share on other sites More sharing options...
desgnl Posted March 16, 2015 Author Share Posted March 16, 2015 j'ai essayé en mettant le fichier dans mon-module/override/classes/Media.php ou dans override/classes/Media.php ça ne marche pas… même en supprimant le fichier class_index. voici mon fichier (qui correspond à ce que tu m'as indiqué ci-dessus) https://www.dropbox.com/s/8q4eha6onpk7tpq/Media.php?dl=0 Link to comment Share on other sites More sharing options...
Alexandre Carette Posted March 16, 2015 Share Posted March 16, 2015 (edited) mmmm.... vide tout tes caches, navigateur et ceux de prestashop, verifie que l'option override n est pas desactivé Edited March 16, 2015 by Alexandre-KM (see edit history) Link to comment Share on other sites More sharing options...
desgnl Posted March 16, 2015 Author Share Posted March 16, 2015 le cache de prestashop est désactivé. j'ai vidé le cache du navigateur (même si je ne pense pas que ça ait un rapport…) le changement à bien lieu quand je modifie le fichier du core. Link to comment Share on other sites More sharing options...
Alexandre Carette Posted March 16, 2015 Share Posted March 16, 2015 (edited) essaye Class Media extends MediaCore au lieu de class Media extends MediaCore Edited March 16, 2015 by Alexandre-KM (see edit history) Link to comment Share on other sites More sharing options...
desgnl Posted March 16, 2015 Author Share Posted March 16, 2015 non plus… je continue à chercher Link to comment Share on other sites More sharing options...
Alexandre Carette Posted March 16, 2015 Share Posted March 16, 2015 vérifie les chmod des fichiers et dossiers on ne sait jamais.... Link to comment Share on other sites More sharing options...
Alexandre Carette Posted March 16, 2015 Share Posted March 16, 2015 ah mais c'est le commentaire que j ai mis en debut de fichier qui est foireux.... remplace class Media extends MediaCore //Je declare que cette classe est une extension de la classe MediaCore par //Je declare que cette classe est une extension de la classe MediaCore class Media extends MediaCore Link to comment Share on other sites More sharing options...
desgnl Posted March 16, 2015 Author Share Posted March 16, 2015 bon en fait il fallait désinstaller / installer le module pour que les modifs soient prise en compte. merci Alexandre. 1 Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now