Correctif bug Scroll avec Chrome

voici un correctif si vous avez le bug du scroll sur prestashop,comme souvent avec le blocklayered

remplacer jquery.scrollTo.js dans js -> jquery -> plugin

/*!
* jQuery.scrollTo
* Copyright (c) 2007-2014 Ariel Flesler - afleslergmailcom | http://flesler.blogspot.com
* Licensed under MIT
* http://flesler.blogspot.com/2007/10/jqueryscrollto.html
* @projectDescription Easy element scrolling using jQuery.
* @author Ariel Flesler
* @version 1.4.14
*/
;(function(define) {
'use strict';

define([‘jquery’], function($) {
var $scrollTo = $.scrollTo = function(target, duration, settings) {
return $(window).scrollTo(target, duration, settings);
};

$scrollTo.defaults = {
axis:’xy’,
duration: 0,
limit:true
};

// Returns the element that needs to be animated to scroll the window.
// Kept for backwards compatibility (specially for localScroll & serialScroll)
$scrollTo.window = function() {
return $(window)._scrollable();
};

// Hack, hack, hack 🙂
// Returns the real elements to scroll (supports window/iframes, documents and regular nodes)
$.fn._scrollable = function() {
return this.map(function() {
var elem = this,
isWin = !elem.nodeName || $.inArray(elem.nodeName.toLowerCase(), [‘iframe’,’#document’,’html’,’body’]) !== -1;

if (!isWin) {
return elem;
}

var doc = (elem.contentWindow || elem).document || elem.ownerDocument || elem;

return /webkit/i.test(navigator.userAgent) || doc.compatMode === ‘BackCompat’ ?
doc.body :
doc.documentElement;
});
};

$.fn.scrollTo = function(target, duration, settings) {
if (typeof duration === ‘object’) {
settings = duration;
duration = 0;
}
if (typeof settings === ‘function’) {
settings = { onAfter:settings };
}
if (target === ‘max’) {
target = 9e9;
}

settings = $.extend({}, $scrollTo.defaults, settings);
// Speed is still recognized for backwards compatibility
duration = duration || settings.duration;
// Make sure the settings are given right
settings.queue = settings.queue && settings.axis.length > 1;

if (settings.queue) {
// Let’s keep the overall duration
duration /= 2;
}
settings.offset = both(settings.offset);
settings.over = both(settings.over);

return this._scrollable().each(function() {
// Null target yields nothing, just like jQuery does
if (target === null) return;

var elem = this,
$elem = $(elem),
targ = target, toff, attr = {},
win = $elem.is(‘html,body’);

switch (typeof targ) {
// A number will pass the regex
case ‘number’:
case ‘string’:
if (/^([+-]=?)?\d+(\.\d+)?(px|%)?$/.test(targ)) {
targ = both(targ);
// We are done
break;
}
// Relative/Absolute selector, no break!
targ = win ? $(targ) : $(targ, this);
if (!targ.length) return;
/* falls through */
case ‘object’:
// DOMElement / jQuery
if (targ.is || targ.style) {
// Get the real position of the target
toff = (targ = $(targ)).offset();
}
}

var offset = $.isFunction(settings.offset) && settings.offset(elem, targ) || settings.offset;

$.each(settings.axis.split( »), function(i, axis) {
var Pos = axis === ‘x’ ? ‘Left’ : ‘Top’,
pos = Pos.toLowerCase(),
key = ‘scroll’ + Pos,
old = elem[key],
max = $scrollTo.max(elem, axis);

if (toff) {// jQuery / DOMElement
attr[key] = toff[pos] + (win ? 0 : old – $elem.offset()[pos]);

// If it’s a dom element, reduce the margin
if (settings.margin) {
attr[key] -= parseInt(targ.css(‘margin’+Pos), 10) || 0;
attr[key] -= parseInt(targ.css(‘border’+Pos+’Width’), 10) || 0;
}

attr[key] += offset[pos] || 0;

if (settings.over[pos]) {
// Scroll to a fraction of its width/height
attr[key] += targ[axis === ‘x’?’width’:’height’]() * settings.over[pos];
}
} else {
var val = targ[pos];
// Handle percentage values
attr[key] = val.slice && val.slice(-1) === ‘%’ ?
parseFloat(val) / 100 * max
: val;
}

// Number or ‘number’
if (settings.limit && /^\d+$/.test(attr[key])) {
// Check the limits
attr[key] = attr[key] <= 0 ? 0 : Math.min(attr[key], max);
}

// Queueing axes
if (!i && settings.queue) {
// Don’t waste time animating, if there’s no need.
if (old !== attr[key]) {
// Intermediate animation
animate(settings.onAfterFirst);
}
// Don’t animate this axis again in the next iteration.
delete attr[key];
}
});

animate(settings.onAfter);

function animate(callback) {
$elem.animate(attr, duration, settings.easing, callback && function() {
callback.call(this, targ, settings);
});
}
}).end();
};

// Max scrolling position, works on quirks mode
// It only fails (not too badly) on IE, quirks mode.
$scrollTo.max = function(elem, axis) {
var Dim = axis === ‘x’ ? ‘Width’ : ‘Height’,
scroll = ‘scroll’+Dim;

if (!$(elem).is(‘html,body’))
return elem[scroll] – $(elem)[Dim.toLowerCase()]();

var size = ‘client’ + Dim,
html = elem.ownerDocument.documentElement,
body = elem.ownerDocument.body;

return Math.max(html[scroll], body[scroll]) – Math.min(html[size], body[size]);
};

function both(val) {
return $.isFunction(val) || $.isPlainObject(val) ? val : { top:val, left:val };
}

// AMD requirement
return $scrollTo;
});
}(typeof define === ‘function’ && define.amd ? define : function(deps, factory) {
‘use strict’;
if (typeof module !== ‘undefined’ && module.exports) {
// Node
module.exports = factory(require(‘jquery’));
} else {
factory(jQuery);
}
}));

Referer Spam

voici une liste des sites de spams à bloquer via votre htaccess et/ou via le filtre de votre google analytics

iedit.ilovevitaly\.com
iloveitaly\.com
econom\.co
semalt\.com [NC]
forum\.topic44637676\.darodar\.com
darodar\.com
iskalko\.ru
ilovevitaly\.ru
ilovevitaly\.com
o-o-8-o-o\.ru
o-o-6-o-o\.ru
buttons-for-website\.com
semalt.semalt\.com
cenoval\.ru
priceg\.com
darodar\.com
cenokos\.ru
seoexperimenty\.ru
gobongo\.info
vodkoved\.ru
adcash\.com
websocial\.me
cityadspix\.com
luxup\.ru
ykecwqlixx\.ru
superiends\.org
slftsdybbg\.ru
edakgfvwql\.ru
socialseet\.ru
screentoolkit\.com
econom\.co
semalt\.com
savetubevideo\.com
shopping\.ilovevitaly\.com
iedit\.ilovevitaly\.com
forum\.topic52548358\.darodar\.com
forum\.topic53813291\.darodar\.com
blackhatworth\.com
hulfingtonpost\.com
bestwebsitesawards\.com
o-o-6-o-o\.com
golbnet
site35.simple-share-buttons\.com
guardlink\.org
site4.free-share-buttons\.com
sanjosestartups\com

Message d’etat de votre stock par marque

Dans prestashop 1.6 vous pouvez définir des messages d’etat de votre stock via le back office prestashop

exemple

 en stock il sera affiché : Chez vous sous 48h
hors stock il sera affiché : Sur commande 15 jours

cela correspond dans votre base de donnée aux champs « available_now » et « avalaible_later » de la table product_lang

Il peut être utile d’afficher un message par marque.

UPDATE  `mbp_product_lang` ,`mbp_product` SET `available_later` ="Livré en 1 semaine" WHERE `mbp_product_lang`.`id_product`=`mbp_product`.`id_product` AND `id_manufacturer` =48 AND `mbp_product_lang`.`available_later` ="";

 

Bug pagination et module à facette (Block layered)

Voici un correctif permettant de corriger le bug de pagination qui disparait en bas de page.

https://raw.githubusercontent.com/PrestaShop/PrestaShop/1a55226db119527092aa1132903fd66834abac6d/themes/default-bootstrap/js/modules/blocklayered/blocklayered.js

à remplacer

/theme/default-bootstrap/js/modules/blocklayered/blocklayered.js

en cas de problème avec le module vous pouvez le réinitialiser  dans le backoffice ->module->navigation à facette->réinitialiser

 

Prestashop 1.6 lent

Lenteur sur votre Prestashop 1.6 voici quelques pistes.

Premièrement faite un rapport de performance avec
www.gtmetrix.com
www.dareboost.com

http://www.webpagetest.org/

http://www.woorank.com/fr/
et suivez les préconisations.
pour plus d’informations sur les préconisations :

http://thelia.net/forum/viewtopic.php?pid=60569

http://www.alsacreations.com/

exemple de fichier htaccess optimisé:

<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/gif "access plus 1 month"
ExpiresByType image/jpeg "access plus 1 month"
ExpiresByType image/png "access plus 1 month"
ExpiresByType text/css "access plus 1 week"
ExpiresByType text/javascript "access plus 1 week"
ExpiresByType application/javascript "access plus 1 week"
ExpiresByType application/x-javascript "access plus 1 week"
ExpiresByType image/x-icon "access plus 1 year"
ExpiresByType image/svg+xml "access plus 1 year"
ExpiresByType image/vnd.microsoft.icon "access plus 1 year"
ExpiresByType application/font-woff "access plus 1 year"
ExpiresByType application/x-font-woff "access plus 1 year"
ExpiresByType application/vnd.ms-fontobject "access plus 1 year"
ExpiresByType font/opentype "access plus 1 year"
ExpiresByType font/ttf "access plus 1 year"
ExpiresByType font/otf "access plus 1 year"
ExpiresByType application/x-font-ttf "access plus 1 year"
ExpiresByType application/x-font-otf "access plus 1 year"
</IfModule>

FileETag INode MTime Size
<IfModule mod_deflate.c>
<IfModule mod_filter.c>
AddOutputFilterByType DEFLATE text/html text/css text/javascript application/javascript application/x-javascript
</IfModule>
</IfModule>

(voir pour l’activation des modules de compressions plus bas)

Activé le cache prestashop
Dans le back office prestashop -> performance

Capture-prestashop-performance-panneau-1 Capture-prestashop-performance-panneau-2 Capture-prestashop-performance-panneau-3

Après une modification toujours vider le cache dans prestashop -> performance, ainsi que dans votre navigateur.
Dans préférence-> recherche ajusté les poids des mots (pour le test mettre à 0).

Capture-prestashop-performance-recherche-1

mettre le _PS_DEBUG_PROFILING_ à true a true dans /config/defines.inc.php.

Capture-debug-prestashop

en bas de page est affiché le temps de chargement de la page  LoadTime, avec des  couleurs , rouge (pas bon), orange (moyen), vert (bon).

 

il faut comparer le temps d’exécution des requêtes (SQL QUERIES) et  des modules ( Hook processing) avec le Loadtime.

Capture-prestashop-performance-profiling
Désactivé les modules inutiles.

prestashop->modules

voir aussi dans prestashop->performance

Désactiver les modules non développés par PrestaShop

selon la volumétrie de votre base et le nombre de connexion à votre site il est conseillé d’être sur un serveur dédié,un serveur mutualisé est bien souvent la source du problème.

Vous pouvez aussi vérifier le time to first byte,si celui ci n’est pas bon alors il faut changer d’hébergement.

Capture-debug-tfb
Optimisé votre Mysql:

Activé le cache Mysql

Prestashop étant gourmand en requête il faut activer le cache mysql

Dans votre répertoire mysql généralement  /etc/mysql ajouter dans my.cnf
query-cache-type = 1
query_cache_limit=4M
query-cache-size = 32M
max_heap_table_size = 300M
key_buffer = 32M
tmp_table_size = 300M
table_open_cache = 15000

pour plus d’informations:
http://dev.mysql.com/doc/refman/5.0/fr/query-cache.html

N’oubliez pas de recharger le serveur :

/etc/init.d/mysql reload
Le problème de lenteur peut être que sur une catégorie souvent à cause d’une base de données corrompue.
utilisé alors les commandes de mysql
--auto-repair --check --optimize
ou dans phpmyadmin->votre base->structure
puis en bas de page

Capture-mysql-repair

vous pouvez aussi  faire ceci avec l’outil mysql tunner:
sudo aptitude install mysqltuner
mysqltuner

Dans votre php.ini

normalement dans le répertoire /etc/php5/apache2/php.ini

max_execution_time = 30
max_input_time = 60
memory_limit = 64M

mettre en marche les modules de compressions

a2enmod headers
a2enmod deflate
/etc/init.d/apache2 restart

faites un phpinfo() pour voir si les modules sont activés.

Si vous avez une version PHP 5.4 , 5.5 il peut être intéressant pour gagner en performance d’utiliser le systeme de cache zendopcache

http://fideloper.com/install-zend-opcache

actuellement la dernière version est la 7.0.3
bien vérifier les chemins de votre php.ini
Configuration File (php.ini) Path et
Loaded Configuration File dans votre phpinfo()

après installation vous devriez voir ceci dans votre phpinfo()
Capture-prestashop-performance-zend

PRESTASHOP Bug affichage du prix a 0€

si vous avez le bug du prix qui ne s’affiche pas sur les produits avec déclinaisons,il se peut que la déclinaison par défaut ne soit pas vidée dans le cache.

Cette requête  corrige le problème.

UPDATE`ps_product`SET`cache_default_attribute`=0;UPDATE`ps_product_shop`SET`cache_default_attribute`=0;UPDATE`ps_product`AS p,`ps_product_attribute`AS pa SET p.`cache_default_attribute`= pa.`id_product_attribute`WHERE p.`id_product`= pa.`id_product`AND pa.`default_on`=1;UPDATE`ps_product_shop`AS p,`ps_product_attribute`AS pa SET p.`cache_default_attribute`= pa.`id_product_attribute`WHERE p.`id_product`= pa.`id_product`AND pa.`default_on`=1