magento-delete-orders

Lors qu'un site sous Magento est en production, il peut s'averer très utile - je pense que personne ne dira le contraire - de tester si le passage d'une commande s'effectue correctement. Ci cette étape est validée, la commande doit apparaitre dans le backend avec toutes les informations sur le client ainsi que l'achat en question.
Maintenant, le problème qui se pose est le suivant: Comment supprimer les commandes de test dans le backoffice?

Le backend permet d'annuler des commandes, mais Magento n'a pas encore implémenté une fonction pour les supprimer. Il faudra donc le faire directement dans la base de données...

Avant d'effectuer la requete suivante, le bon sens voudrait de faire un backup (on est jamais trop prudent)! Testé sous Magento 1.3.2.2.

Voici la requète :

 
SET FOREIGN_KEY_CHECKS=0;
 
TRUNCATE `sales_order`;
TRUNCATE `sales_order_datetime`;
TRUNCATE `sales_order_decimal`;
TRUNCATE `sales_order_entity`;
TRUNCATE `sales_order_entity_datetime`;
TRUNCATE `sales_order_entity_decimal`;
TRUNCATE `sales_order_entity_int`;
TRUNCATE `sales_order_entity_text`;
TRUNCATE `sales_order_entity_varchar`;
TRUNCATE `sales_order_int`;
TRUNCATE `sales_order_text`;
TRUNCATE `sales_order_varchar`;
TRUNCATE `sales_flat_quote`;
TRUNCATE `sales_flat_quote_address`;
TRUNCATE `sales_flat_quote_address_item`;
TRUNCATE `sales_flat_quote_item`;
TRUNCATE `sales_flat_quote_item_option`;
TRUNCATE `sales_flat_order_item`;
TRUNCATE `sendfriend_log`;
TRUNCATE `tag`;
TRUNCATE `tag_relation`;
TRUNCATE `tag_summary`;
TRUNCATE `wishlist`;
TRUNCATE `log_quote`;
TRUNCATE `report_event`;
 
ALTER TABLE `sales_order` AUTO_INCREMENT=1;
ALTER TABLE `sales_order_datetime` AUTO_INCREMENT=1;
ALTER TABLE `sales_order_decimal` AUTO_INCREMENT=1;
ALTER TABLE `sales_order_entity` AUTO_INCREMENT=1;
ALTER TABLE `sales_order_entity_datetime` AUTO_INCREMENT=1;
ALTER TABLE `sales_order_entity_decimal` AUTO_INCREMENT=1;
ALTER TABLE `sales_order_entity_int` AUTO_INCREMENT=1;
ALTER TABLE `sales_order_entity_text` AUTO_INCREMENT=1;
ALTER TABLE `sales_order_entity_varchar` AUTO_INCREMENT=1;
ALTER TABLE `sales_order_int` AUTO_INCREMENT=1;
ALTER TABLE `sales_order_text` AUTO_INCREMENT=1;
ALTER TABLE `sales_order_varchar` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_quote` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_quote_address` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_quote_address_item` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_quote_item` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_quote_item_option` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_order_item` AUTO_INCREMENT=1;
ALTER TABLE `sendfriend_log` AUTO_INCREMENT=1;
ALTER TABLE `tag` AUTO_INCREMENT=1;
ALTER TABLE `tag_relation` AUTO_INCREMENT=1;
ALTER TABLE `tag_summary` AUTO_INCREMENT=1;
ALTER TABLE `wishlist` AUTO_INCREMENT=1;
ALTER TABLE `log_quote` AUTO_INCREMENT=1;
ALTER TABLE `report_event` AUTO_INCREMENT=1;
 
-- reset customers
TRUNCATE `customer_address_entity`;
TRUNCATE `customer_address_entity_datetime`;
TRUNCATE `customer_address_entity_decimal`;
TRUNCATE `customer_address_entity_int`;
TRUNCATE `customer_address_entity_text`;
TRUNCATE `customer_address_entity_varchar`;
TRUNCATE `customer_entity`;
TRUNCATE `customer_entity_datetime`;
TRUNCATE `customer_entity_decimal`;
TRUNCATE `customer_entity_int`;
TRUNCATE `customer_entity_text`;
TRUNCATE `customer_entity_varchar`;
TRUNCATE `log_customer`;
TRUNCATE `log_visitor`;
TRUNCATE `log_visitor_info`;
 
ALTER TABLE `customer_address_entity` AUTO_INCREMENT=1;
ALTER TABLE `customer_address_entity_datetime` AUTO_INCREMENT=1;
ALTER TABLE `customer_address_entity_decimal` AUTO_INCREMENT=1;
ALTER TABLE `customer_address_entity_int` AUTO_INCREMENT=1;
ALTER TABLE `customer_address_entity_text` AUTO_INCREMENT=1;
ALTER TABLE `customer_address_entity_varchar` AUTO_INCREMENT=1;
ALTER TABLE `customer_entity` AUTO_INCREMENT=1;
ALTER TABLE `customer_entity_datetime` AUTO_INCREMENT=1;
ALTER TABLE `customer_entity_decimal` AUTO_INCREMENT=1;
ALTER TABLE `customer_entity_int` AUTO_INCREMENT=1;
ALTER TABLE `customer_entity_text` AUTO_INCREMENT=1;
ALTER TABLE `customer_entity_varchar` AUTO_INCREMENT=1;
ALTER TABLE `log_customer` AUTO_INCREMENT=1;
ALTER TABLE `log_visitor` AUTO_INCREMENT=1;
ALTER TABLE `log_visitor_info` AUTO_INCREMENT=1;
 
-- Reset all ID counters
TRUNCATE `eav_entity_store`;
ALTER TABLE  `eav_entity_store` AUTO_INCREMENT=1;
 
SET FOREIGN_KEY_CHECKS=1;
 

Voila, maintenant vous avez une page de commandes vierge et un dashboard comme au premier jour!
[via Inchoo]

magento
Lorsqu'on m'a présenté Magento pour la première fois, j'ai été incroyablement supris par le nombre de fonctionnaliés présentent dans ce systeme.

Magento est un CMS open source très puissant dédié au développement de des sites de e-commerce.

Magento propose notamment:

  • Tarification par paliers multiples
  • Navigation avec filtrage multi-critères des produits
  • Outil d'édition de contenu statique pour la création de pages cibles
  • Gestion de l'inventaire avec articles commandés en rupture (backorders), quantités minimales et maximales
  • Mises à jour de masse sur catalogue dans le panneau d'administration
  • Gestionnaire de médias avec redimensionnement automatique des images et  filigrane

Liste plus exhaustive de fonctionnalités.

Pour ceux qui souhaitent développer un site de e-commerce avec ce CMS, j'ai regroupé quelques ressources utiles pour débuter:

Ressources

Blogs

Communautés, forums

Themes

Technique

Benchmark

Au final, j'ajouterai simplement que c'est de loin de CMS le plus complexe avec lequel j'ai eu l'occasion de travailler! L'apprentissage est long et parfois douloureux mais, comme on dit, l'enjeu en vaut la chandelle!
Magento a de nombreux avantages, mais surement autant d'inconveignants. A vous de savoir quel CMS est le mieux adapté pour répondre aux besoins de votre e-shop!

Ces petits plugins compatible avec Firefox et Internet Explorer (7 et 8 ) sont vraiment très pratique pour trouver une information pertinente en quelques clics.

openSearch

OpenSearch, c'est quoi?

OpenSearch est une collection de technologies permettant à des sites web et des moteurs de recherche de publier des résultats de recherche dans un format standardisé.

source: wikipedia

Pour créer son moteur en quelques clics, rien de plus facile: Il suffit de créer un fichier XML correpsondant au standard OpenSearch 1.1 et de le completer avec les paramètres voulu. Pour exemple, nous allons prendre celui que je viens de créer: Livedocs AS3 Search.

Objectif: créer un plugin qui utilise le moteur de recherche sur d'adobe.com pour trouver des informations sur la documentation officielle de l’actionscript 3.

Etape 1: Identifier la structurte du moteur.

En inspactant le code source du moteur, on remarque l'input correpsondant à notre champ de recherche:

openSearch_firebug

Etape 2: Préparer la requete.

En faisant une recherche sur livedocs, on se rend compte que le site execute la requete suivante:

"site:livedocs.adobe.com/flash/9.0" +{searchTerm}

Il s'agit dans ce cas d'un google custom search et les resultats affichés dépendent de l'index de google.

Etape 3: Créer le fichier XML du plugin.

Commencez par créer un nouveau ficher XML dans ce répertroire: C:\Program files\Mozilla Firefox\searchplugins.

Etant donné que les spécfifications de l'opensearch ont évolué, le plus simple reste encore de se rendre sur le site et de créer la base de son plugin à partir de l'exemple donné:

 
 <?xml version="1.0" encoding="UTF-8"?>
 <OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/">
   <ShortName>Web Search</ShortName>
   <Description>Use Example.com to search the Web.</Description>
   <Tags>example web</Tags>
   <Contact>admin@example.com</Contact>
   <Url type="application/rss+xml"
        template="http://example.com/?q={searchTerms}&amp;pw={startPage?}&amp;format=rss"/>
 </OpenSearchDescription>
 

D'autres exemples plus détaillés ainsi que les spécifications osnt disponible ici: http://www.opensearch.org/Specifications/OpenSearch/1.1

Etape 4: Configurer et tester le fichier XML.

Pour les champs suivants, je pense qu'aucune explication ne s'impose!

<ShortName>Livedocs AS3</ShortName>
<Tags>Adobe Actionscript 3 livedocs</Tags>
<Description>Search in adobe.com AS3 livedocs</Description>
<Contact>admin@example.com</Contact>
<InputEncoding>UTF-8</InputEncoding>
<SyndicationRight>limited</SyndicationRight>

Pour associer une icone à votre plugins, 2 solutions s'offrent a vous:
- Préciser l'url de l'icone:

<img alt="" width="16" height="16" />http://wwwimages.adobe.com/www.adobe.com/favicon.ico

- Convertir l'icone en base64:

<img alt="" width="16" height="16" />data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAABMLAAATCwAAAAAAAAAAAAAvLy//n5+f/39/f/8/Pz//Hx8f/19fX/8vLy//j4+P/z8/P/9vb2//X19f/39/f//f39//AAAAAAAAAAAAAAAAT09P/z8/P/9/f3//f39//z8/P/8/Pz//r6+v/z8/P/9/f3//Pz8//z8/P/9vb2//z8/P/wAAAAAAAAAAAAAAAH9/f/9PT0//39/f/39/f/8fHx//f39//19fX/+Pj4//Pz8//39/f/9/f3//X19f/8/Pz/8AAAAAAAAAAAAAAACvr6//Ly8v////////////Pz8/////////////v7+//39/f///////////////////////AAAAAAAAAAAAAAAA/////////////////////////////////////////////////////////////////////wAAAAAAAAAAAAAAAMjG+v////////////////////////////////8xKu7/MSru//Hw/f//////8fD9//Hw/f8AAAAAAAAAAAAAAAB2cfP///////////////////////////+6uPn/JBzt/4N/9P///////////6yp+P/x8P3/AAAAAAAAAAAAAAAAJBzt/+Pi/P///////////5+b9/9aVPH/Pzjv/yQc7f/j4vz///////////8/OO//8fD9/wAAAAAAAAAAAAAAACQc7f+Rjfb////////////j4vz/JBzt/yQc7f9oYvL////////////Ixvr/JBzt//Hw/f8AAAAAAAAAAAAAAAAkHO3/Pzjv/////////////////1pU8f8kHO3/yMb6////////////dnHz/yQc7f/x8P3/AAAAAAAAAAAAAAAAJBzt/yQc7f+6uPn///////////+sqfj/Pzjv////////////8fD9/yQc7f8kHO3/8fD9/wAAAAAAAAAAAAAAACQc7f8kHO3/aGLy/////////////////8jG+v///////////5+b9/8kHO3/JBzt//Hw/f8AAAAAAAAAAAAAAAAkHO3/JBzt/yQc7f/j4vz///////////////////////////8/OO//JBzt/yQc7f/x8P3/AAAAAAAAAAAAAAAAJBzt/yQc7f8kHO3/g3/0//////////////////////+6uPn/JBzt/yQc7f8kHO3/8fD9/wAAAAAAAAAAAAAAACQc7f8kHO3/JBzt/zEq7v//////////////////////aGLy/yQc7f8kHO3/JBzt//Hw/f+fn5//r6+v/6ysq/8kHO3/JBzt/yQc7f8kHO3/rKn4////////////4+L8/yQc7f8kHO3/JBzt/yQc7f/x8P3/X19f/5+fn/+fn57/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//w%3D%3D

Le noeud suivant va permettre de configurer les paramètres de la recherche (cf Etape 2):

 
<Url type="text/html" method="GET" template="http://livedocs.adobe.com/cfusion/search/index.cfm">
	  <Param name="loc" value="en_US"/>
	  <Param name="termPrefix" value="=site%3Alivedocs.adobe.com%2Fflash%2F9.0++"/>
	  <Param name="term" value="site%3Alivedocs.adobe.com%2Fflash%2F9.0++%22{searchTerms}%22"/>
	  <Param name="search_text" value="{searchTerms}"/>
	  <Param name="action" value="Search"/>
	</Url>
 

Lorsque le fichier est pret, vous pouvez le testez après avoir redémarré Firefox.

Etape 5: Publier le plugin.

Créez un compte de développeur sur le site de mozilla, renseignez encore quelques informations sur le plugin et publiez le!
Mozilla est assez rigoureux en ce qui concerne le respect de ses utilisateur et la qualité des plugins, il se peut donc que le plugin soit refusé s'il ne respecte pas certaines règles!

Ressources:

Grace aux nouvelles techniques Marketing et de ciblage publicitaire sur Internet, le comportement des consommateurs change. Beaucoup d'efforts sont conscrés pour identifier le canal de vente et de communication les plus appropriée pour proposer des offres plus adaptées aux consommateurs.

Ce changement se fait sans aucun doute au détriment de la publicitié classique, qui a de plus en plus de mal à rivaliser face des méthodes plus efficaces.

A quand la mort de la publicité classique ?

Il y a 6 mois, j'ai mis en ligne un générateur de thèmes Wordpress.
J'avais un peu de temps, une idée quelque peu originale et surtout très envie de me faire la main avec Jquery!

Beaucoup d'ambition pour un petit projet!

C'est clair que beaucoup de travail serait encore nécessaire pour faire de ce site un générateur digne de ce nom... un jour peut etre!
Enfin bon, le but de cet article n'est pas de disgresser autour des défauts du site, mais plutot de parler de son classement sur google: Cela fait quelques temps que je ne m'en occupe plus, mais il a continuer son petit bonhomme de chemin sur les SERP de google:

wordpresst-theme-generator-google

theme-generator.net arrive en 3eme position sur google.com sur 2,440,00 résultats!
Plutot pas mal, nan?

jqueryfancymenu

Avant de découvrir Jquery, je haissais javascript... Il y a tellement de problèmes de compatibilité entre les navigateurs, que coder dans ce langage est un cauchemard!
Et puis Jquery est arrivé...

Voici un tutorial, ou plutot une sorte de résumé pour créer un menu animé qui ressemble à celui-ci : jquery fancy menu.

Le menu à été testé sous IE6/7, FF3 et safari 4.
Vous pouvez déjà télécharger la source.

Objectif :
Créer un menu qui, au survol de la souris sur un lien, s'étire et change de couleur pour laisser apparaitre un autre texte.

Étape 1: Structure du menu

 
<div id="fancyJM">
<ul>
<li><a title="texte qui s'affiche au sorvol" href="lien1.html">Lien 1</a></li>
<li><a title="texte qui s'affiche au sorvol" href="lien2.html">Lien 2</a></li>
<li><a title="texte qui s'affiche au sorvol" href="lien3.html">Lien 3</a></li>
</ul>
</div>
 

Étape 2: Fichiers dépendants

<!--styles -->
<link rel ="stylesheet" type="text/css" media="screen" href="css/styles.css" />
<!--jquery famework-->
<script type="text/javascript" src="js/jquery.js"></script>
<!--plugin citizenColor-->
<script type="text/javascript" src="js/jquery.citizenColor.js"></script>
<!--contient le script pour l'animation du menu-->
<script type="text/javascript" src="js/fancymenu.js"></script>
 

Étape 3: Élaboration du script javascript (fancymenu.js)

// Ce tableau nous servira à stocker la largeur du lien pour IE6
var aW = Array();
var browser = "";
 
$(document).ready(function() {
 
	// Détermine le type de navigateur
	if ($.browser.msie && $.browser.version.substr(0,1)<7) { browser = "ie6"; }
	else if ($.browser.msie && $.browser.version.substr(0,1)<8) { browser = "ie7"; }
 
	// initialise le menu:
	$("#fancyJM li").each(function(i){
 
		// crée un attribut "id" avec pour valeur la position de la liste courrante
		$(this).attr("id", i);
 
		// ajoute l'image à gauche du lien
		$(this).prepend("
<div class='fancyJM_arrow'></div>
 
 ");
	});
 
	// attache l'évenement over/out
	$("#fancyJM li").hover(
		function () { onLiOver($(this));}, // => over
		function () { onLiOut($(this)); }  // => out
	);
 
	// attache l'évenement click
	$("#fancyJM li").click( function(){
		document.location.href = $(this).children("a").attr("href");
	});
 
	// ----- IE HACK
	if(browser == "ie7"){ $(".fancyJM_arrow").css("margin-top", "0px"); }
 
	// ----- IE HACK
	/* probleme: IE ne sait pas calculer la largeur d'un élément tant
	   que celui-ci n'est pas totalement affiché dans le browser
	   Il faut donc créer une liste temporaire...
	*/
	if(browser.indexOf("ie") != -1){
		$("body").append("
<ul class='fancyJM_temp'></ul>
 
");
		$("#fancyJM li").each(function(i){
			$(".fancyJM_temp").append("
<li>
 
"+$(this).children("a").attr("title")+"
</li>
 
");
		});
 
		// ... et stocker la largeur de chaque element dans un tableau...
		$(".fancyJM_temp li p").each(function(i){
			aW[i] = $(this).width();
		});
 
		// ... puis supprimer cette liste
		$(".fancyJM_temp").remove();
	}
 
});
 
// appele cette fonction au survol de la souris
function onLiOver(e){
	// anime la couleur de fond
	e.animate({ backgroundColor: "#2b8f96", queue: true}, 300);
 
	//anime l'image
	e.children(".fancyJM_arrow").css("margin-top", "7px");
	e.children(".fancyJM_arrow").animate( { marginLeft:"24px", queue: true } , 200 );
 
	//cache le lien
	e.children("a").fadeOut(300,function () {
 
		// change la valeur du lien
		changeLinkvalue($(this));
 
		//affiche le lien
		e.children("a").fadeIn(300);
 
		/* si aucune autre animation n'est en cours
		   (le curseur est donc toujours au dessus du lien),
		   effectue l'animation pour étirer la liste */
		if(e.children("a").queue("fx").length <= 1){
			if(browser == "ie6"){ e.css("width", aW[e.attr("id")]);}
			else if(browser == "ie7"){ e.css("width", "100%");}
			else{ 	e.animate({ width: "100%"}, 300); }
		}
	});
}
 
// appele cette fonction lorsque la souris quitte le lien
function onLiOut(e){
	// meme principe, mais à l'envers!
	e.animate({ backgroundColor: "#999999", queue: true}, 300 );
	e.children(".fancyJM_arrow").animate( { marginLeft:"16px", queue: true } , 200 )
	e.children("a").fadeOut(300,function () {
		changeLinkvalue($(this));
		if(e.children("a").queue("fx").length <= 1){
			e.children("a").fadeIn(300);
			if(browser == "ie6" || browser == "ie7"){ e.css("width", 308); }
			else{  e.animate({ width: 308}, 300); }
		}
	});
}
 
/*
remplace la valeur du lien (e) par celle de son attribut title
puis remplace la valeur de l'attribut par celle du lien...
*/
function changeLinkvalue(e){
	s0 = e.html().replace(/ /gi,"&nbsp;"); // html value
	s1 = e.attr("title").replace(/ /gi,"&nbsp;"); // attribute value
	e.html(s1);
	e.attr("title", s0);
}

Attention cependant si vous copiez le code directement à partir du site, car le formatage crée des retours qui causeront des erreurs dans le javascript.

Voila pour mon premier tutoriel, j'espère que cela vous plaira.

Au passage, si vous avez des idées d'optimisation, je serais ravi que vous les partagiez!

Page 1 sur 41234