Petit code pour les descriptions de produits



  • bonjour,
    je vous livre mon petit code (sous licence WTFL) mais j'aimerais bien qu'il ne soit pas à la base d'un module payant.

    Historique du pourquoi.

    Je travaille sur un prestashop d'un client-ami, sa migration de 1.7.7 vers phenix suite. ET (sinon ce n'est pas drôle) je doit mettre en place un crm pour gérer diverses choses comme la facturation, les droits d'auteurs et autres joyeuseté.

    Il a été convenu d'utiliser le crm (tryton pour être précis - parce que je le connais un peu, j'avais développé il y a plus de 10 ans un produit pour un esat basé sur openerp.), le crm comme base arrière. en clair : tout est sur le crm et phenixsuite est juste consacré à la vente. Je suis largement plus à l'aise à "développer " (bien grand mot) sur tryton que sur presta/phenix. Oui je suis long.

    Et donc je dois récupérer toutes les infos de presta pour les passer sur tryton. (et accessoirement son ancien logiciel de gestion des droits) Et lors de la récup-traitment-import des produits je me suis aperçu que pour les cd, on avait le droit à des choses comme ça

    <p style="text-align: left;"> </p>
    <p style="text-align: center;"><span style="font-size: 12pt; color: #800000;"><strong>Contenu du CD</strong></span></p>
    <p style="text-align: left;"> </p>
    <p style="text-align: left;"><strong><span style="color: #800000;">1. Chacha Latino</span></strong>  2'56</p>
    

    j'ai abrégé. donc dans la base de donnée il y a ET des infos ET de la mise en forme. Beaucoup de bruit (outre la difficulté à récupérer avec du csv entre les sauts de ligne et les fins de lignes...) mais c'est un détail.
    Cela veut dire qu'à CHAQUE fois on doit entrer tout le décorum html dans la base et donc avec la mise en forme. (même si on peut css-er une bonne partie.)

    Et comme je suis un rationaliste tétu et entêté. je me suis dit, ce serait vachement plus cool de rentrer un truc comme ça

    <cd titre="Le bal musette en france du 18ème siècle" auteurs="Duchmol Jean yves & josette Pierre" duree="45'32">
    <piste no="1" duree="3'45" titre=" Ah le petit vin blanc"/>
    <piste no="2" duree="2'58" titre=" Il est des nôtres"/>
    </cd> 
    <cd titre="Le bal musette en france du 19ème siècle" auteurs="Lataupe rené & the crazy fogg" duree="45'32">
    <piste no="1" duree="3'45" titre=" Il faut le voir"/>
    <piste no="2" duree="2'58" titre=" Pour le croire"/>
    </cd>
    

    et gérer son affichage. alors j'ai un peu taffé et écrit quelques lignes de plain javascript, que les puristes trouveront peut être horrible. (n'hésitez pas à proposer des améliorations)

    <script>
    window.onload	= function (){
    do_convert('cd');
    }
    
    var dF = document.createDocumentFragment();
    // dans cds le 1 est l'attribut du tag du cd, le 2 le tag a créer et le 3 la la classe du tag créé
    const cds=[['titre','h3','vert jaune'],['auteurs','h4',''],['duree','h5','']];
    // idem dessus sans style (facile à rajouter) comme on parcours ces array
    // le ['','br',''] permet un saut de ligne
    const tis=[['no','span',''],['titre','span',''],['duree','span',''],['','br','']];
    
    function $$(t,e){
    	if (!e) return document.querySelectorAll(t);
    	else return e.querySelectorAll(t);
    }
    
    function do_liste(what,item){
    for (const el of item) {
    	my_tag=document.createElement(el[1]);
    	if (el[0])  my_tag.textContent= what.attributes[el[0]].value;
    	if (el[2])  my_tag.className=el[2];
    	dF.appendChild(my_tag);
    	}
    }
    
    function do_convert(t){
    let list_cd=$$(t);
    if (list_cd.length<1) return;
    for(var i = 0; i < list_cd.length; i++) {
    	do_liste(list_cd[i],cds)
    	let list_titres=$$('piste',list_cd[i]);
    	for(var j = 0; j < list_titres.length; j++) {
    		do_liste(list_titres[j],tis)
    	}
    list_cd[i].replaceWith(dF);
    }
    }
    </script>
    

    le code est simpliste, je ne vais pas vous faire l'affront de le commenter. J'ai mis des balises html pour le voir tomber en marche. Il n'a pas besoin des sauts de ligne dans les éléments et, par nature, les <cd></cd> et <piste/> ne sont pas affichés et ensuite remplacé par le code fabriqué pour le plain javascript. On est certain du coup d'avoir partout la même présentation mise en forme te on gagne beaucoup de temps à saisir les trucs.

    je ne l'ai pas encore mis dans phenix, je suis juste en phase de construction de l'ensemble.

    j'espère que cela donnera des idées et aidera certains.



  • Idée intéressante pour qui ne veut pas utiliser l'éditeur WYSYWIG TinyMCE mais je pense que ça fonctionne surtout si vous avec toujours le même type de produit.
    Pour les exports, il vous suffit d'effectuer un strip_tags(champ_texte) et vous n'aurez plus de balises (c'est ce que font les modules d'export vers les marketplaces par exemple)



  • @eolia

    Oui on n'aura plus les balises mais on aura perdu la "sémantique", ce qui est un bien grand mot puisque ce n'est que de la mise en forme pour le cas du CD si tout le temps on a
    cd
    titre
    titre

    C'est facile mais ce n'est pas toujours le cas.. je vais m'arracher les cheveux (ce qu'il en reste)

    Disons que le l'on peut faire des "modèles" et utiliser 'ou pas' les modèles. Ceux qui vendent des cd, des dvd, des produits dérivés, peut faire un modèle cd, un modèle dvd et laisser le reste en "normal" ensuite si on fait tourner et qu'il n'y a rien à faire on a juste un return après le document.querySelectorAll(tag) s'il ne ramène rien, vue comment presta tourne, cela ne se verra même pas.

    je vais le mettre en œuvre sur notre boutique. je vais "hardcoder" dans le javascript la mise en forme et la récup des tags et laisser le javascript dans le bon dossier d'un module product par exemple. cela devrait le faire ;-)

    L'avantage de cela est qu'il est moins chronophage de rentrer ses produits et cela "oblige" à être sémantique. on est certains d'avoir la même mise en forme partout. c'est un peu du html sémantique