Вы находитесь на странице: 1из 68

CMS et groupes de musique

Travail présenté en vue de l’obtention du titre de bachelier en techniques graphiques,


finalité techniques infographiques • Haute École de La Province de Liège Rennequin Sualem
Delnatte Pierre-Antoine • 2006-2007
« Enfin, vous vouliez faire quoi ?
– Un pont à partir d’une gamme de mi pentatonique qui utilise la septième
majeure comme note de passage », répondit le doyen.
L’archichancelier examina la page ouverte.
« Mais je lis ici Première leçon : Au clair de la lune, dit-il.
– Hum, hum, hum, j’étais un peu impatient, confessa le doyen.
– Vous avez jamais été doué en musique, doyen. C’est un de vos bons côtés. »
Accros du roc, Terry Pratchett

CMS et groupes de musique

Travail présenté en vue de l’obtention du titre de bachelier en techniques graphiques,


finalité techniques infographiques • Haute École de La Province de Liège Rennequin Sualem
Delnatte Pierre-Antoine • 2006-2007
Introduction 1

1. Les sites de groupe 3


MySpace et cie 4
Un site web vraiment personnel, c’est mieux... 4

2. fish in a pan : l’idée et les objectifs 6


Enquête préliminaire 6
Les personnes sondées 7
Les personnes sondées et les sites de groupe. 8
Les attentes des personnes sondées envers un site de groupe. 8
Un projet sans nom 9
Un nom, des objectifs 9

3. Concevons un poisson : le développement de fish in a pan 10


3.1 Les ingrédients 10
Le public visé 10
Les technologies requises par le système 10
Les outils 11
Les objectifs à atteindre 12
3.2 La recette 12
3.3 Mi-temps 12
3.4 Le retour du poisson surgelé 13

4. Anatomie d’un poisson 15


4.1 Les modèles 15
Petit rappel rapide sur les objets 15
4.1.1 L’objet Element 16
L’objet User 16
4.1.2 L’objet Config 17
4.1.3 L’objet Multiple 17
4.1.4 L’objet Uploaded 18
L’objet Image 18
4.1.5 Les autres objets 19
4.2 Les contrôleurs 19
4.3 Les vues 19
4.4 Structure globale 20

5. La tête dans le poisson 21


5.1 Le script d’installation 21
5.2 La zone d’administration 22
5.2.1 Répartition des modules dans la zone d’administration 22
5.2.2 Le module de connexion 22
5.2.3 Le tableau de bord 23
5.2.3.1 Chat privé et notifications 23
5.2.4 Le groupe 24
5.2.4.1 Les membres 24
5.2.4.2 Les intervenants 25
5.2.4.3 La biographie 26
5.2.4.4 La discographie 26
5.2.4.5 Les textes des morceaux 27
5.2.5 Média 27
5.2.5.1 Les galeries de photos 28
5.2.5.2 Les médias audios 29
5.2.5.3 Les médias vidéos 29
5.2.6 Le site 30
5.2.6.1 Les news 30
5.2.6.2 L’agenda 31
5.2.6.3 Le blog 31
5.2.6.4 Le livre d’or 32
5.2.6.5 Le formulaire de contact 33
5.2.6.6 Les liens 33
5.2.7 Configuration 33
5.2.7.1 Les préférences utilisateurs 33
5.2.7.2 Paramètres des modules 34
5.2.7.3 Les paramètres du système 34
5.2.7.4 Système antispam 34
5.2.7.5 Utilitaire de base de données 35
5.3 La zone publique 36
5.3.1 Les thèmes 36
5.3.2 Les flux RSS 36
5.4 Les modules abandonnés 36
5.5 Captures d’écrans 37

6. Un poisson dans la mer 38


6.1 Le site de fish in a pan 38
6.2 La sortie publique 38
6.3 Le prix de fish in a pan 38
6.4 L’équipe fish in a pan 39
6.5 La communauté 39

Conclusion 40

Bibliographie & références

Annexes

Abstract
nternet est une invention formida- Après un petit état des lieux des sites
ble. de groupe sur le net, je vous explique-
Et quand Internet est entré dans ma vie, rai pourquoi avoir choisi ce sujet en
à l’époque où il fallait presque penser à particulier.
pédaler pour que les pages s’affichent Je développerai ensuite l’idée en tant
plus vite, il ne payait pas de mine. que telle et les techniques employées
Et pourtant, Internet a révolutionné pour arriver à mes fins.
bien des choses, à commencer par le Je vous emmènerai enfin, plonger la
fait que j’ai pu trouver une orientation tête la première dans une visite guidée
de vie qui me tentait : créer des sites du système.
web. Ma passion pour l’infographie est J’essaierai autant que possible de ne
venue par la suite. pas faire l’impasse sur l’essentiel, sans
Après quelques années d’expériences, pour autant vous perdre dans des ex-
seul, puis en cours à l’INPRES, nous en plications à rallonge.
arrivons à ce PFE, qui réunit mes deux
passions : la musique et le web.
Mon PFE parle donc de musique et de
sites web, et plus particulièrement du
développement de mon projet : conce-
voir un moteur de sites internet sim-
ple, mais complet, pour permettre à
des groupes de musique de créer sans
peine leur site.
Avant de nous lancer dans le vif du
sujet, j’aimerais profiter des dernières
lignes de cette introduction pour quel-
ques remerciements :

<mode=”ecole des fans”>


Je voudrais tout d’abord remercier mon papa et ma maman (qui sont au fond
de la salle avec le caméscope), pour leur incommensurable patience (et il en
faut).
Ensuite, un grand merci à mes professeurs, et en particulier à Pierre Worontzoff
qui m’a appris à être clair et propre dans mes codes et à Dominique Vilain pour
aller chercher la p’tite bête là où je croyais à chaque fois bien l’avoir cachée...
Je m’en voudrais (et lui aussi) d’oublier Xavier Spirlet, qui, avant d’être mon
maître de stage, m’a toujours soutenu (à moi l’oscar !) tout au long de ses trois
années de cours.
Je ne peux, non plus, oublier l’équipe entière de VAlain S.A. de Wiltz au
Luxembourg, qui ont bien voulu me recueillir pour un bout de stage de trois
semaines, extrêmement enrichissant pour moi, autant pour l’aspect humain que
technique.
Un grand merci à Oli, k et Ben, avec qui j’ai fondé Meguiddo, ce par quoi tout a
commencé... (ou au moins fish in a pan) Merci les gars.
Un super merci à mon p’tit frère, pour tout ce qu’il fait, pour les critiques et les
longues conversations animées lors des balades du soir, débattant des heures
sur un bout de code ou une icône que chacun voulait voir ailleurs que là où
l’autre l’avait mis.
Et enfin, last but not least (et si je l’oublie elle me frappe), un immense merci
à ma “mademoiselle à moi”, qui a passé ces deux derniers mois à me voir plus
souvent derrière mon écran que devant elle, ce qui est bien dommage puisqu’elle
est bien plus jolie que ma machine (qui, pourtant, est un mac !)...
Et coucou à tout ceux que j’oublie.
</mode>

Bon. Et si on commençait ?
nternet, comme je le disais dans buté grâce à la diffusion sur un quel-
l’introduction, est un outil formidable. conque réseau peer-to-peer de leur
Je ne suis bien sûr pas le seul à avoir re- maquette ; de grands groupes orches-
marqué que dès qu’une invention peut trant même discrètement ce genre de
rapporter de l’argent, elle est bien vite “fuite” pour faire un coup de pub sur Science du buzz web
utilisée à des fins commerciales, même leur prochain album. Le groupe Nine Inch
si son but premier ne l’était pas. Il est un fait que le web est un outil de Nails (www.nin.com), a
Et donc, Internet a été le synonyme communication (et donc de pub) sans volontairement “perdu” une
d’un bond en avant pour bien des sec- frontière, où des stars se font et se dé- clé USB contenant une copie
teurs, dont le cinéma, le piratage...et font chaque jour. du clip de leur futur single
la musique. Mais si les grands groupes peuvent lors d’un concert en mars
facilement se payer des sites internet 2007.
Progressivement, tous les groupes
“connus” de la planète ont compris (ou conçus par de grandes boites renom- Ce sont eux aussi qui
plutôt leurs agents de communication) mées avec des animations flash hautes permettent à leurs fans de
qu’il leur fallait être présents sur Inter- en couleurs et des campagnes marke- télécharger les sources de
net. ting Internet impressionantes, pour leurs morceaux au format
les petits groupes, la réalité est toute GarageBand afin qu’ils créent
Le web progressant à grand pas, de autre. leurs propres remixes.
newsgroup en forums et de chat en
youtube et consors, les petits groupes Intéressons-nous donc aux possibili-
s’y sont mis eux aussi. tés offertes aux petits groupes, qui,
conscients des potentiels d’Internet, se
Sur Internet, on peut se faire beaucoup décident à essayer de s’y montrer en
de pub, et surtout pour pas cher. se créant un site.
Bien des groupes en ont profité, racon-
tant à qui veut l’entendre qu’ils ont dé-
MySpace et cie des défauts, des sites communautaires
pour les groupes.
le tout-fait pseudo-communautaire

Depuis quelques mois, dans le monde


Un site web vraiment
musical, c’est le mot à la mode.
personnel, c’est mieux...
MySpace
MySpace est un site communautaire, mais pas plus facile. http://www.myspace.com
où chaque membre peut se créer une
sorte de blog, avec comme particularité Bien sûr, la seconde solution, c’est
la possibilité de mettre en ligne un d’avoir un site web dédié à son groupe,
jukebox avec ses morceaux (ou ceux qui ne parle que de lui et qui collera au
des autres, ce qui n’est pas sans faire mieux à son identité.
réagir les Majors du disque). Le premier problème rencontré, outre
Les avantages de MySpace sont nom- l’aspect technique que nous aborderons
breux : robuste, relativement fiable, très vite, c’est que le web est grand.
extrêmement fréquenté (plus de 90 Il faut se faire une raison : le nombre
millions d’utilisateurs inscrits à la date de visiteurs qu’un groupe amènera de
de juillet 2006 selon l’article Wikipé- nulle part sur son site sera, au début, MySpace sur wikipédia
dia). La plupart des groupes, grands relativement nul. Comme pour tout,
http://fr.wikipedia.org/
comme petits, s’y sont mis. l’idée est de faire son nid, petit à petit,
wiki/Myspace
sur Internet, en se servant des forums,
Mais MySpace n’est pas exempt de dé-
chats, mailing-list et de tous les outils
fauts : il est laid. Bien sûr, c’est subjec-
possibles et imaginables sur le net (et
tif. Son organisation ne permet pas de
en dehors) pour faire la pub licité du
le rendre assez beau pour que chaque
groupe.
groupe puisse y inscrire son identité
propre. Donc, 90% des MySpace sont Internet ne peut qu’aider un groupe à
sur fond noir, avec un petit logo et une se faire connaître, ce n’est que rare-
photo, un jukebox à droite et un liste ment une fin en soit.
d’amis juste en-dessous. Pour sortir du Le deuxième problème soulevé par la
lot, ce n’est pas facile, facile. D’ailleurs, création d’un site web pour un groupe,
la fréquentation de MySpace n’est pas c’est la création en elle-même. On dé-
non plus qu’un avantage : pour se faire gage ici deux tendances :
entendre, il faut vraiment avoir de la
• C’est un peu cher, mais tant pis,
chance, tant le nombre de groupes uti-
on paie : pour un petit groupe dé-
lisant MySpace est énorme.
butant (et même plus), la solution de
MySpace n’est pas le seul site com- payer une société pour se faire créer
munautaire à proposer ce genre de un premier site web est de loin la
services, mais il est de loin le plus re- moins utilisée, car la plus onéreuse.
présentatifs des qualités, et surtout Il ne faut pas oublier une chose : la
musique des débutants est rarement site de mon groupe, et permettait à
rentable dès le début. mes collègues musiciens d’éditer les
• “J’ai un ami qui connait un type news, l’agenda et de modérer le livre
qui pourrait...” est la solution la d’or de notre site.
plus utilisée par la plupart des petits Progressivement, les fonctions se sont
groupes : le bon vieux “Do it yourself”. améliorées, et la possibilité de faire de
Ici, c’est au petit bonheur la chance : cette idée un vrai projet scolaire m’a
on s’y connait ou on ne s’y connait poussé à le reprendre de zéro, et d’en
pas, et donc le résultat est souvent faire un système plus costaud, polyva-
loin des attentes du groupe. lent et apte à s’adapter aux exigences
Au final, on en arrive à un problème qu’attendent les groupes qui souhai-
simple et vieux comme le web : on a un tent se lancer dans la grande aventure
site qui est super au début, mais qu’il de la création d’un site web.
faut maintenir à jour. Et quand person-
ne dans le groupe ne sait manier les ar-
canes sombres et mystérieuses (quoi,
j’exagère ?) du web, le groupe passe à
côté d’un chouette outil de communi-
cation. Ce fait lui sera souvent repro-
ché en concert : “- Je suis venu parce
que j’ai vu votre affiche par hasard,
pourquoi n’aviez-vous pas annoncé ce
concert sur votre site ?”.
C’est ainsi que certains groupes dé-
tournent à grand peine des outils de
blog ou de gestion de site web pour
en faire leur site, rencontrant en che-
min toutes les misères de monde pour
adapter un système qui au départ n’est
pas fait pour gérer un site de groupe de
musique.
Afin d’éviter ces désagréments, lors-
que moi-même j’ai été amené à créer
le site de mon premier groupe, m’est
venue l’idée de mettre en place un sys-
tème de site personnalisable et adapté
aux besoins des groupes de musique.
Dans un premier temps, cette idée est
restée egoïstement appliquée au seul
L’idée et les objectifs

idée de réaliser un système per- Voilà pour l’absolument nécéssaire.


mettant aux groupes de créer leur J’avais d’autres idées de fonctionnali-
propre site web, personnalisable mais tés, mais tout choisir seul, amènerait
surtout évolutif et simple à maintenir à un système permettant beaucoup de
jour était donc née. chose, mais de mon point de vue per-
Mais telle quelle, l’idée est assez mai- sonnel en tant que créateur de site et
gre. Encore fallait-il définir ce qu’il en non en tant que musicien.
serait, et savoir ce que devrait contenir
ce système. Enquête préliminaire
Me basant sur ma propre expérience de J’ai donc décidé de réaliser un petit
musicien et de créateur de sites web, questionnaire, afin de connaître les at-
j’ai vite dressé une première liste de tentes d’autres musiciens, et de mobi- Cahier des charges
ce que devait absolument permettre ce liser toutes mes connaissances et amis Ce premier cahier des
système : rencontrés dans la vie, comme sur les charges est consultable à
• La gestion de l’actualité du groupe. forums, de manière à recueillir leurs at- l’annexe 1.
• La gestion de son agenda. tentes concernant un site de groupe.

• La biographie et la présentation du L’enquête a été rédigée avec l’aide de


groupe. ma mère, qui, dans le cadre de sa pro-
fession (coordinatrice de projets qua-
• La possibilité de mettre en ligne des lité), en a réalisé plus d’une. Elle a été
extraits sonores, vidéos et photos du présentée sur une page web avec une
groupe. série de champs de formulaire classi-
• Laisser aux visiteurs la possibilité de que (cases à cocher, boutons radios,
s’exprimer sur le groupe (livre d’or, etc...). Un questionnaire écrit envoyé
formulaire de contact, etc...) par courrier classique me semblait hors
propos. En effet, la plupart des sondés pour leurs loisirs, les près de 25%
sont des connaissances rencontrées restant l’utilisant pour le travail.
sur des forums internet, la plupart ha- La question suivante me permettait
bitant en France ou ailleurs (l’un des de cibler au maximum les niveaux des
sondés résidant en Guadeloupe). De personnes sondées par rapport à leurs
plus, ayant pour projet le développe- expériences sur Internet. Il leur était
ment d’un site Internet, il aurait été cu- demandé de cocher, dans une série
rieux de ne pas utiliser ce média pour d’actions communes sur internet (pos-
en démontrer l’efficacité et la rapidité. ter sur un forum, utiliser un FTP, télé-
Cette enquête, réalisée lors des mois charger un fichier, etc...), les actions
de novembre et décembre 2006 avait qu’ils avaient déjà réalisées lors de
deux objectifs principaux : définir le ni- leurs navigations. À ma surprise :
veau moyen de connaissance du web • plus de 95% d’entre eux avaient
par les personnes sondées, et connai- déjà posté sur un forum.
tre leurs attentes envers un site de
groupe. • près de 60% avaient déjà utilisé un
FTP
En mois de deux mois, j’ai reçu plus
de 250 réponses, dont j’ai pu retirer • et plus de 93% se sont déjà créés
beaucoup d’informations, dont voici les un compte utilisateur sur un site
tendances marquantes : quelconque.
La plupart d’entre eux savent donc
Les personnes sondées remplir un formulaire. Il ne leur en fau- Résultats détaillés
dra pas plus pour utiliser fish in a pan.
La première partie du questionnaire Les résultats détaillés de
Un peu plus d’une personne sondée sur
servait à mieux cerner les personnes l’enquêtes sont consultables
2 sait utiliser un FTP, compétence né-
sondées et connaître leur niveau de à l’adresse :
céssaire pour installer fish in a pan.
compétence sur internet. Les deux http://fishinapan.
premières questions (moyenne d’âge Les deux questions suivantes, un peu lisaserver.be/enquete.php
et type d’utilisation d’internet) m’ont plus techniques, demandaient aux per-
servi à savoir un peu plus qui j’avais sonnes sondées s’ils avaient déjà créé
comme public “cible”. un site web (51% de oui contre 49% de
non), et quelles étaient leurs compé-
Plus de 75% des personnes sondées
tences dans les langages ou technolo-
se situent dans la large tranche des
gies web les plus courants : HTML, CSS,
16 - 35 ans (plus précisément 41%
Javascript, PHP, MySQL et Flash. Com-
de 16 - 20 ans, 27% de 21 - 25 ans
me je le précisais dans l’enquête, l’ob-
et 17,6% de 26 - 35 ans). Donc, pour
jectif de fish in a pan reste la possibilité
la plupart, un public jeune, ouvert
d’éditer un site sans connaître les lan-
aux nouvelles technologies. La se-
gages précités. Toutefois, c’est un plus
conde question était plus révélatrice
pour la personnalisation des thèmes et
: 75,7% des sondés utilisent internet
du moteur en particulier. Sans surprise,
un peu plus d’une personne sur deux indispensables, tant et si bien que ma
déclare avoir de vagues connaissances liste de fonctions à intégrer a très vite
(ou plus) en HTML et CSS. Un bon point
pour l’édition de thèmes.

Les personnes sondées et les


sites de groupe.
La seconde partie du questionnaire vi-
sait à savoir si les musiciens intérrogés
avaient déjà un site, par qui il avait été
réalisé, qui le maintenait à jour, et à
quelle fréquence.
Près de 40% affirment avoir un site
pour leur groupe. Et dans plus de
50% de ces cas, le site en question
a été réalisé par l’un des membres
du groupe.
Et dans plus de 50% des cas, la fré-
quence des mises à jour du site est
mensuelle, voire anecdotique.
Une confirmation de mon impression :
le fait de devoir toucher à du code pour
effectuer une mise à jour rebute bien
du monde, surtout si cette opération
n’est pas une habitude pour l’utilisa-
teur.

Les attentes des personnes


sondées envers un site de
groupe.
La troisième partie de l’enquête intro-
duisait mon idée et demandait aux uti-
lisateurs de noter la pertinence d’une
liste de fonctionnalités typiques.
Les résultats sont détaillés dans l’ima-
ge suivante.
Sans surprise, donc, la plupart des
modules proposés sont jugés utiles ou
été bouclée (et surtout fameusement porté sur fish in a pan, nom à la fois fish in a pan
aggrandie). mystérieux et complètement idiot. Écrit tout en minuscule.
Dans la question suivante, les person- Toutefois, sachant que l’un des meilleurs En français, ça signifie “un
nes sondées pouvaient proposer une moteurs de blog se nomme Dotclear, poisson dans une poêle”.
idée non citée dans la liste. qu’il existe des systèmes de site nom-
J’ai eu droit à quelques propositions far- més Spip et Joomla!, et que la plupart
felues, allant d’une déclaration d’amour des gens utilisent quotidiennement un
fougueuse de la part de mon batteur, à système d’exploitation nommé Win-
une personne sondée me demandant dows, je trouve que mon nom est bien
la mise en place dans le système d’un choisi. De plus, c’était le seul qui me
“accès webcam pour concerts privés”, permettait de faire un logo marrant et
rien que ça. de susciter la curiosité des utilisateurs.
Plus le nom est étrange, plus la curio-
Les autres suggestions étaient souvent sité est grande.
fort intéressantes, mais faute de temps
pour le développement du projet, je de-
vais faire un choix. Certaines des idées Un nom, des objectifs
seront utilisées par suite pour augmen- J’avais un nom, mes idées, et celles des
ter les possibilités du système. gens qui ont participé à mon enquête,
Les questions suivantes portaient il ne me restait plus qu’à réunir le tout, La dernière partie du
sur les motivations des musiciens en- définir mes objectifs et commencer le questionnaire
vers l’idée de mettre à jour eux-mêmes travail, ce qui est l’objet du chapitre La dernière partie du
leur site si un système le leur permet- suivant. questionnaire portait sur la
tait. Leurs réponses positives m’ont participation des personnes
donné le courage de me lancer dans sondées à un futur site
l’aventure. communautaire regroupant
Il ne me restait plus qu’à définir une lis- les sites utilisant le système
te complète et définitive des fonctions fish in a pan. Cette idée a
de mon projet avant de me lancer dans été mise de côté pour le PFE
le développement proprement dit. mais reste dans les cartons
(avec un cachet rouge du
genre “prioritaire”).
Un projet sans nom
c’est comme Laurel sans Hardy...

Je ne pouvais raisonnablement pas me


lancer dans ce projet sans lui donner
un nom.
Partant du nom redbox et après un
long brainstorming, mon choix s’est
Le développement de fish in a pan

e développement d’un système aus- de musique de manière simple, effica-


si complexe que fish in a pan ne peut ce et pratique, le tout en se connectant
se faire sans préparer convenablement simplement sur une partie du site dé-
le terrain. diée à cet usage.
Une fois toutes les idées réunies et les Ma cible est donc un internaute qui sait
objectifs définis, il y a encore fort à fai- manipuler les bases d’internet, et qui
re avant de se lancer dans le gros du pourra utiliser mon système le mieux
travail. possible en ne faisant que cliquer sur
des boutons et remplir des formulai-
res.
3.1 Les ingrédients
Toutefois, certaines fonctions plus poin-
Avant de commencer à taper la pre- tues du système nécéssiteront peut-
mière ligne de code, je devais définir être des connaissances un peu plus
4 points : poussées, mais ces fonctions particu-
• Le public visé lières doivent être les moins nombreu-
• Les technologies requises par le ses possibles.
système Il me faut donc respecter le principe du
• Les outils dont j’aurai besoin KISS. Principe du KISS
“Keep it simple, stupid !”
• Les objectifs à atteindre Les technologies requises par
http://fr.wikipedia.org/
le système
Le public visé wiki/KISS-principe
Fish in a pan est avant tout un site web,
Fish in a pan est un système de site et son objectif est d’être utilisable par
qui doit permettre à des utilisateurs de le plus grand nombre d’utilisateurs,
créer et d’entretenir un site de groupe
sur le plus grand nombre d’hébergeurs ter la relecture du code par des utili-
possibles. sateurs qui, connaissant vaguement
Il me faut donc choisir des technologies le HTML et le CSS, voudraient “tripa-
qui sont gratuites, répandues et, autant touiller” mon code afin de faire leurs
que possible, open-source. propres thèmes. Smarty est clair et
puissant, me permettant de générer
J’ai donc opté pour les langages sui- des affichages complexes tout en
vants : gardant un code propre et lisible.
• langage serveur : php 4.3 : même Pour le reste, le grand trio du web, à
si la version 5 de php est plus qu’in- savoir HTML/CSS/Javascript, se verra
téressante, notamment pour ses renforcé par la bibliothèque prototype, Prototype
nouvelles fonctions et sa gestion plus qui permet de simplifier le code à
poussée de la programmation orien- http://www.prototypejs.org
l’extrême sans souci de compatibilité
tée objet, elle n’est pas encore assez entre les navigateurs, et la bibliothèque
répandue chez les hébergeurs mon- scriptaculous, qui permet d’ajouter Scriptaculous
diaux pour pouvoir se permettre de la des effets spectaculaires aux éléments
choisir. Ce qui reste, au passage, une de la page.
http://script.aculo.us
belle abbération : php 5 a été conçu
pour être le plus compatible possible Les outils
avec php 4, afin de casser le moins
de scripts possibles lors d’une migra- Pour concevoir un poisson dans une
tion. Mais bref, j’ai choisi php 4, par poêle, il ne suffit pas de pêcher le pois-
souci de liberté envers mes futurs uti- son puis de le frire : il faut conscien-
lisateurs. cieusement choisir ses outils.
• langage de bases de données : Dans le cadre de fish in a pan, mes
mysql 4 : ici encore, c’est le langa- principaux outils sont :
ge de bases de données le plus ré- • Coda, de la société Panic, logiciel Coda
pandu du web, et, contrairement au qui à priori ne paie pas de mine, mais
http://www.panic.com/coda/
php, même si la version 5 de mysql qui s’avère être le couteau Suisse des
est sortie, la version 4 reste plus que développeurs web travaillant sur Mac
compétitive, et ne souffre d’aucunes : coloration syntaxique poussée, mo-
erreurs de compatibilité (ou presque, teur FTP intégré, console intégrée, ré-
mais rien d’alarmant). férences en ligne, travail communau-
• autres technologies : de manière taire, tout y passe...et j’en passe. Le
à séparer le plus possible le moteur dévelopement de fish in a pan peut se
du système et celui de l’affichage, j’ai limiter entièrement à ce programme.
choisi d’utiliser le moteur de templa- Les programmes suivants sont d’un
te Smarty, qui fait l’interface entre grand secours, mais malgré tout, ac- Smarty
le code généré par le php et l’html. cessoires.
http://smarty.php.net
L’avantage de ce choix est de facili-
• YourSQL, petit programme tout sim- permettre aux groupes de moduler le YourSQL
ple de gestion graphique de bases de site selon leurs envies.
http://yoursql.ludit.it
données, plus convivial que l’usine à
gaz phpmyadmin pour manipuler et
consulter ses bases de données. Un
3.2 La recette
brin moins puissant (pas d’export), (première tentative)
mais plus pratique.
Fish in a pan a essentiellement été
• Une immense bibliothèque musi- conçu en deux tentatives chacune
cale : siffler en travaillant... ayant tenté une approche différente.
Les objectifs à atteindre La première, plus classique mais sur-
tout plus désordonnée, se basait sur
Les objectifs à atteindre sont clairs : des techniques de travail en PHP assez
avoir une version fonctionnelle, instal- anarchiques et qui me conduisaient
lable et (surtout) utilisable de fish in a droit dans le mur (fichiers de fonctions
pan, avec toutes les fonctions et modu- dans tous les sens, dédales de varia-
les suivants, définis à la suite de mon bles temporaires et inutiles, requêtes
cahier des charges et de l’enquête pré- MySQL tordues... bref, un cauchemar).
liminaire : Nous ne nous étendrons pas plus sur
• Gestion des membres cette première tentative.
• Gestion des news
• Gestion d’un agenda 3.3 Mi-temps
• Gestion d’un blog Fin mars, début avril, après un petit
mois de stage, le projet Fish in a pan
• Gestion des médias (photo/video/
avançait, doucement mais surtout pé-
audio)
niblement.
• Gestion des liens
J’ai plusieurs fois songé à le recommen-
• Gestion des paroles (textes de chan- cer de zéro, mais sans jamais pouvoir
son) choisir une approche qui me faciliterait
• Gestion de la discographie la tâche tout en gardant le code lisible
et pratique. Rien n’y faisait.
• Gestion de thèmes
Fin avril, je suis parti faire un complé-
• Gestion d’un formulaire de contact
ment de stage de trois semaines chez
• Gestion d’un livre d’or VAlain S.A., à Wiltz (au Luxembourg). VAlain S.A.
• Chat privé pour les membres du J’y ai appris beaucoup de choses, dont http://www.valain.lu
groupe une qui a (osons le mot) révolutionné
ma façon de travailler : l’orienté objet
Chaque module devant être
réfléchi.
(dés)activable à volonté de manière à
Si j’avais déjà touché à la program- • Les vues ne sont rien d’autre que des
mation orientée objet en php4, je ne templates Smarty affichant les don-
l’avais jamais abordée convenable- nées demandées et permettant d’in-
ment. L’approche de ces concepts, au téragir avec elles.
sein de VAlain S.A., était bien plus logi- Cette façon de travailler, en plus d’être
que et basée sur le fameux MVC, alias rapide, permet d’être extrêmement ef- Modèle-Vue-Contrôleur
“Modèle-Vue-Contrôleur”, qui peut être ficace et lisible pour une personne ex- http://fr.wikipedia.org/
résumé de manière très simple : térieure à son travail. wiki/MVC
• Le modèle représente le comporte- Pour fish in a pan, mon choix était fait.
ment : il accède au bases de données,
effectue des requêtes, manipule les
données, mais ne fait rien de plus. 3.4 Le retour du poisson
• La vue, est, comme son nom l’indi-
surgelé.
que, tout ce que l’utilisateur voit et (deuxième tentative)
manipule. La vue n’effectue aucun
traitement des données du modèle, Fish in a pan fût donc ressorti du frigo
elle se contente de les afficher pour et entièrement effacé, pour repartir sur
permettre à l’utilisateur de continuer de nouvelles bases plus saines.
à travailler sur ces données. J’ai donc choisi de partir de la méthode
• Enfin, le contrôleur est le lien entre “VAlain” pour recréer Fish in a pan, tout
les deux : il ne traite rien, mais ap- en y apportant plusieurs modifications
pelle les modèles correspondant aux pratiques :
requêtes de l’utilisateur dans la vue. • Dans la méthode VAlain, il existe un
Chez VAlain S.A., ce système était gros- fichier de modèle par table dans la
so-modo appliqué comme suit : base de données. Ce choix, très logi-
que chez eux qui développent leurs
• Les modèles sont des objets PHP qui sites de A à Z pour un client donné,
ne font que 4 actions : lire, sauvegar- ne pouvait que me bloquer pour fish
der, charger et supprimer des infor- in a pan qui, lui, devait pouvoir évo-
mations dans une table d’une base luer après sa sortie. J’ai donc pris le
de données choisie. parti d’avoir le moins d’objets possi-
• Les contrôleurs sont d’autres objets bles en les rendant polyvalents.
avec des petites manipulations pro- • Les vues, dans la méthode VAlain,
pres (transformations de données étaient souvent peu dynamisées par
dans le but de permettre à la vue de du javascript, ou alors avec du ja-
les afficher plus facilement), ou l’ana- vascript un peu “barbare” (faute de
lyse des requêtes de la vue pour être temps pour se pencher sur ces as-
traitée par les modèles. pects du travail). Pour Fish in a pan,
je voulais dès le début intégrer du ja-
vascript propre et dégradable, afin Javascript dégradable
de permettre aux utilisateurs ayant
Un code javascript
fait le choix d’activer javascript de
dégradable est un code
profiter d’une expérience utilisateur
javascript qui vient rajouter
plus agréable et intuitive, sans pour
des fonctionnalités par
autant pénaliser les utilisateurs qui
dessus une page existante,
ne veulent pas activer javascript sur
sans pour autant être
leur machine.
obligatoire.
La méthode de travail étant mainte-
En bref, un code dégradable
nant complètement définie, nous al-
enrichit l’application mais ne
lons pouvoir aborder le côté plus tech-
l’empêche pas de fonctionner
nique de la chose, à savoir : comment
si javascript est désactivé.
ça marche et selon quels principes ?
Ce principe est un des plus
importants concernant
l’utilisation moderne et
intelligente de javascript.
Le fonctionnement de fish in a pan

uisque fish in a pan est basé sur • l’objet Config


l’idée MVC, nous allons suivre l’ordre • l’objet Multiple
de fonctionnement du système.
• l’objet Uploaded et son jumeau Avertissement
Nous commencerons donc par la des- Image
cription des modèles, suivie de celle Ce chapitre est sûrement
des contrôleurs, et enfin de celle des Ces 4 objets représentent l’entièreté le plus technique de ce
vues. des actions de traitement de données. travail, celui où vous
Nous allons les décrire plus en détails. êtes susceptible de voir
apparaître de drôles de
4.1 Les modèles Petit rappel rapide sur les objets signes sur les pages. Ces
Un petit rappel ne fait pas de tort. Dans La notion d’objet peut être assez com- signes seront soit du code,
le système MVC, le modèle “accède au plexe à appréhender quand on ne la soit des hallucinations dues
bases de données, effectue des requê- connait pas. Pour résumer de manière à une surdose de lecture
tes, manipule les données, mais ne fait très imagée (mais bien plus compré- technique à une heure
rien de plus”. hensible), un objet est un conteneur qui avancée de la nuit.
possède ses propres variables (appe- Quoi qu’il en soit, c’est
C’est donc le plus “bas niveau” de l’ap-
lées propriétés), ses propres fonctions l’heure où je vous conseille
plication fish in a pan. Les objets sont
(appelées méthodes), et une fonction de vérifier le niveau de
chargés directement après les variables
particulière appelée constructeur, qui, remplissage de la tasse de
de configuration, et contiennent toutes
déclanchée à la création d’un objet, café la plus proche.
les actions les plus importantes.
sert à l’initialiser.
Fish in a pan est articulé autour de 4
Lorsque l’on crée un objet, la variable
objets principaux :
qui l’accueille devient une instance de
• l’objet Element et son descendant l’objet, c’est-à-dire qu’elle devient une
User “copie” de celui-ci, avec toutes ses
possibilités : accès aux propriétés de • delete, elle, supprime dans la table
l’objet (et possibilité d’en créer de nou- le rang correspondant à l’identifiant
velles), utilisation des méthodes... de l’objet.
L’avantage indéniable d’un objet com-
4.1.1 L’objet Element me celui-ci est le gain de temps qu’il
L’objet Element est sûrement l’objet apporte lors du développement, puis-
le plus important du système fish in a que la manipulation d’un élément dans
pan. la base de données se trouve simplifiée
Son rôle est de manipuler un rang et accélérée.
Code Complet
d’une table MySQL, de le charger de- Puisqu’un petit exemple vaut mieux
Vous pouvez consulter le
puis la table, de l’éditer, de le suppri- qu’un long discours, examinons le cas
code complet de l’objet
mer, voire d’en créer un nouveau avant typique de l’édition d’un titre d’un ar-
Element en annexe 2.
de le sauvegarder dans la base. ticle dans une base de données, avec
Le principe de cet objet est simple : mon objet :
chaque colonne de la table MySQL est En trois lignes, c’est terminé. La pre-
une propriété de l’objet. mière ligne crée l’objet et va chercher
Ainsi, pour une table qui possèderait
$myArticle = new Element(“blogs”, 3);
une colonne nommée “categorie”, la
manière d’y accéder dans l’objet serait $myArticle->titre = “Mon nouveau titre”;
simplement “$myObject->categorie”. $myArticle->save();
De plus, l’objet Element possède trois
dans la base de données la rangée qui
méthodes principales : load, save et
correspond à l’identifiant (deuxième
delete.
paramètre) dans la table donnée en
• load, la première, est appelée lors de premier paramètre. Ensuite, nous chan-
la création de l’objet. Elle va chercher geons le contenu de la colonne titre et
dans la table MySQL la rangée défi- lui affectons une nouvelle valeur. Enfin,
nie par l’identifiant qu’on lui a fourni, nous sauvegardons les changements
et charge toutes les colonnes de la dans la base de données.
table dans des propriétés de l’objet.
Bien sûr, l’exemple donné ici est des
Si aucun identifiant n’est donné, on
plus sommaires, mais résume les pos-
crée un objet vide qui pourra par la
sibilités et les avantages de l’utilisation
suite être sauvegardé dans la table,
de cet objet.
une fois rempli.
L’objet User
• save, comme son nom l’indique, ré-
cupère les changements appliqués L’objet User, est, comme son nom l’in-
aux propriétés de l’objet, et les sau- dique, un objet dédié à la manipulation
vegarde dans la table MySQL. des utilisateurs. Cet objet hérite de l’ob-
jet Element, au sens où il en récupère
tous les principes d’utilisation (fonc-
tions save et delete pour modifier les première effectuant la sauvegarde sim-
données de l’utilisateur), mais se voit ple des nouvelles données, la suivante
ajouter de nouvelles méthodes propres rechargeant les variables de configura-
à des actions utilisateurs, telle que la tion à la suite de la sauvegarde.
vérification de la validité d’un utilisa-
teur connecté, la gestion des sessions 4.1.3 L’objet Multiple
utilisateurs, etc... Jusqu’à maintenant, nous avons pu voir
les procédés mis en place pour manipu-
4.1.2 L’objet Config ler des éléments de la base de données
Dans fish in a pan, les données de confi- un par un. Il nous faut pourtant avoir
Codes Complets
guration du système sont stockées en accès à un procédé nous permettant
deux parties. Les informations de confi- de visualiser un ensemble d’éléments, Vous pouvez consulter les
guration “critiques”, celles qui permet- notamment pour en faire des listes codes complets des objets
tent de définir les chemins d’accès aux (liste des articles de la table blogs, par Config et Multiple en annexe
fichiers et les paramètres de base de exemple). 3 & 4.
données, sont écrites dans un fichier C’est ce rôle que remplit l’objet Multi-
PHP créé lors de l’installation. ple.
Toutes les autres informations, relati- L’objet Multiple n’est pas vraiment un
ves au fonctionnement du site, telles objet en tant que tel, puisqu’on ne fait
que la visibilité du site ou d’un module jamais appel à son constructeur. En ef-
particulier, le nombre d’éléments à af- fet, il est plutôt utilisé comme un réper-
ficher d’un module, sont stockées dans toire de fonctions statiques, qui sont
un table nommée config, qui fonctionne réunies dans l’objet Multiple pour plus
avec deux colonnes : un mot-clé décri- de commodités.
vant le paramètre de configuration, et
l’autre donnant sa valeur. Chaque rang L’objet Multiple n’a aucune propriété,
de la table config donne donc un cou- mais une série de méthodes qui met-
ple “clé/valeur”, facile à manipuler. tent en place une requête pour la base
de données, et appelent ensuite une
Toutefois, les changements sur la confi- méthode générale de l’objet Multiple,
guration doivent se répercuter immé- qui va soumettre cette requête à la
diatement sur le site, et le couple “clé/ base de données, récupérer le résultat,
valeur” nécéssite une autre approche lui appliquer un petit traitement et re-
pour la manipulation de son contenu. tourner la liste des éléments dans un
C’est pourquoi j’ai créé un objet Config, tableau associatif.
qui fonctionne sur le même principe Par exemple, pour charger la liste des
que l’objet Element, mais adapté au articles de la table blogs, il nous suffit
format de la table config. De plus, l’ob- de faire ceci :
jet Config n’a que deux méthodes as-
sociées : save, et saveAndReload. La $articles = Multiple::getArticles();
La variable $articles contiendra un ta- nom, type qui contient son type MIME,
bleau associatif des articles du blog. et enfin size qui contient sa taille en
Certaines des méthodes de l’objet Mul- octets. Ces cinq propriétés seront cel-
tiple peuvent recevoir des paramètres les qui, typiquement, seront utilisées
pour définir le nombre d’éléments à pour être stockées dans une table de la
renvoyer, un éventuel filtre à appliquer base de données.
aux résultats, etc... Si par malheur l’envoi ou la sauvegar-
de du fichier échoue, l’objet Uploaded
4.1.4 L’objet Uploaded recevra une propriété nommée error,
Le dernier type de données à manipu- avec un code d’erreur correspondant
ler sont les fichiers. En effet, les utilisa- au type d’erreur rencontré (fichier par-
teurs de fish in a pan auront la possi- tiellement envoyé, pas de fichier, fi-
bilité d’envoyer sur le site des images, chier trop gros, etc...).
des sons, des vidéos, voire d’autres fi- L’objet Image
chiers en pièces jointes des messages Les images envoyées par un utilisateur
du chat privé. sur le web sont souvent trop grosses,
L’objet Uploaded a été créé pour mani- que ce soit en taille disque (en octets)
puler facilement un fichier uploadé afin ou en dimension (en pixels). C’est pour-
de le sauvegarder à l’endroit voulu, quoi lorsque l’on envoie une image sur
tout en gérant les erreurs éventuelles. un site, elle est bien souvent redimen-
Ainsi, l’objet Uploaded, à sa création, sionnée, puis vignettée.
reçoit trois paramètres : la variable L’objet Image de fish in a pan remplit
$_FILES contenant le fichier temporaire ce rôle. Mais une image envoyée sur
à traiter, le dossier de destination, et un site est, avant tout, un fichier en-
enfin, un paramètre optionnel pour for- voyé sur le site. C’est pourquoi l’objet
cer le nom du fichier (si ce paramètre Image est une copie de l’objet Uploa-
est omis, le nom physique du fichier ded, lui rajoutant une méthode de re-
sur le serveur sera le timestamp ac- dimensionnement. Lors de sa création,
tuel concaténé avec le hash md5 du un objet Image requiert les mêmes pa-
fichier). ramètres qu’un objet Uploaded, et une
Avec ces trois paramètres, l’objet Uploa- fois le fichier sauvegardé sur le serveur
ded vérifie le nouveau fichier, l’état du avec succès, l’objet Image pourra uti-
dossier de destination, et enfin sauve liser sa méthode spécialisée dans la
le fichier. Si l’opération s’est bien dé- redimension, nommée resize, et qui
roulée, l’objet recevra cinq nouvelles permet, selon ses paramètres, de re-
propriétés : url, qui contient le nom dimensionner l’image en l’écrasant, ou
physique du fichier sur le serveur, com- en en faisant une copie.
pleteUrl, qui contient le chemin absolu Voilà pour les objets principaux de Fish
vers le fichier, name qui contient son in a pan, ceux qui définissent le côté
“Modèle” de notre système Modèle- 2. Vérification de la validité de l’utilisa-
Vue-Controleurs. teur connecté
3. Analyse de l’action à effectuer. Par
4.1.5 Les autres objets défaut, on demande au modèle de
Fish in a pan utilise aussi deux autres retourner une liste des éléments du
objets, mineurs, qui permettent de module (les news, par exemple). Un
générer des fichiers au format zip (ob- autre type d’action est par exemple
jet open-source codé par l’équipe de de récupérer les données d’un for-
phpmyadmin), et de manipuler des mulaire complété dans la vue pour
fichiers audio au format mp3 (objet les enregistrer via le modèle.
open-source codé par regin). Ces deux
4. Appel de la vue en fonction de l’ac-
objets sont utilisés chacun dans un mo-
tion demandée.
dule précis et ne font donc pas partie
des objets “noyaux” du système. Ils L’analyse de la fonction à effectuer se
seront abordés plus loin, lors de la pré- fait à partir d’une structure de switch,
sentation des modules associés. qui examine la variable action et effec-
tue les opérations en fonction de sa va-
4.2 Les contrôleurs leur. L’utilisation d’une telle structure
permet d’utiliser le même contrôleur
Dans l’architecture MVC, le contrôleur lors d’opérations en AJAX. Le script Ja- Code Complet
est ce qui sert d’interface entre les mo- vascript appelle ce contrôleur, qui ef- Vous pouvez consulter le
dèles et les vues... fectue l’action et se termine au point code d’un module commun,
Techniquement, il ne traite aucune trois du déroulement cité ci-dessus, le module de news, en
donnée, ce sont les modèles qui s’en juste avant d’appeler la vue, puisque la annexe 5.
chargent. De même, il n’affiche rien, ce vue est déjà chargée.
sont les vues qui s’en chargent. Voilà pour les contrôleurs. Même s’il
Dans fish in a pan, les contrôleurs sont n’y a pas grand chose à dire sur eux,
donc les portions de code qui récupè- ils restent les piliers de l’application et
rent les données envoyées par les mo- sont à ce titre des éléments incontour-
dèles, et chargent les vues qui vont les nables du système.
afficher, pour permettre aux utilisa-
teurs de les manipuler. 4.3 Les vues
Typiquement, il y a un contrôleur par Selon le modèle MVC, les vues sont
module. Ces contrôleurs sont tous les interfaces avec lesquelles l’utilisa-
structurés comme suit (pour un contrô- teur interagit. Dans fish in a pan, les
leur de la zone d’administration) : vues sont des templates Smarty qui
1. Chargement du noyau de fish in a affichent, en HTML (ou XML selon les
pan cas) les données envoyées par le mo-
dèle correspondant et interprétées par
le contrôleur du module.
Toutes les variables des templates sont Le diagramme suivant résume toute la
affectées à Smarty dans le contrôleur structure de fonctionnement de fish in
du module associé, hormis les variables a pan développée au long de ce cha-
globales (variables de configuration pitre.
qui peuvent être nécéssaires à afficher
dans le template), qui sont affectées à
Smarty depuis le noyau du système.
Les templates sont divisés en plusieurs Vue
parties, de manière à être le plus logi- Affichage, Manipulation par l'utilisateur
que possible.
Pour chaque module, il y a un template
principal, qui porte le nom du module. Contrôleurs
Ce template, qui contient la structure
Interface Modèles/Vues
de la page HTML, en appelle plusieurs
autres :
• Un template, commun à tous les mo- Noyau Modèles
dules, qui contient la balise <head> de Base de
la page, et inclut donc les données Config, Fonctions de base Objets généraux données
concernant les scripts, les meta-tags
et les feuilles de styles.
• L’en-tête de la page, commune aux
modules de l’administration, avec le
titre, et le menu principal.
• Le sous-menu, commun à une section
de l’administration.
• Le template de l’action appelée dans
le contrôleur. Chaque module possè-
de un sous-dossier dans le répertoire
templates qui contient les templates
de chaque action. Ces templates af-
fichent les formulaires d’édition, les
listes d’éléments, etc...
• Le pied de page, commun à tous les
modules de l’administration.
La longueur de ces fichiersne me per-
met pas de les joindre en annexe.

4.4 Structure globale


Les modules de fish in a pan

omme décrit précédemment, fish in de l’application et l’installation com-


a pan est divisé en plusieurs modules, mence.
qui se chargent chacun de la gestion Cette installation s’effectue en quatre
d’un type de données. Par exemple, le grandes étapes.
module de news est le seul habilité à
gérer les news : il peut les créer, les 1. Vérification des permissions :
éditer, les lister et même les suppri- pour fonctionner, fish in a pan né-
mer. céssite que plusieurs de ses dossiers
aient les permissions en écriture sur
Dans ce chapitre, nous allons aborder le serveur. Cette étape de l’installa-
chaque module de fish in a pan, en tion vérifie que tous les dossiers re-
commençant par son installation, puis quis aient l’accès en écriture adéquat
par les modules de l’administration (le afin de passer à l’étape suivante.
gros du chapitre), et enfin le fonction-
nement de la partie publique de l’ap- 2. Paramètres de base de données :
plication. à cette étape, l’utilisateur doit fournir
les identifiants de connexion à la base
de données. Un test de connexion a
5.1 Le script d’installation lieu et s’il est positif, l’installation
L’installation d’un fish in a pan sur un passe à l’étape suivante.
hébergeur se réalise en quelques éta- 3. Création des tables dans la base
pes. de données et création du pre-
Une fois les fichiers de l’application ins- mier utilisateur : cette étape de-
tallés via FTP sur l’hébergeur, l’utilisa- mande à l’utilisateur les login et mot
teur se connecte sur le dossier /install de passe qu’il désire pour se connec-
ter au système, et les tables de l’ap-
plication sont créées, ainsi que le La zone publique, elle, affiche les don-
compte du premier utilisateur. nées pour les visiteurs.
4. Ecriture du fichier config.php : Globalement, la création et la modifica-
À cette étape, le script d’installation tion des données ne se font que dans la
tente de créer le fichier config.php. zone d’administration, hormis pour le
S’il échoue, l’utilisateur peut créer livre d’or et les commentaires de blog,
lui-même le fichier à partir du conte- où les visiteurs ajoutent ces éléments
nu qui lui est fourni. depuis la zone publique.
À la fin de l’installation, l’utilisateur est
invité à créer un code de sécurité, une
5.2.1 Répartition des modules
sorte de super mot de passe, qui sera
dans la zone d’administration
demandé à chaque opération délicate La zone d’administration de Fish in a
sur le système (suppression d’un uti- pan, que nous appellerons aussi conso-
lisateur, modification des paramèttres le ou admin, se divise en 5 sections :
sensibles, etc...) Ce code est très im-
1. Le tableau de bord, qui comporte
portant et ne peut être regénéré par la
un seul module
suite. Il peut être changé, mais unique-
ment si on connait l’ancien. 2. La section Groupe, qui comporte
cinq modules
Une fois le fichier config.php créé,
l’installation est terminée et le site est 3. La section Média, qui en comporte
pleinement fonctionnel. Le script d’ins- trois
tallation recommande à l’utilisateur 4. La section Site, qui en comporte six
de supprimer le dossier d’installation,
5. Et la section Config, qui comporte
de manière à sécuriser le site. Malgré
cinq modules
tout, le script d’installation ne se relan-
cera plus s’il détecte l’existence d’un À ces 20 modules, nous devons ajouter
fichier config.php. un module global qui gère la connexion
d’un utilisateur à l’admin.

5.2 La zone 5.2.2 Le module de connexion


d’administration
Ce module, un peu spécial, est appelé
L’application fish in a pan est fonda- à chaque tentative de connexion d’un
mentalement divisée en deux parties : utilisateur à l’admin. Il vérifie le cou-
la zone d’administration et la zone ple login et mot de passe entré dans le
publique. formulaire, et autorise le cas échéant
La zone d’administration, uniquement l’utilisateur à aller plus en avant dans
accessible aux utilisateurs enregistrés, la console.
permet de gérer l’entièreté des modu- C’est aussi ce module qui se charge de
les et de leurs données. créer les cookies de connexion automa-
tique si l’utilisateur le demande, et de ge est stocké dans une colonne de la
vérifier leur existence éventuelle lors table, en type TEXT. Le contenu est
de la tentative de connexion. donc limité à 65535 caractères, ce
qui, objectivement, laisse de la mar-
5.2.3 Le tableau de bord ge.
• Mise en forme des messages : le
5.2.3.1 Chat privé et notifications contenu d’un message peut recevoir
Le tableau de bord de fish in a pan une mise en forme basée sur le sys-
est le point de départ de l’administra- tème BBCode.
tion. Lors de la conception sur papier, • Gestion de fichiers joints : cha-
il n’était constitué que d’un chat privé, que message peut recevoir une pièce
rudimentaire. jointe, un fichier quelconque que les
De tous les outils proposés lors de l’en- autres membres du groupe pourront
quête, le chat privé est certainement récupérer. Idéal pour partager les
l’un de ceux qui a le moins intéressé partitions d’une composition, ou que
les personnes sondées, mais, par ex- sais-je d’autre.
périence personnelle, j’ai décidé de • Notifications : d’un simple clic sur la
l’intégrer. En effet, sur le site de mon petite cloche située sous les messa-
groupe, ancêtre du système fish in a ges du chat, l’utilisateur peut consul-
pan, nous avons un petit chat privé qui ter toutes les actions effectuées sur
nous sert énormément pour nous lais- le site. À la manière d’un fichier log,
ser des messages, des indications pour toutes les actions effectuées sur la
les répètes et autre. En bref, pour nous, zone publique comme sur la zone ad-
c’est devenu un point de communica- min sont indexées dans une table de
tion indispensable pour le groupe, une la base de données.
fois qu’on y a pris goût.
• Flux RSS : les messages du chat ain-
Cela dit, le chat du premier site était si que les notifications sont indexés
des plus rudimentaires : on ajoutait un dans un flux RSS sécurisé. Contraire-
message, limité à 255 caractères, et ment au flux RSS des news, agenda,
c’est tout. blog et autre, le flux du chat privé doit
Pour fish in a pan, c’était un peu limite. rester...privé. Fish in a pan étant des-
Les améliorations possibles étaient lé- tiné à être publié et installable gra-
gions, je me suis malgré tout limité, de tuitement, n’importe quel petit malin
manière à laisser à ce chat un côté pra- pourrait déduire l’adresse du flux rss
tique et surtout léger. du chat privé... Du coup, il fallait trou-
Les fonctionnalités de ce nouveau chat ver une parade pour le sécuriser. Lors
sont simples : de l’installation de fish in a pan, un
code de sécurité est généré. Ce code,
• Plus de limite de taille pour les passé dans l’url du flux RSS, sécurise
messages : le contenu d’un messa-
le flux (ce code étant impossible à ré- lisateurs de se définir des droits, per-
cupérer ailleurs dans le site). De plus, mettre à l’un ou l’autre de faire plus ou
ce code sert pour d’autres opérations moins que les autres ? Dans le cadre
“critiques”, nous y reviendrons en d’un site communautaire, cet aspect
temps voulu. des choses était à prendre en compte.
Mais dans le cadre de fish in a pan, j’ai
5.2.4 Le groupe pris le parti de laisser chaque utilisa-
teur pouvoir faire tout, sans restriction.
La seconde section de l’administration
En effet, mon système est un moteur
est la section Groupe, qui se charge,
de site pour groupe de musique, et les
comme son nom l’indique, de gérer
membres d’un groupe, de manière logi-
tout ce qui concerne le groupe, à sa-
que, sont des gens qui se connaissent
voir les membres, la biographie, la dis-
et doivent se faire confiance mutuelle-
cographie et les textes des morceaux.
ment pour jouer ensemble.
Dans le cahier des charges, c’était les
Toutefois, pour des raisons de sécurité,
seuls impératifs de cette section. Au fur
certaines actions sont soumises à un
et à mesure du développement, et sur
code de sécurité, de manière à être
un conseil donné par Thierry de chez
sûr que l’utilisateur ait bien conscience
VAlain S.A., la section groupe a reçu un
de la “criticité” de l’action entreprise
nouveau module : les intervenants.
(suppression d’un utilisateur, change-
5.2.4.1 Les membres ment de la mise en ligne du site public,
etc...).
Le module des membres du groupe s’oc-
cupe de la gestion des utilisateurs de Fonctions du module
l’application qui font partie du groupe. • Ajouter un membre : Crée un nou-
Chaque utilisateur membre du groupe veau compte utilisateur en lui spéci-
reçoit un login et un mot de passe qui fiant login, mot de passe et surnom
lui permettent de se connecter à l’ad- affiché sur le site. Sitôt créé, un nou-
min et d’éditer le contenu du site. veau compte est actif pour l’édition
du contenu du site.
De plus, il ne suffit pas d’afficher une
liste des membres du groupe sur la • Éditer la fiche descriptive : Cha-
partie publique du site. Chaque mem- que membre peut éditer le contenu
bre possède une fiche descriptive qu’il de sa propre fiche descriptive, ainsi
est libre de remplir. que celle des autres. Ce choix est
motivé par le fait que dans le site de
Petite précision sur les droits mon groupe, chaque membre ne peut
utilisateurs. éditer que sa propre fiche. Et notre
Depuis le début du développement, batteur n’ayant plus accès à Internet
la question des droits utilisteurs est depuis des mois, quand il veut met-
souvent revenue sur le plan de tra- tre sa fiche à jour, c’est moi qui m’en
vail. Faut-il ou non permettre aux uti-
charge en me connectant avec ses lo- de changer l’ordre d’affichage des
gin et mot de passe. Comme dit dans membres.
la note ci-dessus, c’est au groupe de Changement d’ordre
• Supprimer un utilisateur : La sup-
gérer lui-même ses interactions, il n’y pression d’un utilisateur demande Cette fonction est l’une
a donc pas de restriction à l’édition une confirmation et la saisie du code des rares qui bénéficie
d’une fiche d’un autre membre que de sécurité dont nous avons déjà par- actuellement d’une couche
soi-même. lé plus haut. De plus, et par mesure AJAX. En effet, si javascript
• Changer sa photo : En plus de de sécurité, l’utilisateur connecté ne est activé sur le navigateur
personnaliser sa fiche descriptive, peut supprimer son propre compte. de l’utilisateur, il lui est
chaque utilisateur peut la compléter possible de changer
avec une photo personnelle. La photo 5.2.4.2 Les intervenants l’ordre des membres en
est uploadée et redimmensionnée effectuant une série de
Lors d’une discussion à propos de mon
via la procédure expliquée lors de la drag & drop des utilisateurs.
application avec Thierry, chef de projet
description de l’objet Image. De plus, Les changements sont
chez VAlain, un point intéressant a été
l’utilisateur a la possibilité de choisir automatiquement
souligné : qu’en est-il des groupes qui
si oui ou non cette photo est affichée sauvegardés via AJAX.
feront appel à d’autres personnes pour
dans la zone publique. éditer le contenu d’un site ? On peut
• Masquer/Afficher un membre : très bien imaginer un groupe n’ayant
Cette action permet de masquer ou, aucune connaissance en Internet et
au contraire, d’afficher le membre demandant à un ami dévoué de s’oc-
dans la liste des membres sur le site. cuper du contenu du site... Cet ami ne
Un membre masqué n’est plus visible fait bien sûr pas partie du groupe en
depuis la zone publique. tant que tel. La première solution envi-
sagée était de créer un membre pour
• Masquer la liste des membres :
cette personne, et de le laisser masqué
Cette action, qui est aussi disponible
de la liste des membres. Mais, du coup,
depuis la configuration, permet de
la possibilité de se créer une fiche ou
masquer la liste des membres sur la
de changer sa photo est inutile.
zone publique. Cette action ne se fait
pas immédiatement, elle demande à Le module des intervenants est donc
chaque fois une confirmation. né. Les intervenants ont les mêmes
possibilités d’édition du site que les Préférence des
• Changer l’ordre d’affichage des
membres, excepté la suppression de intervenants
membres : La liste des membres
membres : un intervenant ne peut sup-
n’est pas affichée selon un ordre al- Un intervenant peut, comme
primer un membre du groupe. C’est
phabétique, mais à partir d’un nu- un membre, changer ses
la seule restriction ressemblant à des
méro d’ordre. En effet, la compo- login et mot de passe depuis
droits utilisateurs qui a été codée.
sition de la plupart des groupes est le module des préférences
affichée selon un ordre qui est sou- Fonctions du module dans la section configuration.
vent “chanteur(s)-guitariste(s)-bas- • Créer un intervenant
siste-batteur”. Cette option permet
• Supprimer un intervenant
5.2.4.3 La biographie son nom, des mots-clés (affichés seu-
lement dans la zone d’admin pour l’or-
La biographie est l’un des modules les
ganisation), une description, la date
plus simples de l’application. En effet,
de sortie et le nombre de disques que
la biographie n’est jamais qu’un texte
contient cet élément. Le reste des in-
éditable.
formations sera édité avec les fonc-
Fonctions du module tions suivantes du module.
• Éditer la biographie : Affiche un • Éditer les informations : Cette
simple champ de texte, avec un sys- fonction sert à éditer les informations
tème de BBCode pour styler le texte. générales du disque, celles remplies
• Afficher/Masquer la biographie : à la création du disque et citées ci-
Permet de choisir ou non d’afficher la dessus.
biographie du groupe sur la zone pu- • Éditer la tracklist du disque :
blique du site. Cette fonction sert, comme son nom
l’indique, à définir les tracklist d’un
5.2.4.4 La discographie
disque, c’est-à-dire la liste des mor-
La discographie est un module assez ceaux le composant. Il est possible
complexe de par le nombre de fonc- de lier à chaque morceau un élément
tions qu’il possède. Malgré le fait que du module audio et un élément du
certaines d’entre elles auraient pu être module paroles pour consulter un ex-
liées, elles ont été séparées pour ren- trait ou le texte du morceau lors de la
dre le module plus cohérent. navigation dans la zone publique.
Au départ, sur mes premières notes, un • Éditer les images : Chaque disque
élément disque devait être caractérisé peut se voir affecter une image de
par un nom, une description, une éven- face, une image d’arrière, ainsi qu’un
tuelle image et une liste des titres qui lien vers une galerie de photos. Ainsi,
compose la tracklist du disque. depuis la zone publique, un visiteur
À la suite de l’enquête préliminaire, où pourra voir la couverture du disque,
il est apparu qu’un système de com- sa face arrière, et une série de photos
mande de cd était très demandé par illustrant le packaging du disque, par
les sondés, les idées du module de dis- exemple.
cographie ont pris de l’ampleur, pour • Paramètres de téléchargement :
se voir enfin ajouter une fonction de té- Cette fonction permet d’autoriser le
léchargement d’une archive du disque, téléchargement d’une archive des
pour les groupes qui souhaiteraient morceaux du disque, pour les grou-
partager leur musique gratuitement. pes qui souhaitent le faire. Il y a deux
Fonctions du module méthodes de téléchargement : le té-
léchargement externe, et le téléchar-
• Ajouter un disque : Lors de l’ajout
gement interne. Le téléchargement
d’un disque, on ne fait que préciser
externe consiste à uploader l’archive une éventuelle galerie de photos liée
du groupe sur un service de partage n’est pas supprimée. Cette galerie
de fichiers externe, tel que rapids- doit être supprimée via le module de
hare ou megaupload, et d’ajouter gestion des photos.
dans fish in a pan le lien vers l’archi-
ve hébergée chez ce service. Cette 5.2.4.5 Les textes des morceaux
solution est bien sûr celle qui est la Le module des textes des morceaux
plus économique en place sur l’hé- est un module assez simple. En effet,
bergeur. La seconde solution permet un texte n’est défini que par les infos
d’uploader l’archive directement sur suivantes : son titre, son auteur, son
le site. Cette opération peut se faire contenu, et des mots-clés pour s’y re-
de deux façons différentes : en en- trouver.
voyant directement le fichier via l’in-
terface d’administration, opération Fonctions du module
assez lente et souvent limitée en • Ajouter un texte
taille d’envoi par l’hébergeur, ou en • Editer un texte
envoyant directement le fichier dans
• Supprimer un texte
le bon dossier via un logiciel FTP et
en le choisissant dans une liste des • Afficher/Masquer un texte
fichiers du dossier. • Afficher/Masquer la liste des tex-
• Paramètres de commande : Cette tes
fonction permet de créer un formulai- • Changer l’ordre d’affichage des
re de commande du disque pour les textes
visiteurs, leur précisant le prix à l’uni-
té et quelques informations concer- 5.2.5 Média
nant la vente. Le contenu de ces
commandes sera affiché dans le mo- La troisième section de l’admin est la
dule Contact de la section Site. Fish section média, qui gère les photos, les
in a pan ne gère pas la comptabilité vidéos et les sons. Lors de l’enquête
des groupes, mais permet au moins préliminaire, le module des médias
de centraliser leurs commandes. audio et vidéo est celui qui a été jugé le
plus indispensable par les utilisateurs,
• Afficher/Masquer un disque juste devant le module agenda. Celui
• Afficher/Masquer la discographie des galeries photos a aussi remporté
• Changer l’ordre d’affichage des pas mal de suffrages. Ces modules de-
disques vaient donc être impérativement figu-
rer dans l’application.
• Supprimer un disque : Lors de la
suppression d’un disque, les fichiers Toutefois, les modules des médias video
liés (couvertures, archives de télé- et audio, qui ne faisaient qu’un dans le
chargement) sont supprimés. Seule site de mon groupe, ont ici été sépa-
rés, car certaines fonctions propres à tion de chaque photo ou de la galerie
la manipulation de fichiers audios ne elle-même.
s’appliquaient pas au fichiers vidéos. • Ajouter une galerie
5.2.5.1 Les galeries de photos • Editer une galerie
Lors de l’enquête préliminaire, les per- • Changer l’ordre d’affichage des
sonnes sondées furent interrogées sur galeries
la pertinence de galeries photos publi- • Afficher/Masquer une galerie
ques et de galeries privées. Les deux
• Afficher/Masquer la liste des ga-
propositions ont reçu un accueil favora-
leries
ble, même si l’enthousiasme était bien
plus important pour les galeries publi- • Changer l’ordre d’affichage des
ques que privées. photos dans la galerie
Le module des galeries de photos • Supprimer une galerie : lors de la
contient deux types d’éléments dis- suppression d’une galerie, les photos
tincts : les galeries et les photos. qu’elle contient sont supprimées.
Une galerie se caractérise par un nom, • Ajouter des photos : cette fonction
une description et sa disponibilité (pu- permet d’ajouter jusqu’à 5 photos
blique ou privée). Une galerie privée ne d’un coup à la galerie en question.
pourra pas être utilisée pour être liée à Toutefois l’utilisateur est prévenu
un article de blog ou un disque, et ne que le transfert de plusieurs photos
sera pas affichée dans la liste des gale- en une fois risque d’être plus long
ries. Chaque galerie publique peut être qu’une à la fois, selon la taille et le
masquée de la liste des galeries, mais format des photos envoyées. Chaque
une galerie masquée peut être utilisée photo est en effet redimensionnée et
pour illustrer un article de blog ou un vignetée sitôt envoyée.
disque, et ce de manière à ce qu’elle • Organiser les photos : cette fonc-
n’apparaisse pas à la fois dans un arti- tion, utilisant AJAX et nécéssitant
cle de blog et dans la liste des galeries, donc que javascript soit activé pour
par exemple. fonctionner, affiche les photos de
Une photo est caractérisée par un nom, chaque galerie et permet, par drag
la galerie dont elle fait partie et une & drop, de déplacer une photo d’une
description. galerie à une autre. Si l’utilisateur
n’a pas activé javascript sur son na-
Fonctions du module pour les vigateur, il devra passer par l’édition
éléments galerie d’une photo pour la faire changer de
• Explorer la galerie : affiche les pho- galerie.
tos qui composent la galerie et per-
• Télécharger une archive de la ga-
met d’accéder aux fonctions d’édi-
lerie : cette fonction, se basant sur
l’objet zip.lib développé par l’équipe Fonctions du module
des développeurs de phpmyadmin, • Ajouter un morceau : Lors de l’ajout PhpMyAdmin
permet d’un seul clic de télécharger d’un morceau, en plus de définir ses http://www.phpmyadmin.net
une archive au format zip contenant caractéristiques, on uploade le mor-
toutes les photos de la galerie en ceau au format mp3 via un formulaire
question. d’envoi de fichier.
Fonctions du module pour les • Afficher/Masquer un morceau
éléments photo • Afficher/Masquer la liste des mor-
• Editer une photo : permet d’éditer ceaux
les informations d’une photo ainsi que
• Changer l’ordre d’affichage des
la galerie à laquelle elle appartient.
morceaux
• Supprimer une photo
• Editer les informations d’un mor-
• Afficher/Masquer une photo ceau

5.2.5.2 Les médias audios • Supprimer un morceau

Un site de groupe sans morceaux à • Manipuler un morceau : Cette fonc-


écouter, ce n’est pas vraiment un site tion expérimentale, basée sur l’objet
de groupe. Ce module était donc indis- mp3 de regin, permet de générer un Regin
pensable à l’application. extrait du morceau en cours. Cet ex-
http://www.sourcerally.
trait ne remplacera pas le morceau,
La seule restriction posée par le modu- net/regin
il sera ajouté aux autres médias so-
le est l’utilisation de fichiers au format nores avec la mention “extrait” dans
mp3, format audio le plus répandu sur son titre. Cette fonction est expéri-
le net (et le plus facile à créer), ainsi mentale, et pour des raisons encore
que l’un des plus légers. De plus, le lec- inconnues, elle ne marche pas avec
teur utilisé pour lire les médias mp3 sur tous les mp3, seuls certains passent.
le site n’est ni windows média player, Cette fonction a malgré tout été ajou-
ni quicktime. C’est un lecteur de mp3 tée à l’application avec un message
en flash, libre et open-source, créé avertissant les utilisateurs du carac- Neolao
par le développeur neolao. Ce lecteur tère aléatoire de sa réussite...
a l’avantage d’être hautement per- http://www.neolao.com
sonnalisable, notamment en ce qui 5.2.5.3 Les médias vidéos
concerne les couleurs du lecteur, de
Le plus grand problème concernant Personnalisation du
manière à pouvoir l’intégrer au design
l’utilisation de vidéos sur un site est le lecteur
du site.
choix du format de vidéo utilisé. Afin
Chaque morceau est défini par les ca- Les options de
d’éviter autant que possible des pro-
ractéristiques suivantes : un nom, des personnalisation du lecteur
blèmes de compatibilité, j’ai choisi de
mots-clés, une description et l’autorisa- sont accessibles dans la
n’utiliser qu’un seul format, le format
tion ou non de télécharger le morceau section Config de l’admin.
FLV (flash vidéo). Ce format, taillé pour
depuis le site.
le web, est léger et lisible avec le player par formulaire ou FTP, ou utiliser un
flash, installé sur la plupart des naviga- service externe tel que rapidshare.
teurs, quelle que soit la plate-forme de • Suppression d’une vidéo : Lors de
l’ordinateur. la suppression de la vidéo, les éven-
De plus, les fichiers vidéos sont volumi- tuels fichiers locaux (vidéo au format
neux et du coup remplissent vite l’es- flv et archive téléchargeable) sont
pace de stockage chez un hébergeur. supprimés.
C’est pourquoi j’ai choisi de permet- • Changement de l’ordre d’afficha-
tre aux utilisateurs d’utiliser des ser- ge des vidéos
vices de partage de vidéo, tels que le
très connu YouTube ou encore Daily- • Afficher/Masquer d’une vidéo
Services vidéo
motion. Ces services permettent de • Afficher/Masquer la liste des vi-
stocker des vidéos en ligne, tout en déos http://www.youtube.com
les convertissant à la volée au format http://www.dailymotion.com
flv, et autorise la lecture de vidéo sur 5.2.6 Le site
d’autres sites. Parfait pour une applica-
La section Site de la zone d’administra-
tion comme fish in a pan.
tion regroupe tous les modules concer-
Fonctions du module nant la vie du site, à savoir les news,
• Ajout d’une vidéo : Lors de l’ajout l’agenda, le livre d’or, le blog, etc...
d’une vidéo, l’utilisateur peut soit C’est ici que l’on retrouve les modules
rentrer le code d’identification de sa les plus simples (ou presque) dans leur
vidéo envoyée sur Youtube ou Daily- fonctionnement.
motion (seuls ces deux services sont
supportés pour l’instant), ou stocker 5.2.6.1 Les news
sa vidéo (au format flv) dans les dos- Module indispensable s’il en est, le mo-
siers de l’application. Pour cela, il a dule des news est malgré tout assez
le choix, à l’instar des archives de la simpliste. Chaque news est définie par
discographie, entre l’envoyer par for- un titre, une date de publication, une Dates des news
mulaire, ou via FTP. La vidéo se décrit date d’expiration (optionnelle) et un Même si la visiblité d’une
ensuite avec un titre, des mots-clés contenu. news est définie à “visible”,
et une description.
Fonctions du module elle ne sera affichée sur
• Edition des infos d’une vidéo le site qu’entre sa date
• Ajout d’une news
• Paramètres de téléchargement : de publication et sa date
• Edition d’une news
Sur le même principe que les archi- d’expiration.
ves des disques de la discographie, • Suppression d’une news
les utilisateurs peuvent permettre le • Afficher/Masquer une news
téléchargement d’une archive de la
• Afficher/Masquer la liste des
vidéo dans un format différent du flv.
news
Ce fichier peut être envoyé en interne
5.2.6.2 L’agenda dans l’optique de nous rappeller nos
meilleures répètes et souvenirs, est
Deuxième module jugé le plus indis-
vite devenu une section fort fréquen-
pensable lors de l’enquête préliminaire, Certains nous reprochent
tée par nos visiteurs qui voyaient là
l’agenda est un élément incontourna- même de ne pas être à jour
une occasion de suivre l’évolution du
ble de tout site de groupe qui se res- lorsque nous oublions de
groupe, pas à pas, semaine après se-
pecte, permettant à tous les visiteurs chroniquer une répète !
maine.
de consulter les prochains événements
relatifs à leur groupe préféré... Et puisqu’avant d’être une application
libre, fish in a pan sera l’application qui
Chaque événement de l’agenda est
fera tourner la nouvelle version du site
caractérisé par un titre, une date, une
de mon groupe, populaire ou pas, le
description, le lieu, le prix et un lien
blog en fera partie. Quitte à ce qu’il n’y
vers l’éventuel site de l’événement
aie que nous qui ne l’utilisions...
(ces trois derniers attributs sont op-
tionnels). Le module de blog de fish in a pan est
une version simplifiée mais fonction-
Fonctions du module
nelle des moteurs de blog traditionnels,
• Ajout d’un événement avec des catégories pour les articles et
• Edition d’un événement la possibilité de laisser des commentai-
• Suppression d’un événement res pour chacun d’entre eux.

• Afficher/Masquer un événement Le module gère donc trois types d’élé-


ments distincts mais liés : les éléments
• Afficher/Masquer la liste des évé- articles, les éléments catégories et les
nements éléments commentaires.
5.2.6.3 Le blog Fonctions du module pour les
éléments articles
Parmi les modules proposés lors de
l’enquête préliminaire, le blog n’a pas Chaque article de blog est caractérisé
été très populaire. Certaines person- par un titre, une catégorie, une date Date de publication
nes sondées ne comprenaient pas l’uti- de publication, l’autorisation de com-
Même si la visibilité de
lité d’un blog sur un site du groupe, ce menter l’article, un résumé, un texte,
l’article est sur “visible”,
n’est qu’après une petite explication une galerie liée et un champ de texte
l’article ne sera pas publié
qu’ils ont compris le potentiel d’un blog pour écrire une éventuelle setlist de
sur la zone publique tant que
sur un site de groupe. concert.
sa date de publication ne
Depuis la création de l’ancien site de • Ajouter un article sera pas atteinte.
mon groupe, nous avons pris l’habi- • Editer un article
tude de raconter nos répétitions, sor- • Visualiser un article : affiche l’ar-
ties et concerts sous forme de “chro- ticle et les commentaires qui y sont
niques” sur le site. Ce petit “blog” du associés, pour les éditer ou les sup-
groupe, d’abord créé pour nous-même primer.
• Supprimer un article : si l’article • Edition d’une catégorie
supprimé avait des commentaires, ils • Suppression d’une catégorie :
seront également supprimés. une catégorie qui contient des arti-
• Afficher/Masquer un article cles ne peut être supprimée. Seules
• Afficher/Masquer la liste des arti- les catégories vident peuvent être
cles du blog supprimées.

Fonctions du module pour les 5.2.6.4 Le livre d’or


éléments commentaires
Lors de l’enquête préliminaire, plus
Un commentaire de blog est caracté- de deux tiers des personnes sondées
risé par le pseudo de son auteur, son ont trouvé le module de livre d’or utile
email et éventuellement son site web, ou indispensable à un site de groupe.
la date de publication et son contenu. Malgré tout ce que l’on peut dire, nous
• Afficher/Masquer un commentai- aimons toujours bien savoir ce que
re les autres pensent de ce que nous fai-
• Afficher/Masquer les commentai- sons.
res d’un billet Le module du livre d’or, à l’instar des
• Modérer le contenu d’un com- commentaires du blog, agit sur des élé-
mentaire ments qui sont ajoutés depuis la zone
publique du site.
• Répondre à un commentaire :
cette fonction permet au groupe de Chaque message posté sur le livre d’or
répondre à un commentaire précis, est caractérisé par un titre, le pseudo
cette réaction s’ajoutant direct à la de son auteur, son email, son éventuel
suite du commentaire dans la zone site web et enfin son message.
publique. Fonctions du module
• Supprimer le commentaire • Modérer le contenu d’un messa-
ge
Dans les préférences du blog dans la
configuration, l’utilisateur peut choisir • Réagir à un message : cette fonc-
si les commentaires postés en réaction tion est identique à celle des com-
à un article sont visibles directement mentaires de blog, et permet de
ou doivent être rendu visibles depuis la publier une réaction à un message
zone d’administration. directement à la suite de celui-ci.
Fonctions du module pour les • Supprimer un message
éléments catégories • Afficher/Masquer un message
Les catégories des articles sont définies • Afficher/Masquer le livre d’or
par un nom et une petite description.
À l’instar des commentaires de blog,
• Ajouter une catégorie depuis la configuration du livre d’or,
vous pouvez décider de la visibilité par • Afficher/Masquer le formulaire
défaut des nouveaux messages. de contact

5.2.6.5 Le formulaire de contact 5.2.6.6 Les liens


Lors de l’enquête préliminaire, les per- Lors de l’enquête préliminaire, les per-
sonnes sondées ont été 45% à trouver sonnes sondées ont été unanimes :
le formulaire de contact utile et 40% à 90% d’entre elles jugeaient un module
le trouver indispensable. Mais, plutôt de liens utile voire indispensable !
que de faire un formulaire de contact Le module de liens est sûrement le plus
“classique” qui envoie un email à une basique de tous. Un lien est caractérisé
adresse de contact du groupe, les mes- par un titre, une adresse, et une des-
sages envoyés via ce formulaire sont cription.
stockés dans la zone d’administration
du site et consultables par les utilisa- Fonctions du module
teurs. • Ajouter un lien
C’est aussi ici que sont affichés les • Edition d’un lien
messages de commande de disque, • Supprimer un lien
dont nous avons vu les options au point
• Afficher/Masquer un lien
5.2.4.4.
• Afficher/Masquer la liste des
Chaque message est caractérisé par un
liens
sujet, le pseudo de son expéditeur, son
adresse email, le contenu du message, • Changer l’ordre des liens
le type de message (message simple
ou commande), et enfin un indicateur 5.2.7 Configuration
de réponse (qui est affiché lorsque l’un
La dernière des sections de l’admin est
des membres du groupe a répondu au
la plus importante : c’est elle qui règle
message en question).
tout le contenu du site.
Fonctions du module
• Lire le message 5.2.7.1 Les préférences
utilisateurs
• Répondre au message : permet de
répondre à l’expéditeur à l’adresse Le premier module de la configuration
email laissée. Le contenu de l’email est celui qui règle les préférences pro-
est envoyé au format html, et peut pres à l’utilisateur connecté sur l’ad-
être personnalisé à l’aide de BBCode min.
et/ou d’un template Smarty spécial à C’est le seul module de la configuration
l’image du groupe (situé dans le dos- qui n’a aucune incidence sur la zone
sier templates du theme utilisé). publique. Ici, chaque utilisateur peut
• Supprimer le message modifier son login et son mot de passe
pour la connexion à l’admin, etc...
5.2.7.2 Paramètres des modules la visibilité par défaut des commentai-
res du blog ou des messages du formu-
Ce module se charge de définir les op-
laire de contact, les flux rss disponibles
tions d’affichage des modules de la
pour les visiteurs de la zone publique,
zone publique. C’est ici, par exemple,
etc... Chaque modification d’un para-
que vous pourrez choisir combien de
mètre du système requiert le code de
news s’afficheront en page d’accueil,
sécurité pour être validé.
combien d’articles de blog il y aura par
page. Ce module permet aussi de régler la Visibilité de la partie
Depuis ce module, vous pouvez mas-
visibilité de la zone publique du site. publique
En passant le site hors-ligne, seul les
quer chacun des modules du site, de la Le changement de cet
membres pourront visiter le site, via
même manière que vous le pouvez sur état se signale par un
l’administration. C’est pratique pour
chaque module indépendamment. changement de la couleur
les opérations de maintenance d’en-
C’est ici aussi que vous choisissez l’or- de l’en-tête de l’admin.
vergure, l’installation d’un nouveau
dre d’affichage des pages dans le menu, Habituellement de couleur
thème, etc...
ainsi que les regroupements éventuels bleue, l’en-tête de la zone de
des pages. En effet, vous pouvez réu- l’administration passe en gris
5.2.7.4 Système antispam
nir ensemble la liste des membres et la lorsque la partie publique du
Le spam par email est un fléau connu site est hors-ligne.
biographie pour ne faire qu’une seule
de tous sur le net. Ces emails non-dési-
page sur la partie publique du site, la
rés, admirablement nommés pourriels
même chose pour les médias audio et
par les Québecquois, infestent nos
vidéo que vous pouvez réunir en une
boites mail depuis des années. Depuis
seule page.
quelques mois, un autre type de spam
C’est toujours sur ce module que vous sévit sur le réseau, appelé le spam de
pouvez choisir le titre de chaque page, commentaires. Typiquement, il s’agit
son nom dans le menu du site, ainsi d’un robot (petit programme informati-
que le texte d’introduction qui précé- que qui fonctionne de manière autono-
dera la liste des éléments de chaque me sur le net), qui, dès qu’il trouve un
module. formulaire de contact, de commentaire
pour un blog ou un livre d’or, s’amuse
5.2.7.3 Les paramètres du comme un petit fou à l’inonder de mes-
système sage vantant les plaisirs de sites por-
Ce module est à la fois le plus impor- nographiques, de vente de viagra, ou
tant du site et le plus à même de tout les deux (l’un ne va bizarrement jamais
détruire. Il est à prendre avec des pin- sans l’autre sur internet).
cettes. C’est sur ce module que tous Fish in a pan intègre un système antis-
les paramètres les plus importants du pam basé sur un dictionnaire de mots.
site sont définis : le thème utilisé, le Lorsque l’un de ces mots est trouvé
nom du groupe, la taille des vignettes dans un commentaire ou message sou-
générées lors de l’upload d’une photo, mis par un visiteur, celui-ci n’est pas
enregistré et un message avertit l’uti- série de couleurs. Ainsi, les robots se-
lisateur du blocage de son message. ront floués.
Un robot ne cherchera pas plus loin, et Vous pouvez activer l’un ou l’autre des
un visiteur humain prendra conscience filtres antispam, ou les deux ensem-
de son erreur et modifiera son messa- bles.
ge (ou ira vendre ses stocks de pilules
bleues plus loin). Ce filtre s’appliquera aux messages du
livre d’or, du formulaire de contact et
Le module antispam de fish in a pan aux commentaires de blog.
permet de choisir quel filtre antispam
utiliser. Le système par défaut est celui 5.2.7.5 Utilitaire de base de
du dictionnaire, défini plus haut. Le mo- données
dule vous permet d’ajouter vos propres
On ne le dira jamais assez, une sauve-
mots au dictionnaire, afin de l’enrichir
garde régulière des bases de données
au fur et à mesure de l’évolution des
et des fichiers d’un site est plus qu’im-
robots spameurs.
portante en cas de crash. Si la plupart
Le second type de filtre se base sur un des hébergeurs sérieux font ces sauve-
test de Turing. Pour faire court, le test gardes quotidiennement, on est jamais Test de Turing
de Turing est un test qui sert à détermi- à l’abri d’un incident. De plus, avoir une http://fr.wikipedia.org/
ner si on a à faire à une machine ou un sauvegarde des bases de données per- wiki/Test_de_Turing
humain, en posant une suite de ques- met de réparer une grosse erreur acci-
tions. Le test de Turing le plus connu dentelle d’un membre qui aurait eu la
sur internet est le Captcha, image main lourde lors de l’édition du site. Captcha
légèrement brouillée contenant des http://fr.wikipedia.org/
Le module d’utilitaire de base de don-
caractères à retaper pour valider son wiki/Captcha
nées permet de sauvegarder le conte-
message. Mais il existe un test de Tu-
nu des tables de la base de données de
ring encore plus simple et tout aussi ef-
fish in a pan dans un fichier texte ainsi
ficace, le test de la question idiote.
que de les restaurer à partir d’un autre Second avantage de la
À la différence d’un humain, un ordina-
fichier. question idiote
teur ne pourra répondre à une question
du style “Quelle est la couleur du che- Ce système de sauvegarde n’est pas Ce test a pour qualité
val blanc de Napoléon ?” automatisé, mais les utilisateurs peu- supplémentaire de recaler les
vent, depuis ce module, demander au gens les plus idiots, souvent
Un ordinateur, à l’heure actuelle de la
système de leur rappeler, via un mes- bien plus nuisibles que les
technologie, ne peut comprendre l’ab-
sage dans le chat privé, de faire une robots.
surdité de la question qui donne la ré-
sauvegarde de la base de données tou-
ponse dans son énoncé.
tes les semaines ou tous les mois, par
Le second type de filtre antispam de exemple.
fish in a pan consiste à poser la ques-
tion ci-dessus en demandant une cou-
leur aléatoirement choisie parmi une
5.3 La zone publique • Les news

La partie publique du site de fish in a • Les événements de l’agenda


pan est bien plus rapide à décrire. En • Les articles du blog
effet, son fonctionnement est en tout • Les commentaires postés sur le blog
point conforme à celui d’un site classi- (pour un article ou pour tous)
que, si ce n’est que chaque page affi-
che les éléments du module associé. • Les messages postés sur le livre d’or

L’entièreté du contenu de la partie pu- • Un flux général réunissant les précé-


blique est généré depuis l’admin. dents

5.3.1 Les thèmes 5.4 Les modules abandonnés


La personnalisation de l’habillage de Un certain nombre de modules divers
cette partie publique passe par un sys- n’ont pas pu être intégrés à fish in a
tème de thèmes. pan, et ce pour deux raisons.
Ces thèmes, qui consistent en un réper- La première est le manque de temps
toire contenant des feuilles de styles, pour développer le projet. Il a fallu faire
des templates smarty et des images, un choix et certains modules ont été
sont personnalisables facilement par mis sur le côté.
les utilisateurs qui s’y connaissent un La seconde est la pertinence, certains
peu en CSS, voire en HTML. modules à priori intéressants ne fe-
Les utilisateurs plus hardis ou confir- raient qu’alourdir l’application, surtout
més pourront même modifier le conte- pour une première version.
nu des templates de manières à ce que Mais qui dit abandonné ne veut pas
l’affichage des modules soit le plus dire mort, et certains de ces modules
proche possible de leurs attentes. sont entourés de rouge dans mes ca-
Lors de l’installation de fish in a pan, hiers afin de sortir de l’ombre au fur et
le système est installé avec un thème à mesure des évolutions prochaines de
par défaut, passe-partout. L’utilisateur fish in a pan.
est libre de le modifier ou d’utiliser l’un Parmi ces modules, on peut citer :
des thèmes qui seront progressivement
• Mailing-list : Ce module, initiale-
disponibles sur le site de fish in a pan.
ment prévu, a été reporté par manque
5.3.2 Les flux RSS de temps. Il permettra aux visiteurs
de s’inscrire en donnant leur adresse
À l’instar de l’administration, la partie email afin de recevoir des bulletins
publique possède aussi ses flux RSS de news écrits par le groupe.
pour suivre l’actualité du groupe.
• Splash-screen : Reporté parce que
Ces flux, personnalisables depuis l’ad- susceptible de créer un immense trou
ministration, reprennent :
de sécurité. Ce module devrait per-
mettre au groupe d’ajouter une page
d’introduction au site, avec un conte-
nu personnalisé.
• Statistiques : Reporté par manque
de temps, le module de statistiques
permettra au groupe de visualiser
le nombre de visiteurs du site, selon
leur provenance, leur parcours sur le
site, les navigateurs utilisés et bien
d’autres choses encore.
• Espace pro : Ce module, soumis lors
de l’enquête préliminaire, n’a pas
été inclus au projet par manque de
temps, mais fait partie des futurs mo-
dules à intégrer dans l’application. Il
permettra au groupe de partager en
ligne ses dossiers de presse, fiches
de scène et contrats avec d’éven-
tuels organisateurs de concerts.

5.5 Captures d’écrans


Pour conclure notre description de l’ap-
plication, je vous invite à vous reporter
à l’annexe 6 où vous pourrez consulter
quelques captures d’écrans de l’appli-
cation.
Autour de fish in a pan

ish in a pan ne se réduit pas unique- 6.2 La sortie publique


ment à l’application décrite dans cet
ouvrage. J’en ai parlé plusieurs fois au cours de
l’ouvrage, la sortie publique de fish in a
Dans ce petit chapitre, nous abordons
pan en version 1.0, sa première release,
certains points dont on n’a pas encore
aura lieu selon toute vraisemblance en
parlé, ou qui ont été abordés lors de
juillet 2007, une fois les derniers bou-
la description de l’application sans être
lons resserrés.
approfondis.
À partir de ce moment-là, le travail de
support et d’aide aux premiers utilisa-
6.1 Le site de fish in a pan teurs commençera.
Actuellement en développement, le
site de fish in a pan, prévu pour la 6.3 Le prix de fish in a pan Le site de fish in a pan
release de juillet, a pour objectif de
devenir une référence pour les utilisa- À partir du moment où j’ai décidé de http://fishinapan.
teurs de l’application, où ils pourront rendre publique cette application, l’idée sourceforge.net
consulter l’aide en ligne et un forum était claire dans ma tête : ce sera une
d’entraide. Ce sera aussi le point cen- application gratuite et libre, au sens où
tral pour télécharger les mises à jour et les futurs utilisateurs de mon applica-
les correctifs de l’application ainsi que tion seront libres d’en modifier la struc-
les nouveaux thèmes qui s’ajouteront ture selon leurs compétences, afin de
progressivement sur le site. l’adapter à leurs besoins spécifiques.
De nos jours, nous utilisons de plus en
plus de logiciels open-source, souvent
développés par une seule personne
au départ qui est progressivement en- concerts, s’entraider et se faire connaî-
tourée par une équipe de gens moti- tre les uns les autres.
vés pour faire avancer un projet qu’ils La release de juillet 2007 n’est donc
aiment. pas une fin en soit, mais plutôt le vrai
C’est donc pour ces raisons que fish in départ de fish in a pan.
a pan sera téléchargeable gratuitement
et disponible sous licence GNU/GPL. License GNU/GPL
http://www.gnu.org/
6.4 L’équipe fish in a pan licenses/gpl.html

À l’heure où j’écris ces lignes, l’équipe


fish in a pan n’est pas bien grande,
puisqu’elle comporte un chef de projet,
un webdesigner, un développeur et un
intégrateur... qui ne sont jamais qu’une
seule et même personne, moi.
Tant que fish in a pan était un projet
scolaire, je ne pouvais bien sûr pas me
faire aider. Mais tout au long du dé-
veloppement, j’ai rencontré des gens
motivés par mon projet, qui souhaitent
apporter leur écaille au poisson.
Une fois la release de juillet effectuée,
je compte bien recontacter toutes ces
personnes pour faire évoluer fish in a
pan autour d’une équipe soudée, profi-
tant des capacités de chacun.

6.5 La communauté
Ce projet, que j’ai vaguement abordé
au début de cet ouvrage, est l’un de
ceux qui me tient le plus à coeur une
fois que l’application aura pris un peu
d’ampleur : créer un site communau-
taire, réunissant les groupes utilisant
mon moteur de site, afin de mettre en
commun leurs news, leurs agendas
et morceaux, pour créer une commu-
nauté de groupes apte à se trouver des
u moment où je rédige ces lignes, La prochaine grande aventure, ce sera
fish in a pan est presque terminé. Il la release de fish in a pan, en juillet.
reste quelques bug à corriger. En regar- Sortir mon poisson de sa poêle et le re-
dant ma table de nuit où se trouve mon lacher dans les eaux troubles du net.
cahier à idées, dans les pages duquel la Espérons juste qu’il n’ait pas cuit trop
première idée concernant fish in a pan longtemps...
fut écrite, bien, bien avant de taper la
première ligne de code, je ne suis pas
peu fier du chemin parcouru.
Entre les premières lignes de code,
tapées en janvier 2007, l’abandon en
mars, la renaissance du code sous une
autre forme en fin avril et les derniers « Quelque part, dans un autre monde loin du
boulons à serrer, il y a eu beaucoup de Disque, quelqu’un empoigna d’une main hésitante
questions, d’idées idiotes tombées à un instrument dont la musique fit écho au rythme
l’eau, de grandes idées bien trop gran- qui lui soûlait l’âme.
des pour être reprises et de petites
idées anodines qui sont toujours écrites Elle ne mourra jamais.
à droite à gauche, dans mon fameux Elle est là et bien là. »
cahier ou sur le gigantesque poster col-
lé sur le mur de ma chambre qui m’a Accros du roc, Terry Pratchett
servi de roadmap, rempli de gribouillis,
de ratures et de petits “OK” verts au fur
et à mesure de l’avancée des fonctions
à inclure dans fish in a pan.
Bibliographie
Collectif, article “Myspace” sur Wikipédia, http://fr.wikipedia.org/wiki/Myspace
(consulté le 12 mai 2007)
Collectif, article “KISS (principe)” sur Wikipédia, http://fr.wikipedia.org/wiki/KISS-
principe (consulté le 15 mai 2007)
Collectif, article “Modèle-Vue-Contrôleur” sur Wikipédia, http://fr.wikipedia.org/
wiki/MVC (consulté le 11 mai 2007)
Collectif, article “Test de Turing” sur Wikipédia, http://fr.wikipedia.org/wiki/Test_de_
Turing (consulté le 20 mai 2007)
Collectif, article “Captcha” sur Wikipédia, http://fr.wikipedia.org/wiki/Captcha
(consulté le 20 mai 2007)

Références
WIEDEMANN Julius (éd.), Web Design : Music Sites, Taschen, coll. Icons, 2006
WIEDEMANN Julius (éd.), Web Design : Studios, Taschen, coll. Icons, 2006
GOTO Kelly & COTLER Emily, [Re]design web [2.0] Conduite de projet, Eyrolles,
2005
PORTENEUVE Christophe, Bien développer pour le Web 2.0, Eyerolles, 2006
Annexe 1 : Cahier des charges original

Partie Privée Cahier des charges


Fish in a pan La partie privée d’un
permet de gêrer le contenu
sh in a pan a plusieurs
C’est quoi ? de la partie publique du site.
fonctionnalités, dont la
plus importante est celle de Parmis ces fonctionnalités,
Fish in a pan est le nom de gêrer le contenu de la partie nous trouverons:
mon projet de n d’études. publique du site. • Un module de news
Ca consiste en quoi ? Mais comme le système • Gestions des membres (pour
sh in a pan est ciblé pour ajouter/éditer/supprimer les
Fish in a pan est un CMS les groupes de musique, la ches des membres du groupe)
destiné aux groupes de partie privée comprendra • Edition de la biographie
musique. certaines fonctionnalités
• Gestion de la discographie
L’idée est de développer un plus pratiques qui leur sont
destinés, telles que: • Un module de blog
système de site web complet
à destination des groupes de Tagboard: Le tagboard est un • Un agenda
musique, avec une interface chat, privé, à destination des • Un livre d’or
d’administration simple et musiciens du groupe, pour • Gestion des médias audio/vidéo
permettant de gêrer tout le faciliter la communication
• Gestion des galeries photos (galeries privées / publi-
contenu d’un site de groupe entre eux.
ques)
typique.
Gestion des chansons: Au • Conguration du site
sein de la partie privée du
Fonctionnalités sh in a pan, les musiciens Chaque module sera (dés)activable à volonté pour per-
du groupe pourront mettre à mettre au groupe de modeler son site à sa convenance, au
Installeur: L’installation du fur et à mesure de son évolution.
jour l’avancée des chansons
système sh in a pan sur un en cours de composition, en Partie publique De plus, l’utilisation de la
hébergeur quelconque sera leur attachant les partitions, technologie rss permettra de
simple, basée sur une suite ajouts, etc, de manière à La partie publique du tenir les visiteurs au courant
de petits formulaires pour savoir à tout moment où se site, visible par tous les de tout changement sur le
chaque étape (un peu comme situe le travail à faire sur les visiteurs, sera entièrement site.
dans le système Dotclear). personnalisable via un
compositions.
système de thèmes simples
Le reste des fonctionnalités à modier.

2 3
Cahier des charges

Technologies permettra aux utilisateurs


du système d’être tenu au
Le système     courant des mises à jour du
sera réalisé en utilisant l’en- système.
semble des technologies web  Le système
suivantes: sh in a pan sera téléchar-
 (version 4.3 par souci geable gratuitement sous
de compatibilité) couvert de la license GNU/
GPL.

 (normes W3C)
 (non-obstructif,
l’utilisation d’AJAx appor-
tant plus d’intuitivité et de
convivialité à un outil)



Notes
 le
système sh in a pan sera
codé de manière a être fa-
cilement adaptable en de
multiples langues. Lors de
la sortie du projet, la langue
française sera la seule dispo-
nible, mais la langue anglai-
se rejoindra très vite cette
première.
 un système
basé sur la technologie rss

4
Annexe 2 : Code de l’objet Element

<?php
class Element {
// Constructeur
function Element($table=NULL, $id=NULL) {
if( !empty($table) && is_numeric($id) ) {
$this->o_table = BDD_PREFIX.$table;
$this->o_tableName = $table;
$this->o_idPrefix = substr($table, 0, -1);
$this->o_id = $id;
$this->load($id);
}
} // Element

// fonction load, charge un rang de la db (identifié par un id) dans l’objet
function load($id) {
if( !$id ) return false;
$request = ”SELECT * FROM ”.$this->o_table.” WHERE ”.$this->o_idPrefix.”_id =
‘”.$id.”’”;
$this->o_loadRequest = $request;
$data = mysql_query($request);
if( !$data ) { return false; }
while( $current = @mysql_fetch_assoc($data) ) {
$array[] = array_map(”stripslashes”, $current);
}
// variables de l’utilisateur
foreach($array[0] as $key=>$value) {
$this->$key = $value;
}
$this->o_id = $id;
} // load


(suite du code page suivante)

// fonction save, sauve le contenu de l’objet dans la db


function save() {
// récupération des paramètres de l’objet
$properties = get_object_vars($this);
foreach($properties as $key=>$value) {
if( substr($key, 0, 2) != ”o_” ) {
if( strlen($value) == strlen( addslashes($value) ) ) {
$values[] = ”’”.$value.”’”;
} else {
$values[] = ”’”.addslashes($value).”’”;
}
$keys[] = $key;
}
}
$keysForRequest = implode(”, ”, $keys);
$valuesForRequest = implode(”, ”, $values);
// construction de la requête
$request = ”REPLACE INTO ”.$this->o_table.” (”.$keysForRequest.”) VALUES
(”.$valuesForRequest.”)”;
$this->o_saveRequest = $request;
return mysql_query( $request );
} // save

// fonction delete, efface de la db l’objet en cours


function delete() {
$request = ”DELETE FROM ”.$this->o_table.” WHERE ”.$this->o_idPrefix.”_id = ‘”.$this-
>o_id.”’”;
return mysql_query( $request );
} // delete
} // class Element
?>
Annexe 3 : Code de l’objet Config

<?php
class Config {
// Constructeur
function Config() {
$this->o_table = BDD_PREFIX.»config»;
$configData = Multiple::parseRequest(«SELECT * FROM «.$this->o_table.»»);
foreach($configData as $param) {
$this->$param[«config_key»] = $param[«config_value»];
}
} // Config

// fonction save, sauve le contenu de l’objet dans la db
function save() {
// récupération des paramètres de l’objet
$properties = get_object_vars($this);
foreach($properties as $key=>$value) {
if( substr($key, 0, 2) != «o_» ) {
$values[] = «(‘».$key.»’, ‘».$value.»’)»;
}
}
$valuesForRequest = implode(«, «, $values);
// construction de la requête
$request = «REPLACE INTO «.$this->o_table.» (config_key, config_value) VALUES
«.$valuesForRequest.»»;
return mysql_query( $request );
} // save

// fonction saveAndReload, sauve la config et la recharge


function saveAndReload() {
if( $this->save() ) {
$configData = Multiple::parseRequest(«SELECT * FROM «.$this->o_table.»»);
foreach($configData as $param) {
$this->$param[«config_key»] = $param[«config_value»];
}
return true;
}
}
} // class Config
?>
Annexe 4 : Code de l’objet Multiple

<?php
class Multiple {
// pas de constructeur
// ----------------------------------------
// --- fonctions de requêtes

// getTagboardMessages
function getTagboardMessages($begin=0, $limit=50) {
$request = ”SELECT tb.* , usr.surnom AS msg_user FROM ”.BDD_PREFIX.”boardmsgs tb LEFT
JOIN ”.BDD_PREFIX.”users usr USING ( user_id ) WHERE msg_type = ‘msg’ ORDER BY tb.msg_date DESC
LIMIT ”.$begin.”, ”.$limit.””;
return Multiple::parseRequest($request, true);
} // getTagboardMessages

// getTagboardNotifs
function getTagboardNotifs($begin=0, $limit=200) {
$request = ”SELECT tb.* , usr.surnom AS msg_user FROM ”.BDD_PREFIX.”boardmsgs tb LEFT
JOIN ”.BDD_PREFIX.”users usr USING ( user_id ) WHERE msg_type <> ‘msg’ ORDER BY tb.msg_date DESC
LIMIT «.$begin.”, ”.$limit.””;
return Multiple::parseRequest($request, true);
} // getTagboardNotifs

// getMembers
function getMembers() {
$request = ”SELECT usr.* FROM ”.BDD_PREFIX.”users usr WHERE group_members = 1 ORDER
BY usr.display_order ASC”;
return Multiple::parseRequest($request, true);
} // getMembers

// getUsers
function getUsers() {
$request = ”SELECT usr.* FROM ”.BDD_PREFIX.”users usr WHERE group_members = 0 ORDER
BY usr.display_order ASC”;
return Multiple::parseRequest($request, true);
} // getUsers


// getLyrics
function getLyrics() {
$request = ”SELECT * FROM ”.BDD_PREFIX.”lyrics ORDER BY lyric_display_order ASC”;
return Multiple::parseRequest($request, true);
} // getLyrics

// getDiscs
function getDiscs() {
$request = ”SELECT dsc.*, COUNT(sng.song_id) AS nbrSongs FROM ”.BDD_PREFIX.”discs dsc
LEFT JOIN ”.BDD_PREFIX.”songs sng ON( dsc.disc_id = sng.song_disc_id ) GROUP BY dsc.disc_id ORDER
BY disc_display_order ASC”;
return Multiple::parseRequest($request, true);
} // getDiscs

// getSongs
function getSongs( $discId ) {
$request = ”SELECT * FROM ”.BDD_PREFIX.”songs WHERE ‘”.$discId.”’ = song_disc_id
ORDER BY song_disc_cd_order ASC, song_disc_order ASC”;
$songs = Multiple::parseRequest($request, true);
if( $songs ) {
$newSongs = array();
foreach( $songs as $sng ) {
$newSongs[ $sng[”song_disc_cd_order”] ][ $sng[”song_disc_order”] ] =
$sng;
}
}
return $newSongs;
} // getSongs

// getSongByTrackNum
function getSongByTrackNum( $discId, $discNumber, $songNumber ) {
$request = ”SELECT song_id FROM ”.BDD_PREFIX.”songs WHERE ‘”.$discId.”’ = song_disc_
id AND song_disc_cd_order = ‘”.$discNumber.”’ AND song_disc_order = ‘”.$songNumber.”’ LIMIT 0,1”;
$data = Multiple::parseRequest($request);
return new Element(”songs”, intval( $data[”song_id”] ));
} // getSongByTrackNum


// getAudio
function getAudio() {
$request = ”SELECT * FROM ”.BDD_PREFIX.”medias ORDER BY media_display_order ASC”;
return Multiple::parseRequest($request, true);
} // getAudio
// getVideo
function getVideo() {
$request = ”SELECT * FROM ”.BDD_PREFIX.”videos ORDER BY video_display_order ASC”;
return Multiple::parseRequest($request, true);
} // getVideo

// getNews
function getNews() {
$request = ”SELECT * FROM ”.BDD_PREFIX.”news ORDER BY new_date DESC”;
return Multiple::parseRequest($request, true);
} // getNews

// getEvents
function getEvents() {
$request = ”SELECT * FROM ”.BDD_PREFIX.”events ORDER BY event_date DESC”;
return Multiple::parseRequest($request, true);
} // getEvents

// getLivre
function getLivre() {
$request = ”SELECT * FROM ”.BDD_PREFIX.”livres ORDER BY livre_date DESC”;
return Multiple::parseRequest($request, true);
} // getLivre

// getContacts
function getContacts() {
$request = ”SELECT * FROM ”.BDD_PREFIX.”contacts ORDER BY contact_date DESC”;
return Multiple::parseRequest($request, true);
} // getContacts


// getLinks
function getLinks() {
$request = ”SELECT * FROM ”.BDD_PREFIX.”links ORDER BY link_display_order ASC”;
return Multiple::parseRequest($request, true);
} // getLinks

// getArticles
function getArticles( $byCat=false ) {
if( $byCat ) {
$filter = ”WHERE art.categorie_id = ‘”.$byCat.”’”;
}
$request = ”SELECT art.*, COUNT(com.comment_id) AS comNbr, usr.surnom AS author,
cat.categorie_name FROM ”.BDD_PREFIX.”articles art LEFT JOIN ”.BDD_PREFIX.”comments com ON com.
article_id = art.article_id LEFT JOIN ”.BDD_PREFIX.”users usr ON usr.user_id = art.article_author
LEFT JOIN ”.BDD_PREFIX.”categories cat ON cat.categorie_id = art.categorie_id ”.$filter.” GROUP BY
art.article_id ORDER BY article_date DESC”;
return Multiple::parseRequest($request, true);
} // getArticles

// getCategories
function getCategories() {
$request = ”SELECT cat.*, COUNT(art.article_id) as artNbr FROM ”.BDD_
PREFIX.”categories cat LEFT JOIN ”.BDD_PREFIX.”articles art USING(categorie_id) GROUP BY
categorie_id ORDER BY categorie_name ASC”;
return Multiple::parseRequest($request, true);
} // getCategories

// getComments
function getComments( $art=false ) {
if( is_numeric($art) ) {
$filter = ”WHERE article_id = ‘”.intval($art).”’”;
}
$request = ”SELECT * FROM «.BDD_PREFIX.”comments ”.$filter.” ORDER BY comment_date
DESC”;
return Multiple::parseRequest($request, true);
} // getComments


// getFolders
function getFolders( $public=false ) {
if( $public ) {
$filter = ”WHERE folder_private = 0”;
}
$request = ”SELECT fld.*, COUNT(pto.photo_id) AS nbrPhotos FROM ”.BDD_PREFIX.”folders
fld LEFT JOIN ”.BDD_PREFIX.”photos pto USING(folder_id) ”.$filter.” GROUP BY folder_id ORDER BY
folder_private DESC, folder_display_order ASC”;
return Multiple::parseRequest($request, true);
} // getFolders

// getPhotos
function getPhotos( $id ) {
$request = ”SELECT * FROM ”.BDD_PREFIX.”photos WHERE folder_id = ‘”.$id.”’ ORDER BY
photo_display_order ASC”;
return Multiple::parseRequest($request, true);
} // getPhotos

(suite du code à la page suivante)

// ----------------------------------------
// --- fonctions utilitaires

// parseRequest, effectue la requête et la pré-traite, puis retourne le résultat


function parseRequest($request, $skipUnique=false) {
$data = mysql_query($request);
if( $data == false ) {
return false;
}
while( $current = @mysql_fetch_assoc($data) ) {
$array[] = array_map(”stripslashes”, $current);
}

if( $skipUnique && count($array) != 0 ) {
return $array;
}

if( count($array) > 1 ) {


return $array;
} elseif( count($array) > 0 ) {
return $array[0];
} else {
return false;
}
} // parseRequest

// getError, récupère la dernière erreur rencontrée


function getError() {
if (mysql_error() != ‘’) {
echo ‘<h2>Mysql Error (‘.mysql_errno().’) : ‘.mysql_error().’</h2>’;
exit;
} else {
echo ‘<h2>Aucune erreur mysql rencontr&eacute;e.</h2>’;
}
} // getError
} // class Multiple
?>
Annexe 5 : Code d’un module typique : le module admin_news

<?php
// inclusion noyau
require_once(”../core/core_admin.php”);
session_start();

// vérification utilisateur actuel


User::verifyUser();

if( isset( $_GET[”action”] ) ) {


$smarty->assign(”action”, $_GET[”action”]);
} else {
$_GET[”action”] = ”list”;
}

// action à effectuer
switch( $_GET[”action”] ) {
case ”confirmDelete”:
$delNews = new Element(”news”, intval( $_POST[”new_id”] ) );
if( isset( $_POST[”reset”] ) ) {
$smarty->assign(”news”, Multiple::getNews() );
$smarty->assign(”action”, ”list”);
break;
}
if( !$delNews->delete() ) {
$smarty->assign(”error”, ”cantSuppressNews”);
}
$smarty->assign(”news”, Multiple::getNews() );
$smarty->assign(”action”, ”list”);
break;
case ”delete”:
$delNews = new Element(”news”, intval($_GET[”id”]) );
if( !$delNews ) {
$smarty->assign(”error”, ”news_dontExists”);
$smarty->assign(”news”, Multiple::getNews() );
$smarty->assign(”action”, ”list”);
} else {
$smarty->assign(”newsData”, $delNews);
$smarty->assign(”action”, ”delete”);
}
break;

case ”addSubmit”:
if( empty($_POST[”new_title”]) || empty($_POST[”new_description”]) ) {
$smarty->assign(”error”, ”emptyForm”);
$smarty->assign(”action”, ”add”);
} else {
$tempNews = new Element();
$tempNews->o_table = BDD_PREFIX.”news”;
$tempNews->o_idPrefix = ”new”;
if( !$tempNews ) {
$smarty->assign(”error”, ”saveError”);
$smarty->assign(”news”, Multiple::getNews() );
$smarty->assign(”action”, ”list”);
} else {
$tempNews->new_title = str_entities( $_POST[”new_title”] );
$tempNews->new_date = ””.intval( $_POST[”new_date_Year”] ).”-
”.intval( $_POST[”new_date_Month”] ).”-”.intval( $_POST[”new_date_Day”] );
$tempNews->new_date_expiration = ””.intval( $_POST[”new_date_
expiration_Year”] ).”-”.intval( $_POST[”new_date_expiration_Month”] ).”-”.intval( $_POST[”new_
date_expiration_Day”] );
$tempNews->new_description = str_entities( $_POST[”new_description”] );
if( !$tempNews->save() ) {
$smarty->assign(”error”, ”saveError”);
$smarty->assign(”newsData”, $tempNews );
$smarty->assign(”action”, ”edit”);
} else {
$smarty->assign(”news”, Multiple::getNews() );
$smarty->assign(”action”, ”list”);
}
}
}
break;
case ”add”:
$smarty->assign(”action”, ”add”);
break;

(suite du code page suivante)


case ”editSubmit”:
$tempNews = new Element(”news”, intval( $_POST[”new_id”] ) );
if( !$tempNews ) {
$smarty->assign(”error”, ”saveError”);
$smarty->assign(”newsData”, $tempNews );
$smarty->assign(”action”, ”edit”);
} else {
$tempNews->new_title = str_entities( $_POST[”new_title”] );
$tempNews->new_date = ”.intval( $_POST[”new_date_Year”] ).”-”.intval(
$_POST[”new_date_Month”] ).”-”.intval( $_POST[”new_date_Day”] );
$tempNews->new_date_expiration = ””.intval( $_POST[”new_date_expiration_
Year”] ).”-”.intval( $_POST[”new_date_expiration_Month”] ).”-”.intval( $_POST[”new_date_
expiration_Day”] );
$tempNews->new_description = str_entities( $_POST[”new_description”] );
if( !$tempNews->save() ) {
$smarty->assign(”error”, ”saveError”);
$smarty->assign(”newsData”, $tempNews );
$smarty->assign(”action”, ”edit”);
} else {
$smarty->assign(”news”, Multiple::getNews() );
$smarty->assign(”action”, ”list”);
}
}
break;
case ”edit”:
$tempNews = new Element(”news”, intval($_GET[”id”]) );
if( !$tempNews ) {
$smarty->assign(”news”, Multiple::getNews() );
$smarty->assign(”action”, ”list”);
} else {
$smarty->assign(”newsData”, $tempNews );
$smarty->assign(”action”, ”edit”);
}
break;

(suite du code page suivante)


case ”confirmToggleAllVisibility”:
if( isset( $_POST[”confirm”] ) ) {
$config->visible_news = intval( !$config->visible_news );
$config->save();
}
$smarty->assign(”news”, Multiple::getNews() );
$smarty->assign(”action», ”list”);
break;
case ”toggleAllVisibility”:
if( $config->visible_news ) {
$smarty->assign(”action”, ”hideAll”);
} else {
$smarty->assign(”action”, ”showAll”);
}
break;
case ”toggleVisibility”:
if( is_numeric($_GET[”id”]) ) {
$tempNews = new Element(”news”, intval( $_GET[”id”] ));
$tempNews->new_visible = intval(!$tempNews->new_visible);
$tempNews->save();
unset( $_GET );
$smarty->assign(”news”, Multiple::getNews() );
$smarty->assign(”action”, ”list”);
}
break;
default:
$smarty->assign(”news”, Multiple::getNews() );
$smarty->assign(”action”, ”list”);
break;
}

// affichage
$smarty->assign(”PageScriptFile”, ”admin_news”);
$smarty->assign(”activePage”, ”site”);
$smarty->assign(”activeUnder”, ”news”);
$smarty->display(”admin_news.tpl”);
?>
Annexe 6 : Captures d’écran

Les captures d’écran ont été réalisées avec le navigateur Firefox 2.0.0.3 sur Mac
OS 10.4.9

Capture n°1
Chat privé et son formulaire.
Capture n°2
Module de gestion des
membres
Capture n°3
Module des photos :
organisation des photos
Capture n°4
Edition d’une vidéo importée
de YouTube
ish in a pan est un CMS (Content Ma- ish in a pan is a CMS (Content Mana-
nagement System - Système de gestion gement System) which easily allows to
de contenu) qui permet de facilement create and to keep updated a website
créer et maintenir à jour un site dédié dedicated to a music band with all the
à un groupe de musique, avec tous les appropriated functions: media, journal,
fonctionnalités appropriées : gestion tour dates management and so on.
de médias, d’un agenda, d’un livre d’or This project, which was first created for
et bien d’autres choses. an egocentric purpose (the manage-
Ce projet, qui a la base était une pro- ment of my band website), slowly turns
duction égoïste et destinée à ne servir to become an open and online project
qu’à un seul site et un seul groupe de so that all bands could use it freely wi-
musique (le mien), s’est doucement thout charges. The main goal is to help
changé en un projet ouvert et destiné those bands which didn’t have time or
à être publié sur internet, pour être uti- skills enough to manage their music,
lisée de manière libre et gratuite par their members and their website in the
tous les groupes en manque de temps same time.
et de compétences pour pouvoir se do- From the hook to the plate the docu-
ter d’un site web facile à maintenir en ment you are holding in your hands is
vie en même temps que le groupe dont going to tell you everything about this
il parle. weird fish which has been frying slowly
De la préparation du hameçon à la fina- in its pan from nearly one year...
lisation du projet, le document que vous
tenez dans les mains vous dira tout sur
cet étrange poisson qui frit doucement
dans sa poêle depuis bientôt un an...

Вам также может понравиться