Suivez l'actualité sur CmsMadeSimple http://www.cmsmadesimple.fr Toute l'actualité de CmsMadeSimple, les news, les astuces et les annonces cmsmadesimple CGFeedMaker 1.0.14 on CMS Made Simple kdanezis@gmail.com ( ) CmsMadeSimple 1.10.3 http://www.cmsmadesimple.fr/blog/80/15/CmsMadeSimple-1-10-3 Tue, 10 Jan 2012 11:19:00 +0100 L'équipe est fière de vous annoncer la sortie de la version 1.10.3, j'ai nommé Hyacinthe.

Cette version corrige des bugs détectés dans la branche 1.10.x ces dernières semaines, notamment ceux qui portent sur le nouveau module WYSIWYG MicroTiny.

  • Correction sur MicroTiny Lorsque l'on utilise un thème avec un background sombre
  • Correction de divers problèmes avec MicroTiny
    Correction du menu déroulant des styles dans MicroTiny.
    Petite correction de la documentation de contentoperations
    Correction de l'utilisation des regex dans le plugin cms_stylesheet
    correction de cms_http_request
    correction de cms_selflink
    Correction d'un problème de login lorsqu'une page d'accueil est paramétrée
    Petite amélioration sur le système de setlocale
    Correction d'un problème avec la commande get_module_instance
    Correction de la commande create_textarea pour les syntax highlighters
    Petites correction avec les pages d'accueil dans les préférences utilisateurs

Comme d'habitude nous vous invitons à vous mettre à jour. Vous retrouverez d'ailleurs cette nouvelle version sur notre page de téléchargement. Pour ceux qui ont des questions, rejoignez nous sur le forum

Et bonne semaine à tous!

]]>
http://www.cmsmadesimple.fr/blog/80/15/CmsMadeSimple-1-10-3
Buvons un coup à cette nouvelle année http://www.cmsmadesimple.fr/blog/79/15/Buvons-un-coup-a-cette-nouvelle-annee Sat, 31 Dec 2011 23:50:00 +0100 Une année s'achève, une autre commence. Petit coup d'oeil sur l'année qui vient de s'écouler

2011 aura été personnellement une année épouvantablement chargée de projet de toute sorte tant dans ma vie professionnelle de tous les jours que le soir une fois de retour sur CmsMadeSimple... et quelle année !

2011 aura vu naitre la plus grosse version que CmsMadeSimple ai eu de sa vie. L'association s'est relevée de ses cendres après un crash serveur il y a un an quasiment jour pour jour. La documentation française a prit un coup de fouet. La toute première réunion publique a permis à quelques-uns des membres de la communauté de se rencontrer et de discuter le temps d'une après midi sur Paris. Le site s'est vu offrir une nouvelle peau. Des nouveaux modérateurs ont rejoint l'équipe. OVH a propulsé CmsMadeSimple au rang de star en le proposant en mode one-clik sur ses installations mutualisées. Les réunions de plus en plus fréquentes le soir permettent à chacun d'échanger sur tout dans une très bonne ambiance.

Que d'émotion...

Parce que vous êtes les principaux acteurs, parce que sans vous il n'y aurait pas de nous, toute l'équipe de la communauté française se joint à moi pour vous remercier d'être encore et toujours au rendez vous avec nous, de soutenir toute l'équipe et surtout votre Cms préféré.

Que cette nouvelle année soit celle de la raison (Neutralité d'Internet), de la paix (à la maison, et aussi ailleurs...)  mais surtout qu'elle soit l'année de vos plus belles créations, de vos plus belles réussites et que tout cela puisse se dérouler sous le signe d'une bonne santé.

Bess (qui à l'heure où vous lirez ces lignes sera en vacances loin, très loin)

]]>
http://www.cmsmadesimple.fr/blog/79/15/Buvons-un-coup-a-cette-nouvelle-annee
Message officiel de la team org http://www.cmsmadesimple.fr/blog/78/15/Message-officiel-de-la-team-org Thu, 22 Dec 2011 13:45:00 +0100 L'équipe de développement nous a transmis deux petits messages en nous demandant de vous le traduire, cliquez pour lire la suite !

Demande de Dons - GeekMoot 2012

Comme vous le savez probablement, le fameux Geek Moot - Réunion publique sur tout ce qui touche à CMSMS est prévue à Northampton au Royaume-Uni en Mars 2012. Il se sera écoulé 18 mois (un délai bien trop long) entre ces conférences. Le Geekmoot est un événement précieux, où la communauté peut se réunir pour en apprendre davantage sur CMSMS, sa direction et sur les techniques de travail avec ce produit fantastique. C'est aussi une occasion pour échanger des contacts avec vos collègues et pour rencontrer  les membres de l'équipe qui travaillent très dur chaque jour pour continuer à faire grandir votre Cms favori.

Puisque les membres de l'équipe de Dev sont tous des bénévoles, nous avons besoin de récolter des fonds pour permettre à certains membres de l'équipe de voyager et de participer à la conférence et ainsi vous rencontrer personnellement. Nous cherchons à parrainer au moins deux développeurs d'Amérique du Nord et en aider d'autres dans leur dépenses sur les trois jours de la conférence. Nous avons pour objectif de rassembler 6000$ pour Mars. L'argent ira payer les billets d'avion et l'hôtel pour les membres de l'équipe de dev. Nous savons que notre communauté peut se rassembler et réussir ce pari.

Nous allons bien lister tous les dons sur cette page toute les semaines. Par ailleurs, tous les dons de plus de 200$ seront notés sur le programme geekmoot, et tous les dons de plus de 500$ auront également la possibilité de poster une bannière tournante adaptée sur nos sites (rotation basée sur l'égalité du nombre d'affichage avec les autres contributeurs et partenaires) pour deux mois et un affichage dans notre newsletter mensuelle.

Rassemblons nous et faisons de ce Geek Moot le meilleur d'entre tous !

Appel aux présentations

Bonjour à tous les professionnels de CMSMS. Nous n'avons pas souvent l'occasion de travailler directement avec les professionnels, parce que comme nous, vous êtes le plus souvent occupés à travailler sur votre prochain grand projet. Votre café est souvent froid et vous travaillez beaucoup trop tard avec des échéances serrées et de défis intéressants. Vous êtes toujours à remodeler votre cms préféré pour faire autre chose; résoudre un problème qui -vous le savez- serait bien difficile avec d'autres logiciels.

Eh bien, voici votre chance de partager quelques-unes des choses que vous avez appris, les techniques vous avez développé et peut-être quelques-uns de vos secrets avec vos collègues. Voici l'occasion de vous faire connaître!

Geek Moot 2012 arrive à grand pas ! Nous recherchons des professionnels comme vous pour faire des présentations et des ateliers sur le monde de CmsMadeSimple

Par exemple ..

  • Vous venez de développer la plus grande et la plus efficace campagne de marketing virale dernière avec CmsMadeSimple
  • Vous souhaitez partager des techniques sur l'élaboration et de sites Web mobiles friendly et SEO friendly
  • Vous avez des astuces pour combiner des modules et ainsi construire le nouveau réseau social à la mode
  • Vous voulez partager des astuces et des techniques Smarty dans le respect de la compatibilité inter-navigateur
  • Vous avez des trucs et des astuces avec CMSMS que vous aimeriez partager

Votre communauté aimerait en entendre parler.

  • Donner un peu et prenez un peu. Non seulement votre position dans la communauté CMSMS sera élevée, mais il y a également  un certain nombre avantages que nous allons vous donner pour mettre en valeur votre contribution, votre temps et vos efforts.
  • Journée Gratuite! Donnez soit une présentation à la conférence ou un atelier durant la journée atelier pré-conférence et nous vous offrons un jour de conférence gratuitement! Soit une économie de 75.00£
  • Une notification sur notre programme de conférences
  • Une notification sur le site Web Moot Geek
  • Mentions sur le Twitter et le Facebook de la campagne marketing.
  • Et bien évidement une grande expérience au Moot Geek!

Le Moot Geek se déroule à Northampton au Royaume-Uni en Mars 2012. Les ateliers auront lieu le 8 Mars dans deux salles séparées, et des présentations auront lieux les 9 et 10 Mars dans une plus grande salle. les Ateliers durent pendant environ 90 minutes, et les présentations varient de 45 minutes à une heure. Les places sont disponibles pour les deux ateliers et de présentations. Si vous êtes intéressés de partager vos connaissances sur un sujet lié à notre CMSMS : nous aimerions vous entendre. Alors remplissez le formulaire à l'adresse http://www.geekmoot.com/2012/call-for-presentations dès maintenant!

L'équipe de dev passera en revue les présentations proposées et travaillera avec vous pour trouver le meilleur moment pour vous présenter votre travail. Nous travaillerons avec vous pour vous aider à affiner vos présentation, répondre à toute vos questions afin que ce jour soit la meilleure expérience possible.

C'est une situation gagnant-gagnant. Et n'oubliez pas de sortir avec nous après la conférence, la plupart des mises en relation se déroulent à la fin de chaque journée. Alors, qu'attendez-vous pour remplissez le formulaire sur http://www.geekmoot.com/2012/call-for-presentations dès maintenant!

 

]]>
http://www.cmsmadesimple.fr/blog/78/15/Message-officiel-de-la-team-org
Au sujet du formulaire de contact http://www.cmsmadesimple.fr/blog/77/15/Au-sujet-du-formulaire-de-contact Wed, 21 Dec 2011 00:25:00 +0100 Juste pour informer ceux et celles qui ont envoyé un email depuis la page contact que leur email n'avait pas été ignoré... par contre le mec chargé d'y répondre lui s'est planté en y répondant.... (oui je sais)

Du coup si vous attendiez une réponse importante, n'hésitez pas à renvoyer votre message il sera bien traité cette fois ci.

Vu l'ancienneté de certains messages on va éviter de déterrer les vieux email et ne pas donner de suite à ceux envoyés avant Septembre. Pour ceux envoyer après l'été nous allons tenter d'apporter une réponse dans la semaine.

Mille excuses à ceux qui ont du se demander si on s'était pas foutu un peu d'eux...

]]>
http://www.cmsmadesimple.fr/blog/77/15/Au-sujet-du-formulaire-de-contact
MediaKit publicitaire disponible http://www.cmsmadesimple.fr/blog/76/15/MediaKit-publicitaire-disponible Mon, 19 Dec 2011 11:51:00 +0100 Le MédiaKit contenant tous les tarifs à destination des professionnels est disponible comme promis ! Envie de faire votre publicité sur cmsmadesimple ? C'est par ici que ça se passe :)

Arrivée de la publicité

Je tiens à rappeler que l'arrivée de la publicité non-intrusive sous la forme de simple bannière est la volontée pour l'association de s'assurer une source de revenue complémentaire (nous en avons qu'une seule actuellement) avant de s'engager sur la location d'un serveur plus puissant. Plus puissant surtout pour permettre de nouvelles fonctionnalités et pour améliorer la réactivité de nos sites déjà en place ! Avis donc aux professionnels souhaitant bénéficier d'une vitrine de choix pour se présenter !

L'essentiel de ce qui avait pu être déjà dit a été conservé tel quel. J'ai détaillé au maximum les offres ce qui devrait rendre le tout assez clair. Néanmoins nous avons la page contact si vous avez des questions

Le médiakit est téléchargeable sur sa page dédiée.

]]>
http://www.cmsmadesimple.fr/blog/76/15/MediaKit-publicitaire-disponible
News en masse http://www.cmsmadesimple.fr/blog/75/15/News-en-masse Thu, 15 Dec 2011 17:04:00 +0100 Les annonces arrivent de partout et je n'ai pas le temps de suivre au fur et à mesure, alors du coup vous aurez droit à un récapitulatif !

Café Made Simple #2

Lancement de la deuxième réunion publique où vous pourrez enfin mettre un visage sur le pseudo des participants du forum ! Le prochain café se passera donc Samedi 7 Avril 2012 à 14h. Reste à trouver une ville.

Envie que ça se passe en bas de chez vous ? Votez ! La ville ayant reçu le plus de vote aura le privilège de me voir débarquer. (Du coup je suis pas certain que ça attire les votes).

Ca se passe sur cette page. et je tiens à dire à Romain que ce message est la preuve que je sais tenir mes délais (et toc)

Geek Moot : L'organisation

Cet équivalent au Café Made Simple est organisé pour la troisième année et elle se passe en Angleterre à Northampton les 8,9 et 10 Mars 2012. Le tarif est proposé à 75£ la journée ou 125£ le pass 2 jours avec en prime un accès aux conférences ou des professionnels feront des démonstrations de l'utilisation très poussée de CmsMadeSimple

Je suis déjà en possession des billets et vais donc me faire un malin plaisir à aller embêter nos collègues là bas. Je vous incite très fortement à m'y rejoindre tant les commentaires sur le geek moot de l'année dernière sont plus encourageant les uns que les autres.

Visiter le site du Geekmoot et le site de vente des billets

Geek Moot : Appel aux conférenciers

Calguy a lancé un appel aux professionnels qui seraient intéressés de faire des démonstrations devant public de ce qu'ils sont capable de faire avec CmsMadeSimple. Ça peut être évidement un site très poussé technologiquement ou une utilisation audacieuse de CmsMadeSimple dans un cadre où l'on n'a pas forcement l'habitude de l'y trouver.

Le tout contre le paiement du ticket d'entrée, pas de raison d'hésiter !

Voir l'annonce de Calguy

Geek Moot : Appel aux dons

L'organisation d'un tel évènement nécessite bien évidement un besoin en financement très important. Donnez donc un peu, beaucoup, mais donnez afin de l'on puisse assurer la tenue de ce genre d'évènement cette année et pourquoi pas les années prochaines en France !

A noter que comme chaque année l'association SU³ qui maintient tous les sites de la communauté de CmsMadeSimple en France va une nouvelle fois faire un don.

Merci de nous soutenir ;)

Voir l'annonce de Calguy et la page des dons

La Forge, (nouveau) Mode d'Emploi

La forge, ce site qui regroupe tous les modules téléchargeables pour CmsMadeSimple, vient de se voir attribuer une police d'utilisation.

Si affecter des conditions d'utilisations à un tel outil n'est pas étonnant en soi, ce qui est étonnant c'est que ça intervienne aussi tardivement (3-4 ans). D'après ce que l'on sait c'est que cette mise en place de conditions fait suite à un certain nombre d'abus.

Après lecture rien d'extraordinaire n'en ressort. Voici personnellement ce que j'en ai retenu :

  • La forge ne doit contenir que des modules/plugin/... liés à CmsMadeSimple (visiblement c'est là dessus qu'il y a eu des abus)
  • Vous devez tenir à jour vos modules et proposer une nouvelle version au moins tous les ans
  • Un projet sans mise à jour tous les ans lancera une tentative de contact de l'auteur par l'équipe de la forge
  • Pas de réponse entrainera la suppression du projet.

Cette volonté de nettoyer la forge est à mon sens une très bonne nouvelle car proposer des modules non compatibles avec la dernière version de CmsMadeSimple n'est vraiment pas une bonne image que l'on renvoi aux nouveaux utilisateurs.

De la publicité sur CmsMadeSimple

Nous avons décidé après discussion avec de nombreux membres de mettre en place une petite bannière publicitaire sur nos sites ces prochaines semaines afin de trouver une source de financement supplémentaire. Cette publicité non-intrusive sera composée uniquement d'annonces pour des professionnels de CmsMadeSimple afin de la rendre la plus intéressante possible.

Cette bannière qui sera présente sur le site, le forum et le wiki aura un coût différent selon la formule choisit oscillant entre 5€ pour le wiki et 15€ pour la page d'accueil du site, (PR=6) pour un mois de diffusion.

De nombreuses formules devrait permettre à chacun de s'y retrouver. Je reviendrais d'ailleurs dans un prochain billet avec un MediaKit complet détaillant l'offre dans ses moindres détails avec toutes les conditions nécessaire pour en bénéficier.

Notez que le nombre d'emplacement louable au mois simultanément sont volontairement limités afin d’offrir aux professionnels un maximum de visibilité. Ainsi la rotation des bannières en page d'accueil ne tournera que sur 3 annonces différentes. Premier arrivé, premier servi :)

Pour toute demande d'informations complémentaire n'hésitez pas à prendre contact via notre formulaire habituel

Hier c'était la Nocturne #4

Occasion de discuter de manière informelle, de poser vos questions et de vous tenir à jour des derniers potins, les nocturnes sont ces réunions qui ont lieux tous les mercredi soir  sur Skype.

Si vous souhaitez participer rejoignez nous sur le forum prévu à cet effet et ajoutez le contact "cmsmadesimplefr" si vous souhaitez que je vous ajoute aux sessions automatiquement

Prochaine session (et sans doute la dernière de l'année) : mercredi 21 Décembre à 21h30

Rejoindre le forum des Nocturnes

Le wiki de la communauté vit et s'enrichit chaque semaine

Aidez nous à le remplir en contactant Jissey sur sa boite email jissey@cmsmadesimple.fr. Donnez lui votre pseudo du forum et il vous créera un compte éditeur sur le wiki.

Visiter le wiki

 Fin des annonces

C'est tout bon, vous pouvez éteindre votre ordinateur.

]]>
http://www.cmsmadesimple.fr/blog/75/15/News-en-masse
CmsMadeSimple 1.10.2 http://www.cmsmadesimple.fr/blog/74/15/CmsMadeSimple-1-10-2 Sun, 20 Nov 2011 20:09:00 +0100 On en discute sur le forum. Casa Pilote de son petit nom, voici pour information le changlog :


Core - Bug Reports:
- #7111 liste triée dans le backoffice
- #7112 content-type manquant sur le module d'impression  (CMSPrinting)
- #7172 (travaux sur l'encoding de urlparam dans cms_selflink).
- ajout de force_root_block pour MicroTiny.
- Correction d'un problème avec l'alias des page lorsque c'est vidé dans l'édition d'un contenu
- Correctoin d'un problème mineur avec copycontent
- Correction de problèmes avec les filtres qui ne sont pas chargés.
- Correction sur la génération des packages... Toutes les variantes anglaises sont maintenant packagées ensemble.
- Quelques petits changements mineures dans les templates du filepicker de MicroTiny
- Changement dans la manière dont les tailles de fichiers sont affichés dans  le filepicker de MicroTiny.

Rien de dramatique donc :)

 

Notez que cette version est annoncée comme la dernière avant le passage en 1.11.x (déjà...)

]]>
http://www.cmsmadesimple.fr/blog/74/15/CmsMadeSimple-1-10-2
Ovh propose CmsMadeSimple en installation One-Click http://www.cmsmadesimple.fr/blog/73/15/Ovh-propose-CmsMadeSimple-en-installation-One-Click Wed, 09 Nov 2011 14:44:00 +0100 Il y avait Joomla bien évidement, mais également Drupal, Spip et Concrete5... Maintenant il faut compter une 5 ème option qui compte bien être autre chose que la roue de secours : CmsMadeSimple

Très bonne opération pour toute notre communauté puisque celle ci s'ouvre à tous ceux qui n'avaient jamais entendu parlé de CmsMadeSimple. Très bonne opération également pour OVH qui propose maintenant un excellent outil permettant facilement de créer son site web sans devoir sortir l'usine à gaz !

Dès maintenant vous pouvez installer depuis le pannel manager d'OVH une copie de CmsMadeSimple et démarrer la création de votre site web.

 

Grand merci à notre ami Jissey qui travaille sur le sujet depuis un bon bout de temps !

 

Retrouvez la discussion sur le forum.

]]>
http://www.cmsmadesimple.fr/blog/73/15/Ovh-propose-CmsMadeSimple-en-installation-One-Click
CmsMadeSimple 1.10.1 http://www.cmsmadesimple.fr/blog/72/15/CmsMadeSimple-1-10-1 Sat, 05 Nov 2011 18:26:00 +0100 Cette version corrige évidement un très grand nombre de bug rencontrés sur la version majeure de CmsMadeSimple 1.10. Vus pourrez consulter la liste des bugs corrigés sur cette page

Encore une fois n'oubliez pas de faire une sauvegarde avant de mettre à jour ainsi que de vérifier que tous vos modules sont compatibles CmsMadeSimple 1.10.x !

Bonne soirée à tous et bon WE :)

]]>
http://www.cmsmadesimple.fr/blog/72/15/CmsMadeSimple-1-10-1
CmsMadeSimple 1.10 http://www.cmsmadesimple.fr/blog/71/15/CmsMadeSimple-1-10 Sun, 23 Oct 2011 18:43:00 +0200 Et il faut dire que cette version est lourde de nouveauté. Alors je ne vais pas perdre de temps à refaire ce qui a déjà été annoncé dans d'autres news, je me contenterais de vous donner ces liens :

L'annonce sur le blog anglais avec tout le détail des nouveautés

Notre page de téléchargement

La précédente news ou nous vous indiquions un peu la liste des nouveautés durant le cycle de la béta

Nos conseils : N'installez pas directement en production cette version, testez en local l'upgrade de vos sites car de nombreux modules ne seront plus compatibles, la fautes à leur auteur qui n'auront pas eu le temps de les mettre à jour. Retrouvez nous sur le forum pour de plus amples informations :)

]]>
http://www.cmsmadesimple.fr/blog/71/15/CmsMadeSimple-1-10
Construire un module - part V http://www.cmsmadesimple.fr/blog/70/15/Construire-un-module---part-V Thu, 13 Oct 2011 18:33:00 +0200 Dans l'épisode précédent...

Nous avions finit le dernier article avec un module qui possédait tous les accès depuis l'administration, mais restait quelques peu inactif...

Du coup, au menu du jour : nous allons intégrer tout le code du nettoyeur + gérer le multilangue + ré-aborder un peu de sécurité en SQL + tester notre module finit !

Du nouveau code dans le moduleje

J'ai donc commencé par modifier le fichier CmsModuleCleaner.module.php afin d'ajouter toutes les fonctions que je vais devoir utiliser :

/**
* Renvoi la liste possible des langues supprimable
*/
function _getLang()
{
$langs = array();
$langs["ca_ES"] = array("ca_ES");
$langs["cs_CZ"] = array("cs_CZ");
$langs["da_DK"] = array("da_DK");
$langs["de_DE"] = array("de_DE");
$langs["es_ES"] = array("es_ES");
$langs["en_CY"] = array("en_CY");
$langs["et_EE"] = array("et_EE");
$langs["fa_FA"] = array("fa_FA");
$langs["fi_FI"] = array("fi_FI");
$langs["fr_FR"] = array("fr_FR","fr");
$langs["hr_HR"] = array("hr_HR");
$langs["hu_HU"] = array("hu_HU");
$langs["it_IT"] = array("it_IT");
$langs["iw_IL"] = array("iw_IL");
$langs["ja_JP"] = array("ja_JP");
$langs["lt_LT"] = array("lt_LT");
$langs["nb_NO"] = array("nb_NO");
$langs["nl_NL"] = array("nl_NL","nl");
$langs["pl_PL"] = array("pl_PL");
$langs["pt_PT"] = array("pt_PT");
$langs["ro_RO"] = array("ro_RO");
$langs["ru_RU"] = array("ru_RU");
$langs["sk_SK"] = array("sk_SK");
$langs["sl_SI"] = array("sl_SI");
$langs["so_SO"] = array("so_SO");
$langs["sr_YU"] = array("sr_YU");
$langs["sv_SE"] = array("sv_SE");
$langs["tr_TR"] = array("tr_TR");

return $langs;
}

function _getModulesDirectoriesToPattern()
{
$dirs = array();
global $gCms;
$config = $gCms->GetConfig();
$path = $config['root_path'].'/modules';
if (!is_dir($path) || !$handle = @dir($path)) {
trigger_error('\''.$path.'\' doesn\'t exists or is not a valid directory', E_USER_ERROR);
} else {
while ($entry = $handle->read()) {
if ($entry !== "." && $entry !== "..") {
$path_to_entry = $path.'/'.$entry;
if (@is_dir($path_to_entry)) {
$dirs[] = $path_to_entry;
}
}
}
}

$patterns = array();
foreach($dirs as $dir){
$patterns[] = array(FILE,$dir.'/lang/ext/%1$s.php');
}

return $patterns;
}

function _getPatterns()
{
define ("DIR", "D");
define ("FILE", "F");

$patterns = array();
$patterns = $this->_getModulesDirectoriesToPattern();

$patterns[] = array(FILE,'/admin/lang/%1$s.nls.php');
$patterns[] = array(FILE,'/admin/lang/ext/%1$s/admin.inc.php');
$patterns[] = array(FILE,'/admin/lang/ext/%1$s/index.html');
$patterns[] = array(DIR,'/admin/lang/ext/%1$s');
$patterns[] = array(FILE,'/lib/lang/cms_selflink/ext/%1$s.php');
$patterns[] = array(FILE,'/lib/lang/tasks/ext/%1$s.php');

$patterns[] = array(FILE,'/lib/filemanager/ImageManager/lang/%2$s.js');
return $patterns;
}

function _cleaner($delete)
{
$temps_debut = microtime(true);
define ("DELETE", $delete);
$pipe = '|';

$lang_to_delete = $this->GetPreference('liste_langue_a_supprimer');
$lang_to_delete = explode($pipe,$lang_to_delete);
$patterns = $this->_getPatterns();

$langs = array();
foreach ( $this->_getLang() as $key => $item)
{
if(in_array($key, $lang_to_delete))
{
$langs[] = $item;
}
}

$size=0;
//Pour chaque patterns

$liste_objet = array();

foreach($patterns as $pattern){
//pour chaque langue
foreach($langs as $lang){

$objet = new stdclass;


//On remplace les %1$ et %2$ par la langue
$path = sprintf($pattern[1], $lang[0], (count($lang)>1?$lang[1]:null));

//Si le pattern désigne un fichier qui existe
if($pattern[0] == FILE && @is_file($path)){
//on récupère son poids
$stat = stat($path);
$size += $stat[7];

$objet->path = $path;
$objet->size = $stat[7];

//Si à supprimer, on supprime
if(DELETE)
unlink($path);

//Si le pattern est un répertoire qui existe
} else if($pattern[0] == DIR && @is_dir($path)){
$objet->path = $path;

//Si à supprimer, on supprime
if(DELETE)
rmdir($path);
}

if(isset($objet->path))
{
$liste_objet[] = $objet;
}
}
}
if(DELETE)
{
$this->_makeLog($this->Lang('numberFileDeleted',count($liste_objet),$size));
} else
{
$this->_makeLog($this->Lang('numberFileDeletable',count($liste_objet),$size));
}

return $liste_objet;
}

function _makeLog($str)
{
global $gCms;
$db =& $gCms->GetDb();
// Récupération d'un nouvel identifiant depuis la séquence
$sid = $db->GenID(cms_db_prefix().'module_cmsModuleCleaner_log_seq');
$queryInsert = 'INSERT INTO '.cms_db_prefix().'module_cmsModuleCleaner_log (log_id,log_date,log_texte) values (?,?,?)';
$param = array($sid, trim($db->DBTimeStamp(time()), "'"), $str);
$result = $db->Execute($queryInsert, $param);
if ($result === false){die("Database error durant l'insert de la donnée! $queryInsert");}
}

 

Alors évidement en soit ce n'est pas très intéressant de se pencher sur le contenu des fonctions, c'est simplement une adaptation de ma toute première création : l'UDT de nettoyage des fichiers de langues. Ce qui est par contre plus intéressant c'est le fait que je nomme toujours mes noms de fonction par un underscore.

En effet rien ne m'assure que demain une fonction "makeLog()" ne sera pas implémentée dans le noyau des modules de cmsmadesimple. Quelle assurance alors que mon code fonctionne encore ? Ainsi il a été acté par les développeurs de cmsmadesimple que toutes les fonctions ajoutées dans les fichiers xxx.module.php devront, par sécurité, commencer par un underscore.

Notez également que :

  • Pour faire appel à une fonction depuis une autre fonction j'utilise $this->autreFonction(), c'est la programmation objet qui nécessite cela.
  • Dans mes fonctions, je place parfois un global $gCms; avant toute chose, c'est pour récupérer la valeur de $gCms dans la fonction. Sans ce code cette variable vaudrait null. On appel ce principe la "portée d'une variable"

Une fois ce code ajouté, je vais évidement pouvoir y faire appel depuis les pages de l'administration en y ajoutant un bouton de traitement, ainsi qu'une nouvelle option dans la partie paramétrage du module.

Gestion SQL

On reviendra peut être rapidement sur la fonction _makeLog($str) qui fait des insertions en bases. On avait déjà vu le select dans les précédents billets, voici son pendant : l'Insert SQL. Notez que je vous conseille énormement (impérativement?) de passer les paramètres tel que je l'ai fait :

$queryInsert = 'INSERT INTO '.cms_db_prefix().'module_cmsModuleCleaner_log (log_id,log_date,log_texte) values (?,?,?)';
$param = array($sid, trim($db->DBTimeStamp(time()), "'"), $str);
$result = $db->Execute($queryInsert, $param);

et non comme certains le font :

$sql = "select * from table where id = " + $id; 
$result = $db->Execute($sql);

La raison déjà évoquée dans d'autres articles du blog porte sur la sécurité de votre module contre les SQL-injections !

Donc attention !

Page d'action

Nous avions jusque maintenant peu de page php, et pour dire en fait la seule page appelée était action.defaultadmin.php

Passons un peu de temps sur la façon dont CmsMadeSimple permet de naviguer entre les différentes actions. Dans notre cas je veux un bouton sur l'admin qui amène à une page de traitement que je nommerais arbitrairement "execute" (nettoyage dans notre cas) avant de revenir sur la page d'admin.

on aura donc : action.defaultadmin.php => action.execute.php => action.defaultadmin.php

La création du lien dans l'administration se fait ainsi :

$this->CreateLink($id, 'execute', $returnid, $this->Lang('execute'))

On retrouve en second paramètre le nom de l'action qui permet à CmsMadeSimple de naviguer de fichier action en fichier action. Le 4ème paramètre étant simplement le libellé à afficher (français ou anglais selon la langue du back office)

De l'autre côté nous avons le fichier d'exécution : action.execute.php qui contient finalement très peu de code, et tant mieux pour sa lisibilité !

<?php

//Securite
if (!isset($gCms)) exit;


// Verification de la permission
if (! $this->VisibleToAdminUser()) {
echo $this->ShowErrors($this->Lang('accessdenied'));
return;
}

$delete = $this->GetPreference('suppression');

//Appel au nettoyage, fonction présente dans le noyau du module : cmsModuleCleaner.module.php
$listeResultat = $this->_cleaner($delete);

[...]

$smarty->assign('return_link',$this->CreateLink ($id, 'defaultadmin', $returnid, $this->Lang('return')));

echo $this->ProcessTemplate('executeadmin.tpl');

?>


On retrouve les principes de sécurité dont j'ai déjà parlé dans les précédents articles, suivit d'un appel aux fonctions contenues dans le noyaux du module que l'on a vu en début de cet article. Enfin la création d'un lien pointant vers defaultadmin, la page d'accueil de l'administration du module.

La boucle est bouclée : action.defaultadmin.php => action.execute.php => action.defaultadmin.php

Notez que l'API de CmsMadeSimple permet des redirections post-traitement évitant de dépenser un clic pour passer de action.execute.php à action.defaultadmin.php.

Gestion de l'internationnalisation du module

Attention : ici je ne parle pas forcement de configurer votre module pour gérer 34 langues sur le front-office avec toutes les astuces SEO qui vont avec, je n'aborderais ici que les notions de multilangue envers les utilisateurs du module : tant les webmasters pour le back-office, que les éventuels visiteurs si notre module possédait un front-office.

Dans cette version, l'intégralité des phrases et mots sont traduits en langues FR et EN (Français et Anglais). Maintenant que nous avons besoin de ces doubles fichiers Anglais ET Français il est intéressant de se pencher sur la manière dont CmsMadeSimple gère les fichiers de langues, comme à son habitude : très simplement.

En premier point créez les fichiers et répertoires suivant à la racine de votre module :

  • ./lang/ext
  • ./lang/ext/fr_FR.php

Configuration Terminée (oui je sais : déjà) ! Il vous reste maintenant à dédoubler les messages en anglais dans le fichier d'origine et leur correspondances françaises dans ce nouveau fichier.

Et comment laisser un étranger traduire mon module ?

Attention : Dans notre cas nous allons un peu à l'envers du fonctionnement de la traduction d'un module dans CmsMadeSimple. En effet, dans un cas normal, un module se code simplement en Anglais, s'envoie sur la Forge de CmsMadeSimple, s'inscrit sur le centre de traduction, et enfin se traduit en français, espagnol, russe, ... DEPUIS le centre de traduction.

Disons que dans cet article, j'aborde ce point surtout pour que vous puissiez comprendre le fonctionnement d'un module dans ses grandes lignes, nous reviendrons certainement sur la manière dont un développeur doit procéder pour mettre son module au service de tous sur la Forge un peu plus tard ;)

Exécution du module

Je lance le module en cliquant sur le lien "Procéder au nettoyage". J'ai pris soin de décocher la checkbox "Suppression définitive"

On y retrouve le traitement de simulation de la suppression des fichiers comme le proposait l'UDT, avec une belle couche de design en plus ! Enfin vous allez voir que le log est bien enrichit.

 

Allez un second essai : je recoche la checkbox et je relance successivement 2 fois le traitement.

Hop un second nettoyage ?

 

Notre travail est donc terminé : nous avons bien une suppression propre des fichiers de langues !

Bilan de la 5ème édition et pistes pour creuser vos connaissances

A vous maintenant de me dire si ce petit module disponible en version 1.3.0 fonctionne bien chez vous :)

Alors certains thèmes de programmation n'ont pas encore été abordés. Je peux en citer quelques uns

  • L'automatisme des taches plannfiées (même si vous avez pu voir qu'un paramétre était déjà prévu dans l'administration du module)
  • La gestion des evènements
  • Les Pretty-URL pour un module
  • L'affiche de donnée en front-office
  • ....

Autant de points important à connaitre pour celui qui désire développer de solides modules sur CmsMadeSimple. Je ne sais pas encore si je vais pouvoir vous faire d'autres articles sur ces sujets précisement mais si c'est le cas je penses partir de notre petit module autant que faire se peut ! Affaire à suivre donc...

Si vous souhaitez maintenant creuser vos connaissances (bandes d'affamés) je vous conseille deux choses :

Installez l'excellant module d'apprentissage Skeleton qui est certes en Anglais mais est surtout un excellant outils de travail pour comprendre toutes les subtilités que peut contenir un module sur CmsMadeSimple... Un must donc.

Le second conseil que je vous donnerais si vous devez vous mettre à coder : lisez lisez et relisez cette précieuse documentation qui est la bible pour tous les développeurs sur CmsMadeSimple!

Voilà pour aujourd'hui, N'hésitez pas à me dire si vous avez des questions sur le fonctionnement de notre petit module et si vous avez eu des idées pour l'améliorer !

]]>
http://www.cmsmadesimple.fr/blog/70/15/Construire-un-module---part-V
Packtpub awards 2011 http://www.cmsmadesimple.fr/packtpub-awards-2011 Mon, 10 Oct 2011 22:24:00 +0200 MAIS il est encore temps de se mobiliser pour figurer en bonne place :

Best Open Source CMS for Performance
Best CMS for Best Community
Best CMS for Ease of Use
Il y a aussi Best .NET Open Source CMS. Si comme moi, vous n'en connaissez pas wink , alors il faut mettre n'importe quoi et une url bidon mais valide.
En fait quand on vote dans la sous-catégorie, tous les champs sont obligatoires.

Rendez-vous ici : http://www.packtpub.com/open-source-awa … ubcategory
Et faites passer l'info.

Nous avons jusqu'au 30 Octobre pour voter!

Chez Gandi aussi, vous pouvez faire du bruit autour de CMSMS : plus de détails ici http://www.cmsmadesimple.fr/forum/viewtopic.php?id=3743

 

]]>
http://www.cmsmadesimple.fr/packtpub-awards-2011
Appel d'offre pour la création d'un module http://www.cmsmadesimple.fr/blog/68/15/Appel-d-offre-pour-la-creation-d-un-module Mon, 10 Oct 2011 09:46:00 +0200 Si vous êtes développeur et que le projet vous intéresse rejoignez nous sur le forum.

]]>
http://www.cmsmadesimple.fr/blog/68/15/Appel-d-offre-pour-la-creation-d-un-module
Le Café Made Simple #1, c'est terminé ! http://www.cmsmadesimple.fr/blog/67/15/Le-Cafe-Made-Simple-1-c-est-termine Tue, 04 Oct 2011 14:16:00 +0200 http://www.cmsmadesimple.fr/forum/viewtopic.php?pid=23283#p23283

Encore merci à nos participants et rendez vous le 8 Avril prochain pour la prochaine session !

]]>
http://www.cmsmadesimple.fr/blog/67/15/Le-Cafe-Made-Simple-1-c-est-termine
Faire un module qui agisse sur le titre d'une page http://www.cmsmadesimple.fr/blog/66/15/Faire-un-module-qui-agisse-sur-le-titre-d-une-page Wed, 28 Sep 2011 12:56:00 +0200 Question : comment faire pour que votre module soit capable d'agir sur la balise La Gestion de Contenu Simplifiée de votre gabarit ? réponses dans cette news :)

 

Edit 8 Octobre : article mis à jour (il manquait un bout)

Etape n°1 :

Assurez vous que $config['process_whole_template'] = false; dans le fichier de config.php

Etape n°2 :

Dans le gabarit de votre module, assignez à smarty le titre de votre choix :

{assign var='title' value='mon super titre'}

Note : vous pouvez également le faire depuis les classes PHP :

$smarty->assign('title','mon super titre');

Etape n°3:


Dans le gabarit de votre page :

remplacez

{process_pagedata}

par

{*process_pagedata*}{content assign="capturedcontent"}

 

remplacez

{content}

par

{*content*}{$capturedcontent}

 

et enfin remplacez (dans notre exemple)

<title>{$title}</title>

par

<title>{if isset($title)}
{$title}
{else}
{title}
{/if}</title>

 

Ainsi votre site sera capable d'afficher 'mon super titre' dans la balise <title> dès que votre module sera utilisé. Pratique pour améliorer votre référencement des pages du module

 

Comment ça fonctionne ?

Le {process_pagedata} à pour but d'interpréter toute la page en smarty avant de faire appel aux modules. Alors forcement avec cette ligne, toute tentative d'insertion dans smarty de valeur personnalisée ne pourrait pas fonctionner, ceci explique donc notre suppression de {process_pagedata}.

Ensuite nous avons mis en place une grosse condition : si la variable $title existe, c'est que nous sommes dans une page qui affiche notre module. Il faut donc afficher $title plutôt que d'appeler la balise title de cmsmadesimple habituellement utilisée.

 

Mon conseil : utilisez cette astuce pour plein de choses, comme l'inclusion de librairies JS nécessaires uniquement pour vos modules :)

 

source1 source2

]]>
http://www.cmsmadesimple.fr/blog/66/15/Faire-un-module-qui-agisse-sur-le-titre-d-une-page
cmsmadesimple.fr sur Cloudflare http://www.cmsmadesimple.fr/blog/65/15/cmsmadesimple-fr-sur-Cloudflare Tue, 06 Sep 2011 15:32:00 +0200 Korben ait rédigé un billet sur le sujet, j'ai testé sur plusieurs de mes sites ce CDN gratuit avant de l'appliquer finalement sur www.cmsmadesimple.fr. Retour de mon expérience après quelques jours d'exploitation.

Présentation de CloudFlare

Pour faire rapide et pour ne pas plagier d'autres personnes qui font ce genre d'article bien mieux que moi, Cloudflare est un site qui permet dans leur offre gratuite de disposer votre site internet sur CDN.

Pour rappel, les CDN sont ces systèmes qui mettent en cache les données de vos sites afin de les stocker aux quatre coins de la terre dans l'unique but d'accélérer la transmission de ces données à vos lointains visiteurs.

Quel est l'intérêt d'un CDN pour un petit site ? je dirais sincèrement aucun, d'autant que la plupart sont payant.

Quel est l'intérêt de Cloudflare ? Plusieurs.

  • Cloudflare propose une version gratuite de ses services.
  • Cloudflare est facile à paramétrer et ne nécessite pas de modifier votre site

 

mais surtout

 

  • Cloudflare propose une protection contre les spams dès la version gratuite ! et c'est clairement pour cela que j'ai testé leur offre.

Première approche

Mes premiers tests sur des petits sites ont été un désastre. La faute à ma mauvaise connaissance des zones DNS. Les miennes étaient pourries, fonctionnelles mais pourries. Après remise à plat ça roule comme sur des roulettes.

Cloudflare propose de détecter automatiquement votre configuration DNS (pour peu qu'elle soit bien faite).

Une fois la configuration des zones DNS sur Cloudflare terminé, il reste simplement à modifier les serveurs DNS de votre register. Pour ma part j'ai simplement changé les habituels a.dns.gan di.net, b.dns.gandi.net et c.dns.gandi.net par les informations données par Cloudflare à la fin de mon paramétrage.

Attendez 24H le temps que les nouveaux DNS se propagent (ceci expliquant au passage les soucis de connexions que vous avez pu rencontré semaine dernière.) et vous avez finit.

Après usage

Mon expérience sur CloudFlare se résume à 15 petits jours pour 3 sites web différents., autant dire que mon retour est à prendre avec autant de pincettes.

Première réaction : j'adopte ! leur services réponds parfaitement à mes attentes. Leur backoffice propose de très nombreuses options qui serait très long de lister intégralement. Notez simplement :

  • Liste des visites comme Google Analytics (CloudFlare se vante d'ailleurs d'être plus précis)
  • Liste des menaces bloquées (possibilité de créer une liste blanche par IP)
  • Plein de diagrammes, et moi plus il y a de camembert plus je suis content.
  • Visualisation des gains de bande passante pour votre hébergeur
  • Options pour minimiser votre CSS, vos JS et votre HTML

Tous ces services sont fonctionnels ET intéressant à observer pour s'assurer que votre site est en bonne santé. Mais au delà de leur site, j'ai trouvé très intéressant d'autres points :

  • Mon hébergeur me signale effectivement une baisse de la consommation de la bande passage de l'ordre de 33%
  • Gtmetrix, l'outils de notation de site internet me signale +1 point pour pagespeed et +5 points pour yslow
  • aucun spam reporté sur le blog.

 

bref plutôt pas mal comme résultat pour un service gratuit :)

 

Par contre

Le site, s'il propose la langue française, n'est pas totalement traduit... et encore je ne parles pas des textes traduit en automatique qui restent incompréhensibles.

De très nombreuses options plantent. J'ai ainsi été incapable d'ajouter un enregistrement A ou CNAME dans leur système. Obligé de passer par un import de fichier de zone complet. Bon ce n'est pas bloquant mais c'est lourd pour une petite modification. Notez que j'ai testé sur différent navigateur sans succès.

Autre option qui plante méchant : la plupart de leur popup JS qui ne s'afficheront jamais... aucune idée du pourquoi... (testé sur 2 PC différents avec OS différents).

Enfin quelques utilisateurs m'ont signalé des grosses lenteurs un moment, je penses sincèrement qu'il s'agissait du passage de DNS car depuis je n'ai rencontré aucun soucis.

Au final

Je conserves Cloudflare et je vous invites tout simplement à le tester :)

Je vous proposes évidement de partager votre propre expérience des CDN et/ou de Cloudflare dans les commentaires.

]]>
http://www.cmsmadesimple.fr/blog/65/15/cmsmadesimple-fr-sur-Cloudflare
CmsMadeSimple 1.9.4.3 http://www.cmsmadesimple.fr/blog/64/15/CmsMadeSimple-1-9-4-3 Sat, 27 Aug 2011 21:49:00 +0200 Une nouvelle version de sécurité est sortie ce WE pour colmater une brèche de sécurité relativement peu dramatique cette fois puisqu'elle ne permet à l'attaquant que de modifier le contenu de vos articles publiés par le module News.

Si comme la plupart des personnes vous utilisez ce module fournit par défaut dans toutes les installations de CmsMadeSimple nous vous invitons à vous mettre à jour dès que possible.

Comme pour toutes les sorties de versions corrigeant des failles de sécurité, l'équipe de modération du forum remet à jour sa politique de support. Notez donc qu'à partir de maintenant nous n'apporterons d'aide que sur les versions 1.6.10,  1.9.4.3 et 1.10.0 dans son cadre de la bêta test

Note : A l'heure où nous écrivons ces lignes, le site de téléchargement de cette version semble hors-ligne. Vous retrouverez les liens de téléchargement sur notre site dès que nous aurons pu nous même en prendre connaissance, restez donc dans le secteur ;)

 

edit : liens mis à jour

]]>
http://www.cmsmadesimple.fr/blog/64/15/CmsMadeSimple-1-9-4-3
Petites Coupures de nos sites http://www.cmsmadesimple.fr/blog/63/15/Petites-Coupures-de-nos-sites Mon, 22 Aug 2011 11:16:00 +0200 Afin de tester un nouvel outils qui devrait accélérer et fiabiliser nos sites, je suis en train de tenter d'intégrer CloudFlare, un CDN gratuit qui fait quelques heureux dans le milieu du net.

Seulement la configuration de CloudFlare nécessite quelques changement sur nos propres DNS et entraineront forcement quelques coupures le temps que les nouveaux DNS se propagent un peu partout sur le net.

Donc pas de panique si vous n'accédez plus aux sites suivant, ils reviendront en ligne quelques minutes/quelques heures plus tard.

Et je profiterais de cette expérience pour faire un tuto spécial CmsMadeSimple si j'ai le temps.

]]>
http://www.cmsmadesimple.fr/blog/63/15/Petites-Coupures-de-nos-sites
Cms Made Simple 1.10.0 (béta) http://www.cmsmadesimple.fr/blog/56/15/Cms-Made-Simple-1-10-0-beta Mon, 22 Aug 2011 10:15:00 +0200

En premier point les liens qui pourront vous intéresser :

 

Résumer cette version en seulement quelques points relèverais de l'impossible tant le travail effectué sur le moteur interne de CmsMadeSimple est important

Deux chiffres pour commencer :

Les plus grosses modifications pour les utilisateurs :

  • TinyMce devient un module à part et laisse la place à MicroTiny, autre éditeur WYSIWYG bien moins gourmand. Personnellement j'ai pu tester ce nouveau module dans une version Alpha et je l'ai déjà adopté !
  • Les mots de passe des nouvelles installations sont encodés en md5 + salt
  • Le log de l'administration évolue avec plein d'options de filtre

Bref un petit bijou comme je disais mais attention : un bijou à ne jamais utiliser sur vos sites déjà en production !

Télécharger cette version béta pour test : http://www.cmsmadesimple.org/downloads/

]]>
http://www.cmsmadesimple.fr/blog/56/15/Cms-Made-Simple-1-10-0-beta
Café Made Simple #1 http://www.cmsmadesimple.fr/blog/62/15/Cafe-Made-Simple-1 Tue, 26 Jul 2011 13:40:00 +0200

Initialement prévue en Avril, cette journée de découverte a été finalement repoussée et fixée à la rentrée de Septembre.

L'idée est de se retrouver, discuter de tout et de rien autour d'un verre ou d'un café durant l'après midi, et évidement découvrir qui se cache derrière les pseudos du forum. Une bonne occasion également d'échanger ses connaissances, de poser des questions et par dessus tout se faire plaisir !

Plusieurs dates sont possibles, nous tenterons évidement d’arrêter la date qui conviendrait au plus grand nombre.

Le lieu du rendez vous sur Paris n'est pas encore figé mais sans aucun doute sera un café pouvant accueillir une petite troupe près d'une bouche de métro et proche de restaurant (pour les personnes motivées)

Nous souhaitons évidement vous retrouver nombreux à cette première édition française qui correspondra ni plus ni moins aux 2 ans de l'association (encore une bonne raison de venir!)

Retrouvez la discussion sur le forum.

 

Et sinon : bonnes vacances !

]]>
http://www.cmsmadesimple.fr/blog/62/15/Cafe-Made-Simple-1
Astuces pour les développeurs de module http://www.cmsmadesimple.fr/blog/61/15/Astuces-pour-les-developpeurs-de-module Sat, 25 Jun 2011 17:57:00 +0200 Comment dans le back-office de CmsMadeSimple ajouter un lien vers une librairie JS, et uniquement pour le back-office de votre module ?

la réponse en image !

Ouvrez votre fichier <modulename>.module.php et ajoutez ces lignes

function GetHeaderHTML() {
global $gCms;
$config = $gCms->GetConfig();
return "\r<script type='text/javascript' src='".$config['root_url']."/modules/<modulename>/lib/script.js'></script>";
}

 

Automatiquement le back-office de votre module proposera la librairie ! Pratique lorsque l'on développe des belles interfaces chargées :)

posté par kidcardboard sur le forum anglais.

]]>
http://www.cmsmadesimple.fr/blog/61/15/Astuces-pour-les-developpeurs-de-module
Abandon du support de la version 1.6.x par la team org http://www.cmsmadesimple.fr/blog/60/15/Abandon-du-support-de-la-version-1-6-x-par-la-team-org Wed, 08 Jun 2011 10:24:00 +0200 Calguy1000 l'annonce aujourd'hui, la team arrête le support avec la récente (et dernière) publication de la version 1.6.10... et ça ne promet rien de bon pour ceux qui sont hébergé chez free...


Cette décision va avoir un impact non négligeable sur la vie des français puisque bon nombre d'entre nous sommes encore hébergés chez Free qui ne supporte pas encore les version 1.9.x

La suite sur le forum]]>
http://www.cmsmadesimple.fr/blog/60/15/Abandon-du-support-de-la-version-1-6-x-par-la-team-org
Construire un module - part IV http://www.cmsmadesimple.fr/blog/57/15/Construire-un-module---part-IV Mon, 30 May 2011 08:00:00 +0200 Rappel des précédentes modifications :

Dans l'épisode précédent ...

* Nous avons créé à l'installation une liste de préférences :

  • $this->SetPreference("delay", $delay);
  • $this->SetPreference("suppression", $suppression);
  • $this->SetPreference("liste_langue", $langs);
  • $this->SetPreference("liste_langue_a_supprimer", $langs_a_supprimer);

* Nous avons créé un droit d'accès :

  • $this->CreatePermission('cmsModuleCleaner_acces_standard','cmsModuleCleaner : acc&eacute;der au module');

* Nous avons créé deux tables dans la base de donnée ainsi :

une table module_cmsModuleCleaner_log avec 3 champs :
  • log_id Identifiant
  • log_texte Texte du log
  • log_date Date du log

Nous allons voir maintenant comment l'utiliser.

Concept A Retenir


Pour cela je vais essentiellement vous montrer du code à retenir. Voici quelques concepts à toujours avoir en tête :
if (!isset($gCms)) exit;

Chacune de vos classes doit commencer par cette ligne pour une question de sécurité !
$gCms

C'est la variable mise à disposition dans toutes les classes de vos modules (dès lors que votre module est repéré par Cmsms.)
Elle contient tout ce dont vous avez besoin en termes d'informations sur l'environnement : base de donnée, configuration, url ....
Vous comprendrez donc le concept précédent de sécurité : si Cmsms n'est pas initialisé alors c'est qu'on entre dans vos fichiers suite à une tentative de piratage !
$this

Cette variable correspond a votre module qui parlerait de lui à la 3eme personne (oui il est un peu skizo, je sais)
Très exactement, vous pouvez à partir de $this appeler TOUTES les fonctions présentes dans CmsModuleCleaner.module.php.
Mieux encore, puisque nous avons vu que CmsModuleCleaner.module.php héritait de la classe php : CMSModule, vous récupérez encore plus de possibilité.
$this->GetName()

Exemple d'utilisation de $this, ce code appel donc la fonction GetName() contenu dans CmsModuleCleaner.module.php
$this->GetPreference("delay")

Exemple d'utilisation de $this, mais cette fois l'appel porte sur une fonction héritée de la classe php : CMSModule.

voir la documentation complète de la classe CMSModule
$params


Durant les envois de données de formulaire, les paramètres transmis par $_POST et $_GET sont récupérés dans $params. A noter qu'une restriction existe côté front-office pour une question de sécurité, je reviendrais sur cette restriction plus tard.
Exemple d'utilisation : $params['nomParametre'];

$id
Cette petite variable contiens un identifiant unique représentant votre module aux yeux de CmsMadeSimple. Elle est beaucoup demandé par les fonctions de CMSModule.php

Attention a ne pas l'écraser par inadvertance !
$returnid

Cette variable contient l'id de la page courante (backoffice ou frontoffice) ce qui permettra a CmsMadeSimple de faire des "retours case départ" après un traitement de mise à jour de donnée par exemple

CmsModuleCleaner.module.php


Allez nous avons vu les grandes lignes, nous allons pouvoir nous mettre à coder.

En partant de l'ancien CmsModuleCleaner.module.php du tutorial précédent, j'ai modifié quelques points.
 function GetVersion()
 {
 return '1.2.0';
 }

Modif : J'ai fait évoluer la version pour permettre un update sur les versions.
 function HasAdmin()
 {
 return true;
 }

Modif : En changeant de faux à vrai cette fonction, j'indique à CmsMadeSimple que mon module aura une interface d'administration.
 function GetAdminSection()
 {
 return 'extensions';
 }

Modif : Lié à ma modification précédente, je précise à CmsMadeSimple que c'est dans le menu "Extensions" qu'il apparaitra.
 function VisibleToAdminUser()
 {
 return $this->CheckPermission('cmsModuleCleaner_acces_standard');
 }
{literal}
Modif : Si cette fonction retourne vrai, alors l'utilisateur connecté au panneau d'admin verra mon module. J'ai donc utilisé la permission spécialement créée dans le tuto précédent.

Notez que CheckPermission() est encore une fonction héritée de la classe CMSModule.

method.upgrade.php


J'ai changé ma version, il faut impérativement que je modifie le script de mise à jour même si concrètement la structure des paramètres bdd|permissions|préférences n'ont absolument pas changé
{literal}<?php
if (!isset($gCms)) exit;
$db =& $gCms->GetDb();
$cleaner =& $gCms->modules["CmsModuleCleaner"]['object'];
if(!isset($cleaner))
 return;
$current_version = $oldversion;
switch($current_version)
{
 // On est en version 1.0.0
 case "1.0.0":version_1_0_0($cleaner);
 case "1.1.0":version_1_1_0($cleaner);
 case "1.2.0":version_1_2_0($cleaner);
}
// put mention into the admin log
$this->Audit( 0, 
 $this->Lang('friendlyname'), 
 $this->Lang('upgraded', $this->GetVersion()));
function version_1_0_0($cleaner)
{
 [.......]
}
function version_1_1_0($cleaner)
{
 //Rien à faire, reste au cas ou
}
function version_1_2_0($cleaner)
{
 //Servira pour la prochaine mise à jour 1.2.0 -> autre
}
?>

action.defaultadmin.php


Ce nom est encore une norme ! il représente l'entrée de votre module aux yeux de CmsMadeSimple. Nous allons donc en créer un

./modules/CmsModuleCleaner/action.defaultadmin.php

Notez que l'interface de notre module se découpe en 2 onglets : l'historique des logs de notre module + un onglet pour la configuration des paramètres.
<?php
if (!isset($gCms)) exit;
// Verification de la permission
if (! $this->VisibleToAdminUser()) {
 echo $this->ShowErrors($this->Lang('accessdenied'));
 return;
}
if (FALSE == empty($params['active_tab']))
{
 $tab = $params['active_tab'];
} else 
{
 $tab = '';
}
//On ajoute l'onglet Configuration + Historique
$tab_header = $this->StartTabHeaders();
$tab_header.= $this->SetTabHeader('historique',$this->Lang('title_historique'),('historique' == $tab)?true:false);
$tab_header.= $this->SetTabHeader('configuration',$this->Lang('title_configuration'),('configuration' == $tab)?true:false);
$tab_header.= $this->EndTabHeaders();
$this->smarty->assign('tabs_start',$tab_header.$this->StartTabContent());
$this->smarty->assign('tab_end',$this->EndTab());
//Contenu de l'onglet Historique
$this->smarty->assign('historiqueTpl',$this->StartTab('historique', $params));
include(dirname(__FILE__).'/function.admin_tab_historique.php');
//Contenu de l'onglet Configuration
$this->smarty->assign('confTpl',$this->StartTab('configuration', $params));
include(dirname(__FILE__).'/function.admin_tab_configuration.php');
$this->smarty->assign('tabs_end',$this->EndTabContent());
// passe une référence au module pour smarty ce qui permettra des appel plutôt sympa aux fichiers de langue directement
$smarty->assign_by_ref('module',$this);
//On génère le template nommé defaultadmin.tpl qui doit se trouver dans le sous répertoire /templates de mon projet
echo $this->ProcessTemplate('defaultadmin.tpl');
?>

J'ai tenté de bien commenter le code :)

Retenez :
* la double sécurité en début de fichier sur notamment la permission utilisateur.
* l'appel en INCLUDE de 2 sous fichiers
* le passage en référence de notre module à Smarty
* enfin le dernier point : la génération du template que je vais devoir évidement créer.

function.admin_tab_historique.php


Ce fichier ne contiendra que l'historique des log de notre module grâce à une connexion à la base de donnée.
<?php
if (!isset($gCms)) exit;
// Verification de la permission
if (! $this->VisibleToAdminUser()) {
 echo $this->ShowErrors($this->Lang('accessdenied'));
 return;
}
// Récupérons l'historique des logs
$query = 'SELECT * FROM '.cms_db_prefix().'module_cmsModuleCleaner_log ORDER BY log_date DESC';
$result = $db->Execute($query);
//Traitement en cas d'erreur SQL
if ($result === false)
{
 echo "Database error!";
 exit;
}
//On boucle sur les résultats et on fait une liste d'objet qui contiendra toutes les infos. 
$listeFrontal = array();
$i = 0;
while ($row = $result->FetchRow())
{
 $obj = new stdClass;
 $obj->id = $row['log_id'];
 $obj->date = $db->UnixTimeStamp($row['log_date']);
 $obj->text = $row['log_texte'];
 $obj->rowclass = ($i++%2 == 0?'row1':'row2');
 $listeFrontal[] = $obj;
}
//On passe à smarty les informations dans la variable nommée listeHistorique.
$smarty->assign('listeHistorique',$listeFrontal);
 //elle sera accessible dans les templates via le code {$listeHistorique}
?>

Notez l'utilisation de cms_db_prefix() afin de conserver un code portable d'un installation à une autre !

function.admin_tab_configuration.php


Ce fichier contient les options de configuration ainsi qu'un formulaire pour les mettre à jour.

Le fichier php qui mettre physiquement les données à jour sera le fichier action.admin_save_prefs.php
<?php
if (!isset($gCms)) exit;
// Verification de la permission
if (! $this->VisibleToAdminUser()) {
 echo $this->ShowErrors($this->Lang('accessdenied'));
 return;
}
// On définit dans smarty un début de formulaire
$smarty->assign('start_form', $this->CreateFormStart($id, 'admin_save_prefs', $returnid));
// On définit également une fin de formulaire
$smarty->assign('end_form', $this->CreateFormEnd());
//On ajoute un inputText pour préciser le délay avant un nettoyage automatique
$smarty->assign('input_delay',$this->CreateInputText($id, 'delay', $this->GetPreference('delay'),10,10));
//On ajoute une checkbox pour activer ou désactiver le nettoyage définitif
$smarty->assign('input_suppression',$this->CreateInputCheckbox($id, 'suppression', 1, $this->GetPreference('suppression')));
//On ajoute le bouton d'action type submit
$smarty->assign('submit', $this->CreateInputSubmit($id, 'submit', $this->Lang('saveConfig')));
?>

Beaucoup de déclaration de champs à l'attention de Smarty

action.admin_save_prefs.php


Vous avez vu au dessus, la ligne $this->CreateFormStart($id, 'admin_save_prefs', $returnid)

CmsMadeSimple est capable uniquement avec la chaine 'admin_save_prefs' de savoir vers quel fichier php il doit envoyer les données de votre formulaire. C'est encore et toujours une histoire de norme. Il appelera donc action.admin_save_prefs.php.
<?php
if (!isset($gCms)) exit;
// Verification de la permission
if (! $this->VisibleToAdminUser()) {
 echo $this->ShowErrors($this->Lang('accessdenied'));
 return;
}
//Mise à jour des préférences
if(empty($params['delay']))
 $this->SetPreference('delay',0);
else
 $this->SetPreference('delay',$params['delay']);
if(empty($params['suppression']))
 $this->SetPreference('suppression',0);
else
 $this->SetPreference('suppression',$params['suppression']);
// On écrit une ligne dans le log de CmsMadeSimple
$this->Audit( 0, $this->Lang('friendlyname'), $this->Lang('prefsupdated') );
// retour à la page d'accueil de mon module
$this->Redirect($id, 'defaultadmin', $returnid, array('tab_message'=> 'prefsupdated', 'active_tab' => 'configuration'));
?>

Pas de Smarty cette fois. A la fin du traitement de mise à jour, on reviendra directement sur la page d'accueil de notre module.

Petite pause

A ce niveau de code nous avons vu énormément de chose, la plus important étant sans aucun doute la norme de codage des fichiers pour permettre une interaction de page en page.

  • L'entrée de votre module dans le backoffice devra forcement s'appeler action.defaultadmin.php
  • Tous les fichiers d'action doivent s'appeler action.nomDuFichier.php
  • Un formulaire pointant vers le fichier action.nomDuFichier.php devra faire l'objet d'une déclaration sous la forme $this->CreateFormStart($id, 'nomDuFichier', $returnid)
  • Un lien pointant vers le fichier action.nomDuFichier.php devra faire l'objet d'une déclaration sous la forme $this->CreateLink($id, 'nomDuFichier', $returnid, 'cliquez ici')

Reste un dernier point : le template que smarty doit utilisé. Nous l'avons déjà déclaré dans action.defaultadmin.php :
 echo $this->ProcessTemplate('defaultadmin.tpl');

reste donc à créer ce defaultadmin.tpl dans un nouveau sous répertoire qu'on nommera "templates" (norme oblige)

./templates/defaultadmin.tpl

{$tabs_start}
 {* onglet historique *}
 {$historiqueTpl}
 <fieldset>
 <legend>Historique</legend>
 <table cellspacing="0" class="pagetable">
 <thead>
 <tr>
 <th>{$module->Lang('th_id')}</th>
 <th>{$module->Lang('th_date')}</th>
 <th>{$module->Lang('th_text')}</th>
 </tr>
 </thead>
 <tbody>
 {if count($listeHistorique) == 0}<tr><td colspan='3'>Aucun enregistrement</td></tr>{/if}
 {foreach from=$listeHistorique item=entry}
 <tr class="{$entry->rowclass}" onmouseover="this.className='{$entry->rowclass}hover';" onmouseout="this.className='{$entry->rowclass}';">
 <td>{$entry->id}</td>
 <td>{$entry->date|cms_date_format}</td>
 <td>{$entry->text}</td>
 </tr>
 {/foreach}
 </tbody>
 </table>
 </fieldset>
 {$tab_end}
 {* Fin onglet historique *}
 {* onglet configuration *}
 {$confTpl}
 {$start_form}
 <fieldset>
 <legend>Delai de traitement</legend>
 <div>Delai en seconde avant nettoyage automatique : {$input_delay}</div>
 </fieldset>
 <fieldset>
 <legend>Suppression d&eacute;finitive</legend>
 <div>Si d&eacute;coch&eacute;, ferra uniquement une analyse de votre installation sans supprimer : {$input_suppression}</div>
 </fieldset>
 <div class="pageoverflow">{$submit}</div>
 {$end_form}
 {$tab_end}
 {* Fin onglet configuration *}
{$tabs_end}

Ce qu'on peut retenir :
  • C'est du smarty, tout ce qu'il y a de plus commun.
  • {$entry->date|cms_date_format} permettra de formater la date selon le format de CmsMadeSimple
  • Le code sur le <tr> est une astuce qui permettra de faire un changement de couleur sur les lignes du tableau toutes les deux lignes
  • {$module->Lang('th_id')} correspond à l'appel dans le fichier de langue de 'th_id'

Testons notre module.


Afin d'obtenir un rendu potable dans mon interface j'ai préalablement inséré des données bidons en base grâce à phpmyadmin
INSERT INTO `cms_module_cmsmodulecleaner_log` (`log_id`, `log_texte`, `log_date`) VALUES
(1, 'Quisque sed velit nunc. Suspendisse tincidunt mollis neque, ac dictum sapien sollicitudin vel. Curabitur tellus sem, sollicitudin posuere tempus malesuada, ultrices faucibus tortor. Aenean congue magna sed elit ornare vestibulum. Maecenas mattis ipsum qui', '2011-05-02 14:46:20'),
(2, 'Integer imperdiet rhoncus ipsum, in vestibulum mi elementum eu. Curabitur eget urna arcu, sed gravida ligula. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Duis eget neque et risus malesuada pretium. Ut metu', '2011-05-12 14:46:24'),
(3, 'Morbi pretium erat vel neque interdum tempor. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed in sapien neque, ut mollis ipsum. Maecenas elit lacus, tempor ', '2011-05-14 14:46:49'),
(4, 'Quisque semper nisl eget eros tempor consequat. Vivamus quam leo, auctor tempus bibendum id, volutpat et lorem. Duis at dui in orci suscipit scelerisque vel tristique nunc. Ut bibendum congue massa quis molestie. Donec pretium viverra diam non viverra. Ut', '2011-05-23 14:46:52');
update `cms_module_cmsmodulecleaner_log_seq` set id=4

Reste à me connecter au panel d'administration

 

 

 

Tout fonctionne correctement à un point prêt : le fichier de langue n'a pas été mis à jour !

<?php
$lang['friendlyname'] = 'Best Cleaner Module Ever';
$lang['postinstall'] = 'Post Install Message';
$lang['postuninstall'] = 'Post Uninstall Message, e.g., "Curses! Foiled Again!"';
$lang['really_uninstall'] = 'Really? You\'re sure you want to uninstall this fine module?';
$lang['installed'] = 'CmsModuleCleaner installed with succes';
$lang['uninstalled'] = 'CmsModuleCleaner uninstalled with succes';
//version 1.2.0
$lang['title_configuration'] = 'Module Configuration';
$lang['title_historique'] = 'Log';
$lang['th_id'] = 'Id';
$lang['th_date'] = 'Date';
$lang['th_text'] = 'Message';
$lang['prefsupdated'] = 'Preferences Updated';
$lang['saveConfig'] = 'Save my Configuration';
?>

On retest ?

Bilan


Nous avons énormément avancé dans notre tutorial sur la création du module puisque à ce niveau vous avez déjà de bonnes notions entre le cheminement des fichiers de l'administration, les appels aux sous-fichiers afin de rendre le code plus clair mais également l'utilisation de smarty et des templates.

Tout n'est pas finit ! En effet vous avez pu voir que des libellés en français trainent encore dans mon gabarit et c'est clairement une erreur de ma part (volontaire pour pas encombrer un peu plus le template de balise smarty).
Autre point absent vous l'aurez noté c'est la mise à jour des préférences de langage à supprimer.

La prochaine fois nous verrons donc :
  • la mise à jour de la liste des langues à supprimer.
  • la traduction en français de notre module
  • le traitement effectif de la suppression en déportant le code de l'UDT vers notre module.
  • l'ajout de message de log dans notre module

Et évidement vous pouvez télécharger notre nouvelle version du module (1.2.0)

Stay Tunned !

]]>
http://www.cmsmadesimple.fr/blog/57/15/Construire-un-module---part-IV
Faille de sécurité & nouvelles versions http://www.cmsmadesimple.fr/blog/59/15/Faille-de-securite-nouvelles-versions Thu, 26 May 2011 09:46:00 +0200 Il s'agit visiblement d'un problème d'SQL injection possible dans le module News. Il est évidement indispensable de se mettre à jour dans les plus bref délais.

]]>
http://www.cmsmadesimple.fr/blog/59/15/Faille-de-securite-nouvelles-versions
Avez vous testé du multi-langue ? http://www.cmsmadesimple.fr/blog/58/15/Avez-vous-teste-du-multi-langue Wed, 18 May 2011 15:03:00 +0200 Que ce soit l'ancien fork MLE,  l'un des modules suivant : mlecms (multilangue Cms), ml-management (language manager) ou babel (Babel: Multilingual site) ou encore une autre solution, beaucoup d'entre nous avons été confronté à la mise en place d'un site en différentes langues.

Avant de faire un article sur ce blog sur comment mettre en place un tel système je recherche des témoignages sur VOTRE expérience.

 

Alors vous avez un site Cms Made Simple en multilangue ? n'hésitez pas à m'expliquer quelle méthode/module vous avez choisit, son point fort, ses points faibles et éventuellement partager avec tout le monde vos astuces sur ce sujet.

Vous pouvez présenter votre explication par email à contact at cmsmadesimple point fr, ou directement aller sur le forum pour partager votre expérience et discuter avec les autres membres.

]]>
http://www.cmsmadesimple.fr/blog/58/15/Avez-vous-teste-du-multi-langue
Construire un module - part III http://www.cmsmadesimple.fr/blog/55/15/Construire-un-module---part-III Mon, 16 May 2011 08:00:00 +0200 Au départ

Nous avons vu dans un précédent billet qu'un module pouvait se résumer à quelques fichiers :

  • ./CmsModuleCleaner.module.php
  • ./method.install.php
  • ./method.uninstall.php
  • ./lang/en_US.php

Nous allons aujourd'hui nous pencher sur les fichiers d'installation et de désinstallation avant d'embrayer sur un fichier optionnel : celui de la mise à jour.

Pour rappel : nous travaillons toujours sur la création d'un module issu de la balise présentée dans le premier tuto : comment nettoyer CmsMadeSimple des fichiers de langues inutiles.

Récapitulatif non exhaustif des possibilités pour l'installation

CmsMadeSimple permet de très nombreuses opérations pour ces modules. Je vais vous faire la liste des principales fonctions que vous serez amenés un jour à utiliser.

Sécuriser l'accès aux fichiers

Par défaut : ajoutez toujours cette ligne dans le haut de vos fichiers, c'est le meilleur moyen d'éviter des accès indésirables.

if (!isset($gCms)) exit;

Elle signifie : si l'accès ne provient pas du noyau de CmsMadeSimple, je refuse l'accès.

Personnaliser l'expérience utilisateur

La plupart des modules auront besoin de sauvegarder les paramètres de fonctionnement. Je ne parles pas ici d'enregistrer les logs de fonctionnement, mais bien de savoir si l'utilisateur souhaite que mon module de nettoyage des fichiers de langues fonctionne une fois par jour, par heure ,par mois ou jamais.

Cette fonction peut être récupérée dans le module ainsi :

$this()->GetPreference('nom_de_mon_paramètre');

voir la documentation complète de la fonction

et elle peut être mise à jour tout simplement :

$this()->SetPreference('nom_de_mon_paramètre', ##Nouvelle Valeur## );

voir la documentation complète de la fonction

Pensez donc lors de l'installation d'un module à pré-saisir les valeurs des préférences de fonctionnement. Pour notre module de nettoyage, je vais dire par exemple que je dois nettoyer tous les mois, et je vais en profiter pour initialiser la liste des langues connues, la liste des langues que l'utilisateur voudra supprimer. Enfin je vais ajouter un paramètre spécifiant par défaut que je ne supprime rien, le module ferra donc qu'un simple listing après son installation.

le fichier d'installation doit donc contenir :

$delay = 60 * 60 * 24 * 30; // +/-  1 mois
$suppression = false;

$pipe = '|';
$sep = ';';

$langs = "";
$langs.= "ca_ES" . $pipe;
$langs.= "cs_CZ" . $pipe;
$langs.= "da_DK" . $pipe;
$langs.= "de_DE" . $pipe;
$langs.= "es_ES" . $pipe;
$langs.= "en_CY" . $pipe;
$langs.= "et_EE" . $pipe;
$langs.= "fa_FA" . $pipe;
$langs.= "fi_FI" . $pipe;
$langs.= "fr_FR" . $sep . "fr" . $pipe;
$langs.= "hr_HR" . $pipe;
$langs.= "hu_HU" . $pipe;
$langs.= "it_IT" . $pipe;
$langs.= "iw_IL" . $pipe;
$langs.= "ja_JP" . $pipe;
$langs.= "lt_LT" . $pipe;
$langs.= "nb_NO" . $pipe;
$langs.= "nl_NL" . $sep . "nl" . $pipe;
$langs.= "pl_PL" . $pipe;
$langs.= "pt_PT" . $pipe;
$langs.= "ro_RO" . $pipe;
$langs.= "ru_RU" . $pipe;
$langs.= "sk_SK" . $pipe;
$langs.= "sl_SI" . $pipe;
$langs.= "so_SO" . $pipe;
$langs.= "sr_YU" . $pipe;
$langs.= "sv_SE" . $pipe;
$langs.= "tr_TR" . $pipe;

$langs_a_supprimer = "";


// creation des préférences
$this->SetPreference("delay", $delay);
$this->SetPreference("suppression", $suppression);
$this->SetPreference("liste_langue", $langs);
$this->SetPreference("liste_langue_a_supprimer", $langs_a_supprimer);

Persistance des données

Sans doute une des parties les plus complexe : la gestion des accès en base de donnée. C'est un coup à prendre.

Voici quelques points :

Avec CmsMadeSimple on ne gère pas l'incrémentation automatique comme sous mysql, il faut comprendre que CmsMadeSimple repose sur une surcouche qui est capable normalement d'aller sur d'autre plateforme que Mysql, or certaines de ces plateformes ne gère pas l'incrémentation automatique (Oracle par exemple). Nous utiliserons donc un système qui est compatible partout : les séquences simulées par une table.

Exemple le plus parlant : j'ai une liste de client à insérer en base. L'identifiant du client sera un numéro incrémenté.

Je dois donc créer une table : client contenant 2 colonnes : un numéro et un libellé (nom + prénom)

Je créé également une seconde table client_seq qui contiendra une seule colonne : un numéro.

Lorsque j'insère un nouvel enregistrement, je vais vérifier d'abords dans client_seq quelle est la valeur (zéro au départ), j'ajoute 1 à cette valeur, et je met à jour la ligne dans client_seq. J'ajoute ensuite la ligne : 1-Dupont Maurice.

J'insère un nouvel enregistrement. je vais vérifier d'abords dans client_seq quelle est la valeur (Un cette fois ci), j'ajoute 1 à cette valeur, et je met à jour la ligne dans client_seq. J'ajoute ensuite la ligne : 2-Lefrançais François.

et ainsi de suite.

Maintenant prenons notre cas : je souhaites conserver le log de traitement de mon module, c'est un simple texte doublé d'une date, ce qui nous arrangent bien puisque c'est assez proche de notre exemple du dessus.

Prenez l'habitude de nommer les tables de la même manière dans vos modules :

module_nomDuModule_XXX et module_nomDuModule_XXX_seq

Notez qu'on ne préfixe pas par cms_ ce qui est pourtant la norme par défaut. L'explication viendra en dessous

Nous aurons donc

module_cmsModuleCleaner_log et module_cmsModuleCleaner_log_seq

avec 3 colonnes pour la première table : log_id (Entier) | log_texte (Chaine de 255 caractères) | log_date (date)

Le code de tout cela commence par l'initialisation de l'accès BDD :

$db =& $gCms->GetDb();
$taboptarray = array( 'mysql' => 'TYPE=MyISAM' );
$dict = NewDataDictionary( $db );

On continue par la déclaration de la première table, avant de la créer physiquement

// table schema description
$flds = "
log_id I KEY,
log_texte C(255),
log_date " . CMS_ADODB_DT . "
";

$sqlarray = $dict->CreateTableSQL( cms_db_prefix()."module_cmsModuleCleaner_log",
$flds,
$taboptarray);
$dict->ExecuteSQLArray($sqlarray);

Enfin on créé la séquence associée.

// create a sequence
$db->CreateSequence(cms_db_prefix()."module_cmsModuleCleaner_log_seq");

En bonus on peut ajouter un index sur la colonne de la date afin d'accélérer le traitement côté présentation

$query = 'ALTER TABLE '.cms_db_prefix().'module_cmsModuleCleaner_log ADD INDEX (log_date)';
if ($db->Execute($query) === false)
{
die('erreur grave durant l\'installation');
}

Notez dans la "table schema description" de l'utilisation des symboles I,C .. ils spécifient évidement le format de la colonne

  • I : entier
  • C(x) : chaine de x caractères max
  • X : chaine de longueur indéfinie (attention, ca peut ralentir le site si mal utilisé)
  • CMS_ADODB_DT : une date

+ d'information sur le site du framework

Voilà nous avons finit pour la partie génération bdd, nous verrons évidement le complément durant les prochaines parties de création du module.

Permission d'accès

Et si nous souhaitions ne laisser l'accès qu'aux personnes autorisées ? on va effectivement éviter de laisser le premier gus supprimer tous les fichiers de langue sans distinction non ? Allez hop c'est partis avec la fonction suivante :

// create a permission
$this->CreatePermission('cmsModuleCleaner_acces_standard','cmsModuleCleaner : acc&eacute;der au module');

voir la documentation complète de la fonction

Enrichir le fichier de log de CmsMadeSimple

CmsMadeSimple possède son propre fichier de log qui permet de suivre les installations / désinstallations de toute sorte. Pensez à le renseigner.

$this->Audit( 0, $this->Lang('friendlyname'), $this->Lang('installed'));

Et le reste

Voici pour les 4 grands points que vous retrouverez dans vos fichiers d'installation. Notez qu'il existe également 2 autres sujet que je n'aborderais pas de suite :

La gestion des évènements : très complexe car très abstrait nous le verrons ultérieurement.

La gestion des gabarits : pas mal complexe également, et je ne vois pas comment en parler au travers de mon module de nettoyage, on verra cela sans doute plus tard ;)

Récapitulatif non exhaustif des possibilités pour la désinstallation

J'avais déjà évoqué le sujet dans le précédent billet : il faut penser à TOUT RETIRER : table, préférence, permissions, évènements et gabarits.

Il n'est pas nécessaire de supprimer les fichiers même de votre module, c'est CmsMadeSimple qui s'en occupera.

La désinstallation se fait plus rapidement que l'installation.

On sécurise l'accès à la page

if (!isset($gCms)) exit;

Retirer toutes les préférences :

$this->RemovePreference();

Retirer toutes les tables et séquences :

$db =& $gCms->GetDb();
// remove the database modules_cmsModuleCleaner_log
$dict = NewDataDictionary( $db );
$sqlarray = $dict->DropTableSQL( cms_db_prefix()."module_cmsModuleCleaner_log" );
$dict->ExecuteSQLArray($sqlarray);
$db->DropSequence( cms_db_prefix()."module_cmsModuleCleaner_log_seq" );

Retirer les permissions

$this->RemovePermission('cmsModuleCleaner_acces_standard');

Pensez à renseigner le log de CmsMadeSimple.

$this->Audit( 0, $this->Lang('friendlyname'), $this->Lang('uninstalled'));

Évidement il faut enrichir notre fichier de langue de trois nouvelles lignes :

$lang['installed'] = 'CmsModuleCleaner installed with succes';
$lang['uninstalled'] = 'CmsModuleCleaner uninstalled with succes';
$lang['upgraded'] = 'CmsModuleCleaner upgraded with succes';

La mise à jour de notre installation.

Nous avons vu dans le précédent billet que notre version 1.0.0 était ... pauvre en contenu. Mais elle est déjà installée ! ce qui signifie que si j'ajoute par dessus la prochaine version, CmsMadeSimple ne passera pas par les fichiers d'installation, ne crééra pas de table et rien ne se ferra.

La première solution est de désinstaller le module 1.0.0 et d'installer la version disponible en bas de ce billet... mais bon... c'est un peu de la triche...

La seconde solution est d'ajouter un fichier nommé : ./method.upgrade.php

C'est ce fichier qui sera parcouru à chaque fois que CmsMadeSimple tentera de mettre à jour votre module. Si le fichier n'existe pas, CmsMadeSimple partira du principe qu'il n'y a rien à faire et traitera correctement la mise à jour. Si le fichier est présent dans le fichier xml de la nouvelle version, CmsMadeSimple exécutera en priorité.

Les fonctions à l'intérieur sont exactement les même que celles que nous avons vu pour l'installation et la désinstallation. Cela signifie qu'entre deux versions vous pourrez créer de nouvelles tables, de modifier leur structures, d'ajouter et supprimer des préférences, de faire de savant calcul et d'enregistrer le tout.... Bref rien de neuf pour ceux qui ont lu le début de l'article :)

Encore une fois un seul rappel : sécurisez le fichier :

if (!isset($gCms)) exit;

Il y a toujours un point sensible dans le maintien d'un module : la rétro-compatibilité. Imaginez que vous êtes à la version 10.5.687 (super!) ... cette version apporte juste une permission supplémentaire, vous allez donc dans le fichier ./method.upgrade.php ajouter la création de cette permission. Ainsi ceux qui étaient dans la version précédente auront droit à la mise à jour.

Mais Qu'en est il des personnes étant encore en version 1.0.0 ? ne faut il pas conserver les mise à jour cumulées pour qu'elles puissent passer de 1.0.0 à 10.5.687 ?

A l'inverse, si on conserve tout, tout, tout... que se passe il pour ceux qui ont déjà fait les modifications des dizaines de version précédente ?

Voici pour info le code que j'utilise, je ne prétends pas qu'il soit parfait mais il fonctionne :)

$db =& $gCms->GetDb();
$cleaner =& $gCms->modules["CmsModuleCleaner"]['object'];

if(!isset($cleaner))
return;

$current_version = $oldversion;
switch($current_version)
{
// On est en version 1.0.0
case "1.0.0":version_1_0_0($cleaner);
case "1.1.0":version_1_1_0($cleaner);
}

function version_1_0_0($cleaner)
{
//Va servir pour migrer de 1.0.0 à 1.1.0.
$delay = 60 * 60 * 24 * 30; // +/- 1 mois
$suppression = false;

[ .... Code issu du fichier d'installation ... ]

// create a permission
$cleaner->CreatePermission('cmsModuleCleaner_acces_standard','cmsModuleCleaner : acc&eacute;der au module');

//Ne pas oublier d'appeler les migrations suivantes : version_1_1_0
version_1_1_0();
}

function version_1_1_0($cleaner)
{
//Servira pour la prochaine mise à jour 1.1.0 -> autre
}

Ainsi, peut importe sa version actuelle, on prendra le train en marche et on se mettra à jour sur uniquement les points qui nous concerne.

Note : oubliez pas de mettre à jour le numero de version dans le fichier ./CmsModuleCleaner.module.php et d'ajouter la log pour CmsMadeSimple en fin de fichier

$this->Audit( 0, 
$this->Lang('friendlyname'),
$this->Lang('upgraded', $this->GetVersion()));

Tester son installation

Une fois l'installation effectuée (ou sa mise à jour, tout dépends de quel état vous démarrez), il faut tester l'installation de son module.

Pour celà, voici quelques astuces :

Après installation/mise à jour on vérifie que tout existe bien

Tester les créations de tables depuis phpmyadmin :

Tester les créations de préférences depuis phpmyadmin :

Tester les permissions depuis phpmyadmin

Et évidement après désinstallation on vérifie que rien ne reste.

Bilan 3

Nous voilà à la fin de cette troisième partie sur l'install/upgrade et la désinstallation de votre module ! Vous pouvez retrouver notre module en version 1.1.0 et tester chez vous l'installation de se module qui s'installe vraiment bien ... mais fait rien d'autre ^^

CmsModuleCleaner-1.1.0.xml (Clic droit > enregistrer sous)

Prochaine étape : nous allons réaliser noter première page dans le panneau d'administration qui permettra de mettre à jour les paramètres de fonctionnement de notre module via les préférences.

 

Stay tuned !

]]>
http://www.cmsmadesimple.fr/blog/55/15/Construire-un-module---part-III
Construire un module - part II http://www.cmsmadesimple.fr/blog/36/15/Construire-un-module---part-II Tue, 03 May 2011 12:01:00 +0200 Normer plutôt que Coder

Les modules dans CmsMadeSimple ont conservé l'état d'esprit de CmsMadeSimple : il faut que ce soit simple pour le développeur. Et c'est dans cette optique que les concepteurs ont prévu de privilégier les normes d'écriture afin d'alléger le poids du code très répétitif.

Le premier exemple de l'utilisation de ces normes est la façon de structurer un module. Prenons notre exemple du dernier billet sur la balise utilisateur auto-nettoyante, nous appellerons notre projet CmsModuleCleaner, partant de ce point je vais devoir composer mon projet ainsi (dans le répertoire "modules" de votre installation) :

  • ./modules
  • ./modules/CmsModuleCleaner
  • ./modules/CmsModuleCleaner/lang
  • ./modules/CmsModuleCleaner/lang/ext

Dans chaque dossiers vous ajouterez un fichier index.html vide qui servira de sécurité supplémentaire pour éviter qu'un utilisateur trop curieux ne parcourt le contenu de votre module trop facilement

Ce qui fait la force de CmsMadeSimple c'est qu'une telle structure lui permet de détecter seul la présence (ou non) d'un module sur son installation, cela nous évite d'aller modifier le code source du noyau de CmsMadeSimple. Ainsi la mise à jour de CmsMadeSimple se ferra de manière indépendante des modules, ceux qui utilisent des logiciels tels que phpBB, fluxBB et autres savent de quoi je parles :)

Second point dans notre démarche d'économie de code : nommer correctement les fichiers principaux. Vous devez avoir 4 fichiers au minimum dans votre répertoire CmsLangCleaner :

  • ./CmsModuleCleaner.module.php
  • ./method.install.php
  • ./method.uninstall.php
  • ./lang/en_US.php

Les fichiers method.install.php et method.uninstall.php sont évidement destinés à contenir les instructions nécessaires à l'installation de votre module et à sa désinstallation. C'est ce code qui sera exécutée lorsque l'utilisateur cliquera sur votre module depuis le gestionnaire de modules pour l'installer, ou lorsqu'il clic sur désinstaller depuis ce même gestionnaire de modules : créer une table, créer des paramétrages dédiés à votre module et tout supprimer lorsque l'utilisateur désinstallera votre module.

Note : Par habitude il vous faut désinstaller TOUT ce que votre module a pu installer ou créer durant son existence afin de laisser place nette à sa sortie.

Leur contenu est du code php sans surprise, on peut le simplifier pour notre exemple à cette simple ligne :

<?php echo "hello world"; ?>

Le fichier de langue : en_US.php est un fichier qui contiendra tous les libellés de boutons, de textfield et de message que génèrera votre module, cette norme préconisée par tous les développeurs consiste à dissocier le fonctionnement d'un module (et d'un programme de façon générale) de la langue de l'utilisateur. Exemple de contenu :

<?php

$lang['texte1'] = 'my tailor is rich';
$lang['texte2'] = 'where is bryan ?';

?>

Notez que nous sommes français mais que le premier fichier de langue doit être écrit en anglais (pas de bol pour les anglophobes). En effet l'anglais est la langue par défaut qui sera pris en compte par CmsMadeSimple. Si vous souhaitez traduire votre module dans la langue de voltaire, nous verrons comment y remédier un peu plus tard.

son utilisation est très pratique puisque dans tous nos fichiers nous pouvons appeler ces traductions. Pour notre exemple je reviens sur le fichier method.install.php et je remplace le code écrit précédemment par ceci :

<?php echo '<b>'.lang('texte2').'</b>'; ?>

Produira en sortie : where is bryan ?;

Dernier fichier : CmsModuleCleaner.module.php, c'est le noyau de votre module. C'est à dire que c'est dans ce fichier que l'on définira le nom du module, sa version, ses dépendances, ses paramètres, et énormément d'autres choses. Voici un exemple ultra simplifié du contenu de ce fichier dans notre cas.

<?php

class CmsModuleCleaner extends CMSModule
{


function GetName()
{
return 'CmsModuleCleaner';
}


function GetFriendlyName()
{
return $this->Lang('friendlyname');
}

function GetVersion()
{
return '1.0.0';
}

function GetHelp()
{
return '';
}

function GetAuthor()
{
return 'Bess';
}

function GetAuthorEmail()
{
return '';
}

function GetChangeLog()
{
return '';
}

function IsPluginModule()
{
return false;
}

function HasAdmin()
{
return false;
}

function GetAdminSection()
{
return 'extensions';
}

function GetAdminDescription()
{
return '';
}

function VisibleToAdminUser()
{
return false;
}

function GetDependencies()
{
return array();
}

function MinimumCMSVersion()
{
return "1.0";
}

function SetParameters()
{

}

function InstallPostMessage()
{
return $this->Lang('postinstall');
}

function UninstallPostMessage()
{
return $this->Lang('postuninstall');
}

function UninstallPreMessage()
{
return $this->Lang('really_uninstall');
}


}
?>

Premier constat à faire : l'héritage de classe. CmsModuleCleaner.module.php hérite des fonctions de CmsModule ce qui permet bénéficier immédiatement de fonctionnalités très puissantes dans notre modules, nous verrons leur utilité un peu plus tard.

Second constat à faire : vous retrouvez les appels aux fichiers de lang. Il nous faut donc enrichir notre fichier de langue pour se mettre à niveau.

<?php
$lang['friendlyname'] = 'Best Cleaner Module Ever';
$lang['postinstall'] = 'Post Install Message';
$lang['postuninstall'] = 'Post Uninstall Message, e.g., "Curses! Foiled Again!"';
$lang['really_uninstall'] = 'Really? You\'re sure you want to uninstall this fine module?';
?>

Voilà pour l'aspect Norme de nos modules

L'installation de votre module

Maintenant que nous avons écrit la base de votre module, nous allons tester son installation et sa désinstallation.

Allez dans le panel admin > gestion des modules, vous devriez retrouver votre module. Cliquez sur "installer"

Et voilà votre module installé ! Un clic sur "désinstaller" devrait vous faire revenir au point de départ.

Dernier point : le partage de votre module

Toujours fidèle à la logique CmsMadeSimple : restons simple.... Cliquez sur le bouton xml sur la droite de la ligne de votre module, un fichier XML devrait vous être proposé en téléchargement, c'est ce fichier que l'on distribuera au final à son client, à ses amis ou à la communauté.

Notez que pour les plus habitués d'entre vous, vous pouvez également proposer un .zip un .tar ou encore un .tar.gz en archivant directement le répertoire de votre module : ./modules/CmsLangCleaner

Déjà finit...

Voilà pour cette seconde partie du tutorial, toujours aussi abordable je l'espère, vous savez maintenant quel est le strict minimum à réaliser pour démarrer votre module et le partager.

Pour ceux et celles qui n'auraient pas envie de perdre trop de temps, je vous invite à télécharger ce fichier xml qui vous permettra d'installer en un clic ce tuto sur votre propre site internet de test. Bien évidement le module proposé en sa version 0.0.1 ne ferra rien d'autre que s'installer et se désinstaller efficacement.

Télécharger CmsModuleCleaner-1.0.0.xml (clic droit > enregistrer sous)

Le prochain tutorial vous montrera énormément de fonctions complémentaires disponibles dans CmsLangCleaner.module.php, quelques exemples de procédures d'installation/désinstallation, mais également le processus de mise à jour des modules.

 

Stay tuned !

]]>
http://www.cmsmadesimple.fr/blog/36/15/Construire-un-module---part-II
Le projet de la nouvelle documentation démarre ! http://www.cmsmadesimple.fr/blog/54/15/Le-projet-de-la-nouvelle-documentation-demarre Mon, 21 Mar 2011 17:13:00 +0100 Nous en parlions depuis le début de l'année c'est maintenant une certitude : la communauté FR de CmsMadeSimple va bel et bien prendre la position de leader pour refondre une grande partie du wiki.

Les dernières validations ont été données par l'équipe responsable de CmsMadeSimple ce qui nous permet -enfin- de lancer la machine.

Les postes à pourvoir

Nous avons besoin de personne pour échanger les idées, des personnes pour rédiger les pages et enfin des personnes ayant de solides connaissances sur le moteur wiki mediawiki. Aucune connaissance en PHP n'est nécessaire pour ce projet, et seuls les postes de techniciens requièrent des connaissances sur le CSS. Tous ceux qui souhaitent remercier la communauté pour l'aide que nous tentons d'apporter à chaque visiteur pourront avec ce projet participer à leur tour avec leur propres compétences.

L'intégralité de la discussion sur ce nouveau projet, des postes à pourvoir, de la description du travail est disponible sur le forum à cette adresse : http://www.cmsmadesimple.fr/forum/viewtopic.php?pid=20523#p20523

Nous espérons vous retrouver rapidement pour participer à cette refonte qui servira à l'ensemble des francophones très rapidement.

]]>
http://www.cmsmadesimple.fr/blog/54/15/Le-projet-de-la-nouvelle-documentation-demarre
Nouveaux Modérateurs et Mise à jour du Forum http://www.cmsmadesimple.fr/blog/53/15/Nouveaux-Moderateurs-et-Mise-a-jour-du-Forum Mon, 07 Mar 2011 14:36:00 +0100 Nouveaux modérateurs

Airelibre, Jissey et Ouik (anciennement Tomek) nous ont fait le plaisir de rejoindre Jce et moi même afin de conserver un petit oeil sur le forum. Vous les connaissez très certainement puisqu'ils font partis des habitués qui zonent sur les topics pour venir vous filer un coup de main dès qu'ils le peuvent.

Cette nomination n'est finalement que la suite logique :)

Félicitation messieurs et encore une fois ravis de vous avoir avec nous !

Petite mise à jour du forum

J'ai procédé à une grosse modification du formulaire de pré-saisit, en espérant que sous cette nouvelle version plus claire beaucoup plus de personne seront incitées à nous donner enfin les informations qui nous sont si précieuses lorsqu'on souhaite aider.

Voilà, D'autres nouvelles arriveront rapidement !

]]>
http://www.cmsmadesimple.fr/blog/53/15/Nouveaux-Moderateurs-et-Mise-a-jour-du-Forum
Cms Made Simple 1.9.4 http://www.cmsmadesimple.fr/blog/52/15/Cms-Made-Simple-1-9-4 Mon, 07 Mar 2011 14:33:00 +0100

Cette version corrige toute une série de bug conservées par la 1.9.3 notamment le soucis rencontré par de nombreuses personnes utilisant la dernière version de WAMP pour travailler leur tests en local. Un autre soucis lié cette fois au cache a été également corrigé.

A noter qu'un autre bug subsiste dans un module du core (module manager), vous pouvez le corriger aisement en installant un petit patch.

+ d'infos sur notre page de téléchargement !

]]>
http://www.cmsmadesimple.fr/blog/52/15/Cms-Made-Simple-1-9-4
Documentation et volontariat http://www.cmsmadesimple.fr/blog/35/15/Documentation-et-volontariat Thu, 10 Feb 2011 15:03:00 +0100 Vous la voulez comment votre documentation ?

Si vous vous sentez concerné par le sujet de la documentation française, venez partagez votre expérience sur le forum. Comment la trouvez vous actuellement ? Que faire pour l'améliorer ? Avant de se lancer dans une refonte du projet, il est très important que nous ayons votre avis !

Appel aux volontaires

L'équipe de la team .org fait un appel aux volontaires pour rejoindre l'équipe de marketing. Si vous vous sentez prêt pour ce genre de boulot sachez que plein de postes avec des profils de toute sorte sont actuellement recherchés : + d'info sur cette page.

]]>
http://www.cmsmadesimple.fr/blog/35/15/Documentation-et-volontariat
Maintenance ces prochaines 48H http://www.cmsmadesimple.fr/blog/34/15/Maintenance-ces-prochaines-48H Wed, 09 Feb 2011 21:56:00 +0100 ]]> http://www.cmsmadesimple.fr/blog/34/15/Maintenance-ces-prochaines-48H Construire un module - part I http://www.cmsmadesimple.fr/blog/33/15/Construire-un-module---part-I Mon, 07 Feb 2011 08:00:00 +0100 CmsMadeSimple peut il être plus léger qu'il ne l'est déjà ?

La réponse est oui (et hop je vous spoil la fin du tuto au passage). La faute à la manière dont CmsMadeSimple gère les fichiers de langues au travers des modules de tous poils.

Explications :

Actuellement vous pouvez installer une version dite "full" qui embarquera au passage toutes les traductions possibles de CmsMadeSimple. Vous avez également la possibilité d'installer une version de base (anglais uniquement) et y ajouter un addon français qui va se charger de traduire le contenu de CmsMadeSimple.

La plupart d'entre vous opteront pour cette seconde solution dès que vous souhaitez gagner de la place car embarquer des dizaines de fichiers de traduction, c'est pas rien...

Si la mise à disposition des archives de CmsMadeSimple est bien faite, ce n'est pas forcement le cas des modules qui ne sont disponibles qu'en version full !

Hé oui, installer un pack français, déterminer la langue en front-office et en back-office tout en français, faites tout comme il faudrait et puis installez un simple module : vous embarquez également le russe, l'allemand et tout le reste.

Evaluation des pertes (de place)

Petit exemple avec des modules que tout le monde connait :

  • CgExtensions : 2058 Ko dont 188 Ko de fichiers de langue non FR
  • FEU : 1679 Ko dont 876 Ko de fichiers de langue non FR
  • Gallery : 1514 Ko dont 271 Ko de fichiers de langue non FR

Et ainsi de suite... Plus il est connu et plus nombreuses seront les traductions associées

Alors supprimer les fichiers inutiles ne changera pas la face de votre site ça n'augmentera pas sa vitesse et ne vous libèrera pas 50% de la place prise par CmsMadeSimple. Mais pour un extrémiste du web comme moi, il est difficile de ne pas pester contre tous ces fichiers qui prennent de la place pour rien... d'ou là suite

Le tutorial

Je vais tout d'abord vous présenter la balise utilisateur et vous expliquer son utilisation. Une fois le principe maitrisé je rédigerais un tutorial qui transformera cette balise en module à part entière avec forcement plus d'options.

Tout d'abord j'ai besoin de lister les fichiers de langue de mon installation. Il y en a deux sortes : ceux qui ont un chemin identique d'une installation à une autre , et ceux qui (comme les fichiers de module) sont totalement changeant d'une installation à une autre.

Impossible dès lors de m'amuser à lister à l'avance TOUS les fichiers pouvant exister afin de faire une simple suppression de fichiers de langue si celui existe.

Je démarre donc avec la partie la plus simple en définissant un tableau comportant les patterns des répertoires connus et fixes :

define ("DIR", "D");
define ("FILE", "F");
$patterns = array();
$patterns[] = array(FILE,'/admin/lang/%1$s.nls.php');
$patterns[] = array(FILE,'/admin/lang/ext/%1$s/admin.inc.php');
$patterns[] = array(FILE,'/admin/lang/ext/%1$s/index.html');
$patterns[] = array(DIR,'/admin/lang/ext/%1$s');
$patterns[] = array(FILE,'/lib/lang/cms_selflink/ext/%1$s.php');
$patterns[] = array(FILE,'/lib/lang/tasks/ext/%1$s.php');
$patterns[] = array(FILE,'/lib/filemanager/ImageManager/lang/%2$s.js');

Je connais ces répertoires simplement en parcourant une installation sur mon PC et en trouvant à droite et à gauche ces fichus fichiers.

à celà j'ajoutes les répertoires des modules plus "/lang/ext" qui est la norme de fichiers de langues pour tous les modules. En premier je récupère le répertoire des modules :

global $gCms;
$config =& $gCms->GetConfig();
$path = $config['root_path'].'/modules';

Ensuite j'utilise une petite fonction prise je ne sais plus où qui va lister les répertoires de $path

$dirs = array();
global $gCms;
$config =& $gCms->GetConfig();
$path = $config['root_path'].'/modules';
if (!is_dir($path) || !$handle = @dir($path)) {
trigger_error('\''.$path.'\' doesn\'t exists or is not a valid directory', E_USER_ERROR);
} else {
while ($entry = $handle->read()) {
if ($entry !== "." && $entry !== "..") {
$path_to_entry = $path.'/'.$entry;
if (@is_dir($path_to_entry)) {
$dirs[] = $path_to_entry;
}
}
}
}

J'ai donc dans $dirs tous les répertoires des modules. Il me reste à leur ajouter les sous répertoires des fichiers de langue que je connais : "/lang/ext"

 

$patterns = array();
foreach($dirs as $dir){
$patterns[] = array(FILE,$dir.'/lang/ext/%1$s.php');
}

return $patterns;

 

Je place tout ce code dans une fonction que j'appel "getModulesDirectoriesToPattern()" pour faire plus propre et je peux donc rajouter à la liste des patterns déjà écrits ceux des répertoires des modules.

define ("DIR", "D");
define ("FILE", "F");
$patterns = array();
$patterns = getModulesDirectoriesToPattern();

$patterns[] = array(FILE,'/admin/lang/%1$s.nls.php');
$patterns[] = array(FILE,'/admin/lang/ext/%1$s/admin.inc.php');
$patterns[] = array(FILE,'/admin/lang/ext/%1$s/index.html');
$patterns[] = array(DIR,'/admin/lang/ext/%1$s');
$patterns[] = array(FILE,'/lib/lang/cms_selflink/ext/%1$s.php');
$patterns[] = array(FILE,'/lib/lang/tasks/ext/%1$s.php');

$patterns[] = array(FILE,'/lib/filemanager/ImageManager/lang/%2$s.js');

Maintenant que j'ai tous ces patterns, il me faut boucler dessus ET sur la liste des langues connues. J'ai donc du dresser un listing que chacun pourra enrichir à sa façon

$langs = array();
$langs[] = array("ca_ES");
$langs[] = array("cs_CZ");
$langs[] = array("da_DK");
$langs[] = array("de_DE");
$langs[] = array("es_ES");
$langs[] = array("en_CY");
$langs[] = array("et_EE");
$langs[] = array("fa_FA");
$langs[] = array("fi_FI");
//$langs[] = array("fr_FR","fr");
$langs[] = array("hr_HR");
$langs[] = array("hu_HU");
$langs[] = array("it_IT");
$langs[] = array("iw_IL");
$langs[] = array("ja_JP");
$langs[] = array("lt_LT");
$langs[] = array("nb_NO");
$langs[] = array("nl_NL","nl");
$langs[] = array("pl_PL");
$langs[] = array("pt_PT");
$langs[] = array("ro_RO");
$langs[] = array("ru_RU");
$langs[] = array("sk_SK");
$langs[] = array("sl_SI");
$langs[] = array("so_SO");
$langs[] = array("sr_YU");
$langs[] = array("sv_SE");
$langs[] = array("tr_TR");

Le premier paramètre sera utilisé dans les %1$ des patterns, évidement le second est dédié aux %2$. J'ai du utiliser cette ruse vu que les fichiers n'ont pas tous la même nomenclature pour se distinguer les uns des autres.

fichier.fr_FR.php et fichier.nl_NL.php VS autrefichier.fr.php et autrefichier.nl.php ... Allez comprendre :)

Bref nous voici donc avec la liste des langues et la liste des patterns des chemins (répertoires + fichiers), ne reste plus qu'une bonne double boucle pour en finir

Je définit une variable globale à faux pour l'instant

define ("DELETE", false);

et on boucle !

$size=0;
//Pour chaque patterns
foreach($patterns as $pattern){
//pour chaque langue
foreach($langs as $lang){
//On remplace les %1$ et %2$ par la langue
$path = sprintf($pattern[1], $lang[0], (count($lang)>1?$lang[1]:null));

//Si le pattern désigne un fichier qui existe
if($pattern[0] == FILE && @is_file($path)){
//on récupère son poids
$stat = stat($path);
$size += $stat[7];

echo <<<HTML
$stat[7]\t$path\n
HTML;
//Si à supprimer, on supprime
if(DELETE)
unlink($path);

//Si le pattern est un répertoire qui existe
} else if($pattern[0] == DIR && @is_dir($path)){
echo <<<HTML
\t\t$path\n
HTML;
//Si à supprimer, on supprime
if(DELETE)
rmdir($path);
}
}
}

echo "\n\nTOTAL ".(DELETE?"DELETED ":'').": $size";

Fin de l'histoire... Si la variable DELETE est définie à faux, on fait un simple listing, si elle est définie à vrai, on supprime les fichiers sans poser de question et on fait également un listing.

Rapide simple et efficasse, Notez qu'en commentant une ligne des langues ou en la décommentant vous sauvegardez les fichiers qui s'y rapportent, ainsi dans notre exemple, les fichiers de langue FR sont épargnées

Je vous redonne le code au complet et je vous souhaites bon nettoyage sur vos environnements de test bien évidement (tout le monde sais que tester en production c'est mortel dans tous les sens du terme...)



$temps_debut = microtime(true);


define ("DELETE", true);
//define ("DELETE", false);


$langs = array();
$langs[] = array("ca_ES");
$langs[] = array("cs_CZ");
$langs[] = array("da_DK");
$langs[] = array("de_DE");
$langs[] = array("es_ES");
$langs[] = array("en_CY");
$langs[] = array("et_EE");
$langs[] = array("fa_FA");
$langs[] = array("fi_FI");
//$langs[] = array("fr_FR","fr");
$langs[] = array("hr_HR");
$langs[] = array("hu_HU");
$langs[] = array("it_IT");
$langs[] = array("iw_IL");
$langs[] = array("ja_JP");
$langs[] = array("lt_LT");
$langs[] = array("nb_NO");
$langs[] = array("nl_NL","nl");
$langs[] = array("pl_PL");
$langs[] = array("pt_PT");
$langs[] = array("ro_RO");
$langs[] = array("ru_RU");
$langs[] = array("sk_SK");
$langs[] = array("sl_SI");
$langs[] = array("so_SO");
$langs[] = array("sr_YU");
$langs[] = array("sv_SE");
$langs[] = array("tr_TR");

define ("DIR", "D");
define ("FILE", "F");

function getModulesDirectoriesToPattern()
{
$dirs = array();
global $gCms;
$config =& $gCms->GetConfig();
$path = $config['root_path'].'/modules';
if (!is_dir($path) || !$handle = @dir($path)) {
trigger_error('\''.$path.'\' doesn\'t exists or is not a valid directory', E_USER_ERROR);
} else {
while ($entry = $handle->read()) {
if ($entry !== "." && $entry !== "..") {
$path_to_entry = $path.'/'.$entry;
if (@is_dir($path_to_entry)) {
$dirs[] = $path_to_entry;
}
}
}
}

$patterns = array();
foreach($dirs as $dir)
{
$patterns[] = array(FILE,$dir.'/lang/ext/%1$s.php');
}

return $patterns;
}

$patterns = array();
$patterns = getModulesDirectoriesToPattern();

$patterns[] = array(FILE,'/admin/lang/%1$s.nls.php');
$patterns[] = array(FILE,'/admin/lang/ext/%1$s/admin.inc.php');
$patterns[] = array(FILE,'/admin/lang/ext/%1$s/index.html');
$patterns[] = array(DIR,'/admin/lang/ext/%1$s');
$patterns[] = array(FILE,'/lib/lang/cms_selflink/ext/%1$s.php');
$patterns[] = array(FILE,'/lib/lang/tasks/ext/%1$s.php');

$patterns[] = array(FILE,'/lib/filemanager/ImageManager/lang/%2$s.js');



echo <<<HTML
################################
## CLEANING UDT FOR CMSMS
##
## Version 1.0.0 - 30/01/2011
##
## By Bess : contact at furie dot be
################################

HTML;

if(DELETE)
{
echo <<<HTML
##
## ! DELETING MODE !
##
################################


HTML;
} else
{
echo <<<HTML
##
## TESTING MODE : NO SUPPRESSION
##
################################


HTML;
}



$size=0;
//Pour chaque patterns
foreach($patterns as $pattern)
{
//pour chaque langue
foreach($langs as $lang)
{
//On remplace les %1$ et %2$ par la langue
$path = sprintf($pattern[1], $lang[0], (count($lang)>1?$lang[1]:null));

//Si le pattern désigne un fichier qui existe
if($pattern[0] == FILE && @is_file($path))
{
//on récupère son poids
$stat = stat($path);
$size += $stat[7];


echo <<<HTML
$stat[7]\t$path\n
HTML;
//Si à supprimer, on supprime
if(DELETE)
unlink($path);

//Si le pattern est un répertoire qui existe
} else if($pattern[0] == DIR && @is_dir($path))
{
echo <<<HTML
\t\t$path\n
HTML;
//Si à supprimer, on supprime
if(DELETE)
rmdir($path);
}
}
}

echo "\n\nTOTAL ".(DELETE?"DELETED ":'').": $size";

$temps_fin = microtime(true);
echo "\n\nTemps d'execution : ".round($temps_fin - $temps_debut, 4);

Voilà pour notre balise. Si vous avez des questions ou des idées d'améliorations : c'est en dessous. Personnellement j'ai gagné 2Mo de place sur une installation sommaire + quelques modules, et vous ?

Le prochains billet vous montrera donc comment depuis cette balise coder tout un module qui va faire encore plus : nettoyer même après l'installation d'un module ou sa mise à jour grace à la gestion des évènements sous CmsMadeSimple !

 

Stay Tuned

]]>
http://www.cmsmadesimple.fr/blog/33/15/Construire-un-module---part-I
Cms Made Simple 1.9.3 http://www.cmsmadesimple.fr/blog/32/15/Cms-Made-Simple-1-9-3 Sat, 05 Feb 2011 20:27:00 +0100 Une version hautement intéressante car uniquement dédiée aux corrections de bugs laissés dans la précédente 1.9.2

Pour ceux et celles qui ont suivi la forge ces derniers temps, un drôle de manège s'affairait sur la liste des bugs de CmsMadeSimple puisqu'une fois n'est pas coutume, les bugs étaient clôturés les uns après les autres à vitesse grand V.

Et cette suite de corrections nous donne aujourd'hui la version 1.9.3 dite Motu Tane qui se veut aussi stable que possible afin d'assurer une base solide pour les prochains mois.

En bref sur cette version

 

50 : c'est le nombre que vous devrez retenir de cette nouvelle version : il représente le nombre de bugs corrigés !

Nouvelle gestion des caches pour les pages : une page dite "cacheable" sera mise en cache par le navigateur, améliorant la vitesse de votre site dès sa seconde visite. Une page "non-cacheable" au contraire continuera à fonctionner comme avant et provoquera le rechargement par le navigateur.

Le module du menu est revu et corrige de nombreux bugs dont le très gênant $node->parent qui ne fonctionnait plus.

Mettez vous à jour ! désormais seules les versions 1.6.9, 1.9.2 et 1.9.3 seront acceptés par les modérateurs de notre forum lors de vos appels à l'aide.

Pour ceux que ça intéresse : la liste des corrections

Version 1.9.3 - Motu Tane
-----------------------------
Core - Bugreports:
- #3766 Admin screens blank on new install (firewalled)
- #3794 Remove use of readfile
- #3820 Included method.install.php cannot return an error message
- #3848 Pages flashing on load - no-cache headers
- #5329 Assigning language from locale is not correct
- #5619 Too short input fields
- #5744 Impossible to reload and save a valid sitedown html page.
- #5747 Error when final line of UDT is a comment
- #5794 Stylesheet url in header could be wrong
- #5861 Extra fields are cleared if a mandatory field is forgotten
- #5865 Small issue with admin panel tab header id's.
- #5888 Remove markedown plugins from distribution.
- #5952 GetPageAliasFromID() Undefined variable "alias"
- #5846 When Power Users edit page content, the aliases change
- #5959 UserTagOperations::SetUserTag() does not set ID
- #5971 Missing Image File in the default theme for CMSMS
- #5996 does not show in preview-tab
- Page URLS are case in-sensitive but forced to lowercase on page submit.
- Fixes a minor problems with modules adding tasks to be executed with psuedocron

Core - Feature requests:
- #1133 Admin Panel: MenuText instead of page title in overview & hierarchy
- #1654 Add additional options to the cmsmslink plug-in for WYSIWYG editors.
- #1656 Add the "Character Map" to the TinyMCE WYSIWYG Basic toolbar by default.
- #2635 Enable "reorder pages" tool to change parent id
- #2969 Install > integrity check > number of failed files
- #3140 Improved Page Re-order
- #3194 Page_image and page_thumbnail sort order and/or path
- #3282 Description field for GCB's
- #3670 Better solution for viewing when site is down
- #3689 Create config.php automatically if file does not exist
- #3958 Pretty CSS URLs
- #3975 New checkbox for global content blocks
- #4172 Page_image setting
- #4554 Display ALL Global Content Blocks on One Page
- #5440 View website in maintenance mode.
- #5670 Pref to disable wywiwyg for sitedown message
- Caching - Important Change
1. Now pages marked as 'cachable' will be cachable in the browser for a time period as specified in the global settings page.
Pages not marked as 'cachable', or those accessed via a POST request will not be allowed to be cached by the browser.
2. Adds new settings to global settings to control browser cache capabilities.

Core Installer:
- #4136 Admin gui breaks when isntalling update over https
- #4978 Upgrade.32.to.33
- #5406 Upgrade stops when locales not correct

FileManager:
- #4046 Files too large won't upload

MenuManager:
- #1761 Adding new template downloads moduleinterface.php
- #2488 Apply and Submit does not work in certain scenario
- #2503 Sectionheader is displayed as Link when is activeparent
- #2489 $node->current missing in Help description
- #3460 'items=' active page not working correctly
- #3599 simple_menu not setting correct CSS selectors since 1.6
- #3620 $node->image disapear in 1.6 version
- #4089 "loadprops" doesn't work if "items" is set
- #4186 Template error in simple_navigation.tpl causing invalid XHTML output
- #4237 Menu Separators not generated since v1.6.x
- #5447 Menu function childrenof breaks collapse

News: 
- #5987 Field Definition - Public option

Printing:
- #5209 Printing module causes fatal errors when used with gallery

CMSMailer:
- Remove misleading, and buggy cancel button.

Search:
- Fixes problems with quotes in search terms

ThemeManager:
- Fixes to importing themes wrt Menumanager calls... should now be completely flexible.

 

Version 1.9.3 - Motu Tane
-----------------------------
Core - Bugreports:
- #3766 Admin screens blank on new install (firewalled)
- #3794 Remove use of readfile
- #3820 Included method.install.php cannot return an error message
- #3848 Pages flashing on load - no-cache headers
- #5329 Assigning language from locale is not correct
- #5619 Too short input fields
- #5744 Impossible to reload and save a valid sitedown html page.
- #5747 Error when final line of UDT is a comment
- #5794 Stylesheet url in header could be wrong
- #5861 Extra fields are cleared if a mandatory field is forgotten
- #5865 Small issue with admin panel tab header id's.
- #5888 Remove markedown plugins from distribution.
- #5952 GetPageAliasFromID() Undefined variable "alias"
- #5846 When Power Users edit page content, the aliases change
- #5959 UserTagOperations::SetUserTag() does not set ID
- #5971 Missing Image File in the default theme for CMSMS
- #5996 does not show in preview-tab
- Page URLS are case in-sensitive but forced to lowercase on page submit.
- Fixes a minor problems with modules adding tasks to be executed with psuedocron

Core - Feature requests:
- #1133 Admin Panel: MenuText instead of page title in overview & hierarchy
- #1654 Add additional options to the cmsmslink plug-in for WYSIWYG editors.
- #1656 Add the "Character Map" to the TinyMCE WYSIWYG Basic toolbar by default.
- #2635 Enable "reorder pages" tool to change parent id
- #2969 Install > integrity check > number of failed files
- #3140 Improved Page Re-order
- #3194 Page_image and page_thumbnail sort order and/or path
- #3282 Description field for GCB's
- #3670 Better solution for viewing when site is down
- #3689 Create config.php automatically if file does not exist
- #3958 Pretty CSS URLs
- #3975 New checkbox for global content blocks
- #4172 Page_image setting
- #4554 Display ALL Global Content Blocks on One Page
- #5440 View website in maintenance mode.
- #5670 Pref to disable wywiwyg for sitedown message
- Caching - Important Change
1. Now pages marked as 'cachable' will be cachable in the browser for a time period as specified in the global settings page.
Pages not marked as 'cachable', or those accessed via a POST request will not be allowed to be cached by the browser.
2. Adds new settings to global settings to control browser cache capabilities.

Core Installer:
- #4136 Admin gui breaks when isntalling update over https
- #4978 Upgrade.32.to.33
- #5406 Upgrade stops when locales not correct

FileManager:
- #4046 Files too large won't upload

MenuManager:
- #1761 Adding new template downloads moduleinterface.php
- #2488 Apply and Submit does not work in certain scenario
- #2503 Sectionheader is displayed as Link when is activeparent
- #2489 $node->current missing in Help description
- #3460 'items=' active page not working correctly
- #3599 simple_menu not setting correct CSS selectors since 1.6
- #3620 $node->image disapear in 1.6 version
- #4089 "loadprops" doesn't work if "items" is set
- #4186 Template error in simple_navigation.tpl causing invalid XHTML output
- #4237 Menu Separators not generated since v1.6.x
- #5447 Menu function childrenof breaks collapse

News:
- #5987 Field Definition - Public option

Printing:
- #5209 Printing module causes fatal errors when used with gallery

CMSMailer:
- Remove misleading, and buggy cancel button.

Search:
- Fixes problems with quotes in search terms

ThemeManager:
- Fixes to importing themes wrt Menumanager calls... should now be completely flexible.
]]>
http://www.cmsmadesimple.fr/blog/32/15/Cms-Made-Simple-1-9-3
CmsMadeSimple France s'offre un nouveau site http://www.cmsmadesimple.fr/blog/30/15/CmsMadeSimple-France-s-offre-un-nouveau-site Sat, 29 Jan 2011 15:34:00 +0100

Depuis le temps ou j'avais fait l'annonce sur les forums il était temps que ça sorte !

Et nous y sommes, cette V2 est enfin sur les rails pour votre plus grand plaisir -du moins je l'espère-

Petits remerciements

En premier point je souhaites ici remercier tous ceux qui ont travaillé sur ce projet à mes côtés permettant ainsi d'échanger sur ce qui devait être mis dans cette nouvelle version, de m'aider à coder de nombreuses fonctionnalités et surtout de repasser derrière moi pour corriger mes erreurs.

Par ordre alphabétique : Airelibre, Arnaud, Hervé, Kler, Kraygoon, Jean Claude et Philippe qui me suivent maintenant depuis mi-novembre.

Mais également Emeka Rajis qui a conçu ce design et Sonya ma collègue russe qui nous a énormément aidé en proposant une base allégée qui nous a simplement fallut enrichir

Les nouveautés du jour

Et elles sont nombreuses...

Commentez les articles du blog : vous pouvez dès maintenant commenter les articles, que ce soient des annonces de nouvelles version ou des tutos, c'est sans inscription et c'est rapide :)

Postez vous même vos articles : vous pouvez rédiger vos propres tutoriaux et les mettre à disposition de toute la communauté d'un simple clic.

Suivez nous même en dehors du site : que ce soit par email, par flux rss ou maintenant sur facebook ou sur Twitter, ne loupez plus l'actualité de CmsMadeSimple !

Partagez rapidement l'information : chaque article peut maintenant être diffusé sur vos réseaux sociaux, suffit de cliquer sur l'icône :)

Intégration du forum : Le forum s'intègre maintenant dans le design général. C'est beau, c'est tout :)

Refonte de la documentation : Nous avons tenté de tout regrouper dans une seule page et uniquement l'essentiel.

Suppression d'ancien contenu : ménage par le vide : de nombreuses pages sont supprimées pour aérer le site et lui rendre son but d'origine : présenter CmsMadeSimple et ne pas être un wiki à lui seul

Traduction de la licence d'utilisation : par ce que tout le monde n'est pas anglophone et que je doutes que beaucoup d'entre vous ont pris soin de la lire :] Maintenant vous n'avez plus d'excuses

Et pour l'avenir ?

Le site et sa V2 n'est que le (gros) début d'une longue série d'amélioration, je vous propose donc d'attendre avant de retrouver sur ce site :

Un wiki refondu totalement pour être plus clair, plus agréable à lire et surtout plus accessible.

Un espace personnel sur le site grace à vos connexions du forum afin de profiter de nombreux avantages supplémentaires.(Merci Airelibre pour ton travail)

Commenter les news sans attente de validation

Ajouter un article sans attente de validation

Notation des sites présentés dans le Showroom

Annuaire des professionnels avec pages perso et liste de vos réalisations

 

 

Voilà pour le petit tour d'horizon, en espérant très sincèrement que cette nouvelle version vous plaisent autant qu'à nous. N'hésitez surtout pas à faire des retour sur cette V2, ce qui manque, ce que vous aimez, Nous avons d'ailleurs mis en place un moyen efficace de rassembler vos retours : regardez sur votre gauche :)

Il me reste à vous souhaiter une bonne visite et à bientôt :)

]]>
http://www.cmsmadesimple.fr/blog/30/15/CmsMadeSimple-France-s-offre-un-nouveau-site
Maintenances Ce WeekEnd http://www.cmsmadesimple.fr/blog/31/15/Maintenances-Ce-WeekEnd Thu, 27 Jan 2011 16:39:00 +0100 Si tout se déroule comme nous le souhaitons une grosse maintenance aura lieu ce WE pouvant perturber plusieurs heures durant votre accès au site.

Dans le cas ou vous tombez donc sur une 404 ou un gros message de maintenance : no panique, c'est simplement qu'on bossera.

D'ici là je vous souhaites bonne fin de semaine et bon courage en attendant vendredi soir.]]>
http://www.cmsmadesimple.fr/blog/31/15/Maintenances-Ce-WeekEnd
Serveur Ko http://www.cmsmadesimple.fr/blog/29/15/Serveur-Ko Fri, 17 Dec 2010 17:32:00 +0100 Le vieux serveur de l'association a rendu l'âme ce jeudi 16 décembre emportant tout avec lui : données, sauvegarde, ...

Nous sommes en pleine tentative de restauration et de récupération de donnée "fraiches" mais il y a peu d'espoir.

D'ici là le forum est inactivé afin d'éviter un écart supplémentaire entre ce qui peut être sauvé et la réalité.

Merci de votre compréhension.

Bess

]]>
http://www.cmsmadesimple.fr/blog/29/15/Serveur-Ko
Cms Made Simple 1.9.2 http://www.cmsmadesimple.fr/blog/27/15/Cms-Made-Simple-1-9-2 Sun, 12 Dec 2010 17:21:00 +0100 Portant le nom de Tevairoa, cette nouvelle version vient corriger quelques bugs.

Retrouvez toutes les infos sur la page de téléchargements :)

]]>
http://www.cmsmadesimple.fr/blog/27/15/Cms-Made-Simple-1-9-2
Cms Made Simple : Gagnant du concours du meilleur Cms Open source http://www.cmsmadesimple.fr/blog/2/15/Cms-Made-Simple-Gagnant-du-concours-du-meilleur-Cms-Open-source Sat, 27 Nov 2010 17:29:00 +0100 Buvons un coup à la santé de ce logiciel et mes félicitations à tous les développeurs de cmsms pour cette récompense, ils l'ont tous bien mérité smile

https://www.packtpub.com/open-source-awards-home

https://www.packtpub.com/news/cms-made-simple-wins-2010-open-source-cms-award

]]>
http://www.cmsmadesimple.fr/blog/2/15/Cms-Made-Simple-Gagnant-du-concours-du-meilleur-Cms-Open-source
On recherche du monde ! http://www.cmsmadesimple.fr/blog/28/15/On-recherche-du-monde Thu, 25 Nov 2010 17:32:00 +0100 forum)Cms Made Simple a besoin de vous ! (+ d'info sur le forum)]]> http://www.cmsmadesimple.fr/blog/28/15/On-recherche-du-monde Cms Made Simple 1.9.1 http://www.cmsmadesimple.fr/blog/1/15/Cms-Made-Simple-1-9-1 Tue, 23 Nov 2010 17:27:00 +0100 Nouvelle version corrective

Cette nouvelle version sortie ce week-end nommée Toopua apporte tout un lot de correction dont certaines concernent la sécurité. Donc ne restez pas avec une version 1.9.0, mettez vous à jour tout de suite.

JCE76350 a mis à votre disposition plus d'information sur le sujet de cette sortie sur le forum.

Vous pouvez évidement la retrouver sur notre page de téléchargement.

Bonne install à tous et bonne semaine.

]]>
http://www.cmsmadesimple.fr/blog/1/15/Cms-Made-Simple-1-9-1
Petits Tags entre amis http://www.cmsmadesimple.fr/blog/19/15/Petits-Tags-entre-amis Mon, 01 Nov 2010 15:01:00 +0100

Rappel Général

Une Balise Utilisateur (ci dessous UDT par simplification) est un code PHP que l'on prépare en dehors de tout contenu et que l'on appellera plus loin dans le site au travers d'une page ou carrément d'un gabarit.

Une UDT s'appelle toujours par son nom entourée de crochets : {toto}

Le nom d'un UDT ne peut contenir de tiret ! ainsi {mon_UDT99} est valable alors que {mon-UDT99} est incorrect.

Comme tout code PHP, vous n'êtes jamais à l'abri d'une fausse manip qui provoquera une destruction de donnée (en plus de tuer des bébés phoques pour certaines d'entre elles). Conclusion : si vous aimez les bébés phoques testez toujours le code en local sur une copie de votre site original ! Ne mettez jamais un code en production directement.

L'ensemble des codes ci dessous ont été testé pour vous et reste à disposition sur cette page pour que vous puissiez constater le résultat. Le Wiki francophone a été mis à jour en même temps afin de ne pas perdre ces codes ultérieurement.

Afficher les 10 dernières pages modifiées dans votre site

echo '<div class="nav"><div class="heading">10 Derni&egrave;res pages mises &agrave; jour</div>';
echo ' <ul class="links">';
global $gCms;
$hm =& $gCms->GetHierarchyManager();
$db = &$gCms->db;
// Get list of 10 most recently updated pages excluding the home page
$q = "SELECT * FROM ".cms_db_prefix()."content WHERE (type='content' OR type='link')
AND default_content != 1 AND active = 1 AND show_in_menu = 1
ORDER BY modified_date DESC LIMIT 10";
$dbresult = $db->Execute( $q );
if( !$dbresult)
{
echo 'Erreur bdd durant la remont&eacute;e des infos<br/>';
}
while ($updated_page = $dbresult->FetchRow())
{
$curnode =& $hm->getNodeById($updated_page['content_id']);
$curcontent =& $curnode->GetContent();
echo <<<REQUETE
<li class="updated">
<a href={$curcontent->GetURL()}>{$updated_page['content_name']}</a><br />
{$updated_page['titleattribute']}<br />
Modifi&eacute; le : {$updated_page['modified_date']}
</li>
REQUETE;
}
echo '</ul></div>';

Donnera : 10 dernières pages modifiées

Afficher la date de dernière modification de votre site

global $gCms;
$hm =& $gCms->GetHierarchyManager();
$db = &$gCms->db;

// Get the most recently updated page excluding the home page
$q = "SELECT modified_date FROM ".cms_db_prefix()."content WHERE (type='content' OR type='link')
AND default_content != 1 AND active = 1 AND show_in_menu = 1
ORDER BY modified_date DESC LIMIT 1";
$updated_page = $db->getOne($q);
if(!$updated_page)
{
echo 'DB error durant la r&eacute;cup&eacute;ration de la date<br/>';
break;
}
echo date("d/m/Y",strtotime ($updated_page));

Donnera tout bêtement : date_derniere_modif.png

Faire une redirection maison par alias de page

Appelons notre udt redirection_maison. Il faudra l'appeler ainsi :

{redirection_maison alias='tata'}

ce qui provoquera une redirection transparente pour tous les visiteurs ET pour les moteurs de recherches vers la page possédant l'alias tata. Si aucune page n'existe avec l'alias tata une erreur sera générée.

Le code de cet UDT

global $gCms;

if (! isset($params['alias']))
{
echo "param alias non renseigné";
return;
}

$page = $params['alias'];

$manager =& $gCms->GetHierarchyManager();
$node =& $manager->sureGetNodeByAlias($page);

if (! isset($node))
{
echo "alias '.$page.' inexistant";
return;
}

$content =& $node->GetContent();

if (isset($content) && is_object($content))
{
if ($content->GetURL() != '')
{
redirect($content->GetURL());
}
}
else
{
echo "alias pointant vers une non-page";
return;
}
]]>
http://www.cmsmadesimple.fr/blog/19/15/Petits-Tags-entre-amis
Remplacer le texte par une image pour vos StartExpandCollapse http://www.cmsmadesimple.fr/blog/18/15/Remplacer-le-texte-par-une-image-pour-vos-StartExpandCollapse Mon, 25 Oct 2010 14:59:00 +0200 Les StartExpandCollapse sont les balises smarty qui permettent (avec stopExpandCollapse) d'encadrer un bloc de texte pour cacher aux yeux de l'utilisateur son contenu. L'utilisateur clique sur le texte du lien auto-généré, le texte caché est révélé à l'écran. Re-cliquez, il disparaitra à nouveau.
Mais comment remplacer le lien en texte par une image bien plus conviviale ?

C'est Kler qui nous donnera la réponse sur le forum, Merci à lui

Avant

{startExpandCollapse id='expand1' title='texte du lien'}
texte caché à l'écran
{stopExpandCollapse}

Après

{startExpandCollapse id='expand1' title='<img src="uploads/images/nom_de_votre_image.jpg" alt="texte alternatif" width="100" height="100" />'}
texte caché à l'écran
{stopExpandCollapse}

Une image viendra remplacer votre texte.

Attention : dans le WYSIWYG les symboles < et > vont vite être remplacés par leur équivalent HTML et pourrir votre code. Pensez donc à désactiver le WYSIWYG ou à passer par une balise utilisateur / autre.

]]>
http://www.cmsmadesimple.fr/blog/18/15/Remplacer-le-texte-par-une-image-pour-vos-StartExpandCollapse
Astuce : afficher aléatoirement une image dans votre site web http://www.cmsmadesimple.fr/blog/17/15/Astuce-afficher-aleatoirement-une-image-dans-votre-site-web Mon, 18 Oct 2010 14:52:00 +0200

Contexte

Qui n'a jamais rencontré le soucis : j'ai une série d'une dizaines d'images de même dimensions qui doivent s'afficher de manière aléatoire dans ma page à chaque rafraichissement de page (une bannière de pub, un logo, ...)

Il existe certes la solution de monter toute une galerie photo avec le module Gallery et d'utiliser ses fonctionnalités d'affichage en Random afin de sortir une image aléatoire. Mais comment se passer du module dans le cas ou vous maitrisez complètement la liste des images en entrée ?

Très simplement :)

Nommez vos images de la façon suivante :

  • image1.jpg
  • image2.jpg
  • image3.jpg
  • ...
  • image99.jpg

Insérez dans le gabarit l'appel à l'image :

<img src="uploads/repertoire/de/vos/image28.jpg" alt="logo" title="logo" />

avec 1 qui restera inchangé et 99 qui doit être le nombre d'images en stock.

Finit ! en sortie vous aurez automatiquement une image aléatoire

<img src="uploads/repertoire/de/vos/image1.jpg" alt="logo" title="logo" /> <img src="uploads/repertoire/de/vos/image72.jpg" alt="logo" title="logo" /> <img src="uploads/repertoire/de/vos/image17.jpg" alt="logo" title="logo" /> ...

Note personnelle : N'oubliez pas que la balise alt est indispensable pour une validation Xhml de votre page. Les balise width et height sont pas obligatoires mais permettent d'accélérer le rendu utilisateur si elles sont correctement renseignées. N'hésitez donc pas si vous avez une série d'images de même dimension:

<img src="uploads/repertoire/de/vos/image2.jpg" alt="logo" title="logo" width='100px' height='100px' />

Astuce issue du forum. Merci à Jean Le Chauve.

]]>
http://www.cmsmadesimple.fr/blog/17/15/Astuce-afficher-aleatoirement-une-image-dans-votre-site-web
Requêter facilement la bdd de cmsmadesimple http://www.cmsmadesimple.fr/blog/16/15/Requeter-facilement-la-bdd-de-cmsmadesimple Mon, 11 Oct 2010 14:35:00 +0200

Présentation du problème

Le soucis se présentait sous la forme suivante : J'ai le module news installé et plein de billets renseignés par différents auteurs dans différentes catégories ayant toutes la même catégorie mère. 2 champs complémentaires viennent s'ajouter bien que pas toujours renseignés.

Je veux sortir une édition à l'écran sous la forme d'un tableau à X colonnes comportant :

  • nom de la catégorie
  • nom de l'auteur
  • date de la news
  • champs complémentaire 1 (ou vide)
  • champs complémentaire 2 (ou vide)

En regardant la BDD on trouve facilement nos tables et on parvient au constat qu'il sera facile de lier nos données avec toutes les clés étrangères.

les tables : module_news_categories, module_news, module_news_fieldvals et user pour respectivement les catégories, les articles, les champs additionnels et les utilisateurs.

La première réaction pour afficher notre tableau est de passer par du php. Pour afficher du php, le plus simple est de monter une balise utilisateur (un UDT) nommée "toto" , d'y coller notre code, d'enregistrer et dans la page souhaitée d'insérer la balise smarty : {toto} .Bref rien d'extra-ordinaire de ce coté

Le code qui a été réalisé en premier notre codeur a été celui ci (sans aucune modification de ma part)

echo '<table id="planning" align="center" cellspacing="2">';
echo '<thead><tr class="toprow">';
echo '<table id="planning" align="center" cellspacing="2">';
echo '<thead><tr class="toprow">';
echo '<th>Tâche</th>';
echo "<th>Description</th>";
echo "<th>Postée le</th>";
echo "<th>Postée par</th>";
echo "<th>Action</th>";
echo "<th>Prévue le</th>";
echo "</tr></thead>";
global $gCms; //pour pouvoir travailler avec les objets, classes et méthodes du cms
$db = &$gCms->GetDb(); //connection à la bd cms, recherche de la catégorie Travail et de sa filiation
$query = "SELECT news_category_id, news_category_name FROM xxx_module_news_categories WHERE parent_id = 7 ORDER BY hierarchy ";
$dbretour = &$db->Execute($query);//exécution de la requête
while ($dbretour && !$dbretour->EOF)
{
$CodeCategory = $dbretour->fields['news_category_id'];
$resultChamps1 = $dbretour->fields['news_category_name'];//recherche des news de la category
$query = "SELECT news_id, news_title, news_date, author_id FROM xxx_module_news WHERE news_category_id = '$CodeCategory' ORDER BY news_date ";
$dbresult = &$db->Execute($query);//exécution de la requête
while ($dbresult && !$dbresult->EOF)
{
$resultChamps2 = $dbresult->fields['news_title'];
$resultChamps3 = $dbresult->fields['news_date'];
$CodeAuteur = $dbresult->fields['author_id'];
$CodeNews = $dbresult->fields['news_id'];// recherche du nom de l'auteur de la news
$query = "SELECT username FROM xxx_users WHERE user_id = '$CodeAuteur' ";
$dbtoto = &$db->Execute($query);//exécution de la requête
$resultChamps4 = $dbtoto->fields['username']; // recherche des 2 autres champs
$query = "SELECT fielddef_id, value FROM xxx_module_news_fieldvals WHERE
news_id = '$CodeNews' SORTED BY fielddef_id ";
$dbresultat = &$db->Execute($query); //exécution de la requête
$codechamp = $dbresultat->fields['fielddef_id'];
while ($dbresultat && !$dbresultat->EOF)
{
$resultChamps5;
$resultChamps6;
if ($dbresultat->fields['fielddef_id'] == 1)
{
$resultChamps5 = $dbresultat->fields['value'];
}
elseif ($dbresultat->fields['fielddef_id'] == 3)
{
$resultChamps6 = $dbresultat->fields['value'];
}
$dbresultat->MoveNext();// enregistrement suivant
}// tous les champs sont remplis on affiche la ligne
echo <<<REQUETE
<tr>
<td class="leftcol">{$resultChamps1}</td>
<td class="datadesc">{$resultChamps2}</td>
<td class="data">{$resultChamps3}</td>
<td class="data">{$resultChamps4}</td>
<td class="data">{$resultChamps5}</td>
<td class="data">{$resultChamps6}</td>
</tr>
REQUETE;
$dbresult->MoveNext();//enregistrement suivant
}//Toutes les news de la categorie ont été lues
$dbretour->MoveNext();// catégorie suivante
}
if ($dbretour) $dbretour->Close();//Toutes les news de toutes les catégories sont lues, on ferme la connection
echo "</table>";

Sans rentrer dans les détails du php voilà ce que nous avons en résumé :

  • déclaration de l'entête du tableau en html
  • récupération de la liste des catégories
  • pour chaque catégorie je récupère la liste des news associées
  • pour chaque news je récupère le nom de l'auteur et les 2 champs complémentaires
  • je mixe le tout
  • dans une syntaxe heredoc je produit en sortie la liste des ligne de mon tableau html
  • je clôture les connexions à la bdd au fur et à mesure.

Le principe est bon. Il devrait marcher. Seulement voilà il y a un sacré paquet d'amélioration à faire ici.

Optimiser les requêtes.

Dans le cas ou j'ai 50 news dans 4 catégories différentes, ayant 6 auteurs différents et ayant tous +/- tes 2 champs complémentaires renseignés mon algorithme produira pas moins de 106 requêtes SQL pour arriver à ses fins..

Nous allons utiliser (avec modération) une solution SQL appelée la jointure afin de résoudre ce premier point :

SELECT c.news_category_id, c.news_category_name, n.news_id, n.news_title, n.news_date, u.username, f1.value as champs5, f2.value as champs6
FROM
xxx_module_news n
LEFT JOIN xxx_module_news_fieldvals f1 ON f1.news_id = n.news_id
LEFT JOIN xxx_module_news_fieldvals f2 ON f2.news_id = n.news_id
LEFT JOIN xxx_module_news_categories c ON c.news_category_id = n.news_category_id
LEFT JOIN xxx_users u ON u.user_id = n.author_id
WHERE
c.parent_id = 7 // l'ID de la catégorie mère
AND f1.fielddef_id = 1 // l'ID du premier champs spécial de la news
AND f2.fielddef_id = 3 // l'ID du second champs spécial de la news
ORDER BY
c.hierarchy ASC, n.news_date ASC

ici on récupère directement toutes les infos en une seule requête et directement combinées entre elles. Notez l'utilisation des alias de tables afin de rendre plus clair le code.

A noter que l'utilisation abusive des jointures sur des tables complexes ou chargées devient rapidement un mal plus qu'un bien dans notre recherche d'optimisation !

Ensuite se pose un soucis car telle quelle, ma requête va faire des jointure uniquement sur les news ayant les deux champs complémentaires renseignés. Pour corriger ce point il suffit de rajouter une condition dans les clauses WHERE :

WHERE
c.parent_id = 7
AND (f1.fielddef_id = 1 OR f1.fielddef_id is null)
AND (f2.fielddef_id = 3 OR f2.fielddef_id is null)

Et le tour est joué. Vous obtiendrez dans le résultat soit NULL soit la valeur du champs complémentaire.

Améliorer le traitement des résultats.

Dans l'exemple nous avions :

$dbresult = &$db->Execute($query);
while ($dbresult && !$dbresult->EOF)
{
//TRAITEMENT
$dbretour->MoveNext();// on déplace le curseur d'un cran
}
if ($dbretour) $dbretour->Close();//On a finit de parcourir les résultats, on ferme la connexion.

Il y a clairement plus simple et donc moins sujet aux erreurs de codes !

Dans le cas classique ou l'on remonte une liste d'information :

$query = 'SELECT valeur1, valeur2, valeur3 FROM ma_table';
$resultat = $db->execute($query);
if($resultat === false) {/* faire code de gestion de l'erreur */}
while ($row = $result->FetchRow()))
{
echo "valeur1 =". $row['valeur1'];
echo "valeur2 =". $row['valeur2'];
echo "valeur3 =". $row['valeur3'];
}

et dans le cas ou l'on ne remonte qu'une seule valeur dans une seule colonne comme un compteur par exemple

$query = 'SELECT count(*) FROM ma_table';
$compteur= $db->getOne($query);
if($compteur=== false) {/* faire code de gestion de l'erreur */}
echo "il y a ".$compteur." résultats en base";

Plus léger, plus simple, moins de chance de laisser passer une erreur :)

Gestion des codes erreurs SQL

De mon avis personnel, je préconise toujours de ne pas afficher les erreurs dans l'interface aux yeux des utilisateurs, c'est le meilleur moyen de les renseigner sur la structure de votre base de donnée et ainsi laisser la possibilité aux personnes mal intentionnée de tenter d'exploiter des failles de sécurité.

donc plutôt que faire un echo brutal du résultat en cas d'erreur, je préconise simplement dans mes exemple précédent :

if($dbretour === false) { echo "Erreur lors de la remontée des données";exit();}
if($compteur=== false) { echo "Erreur lors du comptage des lignes";exit();}

Affichage des données

Alors que certains utiliseraient à tout va les syntaxes echo, pensez herodoc ! démonstration :

echo <<<REQUETE
<tr>
<td class="leftcol">{$row['news_category_name']}</td>
<td class="datadesc">{$row['news_title']}</td>
<td class="data">{$row['news_date']}</td>
<td class="data">{$row['username']}</td>
<td class="data">{$row['Champs5']}</td>
<td class="data">{$row['Champs6']}</td>
</tr>
REQUETE;

pas de gestion des apostrophes, des guillemets et autre subtilités, vous insérez directement dans le code HTML pré-maché vos variables sous la forme $maVariable avec des accolades autour. D'autre part, PHP à tendance à gagner du temps lorsque vous utilisez l'herodoc plutôt qu'une série de 20 appels à echo. Bref totalement gagnant

Petite pause

A ce stade du tutorial nous avons déjà pas mal chamboulé le chantier... faisons un point sur le nouveau code

echo "<table>";
query = "SELECT c.news_category_id, c.news_category_name, n.news_id, n.news_title, n.news_date, u.username, f1.value as champs5, f2.value as champs6
FROM
xxx_module_news n
LEFT JOIN xxx_module_news_fieldvals f1 ON f1.news_id = n.news_id
LEFT JOIN xxx_module_news_fieldvals f2 ON f2.news_id = n.news_id
LEFT JOIN xxx_module_news_categories c ON c.news_category_id = n.news_category_id
LEFT JOIN xxx_users u ON u.user_id = n.author_id
WHERE
c.parent_id = 7
AND (f1.fielddef_id = 1 OR f1.fielddef_id is null)
AND (f2.fielddef_id = 3 OR f2.fielddef_id is null)
ORDER BY
c.hierarchy ASC, n.news_date ASC";

$dbretour = &$db->Execute($query);//exécution de la requête
if($dbretour === false) { echo "Erreur lors de la remontée des données";exit();}

while ($row = $dbretour->FetchRow())
{
echo <<<REQUETE
<tr>
<td class="leftcol">{$row['news_category_name']}</td>
<td class="datadesc">{$row['news_title']}</td>
<td class="data">{$row['news_date']}</td>
<td class="data">{$row['username']}</td>
<td class="data">{$row['Champs5']}</td>
<td class="data">{$row['Champs6']}</td>
</tr>
REQUETE;
}
echo "</table>";

Plus clair, une seule requête, séparation entre le code de requetage et celui de présentation, on est presque bon !

Portabilité du code

Votre code fonctionne chez vous? c'est super... mais fonctionnera t il sur l'installation du voisin ? les préfixes de tables : xxx_ sont paramétrables selon chaque installations, et il se trouve que bien souvent, les installations ont leur propre suffixes imposés par les hébergeurs.

Du coup une astuce va vous apporter une portabilité totale du code : c'est la fonction cms_db_prefix() de cmsms. Cette fonction va retourner justement "xxx_" en fonction de l'installation. Ainsi mon code finalisé ressemblera à ceci :

global $gCms;
$db = &$gCms->GetDb();
echo "<table>";
query = "SELECT c.news_category_id, c.news_category_name, n.news_id, n.news_title, n.news_date, u.username, f1.value as champs5, f2.value as champs6
FROM
".cms_db_prefix()."module_news n
LEFT JOIN ".cms_db_prefix()."module_news_fieldvals f1 ON f1.news_id = n.news_id
LEFT JOIN ".cms_db_prefix()."module_news_fieldvals f2 ON f2.news_id = n.news_id
LEFT JOIN ".cms_db_prefix()."module_news_categories c ON c.news_category_id = n.news_category_id
LEFT JOIN ".cms_db_prefix()."users u ON u.user_id = n.author_id
WHERE
c.parent_id = 7
AND (f1.fielddef_id = 1 OR f1.fielddef_id is null)
AND (f2.fielddef_id = 3 OR f2.fielddef_id is null)
ORDER BY
c.hierarchy ASC, n.news_date ASC";

$dbretour = &$db->Execute($query);//exécution de la requête
if($dbretour === false) { echo "Erreur lors de la remontée des données";exit();}

while ($row = $dbretour->FetchRow())
{
echo <<<REQUETE
<tr>
<td class="leftcol">{$row['news_category_name']}</td>
<td class="datadesc">{$row['news_title']}</td>
<td class="data">{$row['news_date']}</td>
<td class="data">{$row['username']}</td>
<td class="data">{$row['Champs5']}</td>
<td class="data">{$row['Champs6']}</td>
</tr>
REQUETE;
}
echo "</table>";

Ce code est virtuellement capable d'être installé sur n'importe quelle installation de CMS Made Simple dans une Balise utilisateur et s'excecuter avec joie dans votre coeur :)

Récupérer une date de la bdd

La question s'est posée : comment transformer une date issue de la bdd en date php afin d'être traitée comme tel.

Ma solution actuelle est cette fonction :

oubliez ce code et utilisez plutôt ceci

$dbdate = $db->UnixTimeStamp($row['news_date']);
echo date("d m Y",$dbdate);

pour rappel, l'ancien code que j'avais proposé

/**
* Transforme la date issue de la base en une veritable date php
**/
function _dbToDate($stringDate)
{
return mktime(substr($stringDate, 11,2),
substr($stringDate, 14,2),
substr($stringDate, 17,2),
substr($stringDate, 5,2),
substr($stringDate, 8,2),
substr($stringDate, 0,4));
}

et un exemple de son appel dans votre balise utilisateur

$dbdate = _dbToDate($row['news_date']);
echo date("d m Y",$dbdate);

affichera la date sous la forme "01 01 2001" selon le paramétrage php spécifié.

A noter que cette fonction n'est pas la plus parfaite qu'il soit, je recherche toujours un moyen plus léger pour transformer cette date issue de la bdd en date php et serait ravis d'avoir votre retour sur le sujet done ! voir un peu au dessus

Bilan

Fin du tuto du jour. J'espère qu'il sera utile pour tous ceux qui sont amenés à travailler directement sur la bdd. Merci de m'avoir suivit et bonne fin de semaine :)

]]>
http://www.cmsmadesimple.fr/blog/16/15/Requeter-facilement-la-bdd-de-cmsmadesimple
FrontEndUser file Manager externe http://www.cmsmadesimple.fr/blog/15/15/FrontEndUser-file-Manager-externe Mon, 20 Sep 2010 14:33:00 +0200 AjaXplorer

Ecrit par Jissey

Avec le module FEUajaxplorer, vous voici équipé d'un FrontEndUser file Manager.

Avec AjXp en standard, vous avez: Gestion d'utilisateurs, gestion de dépôts, gestion de droits. Les dépôts peuvent être locaux ou distant (FTP, SSH, SVN, inter-applications). Chaque utilisateur, selon ses droits peut avoir accès aux dépôts en lecture ou lecture/écritures. Les fichiers images et vidéos(flv) sont visualisables directement dans l'interface, certains types de fichiers sont aussi éditables. On peut déposer des fichiers par glisser/déposer, créer des liens publiques pour inviter quelqu'un à voir un fichier, indiquer des données meta sur les fichiers, rechercher, ...la liste est longue. Rien n'est en base de données, des fichiers sérialisés sont utilisés.AjaXplorer

L'architecture est basée sur des plugins. Chaque fonctionnalité est un plugin y compris la connection à l'interface. C'est ainsi qu'il existe un plugin pour joomla, wordpress et maintenant CMSMS.

Le plugin d'authentification (auth.cmsms) forcera l'utilisateur à se connecter dans le FrontEndUser de son CMSMS. Une fois le module FEUajaxplorer installé et paramétré, la gestion des accès n'est plus faite avec un fichier à plat, mais avec la table des utilisateurs du module FrontEndUser. La gestion des droits est toujours quant à elle du ressort de AjXp (mais cela évoluera).

Dans FEU, vous définirez un groupe dédié à l'accès au partage de fichiers. Le paramétrage demande l'URL de votre installation, la saisie d'un code secret qu'il faudra aussi renseigner dans AjXp, le texte du lien qui pointera vers votre installation et le groupe des utilisateurs concernés. Vous mettrez ensuite le tag {cms_module module='FEUajaxplorer'} là où vous en aurez besoin (contenu, gabarit, menu) et le lien apparaitra lorsqu'un utilisateur du groupe sera connecté.Il ne se sera identifié qu'une seule fois.FEUajaxplorer

Ainsi, vous pouvez intégrer à votre CMSMS une partie extranet de partage de fichiers. Le module est accessible ici : CMS MADE SIMPLE FORGE.

Le module est documenté dans l'aide et le plugin auth.cmsms contient les instructions de configuration de AjXp.

Développement-Formation  CMSMS

]]>
http://www.cmsmadesimple.fr/blog/15/15/FrontEndUser-file-Manager-externe
Les outils du webmaster : les notes Yslow et PageSpeed http://www.cmsmadesimple.fr/blog/3/15/Les-outils-du-webmaster-les-notes-Yslow-et-PageSpeed Fri, 18 Jun 2010 17:29:00 +0200 forum l'ont surement remarqué, ces derniers temps j'inclus dans mes remarques  un nouveau critère de notation : les notes Yslow et PageSpeed. Loin  d'être une lubie de ma part, je vais vous expliquer dans cet article  pourquoi je m'acharne tant à intégrer ces deux mesures dans la notation  de vos sites et surtout comment faire pour améliorer ces notes.

Principe de fonctionnement

Yslow tout comme PageSpeed sont deux utilitaires qui vérifient un site web et en "calculent" sa notes selon des critères personnels en appliquant à chaque fois un coefficient d'importance.

Imaginez un professeur de français corrigeant une copie et préparant le décompte des notes ainsi :

  • w/10 pour le fond du texte coef 3
  • x/10 pour l'orthographe coef 3
  • y/10 pour la présentation de votre nom/prénom/classe coef 2
  • z/10 pour le clin d'œil que vous lui ferrez en remettant la copie coef 1

(je n'ai pas précisé le sexe du prof, à vous de voir)

La note moyenne de votre copie sur 10 que vous recevrez sera donc égal à (3 * w + 3 * x + 2 * y + 1 * z ) / (3 + 3 + 2 + 1)

Yslow et PageSpeed ont donc chacun leur propres critères et appliquent parfois pour des critères communs des coefficients différents, C'est pour cela que leur note ne sera quasiment jamais identique (Yslow était il y a encore peu de temps bien plus sévère dans sa notation. Depuis début juin 2010 PageSpeed a revu à la hausse ses exigences.)

Gtmetrix ou Firebug ?

Firebug est un addon que j'ai déjà analysé pour vous dans une news précédente. Il se trouve que des add-on de firefox type Yslow existent et s'appuient justement sur Firebug pour fonctionner. C'est intégré à votre navigateur web (firefox en l'occurrence) et test, note et synthétise la page que vous visitez.

Les inconvénients pour ce genre de solution c'est la dépendance envers le navigateur, l'impossibilité de conserver une trace du rapport et surtout l'impossibilité d'envoyer le rapport obtenu à un Tiers.

Et voilà celui qui va améliorer tout cela : Gtmetrix. C'est un service gratuit permettant de tester un site web et d'en tirer plusieurs rapports de notation et de performance. Le tout sera sauvegardé si vous créez votre compte (gratuit) ou simplement mémorisé durant une période de 15 jours afin d'être partagé entre amis grâce à une URL personnalisée.

Fonctionnement

Présentation GTmétrix

Principe dès plus simple : collez votre URL dans le champs et cliquez sur GO! à droite

Analyse des résultats

Résultat GTMetrix

Le tableau de résultat synthétise l'ensemble de votre travail sur le site mais également les manques. On se penche en premier sur la partie haute du site afin de voir en 1 la note de Yslow (ici 85%). Notez la flèche verte à droite du score pointant vers le haut elle indique que le site testé a un score au dessus de la moyenne internationale (ou comment se la péter en soirée mondaine). En 2 on retrouve évidement la note Page Speed. En 3 on compile le poids de la page (html + css + js + média (images / vidéos / ... ), le temps nécessaire au chargement et enfin le nombre de requête HTTP nécessaire pour accéder à l'ensemble des informations du site.

24_002.png

Ce qui faut retenir de manière grossière :

  • plus votre note approche le 100 et mieux c'est
  • moins de temps met la page à s'afficher et mieux c'est (toujours < 2s)
  • moins de poids pèse une page et mieux c'est (influe sur le temps de chargement) (toujours < 100Kb)
  • moins de requête HTTP ouverte mieux c'est (influe sur le temps de chargement également) (toujours une dizaine maxi)

Pourquoi de telles affirmations ?

Pour le poids

C'est une logique que certaines personnes oublient : l'ADSL n'est pas présent dans tous les foyers (hé oui...) alors souvenez vous de votre modem 56K qui affichait une page en 1 minute... pareil ici... Autre point lié au poids mais même calcul : moins de traffic sur votre site internet en terme de poids = CPU allégé = serveur mieux disponible = bonheur dans votre coeur voir même baisse des coûts de fonctionnement pour certains contrats d'hébergement liés par un tarif à la bande passante. A titre d'exemple j'ai réussit à diminuer le poids d'une page vu 25.000 par mois de 1Mo à 220Ko Je passe ainsi d'une consommation de 25Go par mois à 5,5Go. Suffit de voir les tarifs au Go/mois pour comprendre l'intérêt de la réduction de poids des pages.

Les temps de réponses

Je doute que vous appréciez de visiter un site qui rame, pensez à vos visiteurs. Au dessus de 2s de chargement sans rien obtenir il sera tenté d'aller voir ailleurs.

Les requêtes HTTP

Un temps précieux est perdu à chaque ouverture de connexion HTTP, plus de requêtes = plus de temps de perdu pour charger votre page.

24_003.png

Après avoir vu l'état de notre site internet, on se dirige vers la seconde section ou l'on retrouve dans un système d'onglet les détails des notes Yslow, Page Speed mais également un diagramme de Gantt sur le chargement des pages déjà présenté dans Firebug qui permet rapidement de voir les erreurs HTTP présentes sur un site (404 sur une image, 301 inutile sur une sous page, ...) Enfin le bouton Historique pour consulter les anciens rapports si vous les avez enregistrés (uniquement via un compte utilisateur)

24_005.png

Le cœur de ce qui nous intéresse dans ce tutorial : les notes, avec pour même principe entre Yslow et PageSpeed :

  • la description de la demande
  • la note obtenue
  • votre position par rapport à la moyenne mondiale
  • l'élément impacté
  • la priorité de l'optimisation (le fameux coefficient de notation)

La différence entre Yslow et PageSpeed se situe sur deux points : certaines demandes sont différentes de l'un à l'autre, mais surtout ce sont les coefficients entre les deux qui diffèrent pour certaines demandes de l'un à l'autre, d'où l'obtention de note différentes au final

Enfin il ne faut pas oublié que suivant l'évolution des versions Yslow ou PageSpeed, la notation des méthodes de calculent peuvent changer, en général lorsque leur développeurs ré-évaluent les normes de best-practices. Ainsi récemment -début juin- une note de 90 sous pageSpeed est retombée à 82 car leur équipe de développement avaient revus à la hausse les critères de notation.

N'oubliez jamais qu'il faut savoir faire la part des choses entre l'ultra optimisation, qui peut poser des soucis dans l'utilisation quotidienne de CMS Made Simple, et ce qui est réellement utile, ainsi il n'est pas nécessaire d'atteindre les 100 dans chaque note, dépasser le 90 est déjà signe d'une excellente santé. Autre point important, certaines améliorations nécessitent des accès à la configuration des serveurs, ce que tous les hébergeurs ne proposent pas ! Ainsi la compression Gzip et la mise en cache sont des modules optionnels d'Apache que seuls certains hébergeurs proposent, sans cela vous perdrez des précieux points à vos notes... A vous de choisir le bon hébergeur :)

Quelques demandes et leur explications en français accessible

Je ne ferrais pas le traducteur pour chaque demandes mais je me concentrerais au contraire sur celles qui ne sont pas évidente aux premiers abords pour un webmaster novice. La plupart des réponses ci dessous sont tirées pour certaines de mon expérience personnelle, pour d'autre de recherche faites sur internet justement dans le cadre d'amélioration de notes Yslow et PageSpeed sur mes sites. Elles sont donc à considérer dans l'état et ne sauront remplacer vos propres recherches et conclusions sur le sujet ;)

Use a Content Delivery Network (CDN) (YSlow)

les CDN sont des réseaux de serveurs, la plupart du temps payant, répartis tout autour de la planète et destiné à stocker des fichiers plats (autres que fichiers php & co). L'intérêt de stocker des copies d'images dans tous les pays du monde est que le visiteur réceptionne plus rapidement son contenu et affichera votre site plus rapidement. Le procédé peut couter cher et amoindrit les possibilités d'améliorer ce critère bien qu'il soit interessant pour des sites multilingues et donc par définition destiné à un public international.

Add Expires headers (YSlow) et Leverage browser caching (pageSpeed)

le mod_expire d'apache est un addon pas tout le temps installé sur les hébergements que les professionnels vous proposent... et c'est bien dommage. Car c'est avec ce genre d'addon (celui ci ou d'autre...) qu'un site gagne en vélocité. Le principe est tout con : vous pouvez spécifier via un fichier .htaccess quelle est la date de validité d'une image, d'un fichier css ou js. Et en général on le fixera à un bon mois. De ce fait le navigateur conservera toutes ces données en cache et ne cherchera pas à le mettre à jour durant les visites suivantes. Quand on sait que pour mon site ces données fixes représentent 95% du poids total, c'est un énorme poids d'amélioration qu'il ne faut surtout pas rater. Malheureusement Google Analytics n'appose pas de délai suffisamment long à sont célèbre javascript ga.js (établit à une seule journée). Cela détériore la note sans que vous puissiez y faire grand chose.

Configure entity tags (ETags) (YSlow)

Sans doute la plus grande de mes interogations : qu'est ce qu'est l'ETags ? l'Etags est une fonctionnalité de hachage qui rend une image, un fichier unique au yeux d'un navigateur web tel serait une empreinte digitale pour un humain. Cela à l'avantage de lui permettre de savoir si l'image a déjà été téléchargée via une visite précédente ou si le navigateur doit le récupérer à nouveau. Ca serait très bien si un ETags n'était pas dépendant du serveur qui le distribue. Or dans le cas d'hébergement de masse, il y a en général du loadBalancing qui permet à X serveur de simuler la présence d'une seule plateforme. Concrètement pour les ETags il se peut qu'une "même image" : votre logo, soit un coup distribué par le serveur n°1, un coup par le serveur n°2, et ainsi de suite ce qui provoquera autant de marqueur numérique différent, imposant au navigateur de re-télécharger l'image à chaque visite. Étant donné ce problème, il est dans la plupart du temps interessant de supprimer d'Apache (ou ISS) la génération des ETags. Pour ceux et celles qui ont accès à la conf de leur serveur évidement.

Use cookie-free domains (YSlow) et Serve static content from a cookieless domain (pageSpeed)

Les cookies transmettent à chaque visite de page des informations diverses et variée qui pèsent un poids supérieur à zéro. Pourtant pour des images, des fichiers plats, un cookies est rarement utile. Il est donc recommandé de gérer un sous domaine type http://static.monsite.fr qui s'occupera uniquement de contenir les fichiers plats. Notez bien que je n'ai aucune idée pour faire fonctionner CMS Made Simple dans ce genre de configuration -_-' Je suis ouvert à toute idée intéressante sur le sujet.

Put JavaScript at bottom (YSlow)

Le point avec lequel ne je suis pas (entièrement) d'accord : Mettez vos script en bas de page pour éviter qu'un chargement JS bloque le chargement de la page actuelle. Okay mais gardez avant tout en tête que si un script personnel bloque le chargement c'est qu'il est temps de penser au poids de ce dernier ! Enfin pour les scripts type Google Analitycs, ils ont sortis une version Asynchrone que j'ai déjà évoqué dans un précédent billet. Pour cette raison je trouve que la règle est trop restrictive et pas assez précise : un simple script asynchrone qui ne gène en rien mais qui n'est pas "bien" placé vous ferra perdre des points.

Make fewer HTTP requests (YSlow)

Déjà dit : moins de requêtes HTTP = moins d'ouverture de socket = moins de perte de temps. Pour gagner des points sur ce thème il y a des astuces facilement réalisable : combinez vos fichiers JS et CSS dans un premier temps. Dans un second temps il est possible d'utiliser des CSS Sprites sur vos images. Des sites en ligne le font même pour vous !

un exemple d'image "CSS Spirites" Ready de mon site : http://www.furie.be/uploads/skin10/barre.png http://www.furie.be/uploads/skin10/ssmenu.png

Dans le premier cas un Spirite horizontal me fait gagner un peu de poids(*) + 1 requête HTTP Dans le second cas, un double Spirite vertical me fait gagner un peu de poids(*) + 2 requête HTTP

(*) suivant la comparaison suivante : total poids de 2 ou 3 images séparés VS poids d'une image contenant 2 ou 3 partie

Compress components with gzip (YSlow) ET Enable gzip compression (pageSpeed)

Second plus grosse note avec les dates d'expirations et pour cause : utiliser le Gzip sur votre site est tout bonnement bonheur pour le visiteur. Attention : il faut que le serveur possède le mod_deflate pour Apache ce qui signifie accéder à la configuration du serveur ou avoir des hébergeurs sympa qui ont pensé à vous. Une fois le serveur opérationnel, normalement et sans d'autres modifications de votre part, Cms Made Simple devra compresser automatiquement les fichiers plats non-compressé, c'est à dire tout sauf : image / son / video / archive, ceci pour la raison simple que le rapport Gain de poids / Temps CPU est ridicule dans ce genre de traitement en comparaison avec une compression d'un fichier HTML, JS ou CSS.

Minify JavaScript and CSS (YSlow) et Minify CSS (pageSpeed) et Minify JavaScript (pageSpeed)

Il n'y a pas de petite économie et la "minification" de vos fichiers plats de JS et CSS vous permettra de réduire leur poids de 20 à 25%. Malheureusement cela ce ferra au détriment d'une lecture humaine sans risquer de perdre une rétine. GTMetrix vous propose automatiquement de télécharger vos fichiers "minifiés" par ses soins. Conservez les originaux au cas ou vous devez modifier ultérieurement une donnée.

exemple de fichier JS naturellement minifié : http://code.jquery.com/jquery-latest.min.js

Avoid URL redirects (YSlow) ET Minimize redirects (pageSpeed)

les redirections sont le mal et font perdre du temps. Cela est également valable pour les redirections de type http://monsite.fr vers http://www.monsite.fr .. je ne partage encore une fois pas l'avis... Certaines redirections sont plus intéressantes pour le visiteur qu'elles ne sont pénalisantes.

Make AJAX cacheable (YSlow)

je me suis pas assez penché sur la question pour me permettre de vous la définir. Si un pro de l'ajax passe par là je suis preneur de son explication.

Put CSS at the top (YSlow) ET Put CSS in the document head (pageSpeed)

Pour la simple raison que le navigateur aura ainsi dès le début de la réception des données HTML la possibilité de faire le rendu de la page. CSS en bas de page = début de rendu une fois la page complètement téléchargée = page moche avant la fin du téléchargement.

Remove duplicate JavaScript and CSS (YSlow)

Ça se passe de commentaire. Toutefois ce n'est pas toujours le cas sur Cms Made Simple lorsque l'on installe X module tournant avec un appel à la bibliothèque JQuery chacun de leur côté !

Avoid AlphaImageLoader filter (YSlow)

le AlphaImageLoader filter est un hack de IE6 (et IE7?) permettant d'utiliser des PNG qui a l'origine ne sont pas supporté par ce navigateur. Cela se fait au détriment d'un temps de post-traitement côté client par le CPU qui est du coup à éviter. A la place changez de population cible (tout sauf IE6) ou installez des .GIF

Avoid HTTP 404 (Not Found) error (YSlow) et Avoid bad requests (pageSpeed)

Ça se passe de commentaire. une erreur 404 ou 410 est une requête ouverte et traitée inutilement.

Reduce the number of DOM elements (YSlow)

Les pages web construites à la manière d'un Xtml sont lentes parcourir pour le navigateur (rendu graphique) et par le JS (post-traitement) lorsque la structure est très complexe ( > dizaines de div incluses entre elles). Restez simple.

Do not scale images in HTML (YSlow) ET Serve scaled images (pageSpeed)

Généralement pour une miniature, le redimensionnement d'image en HTML ne change que le rendu mais provoque le chargement de l'image originale (et surtout son poids !) Envie d'une miniature ? créez là de toute pièce en back-office et affichez uniquement la miniature ! plus légère, plus rapide.

Use GET for AJAX requests (YSlow)

La méthode POST est plus consommatrice en terme de poids transité. (Attention : IE6 possède apparemment une limitation pour la taille d'un GET)

Avoid CSS expressions (YSlow)

Typiquement utilisée pour recadrer en automatique sous IE6 & IE5 la taille de certains élèments, les expressions CSS remplacent à tord un traitement JS. A éviter

exemple

.identifiant{
width:expression(500 + "px");
}

Reduce DNS lookups (YSlow) ET Minimize DNS lookups (pageSpeed)

Évitez de stocker des données sur des nom de domaine Tiers autant que possible, et ramenez sur votre domaine un maximum d'information afin de facilité le transfert réseau entre le client et votre site internet. Chaque lecture DNS à un coût non négligeable en terme de temps. Sans compter le risque de ne pas pouvoir maitriser la disponibilité d'un élément situé sur un autre domaine. Attention ce point n'est pas en contradiction avec la nécessité de gérer des sous domaine type http://static.monSite.fr qui lui n'est pas un autre domaine mais un sous-domaine ... et donc ne nécessite pas de nouvelle résolution DNS.

Reduce cookie size (YSlow)

Question de poids... jamais eu besoin de me pencher dessus.

Make favicon small and cacheable (YSlow)

Configurer correctement le .htaccess et le serveur pour ce point.

Make JavaScript and CSS external (YSlow)

C'est cette fois non seulement une question de best-practice en terme de programmation mais également de bon sens : tout fichier plats externalisé de votre page dynamique aura une change d'être gérée en cache par les modules Apache appropriés ;)

Use efficient CSS selectors (pageSpeed)

Le plus complexe à maitriser pour chacun d'entre nous : cette règle impose de gérer des déclarations CSS les plus courtes possible afin que le traitement du navigateur pour le rendu soit le plus rapide possible. Exemple dérivé : imaginez un itinéraire donné par un pote : Pays 1 -> Departement 2 -> Ville 3 que vous devez suivre spécifiquement dans cet ordre sans bruler les étapes en comparaison avec " aller à Ville 3 directement" Le voyage en voiture sera plus courts dans le second cas du fait que la destination est claire. Exemple a éviter absolument car complétement inutile :

div.MonIdentifiant ul div.AutreIdentifiant ul#maClasse li a.EniemeId {}

a remplacer par

a.EniemeId {}

Minify HTML (pageSpeed)

Pas évident surtout avec un site dynamiquement généré comme CMS Made Simple. Évitez au moins les pavés de code mort mis en commentaire qui transitent sur le réseau.

Optimize images (pageSpeed)

Très interessant, la compression sans perte des images. Je vous épargne le "pourquoi mon photoshop est pas aussi performant qu'un logiciel en ligne" mais sachez que GTMetrix propose de gagner encore quelques Octet sur vos images sans perte de qualité.

Specify a character set early (pageSpeed)

je me suis pas assez penché sur la question pour me permettre de vous la définir. Si un pro passe par là je suis preneur de son explication.

Specify image dimensions (pageSpeed)

le fait de spécifier les tailles des images permet au navigateur de pré-dimensionner les éléments affiché dans la page avant même que l'image ne soit téléchargée. Dans le cas contraire il est obligé après réceptions des premiers paquets d'information de l'image de redimensionner les éléments ce qui coute cher en temps de traitement.

A faire :

<img src='./monimage.jpg' height='90' width='150' alt='texte alternatif'/>

Remove unused CSS (pageSpeed)

Un peu inutile à mon gout, on vous demande de conserver une feuille de style CSS dépouillée de tout code inutilisé.... okay soit, mais si une balise n'est pas utilisé sur 1 page de votre site, elle l'est peut être ailleurs... ou le sera plus tard... donc ce n'est personnellement pas ma priorité.

Combine external CSS (pageSpeed) et Combine external JavaScript (pageSpeed)

Combiner les fichiers externes CSS et JS permet logiquement de réduire le nombre d'appel HTTP.

Minimize request size (pageSpeed)

Cela ne concerne pas vraiment Cms Made Simple qui reste peu gourmand, mais il faut garder en tête que charger les informations du header (via commande spécifique PHP) ou le cookie d'un site peut provoquer un surpoids du header général au point de nécessité l'envoi de ce dernier en 2 paquets HTTP voir plus... Autant d'appel inutile.

Optimize the order of styles and scripts (pageSpeed)

Sachant que sur certains navigateurs, le téléchargement d'un fichier Javascript provoque l'arrêt momentané des téléchargement parallèles (image, css, autre js), il est important de déclarer en premier les feuilles de style et ENSUITE le javascript

Parallelize downloads across hostnames (pageSpeed)

Uniquement pour ceux qui utilisent des sous domaine static (voir l'exemple du http://static.monDomaine.fr) afin de distribuer leur contenu sans cookies, il est interessant de dispatcher les données sur plusieurs serveurs afin que ces derniers puissent répondre très rapidement aux demandes du client. Uniquement valable pour les énormes sites. Cms Made Simple n'est pas concerné.

Remove query strings from static resources (pageSpeed)

Si on demande de mettre en cache les fichiers plats, il est évident qu'il ne faut pas mettre en cache les fichiers dynamiques qui, par définition, sont susceptibles d'être modifiés à chaque instant. Exclus donc de mettre en cache des pages possédant des paramètres d'appel (par exemple index.php?page=maPage)

Serve resources from a consistent URL (pageSpeed)

C'est con... mais si vous déclarez à différent endroits de votre page une même image (une puce pour des liste), assurez vous de la déclarer de la même manière et de ne pas dupliquer des déclarations menant à différents fichiers représentant une même image.

Specify a cache validator (pageSpeed)

Assurez vous d'avoir au moins l'une ou l'autre technique de mise en cache : le mod_expire ou les ETags, même si comme déjà dit précédemment il est préférable de n'avoir QUE le premier.

Specify a Vary: Accept-Encoding header (pageSpeed)

C'est une manipulation du serveur et qui concernera sans doute aucun d'entre vous. Il s'agit de forcer dans l'envoi d'une page l'information Vary: Accept-Encoding afin de corriger un soucis sur certains proxy pour les clients qui n'accepte pas le mode Gzip sur leur navigateur (rare).

Bilan

J'espère sincèrement que mon petit tour de piste vous aura convaincu non seulement de l'utilité des notations YSlow et PageSpeed mais surtout qu'en tant que webmaster il est important de rester au abois, ne jamais se reposer sur nos lauriers et toujours voir si une petite amélioration de nos installation n'est pas possible :)

Petit Jeu

Si vous avez 5 minutes et que vous voulez me remerciez je vous demanderais un petit service afin de préparer un nouveau billet sur la qualité des hébergeurs. L'idée est d'obtenir une notation par défaut lorsque l'on installe un Cms Made Simple sur un hébergeur ÉPURÉ DE TOUTE MANIPULATION PRÉALABLE

Le vainqueur sera celui qui arrivera à produire le pire rapport du premier coup

Les gains : un max de blé, des vacances dans une ile paradisiaque de son choix, un choux de Bruxelles, l'accès libre à Google pendant le restant de sa vie, toute mon estime, son nom dans le sommaire du prochain billet

fin de la partie : Dimanche 4 Juillet

Les règles sont simples : - Aucun fichiers .htaccess à la base de l'installation - Aucune modification de serveur pour l'occasion - Aucune modification du fichier de config.php ou autre. - Installez un Cms Made Simple dernière version (1.6.7 ou 1.7.1) francisé ou non - Testez le site sur http://gtmetrix.com/

Une fois la note obtenue ajoutez un commentaire ci dessous en indiquant - l'URL du rapport d'analyse de gtmetrix - la note Yslow, la note pageSpeed - le nom de l'hébergeur (éventuellement le nom du pack acheté : mutualisé, dédié, ...) - le temps de chargement de la page (voir image ci dessous, zone n°3)

24_002.png

Merci d'avance à tous ceux qui participeront au jeu.

]]>
http://www.cmsmadesimple.fr/blog/3/15/Les-outils-du-webmaster-les-notes-Yslow-et-PageSpeed
Comment intégrer un compteur à vos boucles http://www.cmsmadesimple.fr/blog/14/15/Comment-integrer-un-compteur-a-vos-boucles Mon, 07 Jun 2010 12:01:00 +0200

Insérer un compteur dans une boucle peut paraître assez inutile de prime abord, jusqu'à ce qu'on se rende compte des applications possibles. Voyons ensemble un cas concret. ;)

Ecrit par Corrine de l'agence Inseo

Créer une liste alternée :

Partons du principe que vous souhaitiez lister les articles de votre site. Afin de rendre la lecture de votre page plus confortable, vous aimeriez styler un article sur deux.

Or vous n'avez pas la main sur le code produit car il est automatiquement généré. Une boucle parcourt l'ensemble de vos articles et crée un élément pour chaque article trouvé.

Voici à quoi ressemble le gabarit du sommaire par défaut. Ce dernier étant assez indigeste, je n'ai conservé ici que les éléments qui nous intéressent, à savoir l'intitulé de l'article et sa date de parution :

{foreach from=$items item=entry}
{if $entry->postdate}
<div class="NewsSummaryPostdate">
{$entry->postdate|cms_date_format}
</div>
{/if}
<div class="NewsSummaryLink">
<a href="{$entry->moreurl}" title="{$entry->title|cms_escape:htmlall}">{$entry->title|cms_escape}</a>
</div>
{/foreach}

Avant de continuer, rendons ce code un peu plus sémantique :

  • en nous séparant de ces <div> inutiles ;
  • en encadrant les informations dans un élément de liste ;
  • et en rajoutant une balise <span> qui va nous servir pour la mise en forme.
<ul>
{foreach from=$items item=entry}
<li>
{if $entry->postdate}
<span>{$entry->postdate|cms_date_format}</span>
{/if}
<a href="{$entry->moreurl}" title="{$entry->title|cms_escape:htmlall}">{$entry->title|cms_escape}</a>
</li>
{/foreach}
</ul>

Ajoutons un peu de style à l'ensemble :

li {
margin: 0;
padding: 9px 0;
width: 500px;
font-family: Arial, Verdana, ans-serif;
font-size: 0.75em;
color : #384654;
list-style: none;
}

li span {float: right}

li a:link {
color : #384654;
text-decoration: underline;
}

Et affichons le résultat dans notre navigateur : Rendu du code html

Nous allons maintenant intégrer un compteur à cette boucle. Il suffit pour cela de le créer, de l'initialiser et de l'incrémenter à chaque nouveau passage :

<ul>{counter start=0 assign=compteur}
{foreach from=$items item=entry}{counter}

Afin de différencier un élément sur deux, nous allons déterminer si la valeur du compteur est paire ou impaire en utilisant la fonction mathématique modulo : %.

Si le reste de la division est strictement égal à 0, nous pourrons alors en déduire que la valeur du compteur est paire. Sinon, cela voudra dire que la valeur du compteur (et donc l'élément de liste <li>...</li>) est impaire.

En langage informatique, cela équivaut à : "Si la valeur du compteur est paire, alors je crée une class de valeur paire". Et traduit en smarty, cela donne : {if $compteur % 2 == 0} class="paire"{/if}

Il ne nous reste qu'à intégrer cette portion de code à l'ensemble, comme ceci :

<ul>{counter start=0 assign=compteur}
{foreach from=$items item=entry}{counter}
<li{if $compteur % 2 == 0} class="paire"{/if}>
{if $entry->postdate}
<span>{$entry->postdate|cms_date_format}</span>
{/if}
<a href="{$entry->moreurl}" title="{$entry->title|cms_escape:htmlall}">{$entry->title|cms_escape}</a>
</li>
{/foreach}
</ul>

À ajouter une nouvelle classe correspondante.

li.paire {background-color: #E2EAEB}

Et à admirer le résultat : Rendu du code html avec style alterné

Pratique, non ? :)

Addon du 24 janvier 2011

Le modulo permet de connaître le reste de la division.

En indiquant {if $compteur % 3 == 0}, on stylera donc un élément sur trois.

Pour stopper une boucle au-delà d'un certain nombre, j'opterais plutôt pour une boucle do { … } while() qui répond tout à fait à cette problématique.

]]>
http://www.cmsmadesimple.fr/blog/14/15/Comment-integrer-un-compteur-a-vos-boucles
L'optimisation de la vitesse de chargement du site par le fichier .htaccess http://www.cmsmadesimple.fr/blog/13/15/L-optimisation-de-la-vitesse-de-chargement-du-site-par-le-fichier-htaccess Mon, 17 May 2010 11:46:00 +0200

Article écrit par Kraygoon

Attention, certains fonctions ne seront pas forcément accessible suivant l'hébergeur que vous utilisez. En effet, Apache fonctionne sur le principe de modules qu'on active ou désactive pour multiplier ses capacités.

Pré-requis

Un site Internet dont le contenu est délivré au visiteur par le biais d'Apache. C'est le cas de plus de 90% des sites Internet. Par défaut, à la suite d'une installation de CMS Made Simple vous devriez avoir à la racine de votre site Internet un fichier « .htaccess ». Si tel n'est pas le cas, vous devriez immédiatement en créer un.

Le fichier « .htaccess » optimisé et ses explications

Gestion du cache

Le cache est une fonctionnalité qui permet à votre navigateur de ne pas télécharger deux fois un même fichier afin d'accélérer le chargement des pages. Ainsi si toutes les pages de votre site Internet comportent un logo identique, votre navigateur en passant de page en page ne rechargera pas le logo depuis le serveur.

Dans le fichier « .htaccess » vous devez rajouter les lignes suivantes :

<ifmodule mod_expires.c>
<filesmatch ".(jpg|jpeg|png|gif|js|css|swf|ico)$">
ExpiresActive on
ExpiresDefault "access plus 1 months"
</filesmatch>
</ifmodule>

La première ligne vérifie que le module « mod_expires.c » est activé sur le serveur Apache. C'est le fameux module de gestion du cache. Si tel est le cas alors il va traiter la suite. La seconde ligne permet de définir quels seront les fichiers qui devront être mis en cache. Ici nous avons les images (jpg, jpeg, png et gif), les fichiers Javascript (js), les fichiers Flash (swf) et les icônes (ico). La troisième ligne active le module, sans quoi rien ne fonctionnerait. La quatrième ligne indique au module que le fichier devra tout de même être rechargé un mois après le dernier accès.

Compression des fichiers

Les navigateurs (de moins de 10 ans) gèrent normalement la décompression à la volée de fichiers fournis au format GZip. GZip c'est un mode de compression largement développé sous le système d'exploitation Linux. Nous allons exploiter cette fonctionnalité pour fournir au navigateur des versions compressées des fichiers les plus lourds (hors images).

Dans le fichier « .htaccess » vous devez rajouter les lignes suivantes :

<filesmatch ".(php|html|css|js)$">
SetOutputFilter DEFLATE
</filesmatch>

La première ligne indique quels sont les fichiers qu'Apache devra compresser pour les navigateurs. Dans notre cas, les fichiers « .php » et « .html » mais surtout les fichiers CSS et Javascript. La compression pouvant atteindre les 90%, les temps de chargement n'en seront que meilleurs. La seconde ligne indique au navigateur que les fichiers ayant cette extension devront être décompressés.

Attention, ne vous amusez pas à rajouter les extensions d'images ici car non seulement vous ne gagnerez pas en terme de vitesse (voire même l'effet inverse) et surtout votre serveur aura beaucoup plus de travail.

La redirection des « www »

La dernière petite modification que nous allons faire dans le fichier « .htaccess » c'est permettre à nos visiteurs de saisir une adresse sans « www » dans leur navigateur et d'être redirigé automatiquement sur la version avec « www ». Cette fonctionnalité est particulièrement intéressante pour un bon référencement car seules les adresses avec les « www » seront référencées. On évite ainsi les contenus dupliqués très néfastes pour son positionnement dans les moteurs de recherches.

Dans le fichier « .htaccess » vous devez rajouter les lignes suivantes :

RewriteCond %{HTTP_HOST} ^monsite.fr$
RewriteRule ^(.*) http://www.monsite.fr/$1 [QSA,L,R=301]

La première ligne dit au serveur Apache quelque chose dans ce genre : « Si tu rencontres une adresse qui commence par « monsite.fr » alors tu rediriges vers « http://www.monsite.fr ». Par exemple, si le visiteur tape dans sa barre d'adresse « monsite.fr/dossier/page.html » alors Apache transformera l'adresse saisie en « http://www.monsite.fr/dossier/page.html ».

Les pretty urls ou URL Rewriting

Normalement vous devriez avoir les lignes suivantes dans votre fichier « .htaccess ». Je vais tout de même les commenter.

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)$ index.php?page=$1 [QSA]

La première ligne vérifie si l'adresse saisie dans le navigateur pointe bien sur un fichier (f). La seconde, idem mais pour un dossier (d). La dernière redirige sinon l'adresse saisie vers le fichier index.php de CMS Made Simple pour afficher la page demandée.

Conclusion

Nous n'avons fait ici que survoler toutes les capacités du fichier « .htaccess ». Mais ces quelques petites optimisations vont vous permettre de mieux gérer votre cache, de compresser des fichiers à la volée et d'éviter les contenus dupliqués. Nous aurons probablement l'occasion de voir dans de prochains billets d'autres astuces.

]]>
http://www.cmsmadesimple.fr/blog/13/15/L-optimisation-de-la-vitesse-de-chargement-du-site-par-le-fichier-htaccess
Comment mieux intégrer Google Analytics dans votre site ? http://www.cmsmadesimple.fr/blog/12/15/Comment-mieux-integrer-Google-Analytics-dans-votre-site Mon, 10 May 2010 11:45:00 +0200

 

Récapitulatif des faits.

Google Analytics (nommé GA ci dessous) est un utilitaire de Google qui propose après insertion d'un code javascript dans vos pages de scruter les allées et venues des visiteurs et dresse pour vous un état des lieux des visites de votre site. C'est gratuit, c'est efficace et avec un tel niveau de compétence, Xiti, Piwik et autres logiciels concurrents ont fort à faire.

Au chargement de la page de votre site web, le code Javascript de GA va de lui même charger d'autres informations, rien de choquant à première vue sauf que dans la pratique, le chargement de ces données bloque le chargement de votre page. Et c'est là où le bât blesse.

La première solution est de mettre le code Javascript de GA en bas de votre code, juste au dessus de </body></html> afin de tromper l'utilisateur, il a l'impression que la page est chargée car le navigateur web a affiché le contenu de la page, alors qu'en réalité la page se charge toujours.

C'est donc une méthode un peu douteuse...

Histoire d'enfoncer le clou, Google a fait savoir récemment qu'a contenu équivalent, les sites les plus rapides seraient également les mieux référencés, voilà c'est dit : il nous faut donc absolument modifier tout ça !

Donc quoi qu'on faisons nous donc ?

C'est google qui l'a proposé en catimini : la mise à disposition d'un code JS équivalent mais qui fonctionne cette fois ci en mode asynchrone. Concrètement c'est le même traitement des données qui est réalisée, sauf que cette fois ci le chargement de votre page ne sera pas interrompu par le travail du javascript de GA qui se fait de manière indépendante et sans bloquer votre page.

L'installation de ce code dans Cms Made Simple se fait comme d'habitude :

  • pensez à bien supprimer l'ancien code de votre gabarit
  • créez un contenu global du nom de GAasynchrone

<script type="text/javascript">

var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-XXXXX-X']);
_gaq.push(['_trackPageview']);

(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();

</script>

remplacez UA-XXXXX-X par votre propre identifiant Google Analytics, enregistrez le tout.

Dans votre gabarit juste avant </head> cette fois ci, ajoutez le code d'appel à votre contenu global

{global_content name='GAasynchrone'}

Enregistrez et testez :)

]]>
http://www.cmsmadesimple.fr/blog/12/15/Comment-mieux-integrer-Google-Analytics-dans-votre-site
Comprendre et utiliser process_pagedata http://www.cmsmadesimple.fr/blog/11/15/Comprendre-et-utiliser-process_pagedata Mon, 03 May 2010 11:37:00 +0200 J'ai été étonnée de voir que cette balise pouvait me rendre bien des services en évitant un certain nombre de complications inutiles.

Article réalisé par Corrine d'Inseo

Définition :

D'après la page d'aide, {process_pagedata} permet de spécifier des données spécifiques à chaque page via smarty sans avoir à changer le gabarit de chaque page.

En clair cela signifie que vous pouvez assigner une donnée particulière à chaque page. Cette dernière vous permet alors d'adapter le contenu ou la structure de la page en question tout en conservant un seul et unique gabarit pour l'ensemble du site.

Mise en place :

Dans tous les cas, pour utiliser cette balise, vous devez inclure {process_pagedata} au plus haut de votre gabarit. Sans cela, vos données ne seront pas prises en compte lors de la génération de votre page.

Exemple 1 : Personnalisation du header

Partons du principe que le header de vos page contient une accroche spécifique à chaque page. Ce dernier est constitué de votre logo, du menu, de l'accroche et du fil d'ariane. Il est codé comme suit :

<div id="header">
{cms_selflink page="index" id="logo" text="Ma société"}
{menu template="menu" number_of_levels="1"}
<p id="accroche">Ici mon texte d'accroche</p>
<p id="breadcrumb">{breadcrumbs root="index"}</p>
</div> <!-- fin de header -->

En toute logique, vous aimeriez l'inclure dans votre gabarit. Or ce faisant, vous ne pourriez pas modifier l'accroche en fonction de votre page, à moins de créer un gabarit pour chaque page. C'est là qu'intervient {process_pagedata} en vous permettant de créer vos propres variables personnalisées.

Dans notre exemple, nous allons créer la variable accroche de valeur Texte personnalisé. Ouvrez l'onglet Options de votre page et insérez le code suivant dans le champs Balise smarty spécifique : {assign var="accroche" value="Texte personnalisé"}

Modifiez ensuite votre gabarit en remplaçant votre texte par votre variable comme ceci : <p id="accroche">{$accroche}</p>

Et lancer l'aperçu de votre page.

Vous visualiserez alors Texte personnalisé en lieu et place de Ici mon texte d'accroche.

Renseignez pour chaque page le champs Balise smarty spécifique et vous obtiendrez ainsi une accroche spécifique à chaque page.

Exemple 2 : Personnalisation du header (suite)

Reprenons l'exemple précédent et considérons que certaines pages ne contiennent pas d'accroche. Il suffirait de ne pas renseigner le champs Balise smarty spécifique pour obtenir le résultat escompté. Mais dans ce cas-là, les balises <p id="accroche"></p> seraient toujours présentes dans le code source.

Pour résoudre ce problème, il suffit de ne créer le paragraphe <p id="accroche"></p> que si la variable accroche existe. Pour cela, éditez le gabarit et rajoutez la condition suivante : {if $accroche}<p id="accroche">{$accroche}</p>{/if}

Ainsi, le paragraphe ne sera créé que si la variable est renseignée et qu'une accroche est à afficher.

Exemple 3 : Affichage contextuel

Partons du principe que notre site est divisé en deux colonnes. La première sert à l'affichage du contenu principal tandis que la seconde sert à afficher des articles et des informations relatives au contenu.

Afin de simplifier les choses, {content} ne correspond qu'au contenu de la colonne principal. La colonne secondaire est quant à elle entièrement paramétrée dans le gabarit dont voici le code de départ :

<div id="main"> {content} </div> 
<div id="sub">Ici mon affichage contextuel</div>

Dans le champs Balise smarty spécifique de nos page, nous allons créer une variable categorie de valeur produits ou services.

Les pages présentant les services se verront assigner : {assign var="categorie" value="services"}

Tandis que les pages présentant les produits auront : {assign var="categorie" value="produits"} Modifions maintenant notre gabarit pour qu'il affiche le contenu approprié en fonction de la catégorie à laquelle appartient la page :

<div id="sub">
{if $categorie=="produits"}
ici le contenu correspondant à la catégorie produits
{/if}
{if $categorie =="services"}
ici le contenu correspondant à la catégorie services
{/if}
</div>

Nous pouvons aller plus loin en affichant par exemple une série d'articles thématiques. Pour cela, il suffit de les classer en deux catégories et d'ajouter ces derniers dans notre colonne secondaire :

<div id="sub">
{if $categorie =="produits"}
ici le contenu correspondant à la catégorie produits
et les 3 derniers articles de la catégorie produit
{news pagelimit='3' category='produit'}
{/if}
{if $categorie =="services"}
ici le contenu correspondant à la catégorie services
et les 3 derniers articles de la catégorie service
{news pagelimit='3' category='service'}
{/if}
</div>
]]>
http://www.cmsmadesimple.fr/blog/11/15/Comprendre-et-utiliser-process_pagedata
[Traduction] Boostez à mort votre installation (2/2) http://www.cmsmadesimple.fr/blog/10/15/Traduction-Boostez-a-mort-votre-installation-2-2 Mon, 26 Apr 2010 11:35:00 +0200 Suite des hostilités entamées semaine dernière sur les performances de Cms Made Simple avec cette seconde partie toujours inspirée de l'article en allemand de cyberman

M pour modules

Cms Made Simple est livré avec 10 modules. Ils sont situés dans le répertoire /modules et sont automatiquement utilisés grâce à la procédure d'installation lorsque vous démarrez CMSMS (= chargement de tous les modules en mémoire à chaque visite du site).

Pour cette raison, Les modules non-indispensables devraient être désinstallés (ou mieux encore, même pas mis sur le serveur :)).

Petite aide à la décision :

CMSmailer

Ce module fournit les fonctions de PHPMailer

http://phpmailer.sourceforge.net/

Par exemple, il est utilisé par le module de livre d'or pour envoyer après l'envoi d'un nouveau message une notification à l'administrateur.

Dans le cas où la balise est utilisée, l'envoi d'un mail passe alors par la fonction php : mail(). Le module CMSMailer n'est du coup plus nécessaire et devrait dans ce cas précis être désinstallé voir supprimé du serveur.

attentionNote du traducteur : Je tiens à préciser que depuis la rédaction de ce billet original, la balise est devenue obsolète, bien que toujours présente dans nos nouvelles installations, il est donc préférable de conserver le module CMSmailer ;).

Gestionnaire de modules

Avec ce module, un répertoire central est interrogé (ndt : la forge de Cms Made Simple par défaut), Les modules sous la forme de fichiers XML peuvent être importés et le tout est affiché sous forme de liste de modules. Les modules peuvent également être directement installés et mis à jour via cette interface.

Si sur certaines installations en développement, les mises à jours de modules sont fréquentes et obligatoires, ce n'est pas forcement le cas en production si aucun bug n'est à signaler, de plus les uploads par FTP d'un module est une solution alternative. Dans ce cas on peut supprimer le module.

REMARQUE: L'upload par FTP des modules peut poser problèmes chez certains hébergeurs du fait de droits d'accès qui empêchent Cms Made Simple de "voir" tout dossiers dont il n'en soit pas l'auteur (privilèges manquants).

Enfin ceux qui souhaitent installer leur modules sous la forme de fichier XML (ou ceux qui n'ont pas d'accès FTP par exemple) peuvent également se passer du gestionnaire de module. Ils n'ont simplement qu'a enregistrer le fichier xml sur leur PC, puis le charger sur leur installation via le menu Extensions » Modules » Télécharger le module.

NuSOAP

Ce module offre les fonctionnalités pour les modules SOAP de Cms Made Simple.. SOAP (acronyme de "Simple Object Access Protocol") est un protocole qui permet l'échange de données entre différents systèmes via des appels en webservice (des requêtes sur internet de site à site sans que le navigateur web soit sollicité.)

Source / informations complémentaires: http://fr.wikipedia.org/wiki/SOAP

Cette fonctionnalité est uniquement nécessaire pour le gestionnaire de module. Si vous l'avez déjà désinstallé ou supprimé, vous pouvez retirer NuSOAP également

ThemeManager

Le gestionnaire de thème permet d'importer et d'installer un thème graphique via un fichier Xml. Ce fichier contient toutes les données requises (gabarits, feuilles de style, images, java-scripts). Pour changer, et étant donné qu'en production on change rarement les modèles , le module peut être désinstallé ou supprimé.

M pour MySQL

Même MySQL fournit des méthodes pour compresser la communication avec la base de données et donc accélérer les performances. La compression est également utilisé dans la couche de base de données CMSMS ADOdb Lite.

Pour l'activer : ouvrir le fichier /lib/adodb.functions.php dans un éditeur texte

Trouver :

 $dbinstance =& ADONewConnection($config['dbms'], 'pear:date:extend:transaction'); 

Insérer en dessous

  $dbinstance->clientflags = MYSQL_CLIENT_COMPRESS; 

Enregistrer

S pour serveur (choix du ...)

Si vous avez le choix de décider si votre site devrait fonctionner sous un serveur Apache / Linux ou IIS / Microsoft, la recommandation est tout à fait clair : Apache / Linux. Les images sont plus parlantes que des mots:

http://blogs.zdnet.com/threatchaos/?p=311 (ndt : lien KO)

Bien qu'écrites en anglais, Les images montrent le plus important, à savoir le système nécessaire pour l'utilisation d'Apache et d'IIS. Le modèle "pèle-mêle" d'IIS ne peut pas être plus rapide que Apache :). .

S pour Serveur Optimisé

Outre les optimisations internes mentionnées ci dessus pour Cms Made Simple, on peut également procéder à une optimisation du serveur lui-même, une accélération significative en perspective:

Module Apache : mod_cache

Ce module permet de stocker la sortie du serveur dans une mémoire tampon qui sera de fait disponible immédiatement pour une récupération ultérieure. L'utilisation de ce module peut accélérer le système de 20 à 40%. Pour plus d'infos consulter ici

http://httpd.apache.org/docs/2.0/mod/mod_cache.html

Remerciements à Pierre.

Module Apache : mod_expires

Également, et via les fichiers .htaccess cette fois, certains éléments peuvent être mises en cache tels que des images, CSS et JavaScript. Voici un exemple:

ExpiresActive on
ExpiresByType image/gif "access plus 6 months"
ExpiresByType image/jpeg "access plus 6 months"
ExpiresByType image/png "access plus 6 months"
ExpiresByType text/css "access plus 6 months"
ExpiresByType text/javascript "access plus 6 months"
ExpiresByType text/html "access plus 1 day"
ExpiresByType application/x-javascript "access plus 6 months"

<Files ~ "\.(js|css|gif|jpg|png)$">
Header append Cache-Control "public"
</Files>

Pour plus d'infos consulter ici

http://httpd.apache.org/docs/2.0/mod/mod_expires.html

Le lien qui suit permet de tester quels sont les éléments de votre site qui sont mis en cache et sous quel condition.

http://www.ircache.net/cgi-bin/cacheability.py

Remerciement à faglork.

Et voici un lien vers la compréhension de la mise en cache (Anglais)

http://www.mnot.net/cache_docs

eAccelerator

Pour ceux qui auraient installé leur Cms Made Simple sur un serveur dédié ou sur un VPS, pour ceux qui ont accès à l'administration de leur serveur ou ceux qui connaissent bien l'administrateur de ce dernier, il est interessant de jeter un coup d'œil à cette extension.

http://eaccelerator.net/

Cette extension compile et met en cache tous les scripts PHP afin d'accélérer leur exécution et de soulager le serveur. Aux dires de son auteur, le coefficient d'accélération serait de 1:10 :)

Zend Optimizer

L'équivalent d'eAccelerator en plus conséquent pour ceux et celles qui administrent leur propres serveurs, Attention il n'est pas intégrable à votre serveur Apache.

http://www.zend.com/fr/downloads

S comme Smarty

Smarty, est utilisé par CMSMS comme moteur de gabarit, et apporte toute une série d'extensions et de plugins utiles. Ceux-ci peuvent être retrouvés dans le répertoire /lib/smarty/plugins. S'ils mènent souvent une existence d'ombre, ils sont toutes fois interrogés à chaque fois que vous démarrez CMSMS.

Lorsque vous n'utilisez pas les modules qui exigent des balises spécifiques de cette liste (tels que le module News), il est interessant de retirer ces balises pour gagner en optimisation.

Mais ATTENTION - ici, vous devez savoir exactement ce que vous faites !

T pour tags

les balises sont également touchés par le problème évoqué précédemment dans la section "Module". Lors du démarrage, le répertoire des plugins est entièrement lu. Par conséquent, il convient de laisser ici que les balises requises dans le répertoire. Il est difficile de donner des recommandations spécifiques, puisque chacun d'entre nous a des besoins différents.

Ci dessous je vous donne une liste personnelle des tags que je n'utilise pas ou que très rarement :

  • function.adsense.php
  • function.bulletmenu.php
  • function.cms_version.php
  • function.cms_versionname.php
  • function.edit.php
  • function.embed.php
  • function.google_search.php
  • function.googlepr.php
  • function.html_blob.php
  • function.image.php
  • function.ImageGallery.php
  • function.valid_css.php
  • function.valid_xhtml.php

Balises qui ne sont utilisées que si nécessaire :

  • function.contact_form.php
  • function.created_date.php
  • function.current_date.php
  • function.description.php
  • function.last_modified_by.php
  • function.menutext.php
  • function.modified_date.php
  • function.recently_updated.php
  • function.sitemap.php
  • function.sitename.php

U comme use_sub_dirs

Pour l'optimisation suivante, ouvrez le fichier admin/lib/content.functions.php et trouvez :

//use_sub_dirs doesn't work in safe mode
//if (ini_get("safe_mode") != "1")
// this->use_sub_dirs = true;

qui doit être remplacé par

//use_sub_dirs doesn't work in safe mode
if (ini_get("safe_mode") != "1")
this->use_sub_dirs = true;

Ce réglage doit être testé au cas par cas, car elle ne fonctionne pas sur n'importe quel serveur.

attentionNote du traducteur : plus d'info sur cette manipulation et son intérêt : http://www.lephpfacile.com/manuel-smarty/variable.use.sub.dirs.php)

U pour Übersetzungen (= Traduction)

CMS Made Simple est actuellement disponible en 33 langues qui sont inclus avec l'installation par défaut. Ce serait fondamentalement pas un problème, si ce n'est que les-dites traductions de tous les modules sont complètement chargées à chaque affichage de page web.

Durant l'évolution de Cms Made Simple, la structure des répertoires de langue des modules a été modifiée à plusieurs reprises, de /modules/unModule/lang/fr_FR.php à /modules/unModule//lang/fr_FR/fr_FR.php jusqu'à /modules/unModule/lang/ext/fr_FR.php.

Dans l'administration le principe est similaire. Ainsi dans le répertoire admin/lang/ vous trouverez de langue au format fr_FR.nls.php ainsi que dans le sous-répertoire /admin/lang/ext/de_DE.

Toute personne qui utilise seulement le français, peut donc supprimer toutes les langues sauf le français (et éventuellement l'anglais).

X comme XHTML

CMS Made Simple est par nature un xhtml-CMS. Par conséquent, des précautions doivent être prises avec les gabarits et le contenu que l'on y insère afin que toutes les pages soient XHTML valide.

En toute logique, un code propre et valide apparaîtra plus vite qu'un code défectueux, le navigateur n'ayant besoin que d'afficher, et non de se demander comment faire.

Un examen du code généré devrait toujours avoir lieu parce que les éditeurs WYSIWYG disponibles dans CMS Made Simple ne permettent pas (ou seulement dans certains contextes) de produire du code XHTML valide.

Cela peut se faire en ligne via le lien http://validator.w3.org/ ou hors ligne avec le navigateur Firefox et son extension HTML Tidy

Au final

Au final, votre site doit maintenant être un tout petit peu plus rapide.


]]>
http://www.cmsmadesimple.fr/blog/10/15/Traduction-Boostez-a-mort-votre-installation-2-2
[Traduction] Boostez à mort votre installation (1/2) http://www.cmsmadesimple.fr/blog/9/15/Traduction-Boostez-a-mort-votre-installation-1-2 Mon, 19 Apr 2010 11:32:00 +0200  

Préambule

Premier article sur les deux qui se pencheront sur la modification en profondeur de Cms Made Simple, c'est également le premier article issu d'une traduction d'un travail formidable réalisé par Cyberman que je tiens encore une fois à remercier pour son travail pour la rédaction du billet original en Allemand (et merci aussi à Google Traduction sans qui vous n'étiez pas près à me voir jouer le traducteur Germano-Français .... )

attentionLors de la validation de ce billet des réflexions ont fusées de la part de mes collègues concernant certaines modifications proposées ci dessous, réflexions d'autant plus percutantes qu'elles sont tout à fait fondées : rappelez vous que toute modifications du noyau de Cms Made Simple peuvent entrainer de lourdes conséquences, inutile donc de vous préciser que ce qui suit doit faire l'objet de multiples tests en local avant d'être poussés sur des sites en production.






Chers tous,

Rien de bon ne peut être amélioré. Aussi pour CMSMS il existe un certain nombre d'optimisation pour les performances. Ils sont expliqués plus en détail dans le texte suivant.

REMARQUE: Si un bout d'optimisation se réfère à une ligne particulière dans le code source, méfiez vous : elles ont peut être déjà été changé après une nouvelle version de CMSMS, vérifiez donc toujours avant de vous lancer tête baissée dans une modification à l'aveugle !

C comme config.php

URL Hiérarchisée

Depuis la version 0.13 de Cms Made Simple pouvez afficher l'URL correspondant à la structure hiérarchie des pages, c'est à dire, par exemple,

http://siteweb.fr/menuParent/menuFils/pageDuMenuFils

Bien que cela semble sympa aux premiers abords cela a également des coûts de performance. Pour gagner en rapidité, restez sur la valeur par défaut de Cms Made Simple :

$config['use_hierarchy'] = false;

Connexions persistantes

A propos du fichier config.php,il est possible de définir que CMSMS se connecte à la base de donnée de façon permanente. Ceci est fait en utilisant le paramètre $config[ 'persistent_db_conn']. Par défaut la valeur est à faux.

Les connexions persistantes sont des liens SQL qui ne ferment pas, ainsi lorsque l'exécution d'un script/d'une page se lance, une connexion persistante est demandée, PHP vérifie si une connexion persistante identique n'existe pas déjà (car restée ouverte précédemment). Si elle existe il l'utilisera, sinon et seulement dans ce cas il crée une nouvelle connexion.

Par conséquent, le paramètre suivant peut contribuer à accélérer :

$config['persistent_db_conn'] = true;

Pour plus d'informations: http://www.php-resource.de/manual.php?p=features.persistent-connections

NOTE: Cette valeur n'est pas acceptée par tous les hébergeurs et peut entraîner des problèmes.

"Beautiful" Pretty URLs

La même chose s'applique ici comme dans l'option "structure hiérarchie des pages". Le plus paramètre le plus rapide reste celui par défaut du système :

$config['internal_pretty_urls'] = false;

REMARQUE: Pour voir les changements dans "config.php" soit efficace il faut penser à vider le cache du site web (menu Administration Administration> Paramètres globaux > options avancées > vider le cache).

C comme contentcache.php

Il y a quelque temps le fichier contentcache.php a été introduit dans le répertoire /tmp/cache est créé. Il est sensé sérialiser l'ensemble du contenu des pages Web pour accélérer le tout. Ce n'est pas le cas.

Pour désactiver la création du fichier, ouvrir le fichier class.contentoperations.inc.php depuis le répertoire /lib/classes et à la ligne 497 trouver

$usecache = true;

et remplacer par

$usecache = false;

Source : http://translate.google.com/translate?hl=de&sl=de&tl=fr&u=http%3A%2F%2Fforum.cmsmadesimple.org%2Findex.php%2Ftopic%2C7645.0.html

E pour les Extensions

CMS Made Simple fonctionne avec de nombreux modules (répertoire /modules, voir le menu d'administration 'Extensions > Module') et de nombreuses Balises (répertoire /plugins, voir le menu d'administration 'extensions > balise')

Il y a plein de bonnes raisons pour installer un module pour une tâche spécifique. Mais quand on a le choix, il est préférable de ne conserver QUE les modules utilisés tous les jours pour libérer les ressources systèmes (quitte à réinstaller ponctuellement les autres suivant le besoin)

Un bon exemple est le formulaire de contact : soit on utilise le module FormBuilder soit on utilise la balise {contact_form} mais il est inutile de conserver les deux

attentionNote du traducteur : Je tiens à préciser que depuis la rédaction de ce billet en Allemand, la balise {contact_form} est devenue obsolète, bien que toujours présente dans nos nouvelles installation et donc toujours consommatrice de ressources.

J'aime l'index.php

La compression en sortie

attentionNote du traducteur : Attention : des modifications dans le fichier index.php sont toujours dangereuses. De plus la compression qui est évoquée ci dessous est maintenant gérable directement depuis le fichier config.php en mettant à TRUE la ligne $config['output_compression'] . Pourquoi ne pas en profiter ?

Si votre hébergeur offre la compression zip (ce qui peut se vérifier facilement via la fonction phpinfo() ) alors le changement suivant est à peu près incontournable:

Ouvrez le fichier index.php dans un éditeur, puis allez à la ligne 35, il devrait y avoir quelque chose comme :

@ob_start();

Selon l'hébergeur, il faut mettre :

@ob_start('gzhandler');

@ob_start('ob_gzhandler');

@ob_start('gz_handler');

Essayez simplement...

Qu'est-ce qui s'est exactement passé? Le serveur charge tous les fichiers avec l'algorithme de compression Zip pour compresser et seulement après les envoie au client. Le fichier compressé est alors décompressé par le navigateur du client et enfin affiché à l'écran. En raison de la compression, la taille des fichiers est moindre, d'où une économie de bande passante, un transfert plus rapide et donc un affichage plus rapide sur l'ordinateur.

On peut également rendre l'administration plus rapide en reproduisant la manipulation sur le fichier admin/header.php que l'on ouvrira avec un éditeur pour changer la ligne 5 comme décrit ci-dessus.

ATTENTION: Si le module TinyMCE est utilisé (qui utilisent également la compression zip), cela peut entraîner des problèmes. La compression de TinyMCE doit être dans ce cas désactivée.

attentionNote du traducteur : à noter que maintenant TinyMCE est de toute façon installé par défaut dans les nouvelles version.



Réglage du cache des entêtes HTTP

Dans l'en-tête HTTP de chaque page HTML, on peut déterminer la durée de vie d'une page en cache dans le navigateur du visiteur. Cette valeur peut être ajoutée en entête du fichier index.php.

Dans le fichier index.php, trouver

header("Content-Type: [...]

Ajoutez sur la ligne suivante :

header("Cache-Control: public, max-age=60, s-maxage=60");

Ceci afin que la page soit mise en cache pendant 60 secondes. Ces valeurs peuvent bien entendu être ajustées en fonction des besoins, ce qui rend l'opération très intéressante pour des pages relativement statique.

REMARQUE: Cette modification n'est pas recommandée pour les pages générées dynamiquement (utilisation du module CustomContent)

Si vous ne voulez toujours pas de renoncer à cette possibilité, sachez que l'on peut insérer individuellement ce code dans les pages de Cms Made Simple au cas par cas en utilisant les META-TAG. La balise META ressemblera à ceci:

Couper le moteur de compilation Smarty

A chaque invocation de l'application PHP, Smarty fait un test pour voir si le gabarit courant a été modifié (date de dernière modification différente) depuis sa dernière compilation. S'il a changé, le gabarit est recompilé. Si le gabarit n'a pas encore été compilé, il le sera quelque soit la valeur de ce réglage. Par défaut cette valeur est à TRUE.

Quand une application est mise en production (les gabarit ne changent plus), cette vérification n'est pas nécessaire. Assurez-vous de mettre $compile_check à FALSE pour des performances maximales.

Dans le fichier index.php, trouver

$smarty->compile_check = true;

remplacer par

$smarty->compile_check = false;

Notez que si vous mettez ce paramètre à FALSE et qu'un gabarit est modifié, vous ne verrez *pas* le changement car le gabarit ne sera *pas* recompilé. Si le processus de cache est activé et que $compile_check l'est aussi, alors les fichiers du cache seront regénérés si un gabarit concerné ou un fichier de configuration concerné est modifié.

Source: http://www.smarty.net/manual/fr/variable.compile.check.php

]]>
http://www.cmsmadesimple.fr/blog/9/15/Traduction-Boostez-a-mort-votre-installation-1-2
Installation « manuelle » de PHP 5.3.2 avec Wampserver http://www.cmsmadesimple.fr/blog/8/15/Installation-manuelle-de-PHP-5-3-2-avec-Wampserver Mon, 12 Apr 2010 11:29:00 +0200 But du tuto :Installer sous Windows une version PHP 5.3.2 non disponible dans les Addons PHP

Article écrit par JCE7650

Pré-requis avoir télécharger WAMP et bien sur l'avoir installé

- Quitter Wampserver

Récupérer la version 5.3.2 sur le site php.net
Il faut télécharger le pack VC6 x86 Thread Safe en zip , http://windows.php.net/download/

On supposera que la version actuelle est la version WampServer 2.0i (11/07/09) avec PHP 5.3.0
Sur votre disque dur, dans le dossier où WAMP a été installé,

- Créer un dossier wamp\bin\php\php5.3.2

- Dézipper l'archive (sauf /extra) dans ce dossier wamp\bin\php\php5.3.2
Ensuite,
Depuis le dossier wamp\bin\php\php5.3.0

Copier les fichiers
1 wampserver.conf : de php5.3.0 vers php5.3.2

2 php.ini : de php5.3.0 vers php5.3.2

3 phpForApache.ini : de php5.3.0 vers php5.3.2

4 Remplacer dans php.ini:

extension_dir = "E:/Dev_web/wamp/bin/php/php5.3.0/ext/" par extension_dir = "E:/Dev_web/wamp/bin/php/php5.3.2/ext/"

5 Remplacer dans phpForApache.ini

extension_dir = "E:/Dev_web/wamp/bin/php/php5.3.0/ext/" par extension_dir = "E:/Dev_web/wamp/bin/php/php5.3.2/ext/"

*Lancer Wampserver

Icone Wampserver, PHP, Version, Valider 5.3.2

Éventuellement , valider les extensions souhaitées.

Nota ; ce tuto est basé sur le post Installer PHP 5.3.0 manuellement

]]>
http://www.cmsmadesimple.fr/blog/8/15/Installation-manuelle-de-PHP-5-3-2-avec-Wampserver
Les Hébergeurs et Cms Made Simple http://www.cmsmadesimple.fr/blog/7/15/Les-Hebergeurs-et-Cms-Made-Simple Mon, 05 Apr 2010 11:23:00 +0200 Cet article n'a pas pour but de vous dénicher LA perle ni de dénigrer un hébergeur au profit d'un autre, ce ne sera ici qu'une compilation des retours d'expériences des utilisateurs du forum.

attentionLes retours d'expérience n'engagent que leur auteurs respectifs. L'équipe de rédaction n'expose en aucun cas un point de vue direct et sera ravie de compléter les informations collectées par de futurs retours d'utilisateurs.

OVH

Commençons par l'une des références de l'hébergement français, OVH est réputé pour son sérieux sur nos forums. Il est a noter qu'il y a encore peu de temps pourtant CMS Made Simple souffrait d'une configuration spéciale sur les serveurs de OVH qui provoquait de drôles de problèmes[1]. Le soucis est maintenant réglé depuis fin 2009, aucune personne n'a eu à se plaindre de soucis lié à l'hébergeur depuis.

site : http://www.ovh.com

Free

Un gratuit qui a ses nombreux fans, Free propose des hébergements gratuits. Certaines limites sont cependant liées à cette gratuité et l'installation de Cms Made Simple doit passer par une configuration attentive du serveur[2]. Une fois cette configuration faites, no soucis, ca roulera pour vous. Attention également à des petits soucis de perte de CSS sous les navigateurs les plus récents de façon aléatoire. Une solution existe et est liée à la lenteur toute relative de free. [3][4][5][6]

site : http://pageperso.free.fr/

SU³

L'association qui gère la communauté de Cms Made Simple française met à disposition des propriétaires de petits sites web un hébergement taillé spécialement pour Cms Made Simple. Aucun problème n'est a signalé à l'heure ou j'écris ses lignes alors qu'elle gère une petite dizaine de site sous Cms Made Simple.

site : http://www.su3.fr

Hosteur

Le seul retour de cet hébergeur est un soucis pour un utilisateur à gérer un .htaccess correctement. Nous ne savons pas si l'hébergeur est lié ou non à ce problème.[7]

site : http://www.hosteur.com

Infomaniak

De nombreux soucis liés au fait que l'hébergeur laisse une faible marge sur certains de ses paramètres notamment max_execution_time [8] réglé à 10s au lieu des 30s préconisé pour Cms Made Simple comme pour n'importe quel logiciel en fait. A noter qu'un habitué de Cms Made Simple explique n'avoir aucun soucis à gérer ses nombreux sites chez eux[9] alors que d'autres ont des sérieux problèmes de CHMOD [10]

site : http://www.infomaniak.fr

Amen

RAS concernant sa fonction première : l'hébergement. Par contre Kraygoon précise : Cependant l'IP du serveur d'hébergement est en Italie... Pas très bon pour le référencement d'un site français car Google prend en compte cette "variable" semble-t-il.

site : http://www.amen.fr

1&1

Bon fonctionnement [11](info de 2008). Il est apparemment arrivé des soucis d'erreur 500 chez certaines installation qui se corrigent finalement assez facilement si l'on connait l'astuce. [12]. Dernier point, la commande url_open n'est pas activée par défaut [13], elle reste néanmoins modifiable.

site : http://www.1and1.fr

LWS

un seul retour utilisateur et mauvais. [14] (info de 2008)

site : http://www.lws.fr/

Les cigales

Apparemment ce service gratuit fonctionne plutôt bien. [15] (info de 2008)

site : http://www.lescigales.org/

Web Hebergeur

Problème de lenteur signalés [16]

site : http://web-hebergeurs.pro

Planet-Work

Après discussion avec un membre habitué à Cms Made Simple (Kraygoon pour ne pas le nommer), Planet-Work serait également à classer dans la liste des bons hébergeurs. Je cite : Je travaille avec Planet-Work chez qui je n'ai pas d'action mais qui a l'énorme avantage d'être très réactif au téléphone ou par mail et chez qui tout tourne à merveille. L'interface d'administration des sites est beaucoup plus claire que chez OVH.

site : http://www.planet-work.fr


edit 20 avril : Merci à Philipppe et Tomek pour leur retours dans les commentaires sur des hébergeurs que nous n'avions pas encore évoqué (car aucun retour)

Gandi

Très connu des webmasters, Gandi à une solide réputation dans tous ses domaines. Les avantages d'un hébergement chez eux est, je cite : une solution globale depuis l'acquisition du domaine jusqu'au "serveur de backup" +pour les débutants et/ou non initiés aux arcanes de la gestion d'un serveur en ligne de commande ..., une solution qui permet un auto-apprentissage progressif, avec une bonne documentation en ligne, et une assistance via mail efficace.. Attention toutes fois : constat de lenteurs par moments, mais peut-être dû davantage à un serveur dédié pas bien dimensionné.

site : http://www.gandi.net

Phpnet

En résumé : ca tourne :)

site : http://www.phpnet.org/

__edit 26 avril : Merci à Mika pour son retour dans les commentaires sur Nexen Service

Nexen Services

Très bon hébergeur : vserver facilement configurable, niveau performance la génération des pages se fait au minimum 2x plus rapide qu'en local et le support est au top. Par contre attention le tarif !

site : http://www.nexenservices.com/

__edit 17 janvier : compilation de nouveaux témoignages

Celeonet par ZZTop

Je confirme ce qui se dit sur les forums : Celeonet en mutualisé, c'est pas top :
- lenteurs (même en optimisant le site),
- soucis d'envoi des e-mails avec FormBuilder (mais CMS Mailer fonctionne bien depuis l'admin)

Alwaysdata par jeebeezebee

Je suis chez alwaysdata.com depuis 1 an, vraiment sans problème : , pas cher, support hyper réactif y compris sur l'offre gratuite.
Je les mets au même niveau que phpnet pour l'uptime.

OPHOS par Square


Je suis chez OPHOS et je suis plutôt satisfait. Ils proposent des solutions d'hébergeent mutualisés accessibles.

La navigation est rapide, le service client est disponible et compétent, mais je n'ai pas eu beaucoup besoin de leurs services. L'interface de gestion est bien (sauvegardes, accès fichier, accès BDD...)

Un seul soucis : de temps en temps, des petit soucis de connexion de mon CMSMS à la base de données, mais ça ne dure pas plus de 5sec et ça n'arrive pas tous les jours.

sivit.org par Jissey

J'ai une install chez sivit.org, un hébergeur de Lyon. Il propose une offre de virtuel-dédié (vds) très efficace. La puissance et la vitesse sont au rendez-vous. Le coût est plus élevé que chez les grands comptes que nous connaissons, mais il est justifié de part la performance et le service réactif. L'éventail des offres n'est pas très grand mais couvre beaucoup cas si vous n'avez pas besoin de 250G!

Netensia par Kler

La plupart de mes install sont chez Netensia, un hébergeur vannetais. Serveurs virtuels ultra performants, et un SAV au top (et ça c'est bien !). En plus je peux gérer l'intégralité de mon paramétrage serveur : accès au Safe_mode, choix des scripts pris en charge, gestion des espaces de stockage et de traffic... Bref je suis on ne plus satisfait de leurs prestations et le rapport qualité prix est très concurrentiel.

 

Bilan

Voici donc une petite liste qui permettra aux nouveaux arrivants d'avoir une idée des acteurs sur le marché de l'hébergement de site web. Cette liste et ces avis ne sont clairement pas figés, si vous même êtes confrontés à des soucis récurants chez un hébergeur avec Cms Made Simple ou que si au contraire vous connaissez un hébergeur que vous jugez fiable, n'hésitez pas à nous prévenir afin de mettre la liste à jour :)

]]>
http://www.cmsmadesimple.fr/blog/7/15/Les-Hebergeurs-et-Cms-Made-Simple
La gestion des feuilles de styles (CSS) avec les variables Smarty http://www.cmsmadesimple.fr/blog/6/15/La-gestion-des-feuilles-de-styles-CSS-avec-les-variables-Smarty Mon, 29 Mar 2010 11:16:00 +0200

A noter que depuis la parution de cet article, CmsMadeSimple intègre son propre plugin : cms_stylesheet. Il est donc inutile d'installer le plugin smarty indiqué. Le reste de l'article reste d'actualité tant que vous utilisez cms_stylesheet  et non smarty_stylesheet  :)

En CSS et sous CMS Made Simple, jusqu'à présent nous n'avions par la possibilité d'utiliser de variables. Pourtant l'utilité n'est pas des moindres quand on sait qu'on utilise x fois le même code couleur, ou y fois la même URL pour accéder aux images...

Le plugin Smarty Stylesheet est la pour répondre à cette problématique... et plus encore.

Pré-requis

Pour suivre pas-à-pas ce tutoriel vous devez avant tout télécharger le plugin Smarty Stylesheet sur le Forge de CMSMS (http://dev.cmsmadesimple.org/projects/smartstylesheet).

Au moment de la rédaction de cet article, le plugin est en version 0.6. Bien qu'étant encore en phase de développement et n'ayant pas atteint le cas de la version 1.0, ce plugin est parfaitement fonctionnel.

Vous devez également avoir des notions de CSS et de Smarty.

Le plugin Smarty Stylesheet

Présentation

Ce plugin vous offre trois fonctionnalités qui le rendent indispensables (à mes yeux) :

  • La possibilité d'utiliser des variables Smarty au sein de la feuille de style,
  • La génération d'un nom de fichier CSS unique à chaque modification (donc mise en cache de la dernière version du fichier uniquement),
  • La création d'un fichier CSS en dur permettant des optimisations (voir Conclusion).

Mise en place

Dès que vous avez téléchargé le plugin Smarty Stylesheet, vous devez transférer le fichier function.smarty_stylesheet.php dans le répertoire /plugins/ dans votre installation de CMS Made Simple.

La seconde étape est de remplacer dans votre (ou vos) gabarit(s) la méthode d'appel des feuilles de style. Par défaut, CMS Made Simple fait appel à la balise {stylesheet}, nous allons donc la remplacer par la balise {smarty_stylesheet} comme dans l'exemple ci-dessous :

{process_pagedata}
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
<head>
<title>{$pagetitle} - {sitename}</title>
{metadata}
{smarty_stylesheet}
</head>
<body>

Tests

Afin de tester le bon fonctionnement du plugin, vous devez vous rendre sur la page d'accueil de votre site, la recharger et voir si l'affichage est correct. Si vous regardez le code source de votre page, vous devriez obtenir des lignes de code de ce type :

<link rel="stylesheet" type="text/css" href="http://www.domaine.tld/tmp/cache/Feuille_1_02_22_10_17_45_27.css" media="screen"/>
<link rel="stylesheet" type="text/css" href="http://www.domaine.tld/tmp/cache/Feuille_2_03_05_10_08_54_42.css" media="screen"/>

Comme vous pouvez le voir, la feuille de style est datée de votre dernière modification dessus ce qui ne vous oblige pas à vider votre cache pour voir chaque modification. Cela permet aussi aux visiteurs du site d'avoir toujours la dernière feuille de style en cache.

Exemples d'utilisation

Nous allons voir ci-dessous comment utiliser les variables Smarty au sein de la feuille de style. Il faut avant tout déclarer la variable en début de fichier CSS :

[[assign var="nom_de_la_variable" value="valeur_de_la_variable"]]

pour ensuite utiliser la variable dans le CSS en faisant appel de cette façon :

[[$url]]

Comme vous pouvez le voir nous ne déclarons par les variables Smarty de façon classique avec les accolades mais avec des double-crochets. En effet, les accolades sont utilisées dans le code CSS pour définir des styles associés à un élément.

Gestion des couleurs

Il arrive souvent que nous ayons à employer sur différents éléments (id ou class) des couleurs identiques. Avant nous recopions systématiquement les codes couleurs du type #d40000 partout sur notre feuille. Si nous avions à changer cette couleur plus tard dans le développement du site, nous devions rechercher les occurrences et les remplacer.

Maintenant, nous allons déclarer un variable en haut de notre feuille de style :

[[assign var="rouge" value="#d40000"]]
[[assign var="bleu" value="#00004f"]]

et l'utiliser un peu partout sur notre feuille :

#bloc {
font-size : 16px ;
color : [[$rouge]] ;
}

#bloc2 {
width : 100px ;
height : 50px ;
background : [[$bleu]] ;
}

Voilà, si vous aviez à changer le rouge ou le bleu, vous n'auriez qu'à changer le code couleur dans la déclaration de la variable.

Gestion des URLs

Sur le même principe, nous pouvons définir des URLs à employer plusieurs fois. Si ces URLs sont en format absolu, il suffit de les déclarer tel que :

[[assign var="site1" value="http://www.unsite.com"]]

Par contre, si les URLs sont au format relatif, nous devons tenir compte de l'emplacement du fichier CSS généré par le plugin. Dans notre cas, le plugin créé le fichier dans le dossier /tmp/cache/ (valeur par défaut sur CMS Made Simple).

Donc pour accéder à l'emplacement /uploads/images/ nous devrions déclarer la variable :

[[assign var="url_images" value="../../uploads/images/"]]

et l'utiliser de telle manière :

#bloc2 {
width : 100px ;
height : 50px ;
background : url([[$url_images]]mon_image.jpg) no-repeat ;
}

Conclusion

Voilà, à présent vous allez pouvoir améliorer votre expérience des feuilles de style sous CMS Made Simple grâce à ce petit plugin Smarty Stylesheet.

Comme nous l'avons vu dans la présentation du plugin, Smarty Stylesheet génère automatiquement dans le répertoire cache(/tmp/cache/) des fichiers CSS en dur. Cet fonctionnalité nous permettra de mettre en place des optimisations permettant de compresser à la volée le fichier CSS pour gagner en temps de chargement. Cela fera partie d'un prochain article.

]]>
http://www.cmsmadesimple.fr/blog/6/15/La-gestion-des-feuilles-de-styles-CSS-avec-les-variables-Smarty
Installation de Postgresql avec WAMP http://www.cmsmadesimple.fr/blog/5/15/Installation-de-Postgresql-avec-WAMP Mon, 15 Mar 2010 11:14:00 +0100 But du tuto : Installer PostgreSql sous Windows pour une plate-forme de développement Web local Pré-requis avoir télécharger WAMP et bien sur l'avoir installé Nota les noms des dossiers sont donnés à titre d'exemple

Article écrit par JCE7650


- Installation PostgreSQL :

"Vous pouvez trouver deux types d'installeurs pour Windows : l'installateur "en un clic", ou l'installeur "pgInstaller". Le premier est créé par EnterpriseDB, le seconde par la communauté." Pour information un Guide de démarrage rapide avec PostgreSQL

- Installer en suivant les instructions l'installation se fera dans - E:\Dev_web\postgresql pour le programme et - E:\Dev_web\postgresql\data pour les bases de données

Choisissez un login (postgres par exemple) et un mot de passe (postgresql par exemple) permettant d’accéder à la future base de données. Terminer l'installation. Lancer le programme pgAdmin III depuis le menu démarrer. Vous pourrez vous y connecter grâce au mot de passe préalablement choisi. Et éventuellement créer une base de donnée de test.

- Installation phpPgAdmin :

Récupérer le fichier d’installation sur le site phpPgAdmin au format compressé

il faut extraire l'archive téléchargée dans E:\Dev_web\wamp\apps\phppgadmin, à côté du répertoire phpmyadmin.

Pour configurer phppgadmin, éditer le fichier E:\Dev_web\wamp\apps\phppgadmin\conf\config.inc.php Les lignes à modifier :

// $conf['servers'][0]['desc'] = 'PostgreSQL';
$conf['servers'][0]['desc'] = 'PostgreSQL_local'; //+

// $conf['servers'][0]['host'] = '';
$conf['servers'][0]['host'] = '127.0.0.1';//+

// $conf['servers'][0]['pg_dump_path'] = '/usr/bin/pg_dump';
// $conf['servers'][0]['pg_dumpall_path'] = '/usr/bin/pg_dumpall';
$conf['servers'][0]['pg_dump_path'] = 'E:\\Dev_web\\postgresql\\bin\\pg_dump.exe'; //+
$conf['servers'][0]['pg_dumpall_path'] = 'E:\\Dev_web\\postgresql\\bin\\pg_dumpall.ex'; //+

// $conf['servers'][0]['slony_sql'] = '/usr/share/pgsql';
$conf['servers'][0]['slony_sql'] = 'E:\\Dev_web\\postgresql\\share'; //+


// $conf ['extra_login_security'] = true;
$conf ['extra_login_security'] = false; // par défaut à true,
// Sinon pas de connexion avec le compte postgres, et message "Connexion désactivée pour raison de sécurité"

- PHP : (configuration du chemin)

Pour modifier la variable d'environnement PATH : - Clic-droit sur Poste de Travail, Propriétés, Avancé, Variables d'environnement, Variables système, Valider Path, - Modifier et ajouter à la fin de la ligne existante : ;E:\Dev_web\wamp\bin\php\php5.2.11 (Nota ne pas omettre le ";" qui est le séparateur + Indiquer la version de PHP en service !!)

-Apache : (configuration de l'alias)

Lancer WAMP La configuration de l'alias se fera comme suit , via un click gauche sur l'icône de WampServer : Apache > Répertoire Alias > Créer un alias Dans l'invite de commande proposé, entrer /phppgadmin/ puis taper "entrée", ensuite dans l'invite de commande suivante entrer le répertoire d'installation de phpPgAdmin E:\Dev_web\wamp\apps\phppgadmin puis taper "entrée". votre fichier httpd.conf est à présent configuré.

- Module PHP :

Il ne reste plus qu'à configure PHP pour qu'il tienne compte de Postgresql. Ceci via un click gauche sur l'icône de WampServer : PHP >Extensions PHP > php_pgsql

Redémarrer WAMP et s'assurer que PostgreSQL est démarré enfin tester http://localhost/phppgadmin/.

]]>
http://www.cmsmadesimple.fr/blog/5/15/Installation-de-Postgresql-avec-WAMP
Les outils du webmaster : Firebug http://www.cmsmadesimple.fr/blog/4/15/Les-outils-du-webmaster-Firebug Mon, 15 Mar 2010 11:08:00 +0100 me re-pomper honteusement vous restituer le tutorial de Firebug.

Ce logiciel (ou devrais-je dire cet addon) est une extension que l'on ajoute à Firefox. Une fois installé il facilite la vie du développeur en lui indiquant de possibles problèmes de temps de chargement. Il permet également la modification du CSS d'un site distant ou local afin de faire des "bidouille" avec son CSS et trouver rapidement la solution à ses problèmes.[1]

Ce module ne vous apprendra pas le CSS, il fait l'auto-complexion des propriétés CSS 2.1.

L'installation.

Firebug (c'est son nom) est disponible en téléchargement via Firefox et uniquement pour Firefox : lien et sous forme de compilation d'extension pour développeur web : lien

Un équivalent existe pour Internet Explorer 8 : lien [2]

Son installation étant basique je ne vais pas m'étendre dessus et passerais direct sur ses deux fonctionnalités phares.

Le réseau.

Une fois installé une icône apparait en bas à droite de votre Firefox :. Cliquez dessus pour ouvrir le panneau Firebug

943948800.jpeg

Cliquez sur Réseau et activez le panneau réseau comme montré ci dessous :

87786740lz0.png

recharger la page, un joli graphique s'offre à vous, voilà vous obtenez la courbe de chargement de votre site web. A vous d'en tirer les conclusions.

Justement les conclusions de ce graphique, elles ne sont pas toujours évidentes mais peuvent donner certaines pistes :

33385254bv1.png

légende : -colonne 1 l'élément de votre site que Firefox a chargé, pièce par pièce -colonne 2 : le code HTTP retourné par le serveur, retenez simplement que 200 = ok, 304 = aucune modification depuis ta dernière visite, reprend l'image de la dernière fois, 404 = pas trouvé !, 500 = erreur interne inattendue. -colonne 3 : le nom du site -colonne 4 : le poids de l'élément -colonne 5 : les temps des téléchargements en millisecondes suivant un diagramme de Gantt

fin de la colonne 5 en gris foncé, le temps qu'a mit Firefox pour compiler tout ce qu'il a reçu et l'afficher sous la forme que vous aurez au final.

Ainsi un tel graphisme me permet de voir que apparemment tous va bien, aucune ligne ne dépasse la seconde de chargement, donc je n'ai aucune image trop lourde et je n'ai aucune erreur 404, je n'ai donc aucun fichier absent.

Que faire si j'ai une erreur 404 en colonne 2 ?

regarder si le fichier est bien placé dans vos répertoires et vérifier également si vous avez écrit fichier.JPG ou fichier.jpg, les majuscules c'est tuant...

Que faire si j'ai un temps de chargement d'une image trop longue ?

réduisez sa taille ? sa qualité ? revoyez la manière dont elle est chargé par le site (découpez la judicieusement).

Que faire si j'ai un fichier (image compris) qui n'est pas lourd mais prend un temps monstre à charger ?

hormis pour les fichiers PHP vous pouvez vous poser la question de savoir si ce n'est pas votre hébergeur qui vous débloque trop lentement le contenu de votre site ? (ou si votre ligne internet tire la gueule) Testez sur un autre hébergeur gratuit ou non, testez d'une autre connexion internet ( = différent bâtiment, = différent fournisseur d'accès). Pour les fichier PHP on peut se demander si le programme travail pas trop. avez vous 3000 pages dans CMSMS ? quel est le contenu de votre site en terme de volume ? qu'avez vous modifier ? quelle est votre configuration ? Répondez à toutes ces questions et ouvrez une discussion sur ce forum :)

Le CSS.

Le module Firebug comporte également une partie de gestion du CSS à la volée.

Attention : toutes les modifications faites dans Firebug restent dans Firebug ! ce qui a pour avantage de ne pas risquer de foutre en l'air votre site. ça a le désavantage de tout perdre niveau modification faite en live si il vous prend l'envie de recharger la page en oubliant de copier les modifications apportée

Ce n'est pas par ce que Firebug vous permet de modifier le CSS qu'il va vous donner des cours en même temps. Ce n'est pas son job et il ne sait pas le faire. Si vous ne connaissez pas/mal/pas suffisamment le CSS je ne peux que vous motiver à vous former préalablement sur le sujet [3]

Firebug dans son onglet Principal possède deux fenêtres. A gauche vous avez le code généré par le site web, à droite vous retrouvez le CSS de l' élément de gauche sélectionné (dans l'exemple la balise <body>)

testao7.png

De là 3 possibilités pour atteindre le point qui vous intéresse :

Vous retrouvez déjà dans la partie de droite l'élément qui vous intéresse, vous avez alors la possibilité de modifier ses attributs par un simple clic sur la valeur en bleu, vous pouvez également désactiver l'attribut par un clic gauche à gauche du libellé vert, vous pouvez ajouter un nouvel attribut par un double clic gauche sur la droite d'un des points-virgules, Enfin plein d'autre opération sont réalisable via le clic droit de votre souris. Dans tous les cas les modifications sont immédiates sur la page ! A noter que les styles CSS se superposant les uns les autres vous pouvez retrouver les autres codes CSS associés à l'élément sélectionné dans la partie de gauche.

Vous savez ou se trouve la balise qui vous embête ? alors parcourez le code sur la partie de gauche jusqu'à atteindre le nœud qui vous intéresse, retour alors dans la situation précédente.

Vous souhaitez récupérer directement dans le site l'élément qui vous intéresse, c'est possible en cliquant sur "INSPECTER" puis en cliquant sur l'un des élément de la page web, Firebug vous positionne alors sur le code HTML de l'élément sélectionné + affiche le code CSS associé à l'élément sélectionné, retour alors dans la situation 1.

N'oubliez jamais que le code modifié n'est pas répercuté sur le site. Pensez donc à sauvegarder régulièrement le code CSS ajouté/modifié vers les fichiers .css de votre site lorsque vous avez atteint une qualité de rendu acceptable :)

Bilan

Voilà pour les explications rapides qui vous permettront j'espère de gagner un temps précieux dans votre débugage de vos soucis. Ce n'est évidement pas une bible pour Firebug, je suis certain que des tuto bien plus précis existent ;) mais maintenant vous avez l'outil alors foncez !

Notes

[1] Firebug possède d'autres capacités que je n'aborderais pas ici notamment le debug de Javascript

[2] Le site d'Elegent-Code nous fait un élégant comparatif entre les équivalent de Firebug pour IE8, Chrome, Safari et les autres

[3] http://www.google.fr/search?q=tuto+CSS : 'les sites ne manquent pas ;)'

]]>
http://www.cmsmadesimple.fr/blog/4/15/Les-outils-du-webmaster-Firebug