Le carnet de bord du webmaster
Passez votre chemin c'est mes notes ici...
07 | 31 | 01 | 19 | 20 | 04 | 32 | 10 | 11 | 21 | 34 | 16 | 36 | 17 | 30 | 18 | 28 | 14 | 29 | 08 | 06 | 03 | 27 | 25 | 22 | 05 | 09 | 02 | 13 | 15 | 12 | 23 | 26 | 24 | 33
**** 16-05-2010
05h34 : start
Bon, sys admin: mon manitou
super :
http://www.kingcomputerservices.com/unix_101/shell_programming_and_simple_menus_part_1.htm
08h40 : voici mon architecture qui fonctionne, qui permet de faire un programme bash avec menu et sous menus imbriqués.
Il y 2 scripts : manitou.sh et manitou-intro.sh
manitou.sh
#!/bin/bash
#GLOBAL
export SCRIPTFOLDER="/Volumes/Macintosh HD 2/web/projets/toursannonces/ta5/scripts/manitou-helpers"
export MSG_BADCHOICE_DEFAULT="Je ne comprends pas ce choix. Veuillez recommencer."
export MSG_PLEASESELECT_DEFAULT="Faîtes votre choix puis appuyez sur Entrée"
export MSG_YOUR_CHOICE="Que puis-je faire pour vous ?"
export SPACING="" # SPACING="\t\t\t"
#HANDFUL
#use following two lines to create nice subprogramms manitouintros
manitouintroParam="########### #########################"
manitouintroParam="########### Your subtitle here #########################"
#SPECIFIC - You may want to copy paste from this line to create new child scripts
manitouintro()
{
#"$SCRIPTFOLDER/manitou-intro.sh" "$manitouintroParam"
"$SCRIPTFOLDER/manitou-intro.sh"
}
MSG=
amenu="a. Download les fichiers du serveur xxx vers le poste local (fichiers web + fichier yyy.sql)" ;
bmenu="b. Set Standard Defaults " ;
cmenu="c. Display Directory Listing " ;
dmenu="d. Payroll Menu " ;
emenu=" " ;
fmenu=" " ;
gmenu=" " ;
hmenu=" " ;
imenu=" " ;
jmenu=" " ;
kmenu=" " ;
lmenu=" " ;
apick () {
"$SCRIPTFOLDER/rsync-xxx-local.sh";
}
bpick () { echo kop ; }
cpick () { ls -l| more ; echo Press Enter ; read DUMMY ; }
dpick () { payroll.mnu ; }
epick () { badchoice ; }
fpick () { badchoice ; }
gpick () { badchoice ; }
hpick () { badchoice ; }
ipick () { badchoice ; }
jpick () { badchoice ; }
kpick () { badchoice ; }
lpick () { badchoice ; }
badchoice () { MSG="$MSG_BADCHOICE_DEFAULT" ; }
themenu () {
# clear the screen
manitouintro
echo
echo -e $SPACING $MSG_YOUR_CHOICE
echo
echo -e $SPACING $amenu
echo -e $SPACING $bmenu
echo -e $SPACING $cmenu
echo -e $SPACING $dmenu
echo -e $SPACING $emenu
echo -e $SPACING $fmenu
echo -e $SPACING $gmenu
echo -e $SPACING $hmenu
echo -e $SPACING $imenu
echo -e $SPACING $jmenu
echo -e $SPACING $kmenu
echo -e $SPACING $lmenu
echo -e $SPACING x. Exit
echo
echo $MSG
echo
echo "$MSG_PLEASESELECT_DEFAULT" ;
}
while true
do
themenu
read answer
MSG=
case $answer in
a|A) apick;;
b|B) bpick;;
c|C) cpick;;
d|D) dpick;;
e|E) epick;;
f|F) fpick;;
g|G) gpick;;
h|H) hpick;;
i|I) ipick;;
j|J) jpick;;
k|K) kpick;;
l|L) lpick;;
x|X) break;;
*) badchoice;;
esac
done
et manitou-intro.sh
#!/bin/bash
#manitou-intro.sh
clear
echo `date`
echo "##############################################################################"
echo "##############################################################################"
echo "##############################################################################"
echo "########### THE BIG MANITOU SCRIPT #########################"
echo "${1:-########### #########################}"
echo "########### by ling #########################"
echo "##############################################################################"
echo "##############################################################################"
echo "##############################################################################"
exit 0
Encore beaucoup de mal avec la syntaxe basique… je galère…
09h28 : Tours annonces
10h40 : Mon objet est fini, je suis particulièrement de sa propreté.
L'objet
Tan_Private_NewsLetterCreator
possède un fils :
Tan_Private_NewsLetterCreator_Evolution
C'est très simple à décrire :
A son instanciation,
Tan_Private_NewsLetterCreator_Evolution reçoit un tableau de configuration en paramètre,
puis prend les variables dont il a besoin pour se construire,
puis fait appel à la méthode _setup
private function _setup() {
$this->setSeparator();
$this->setContentHead();
$this->setIntroText();
$this->setChangeLogList();
$this->setContentEnd();
}
puis il appelle son parent en lui transmettant le tableau de configuration.
Tan_Private_NewsLetterCreator, de la même manière,
prend les variables du tableau de configuration dont il a besoin pour se construire,
puis fait appel à sa propre méthode _setup
private function _setup() {
if (!file_exists(dirname($this->destination))) {
throw new Ling_Exception("Le répertoire ". $this->destination ." n'existe pas, vous devez le créer!!!");
}
$this->setHtmlTitle();
$this->setHtmlHeadStyle();
$this->setHtmlHead();
$this->setHtmlContent();
$this->setHtmlBottom();
}
Toutes ces fonctions de setup ( $this->setHtmlTitle();
$this->setHtmlHeadStyle();
$this->setHtmlHead();
$this->setHtmlContent();
$this->setHtmlBottom();)
sont overridées par
Tan_Private_NewsLetterCreator_Evolution
ce qui bien évidemment lui permet de se distinguer de son parent.
Enfin, la méthode du parent permet de créer le fichier newsletter à l'endroit indiqué par le tableau de configuration.
public function createHTML() {
ob_start();
echo $this->getHtmlHead();
echo $this->getHtmlContent();
echo $this->getHtmlBottom();
$content = ob_get_clean();
if (true === $this->debug) {
echo $content;
}
file_put_contents($this->destination, $content);
}
A part les méthodes qui contiennent du texte, car dans l'automatisation d'une newsletter,
il y a fatalement du texte,
chacune des méthodes créées ne contient pas plus de (au jugé) 20 lignes.
C'est certainement la première fois que je crée un système en objet qui me semble cohérent par rapport aux contraintes
qui lui sont affligées.
Kool.
Lentement mais sûrement.
Passons maintenant à la phase de désinscription de l'utilisateur.
L'utilisateur a besoin d'un bouton à activer pour se désinscrire.
Ce bouton sera accessible par son compte, dans la section profil.
Note, optimiser son temps de travail oui, mais c'est à dire aussi optimiser l'optimisation.
C'est à dire ne pas suroptimiser ce qui est déjà optimisé, mais optimiser ce qui est le moins optimisé.
Ne soyons pas pessimiste, ça devrait être faisable.
sch-patch16mai.png
11h46 : pfff.
J'étais en train de penser à un truc :
le tableau que j'ai fait hier, pourquoi je ne l'ai pas directement formaté au format sql ou au moins php,
car tant qu'à l'écrire autant l'écrire au bon endroit.
Ca m'évite de faire un programme qui reconvertit après. Pourquoi faire ?
Donc ce truc là, ::
Un système de republication pour les utilisateurs méritants.
++
Possibilité pour les utilisateurs de republier leurs annonces (repasser leurs annonces en tête de liste pour un coût de
{CONST_TAO_COUT_REPUBLICATION_ANNONCE} {CONST_TAO})
++
1
*********************************
Ajout du champ siret sur le formulaire d'ajout de commerce
++
++
46
*********************************
Ajout de boutons de navigation sur l'espace perso des commerces
++
++
7
*********************************
Amélioration du système de commentaires dans la partie évolution
++
Le système permet la possibilité de mettre un commentaire à gauche ou à droite, et lorsque c'est le webmaster qui parle,
un cadrage spécial est utilisé.
++
28
*********************************
Ajout d'un style d'affichage: grid, pour les listes d'annonces
++
++
8
*********************************
Ajout d'un loader ajax pour la plupart des formulaires du site
++
++
27
*********************************
Amélioration du formulaire d'inscription
++
Une requête ajax est faite et permet d'indiquer en temps réél la disponibilité d'un pseudo.
Un test simple est effectué sur le mot de passe afin de donner une indication sur sa sécurité
++
29
*********************************
Ajout de la catégorie : projets
++
++
24
*********************************
Création du système d'alerte sur les annonces
++
L'utilisateur peut désormais placer des alertes sur des annonces,
ces alerte arrivent dans ses mails et dans son compte {CONST_WEBSITE_TITLE_DEFAULT}.
++
23
*********************************
Ajout d'une entrée dans la FAQ : les constantes système
++
++
19
*********************************
Ajout d'une vidéo dans la FAQ pour l'entrée : comment inscrire gratuitement mon commerce ?
++
++
9
*********************************
Ajout d'un logo pour matérialiser le fait que le site est en phase d'évolution
++
++
18
*********************************
Création d'un système d'alerte sur les promos d'un commerçant
++
L'utilisateur peut s'inscrire au flux de données "promo" d'un commerçant particulier par le biais
du système d'alerte.
Lorsqu'il le fait, il reçoit instantanément par mail et dans son compte {CONST_WEBSITE_TITLE_DEFAULT} les promos du commerçant en question.
++
20
*********************************
Amélioration de l'espace perso du commerçant pour les possesseurs du compte vendeur
++
Le commerçant qui possède un compte vendeur peut créer autant de "blocs" qu'il le souhaite dans la section infos
de son espace perso. Un gestionnaire de médias est à sa disposition qui lui permet de gérer un espace disque sur {CONST_WEBSITE_TITLE_DEFAULT}.
Le poids de maximum autorisé par compte est défini ailleurs. Le formulaire d'ajout de "blocs info" utilise ce gestionnaire de médias.
++
21
*********************************
Ajout de la section biographie sur le profil d'un utilisateur
++
L'utilisateur peut ajouter sa biographie par l'intermédiaire de son compte.
Si la biographie est créée, elle s'affiche sur le site, sinon, le système n'affiche rien.
++
22
*********************************
Développement de la partie rencontres
++
La catégorie rencontres est mise en avant sur le site (ajout d'un icône dans le iconsmenu), et gestion d'un popup de warning
pour alerter que du contenu choquant pourra être diffusé dans cette section.
++
25
*********************************
Modification du mécanisme de tri par prix pour les annonces
++
Les annonces sans prix ne sont plus prises en compte lors de l'affichage d'une liste d'annonces triée par prix croissant.
++
32
le plus direct c'est de l'écrire direct sous forme de patch sql , mais je vais faire sous forme de tableau php car plus pratique en cas de modif.
et en ce moment, je change tout le temps…
Mouai, bof, non plus, là ça m'énerve je refais le même travail plusieurs fois, le mieux c'est le formulaire finalement.
12h25 : ok pour la désinscription,
et maintenant donc, le formulaire d'admin pour rentrer les changelogs "à la main".
13h musique
14h tours annonces
Il faut que je récupère mon générateur de formulaire sur mon vieux pc, en attendant, celui là, je le fais à la main;
15h40 : ouai, mais il y a des soucis de compabilité, tant pis.
Une fois les formulaires créés, il m'a fallu à peu près 5 minutes pour insérer les données.
Pas très long, mais très chiant.
Essayons de générer la newsletter.
15h43 : top ca y est. kool
Ok, et maintenant comment je ferais pour envoyer la newsletter ?
(je me rappelle déjà plus)
Il faut déjà que je choisisses le groupe de personnes à qui l'envoyer et ensuite,
ah oui, j'ai un petit script à retaper…
Et avant que j'oublie, voici le schéma pour mes newsletter.
evolutionmodel.png
16h20 : le système est en place,
en fait j'ai juste adapté pour l'instant.
Mais je ne reçois pas le mail, peut être que c'est parce que je suis en local.
Pour ne pas trop perdre de temps,
je vais passer à la suite directement, je restesterai au moment voulu sur le serveur
en prod.
Republication automatique des annonces
Faire un système de republication automatique des annonces,
que les utilisateurs peuvent choisir d'activer ou non.
En gros, au bout du temps prévu,
au moment où le système va faire passer l'annonce à l'état effacée,
il regarde le règlage de l'utilisateur : relance automatique oui ou non.
Si c'est oui il republie, si c'est non, il fait ce qu'il a à faire.
17h27 : ok pour le roulement,
j'avoue avoir flippé de m'être gourré au niveau de la requête de relance,
mais c'était bon, rien d'anormal, à part le fait que j'avais oublié de filtrer les statuts
de l'annonce, ce qui avait un leger impact au niveau des performances, mais maintenant c'est
réparé.
Reste le réglage à mettre dans le compte utilisateur;
17h47 ok,
j'en ai profité pour corriger une erreur de distraction mortelle au niveau de la réception
ou pas de la newsletter evolution par utilisateur (j'avais tout simplement oublié de faire le filtrage au niveau
de la requête.)
Et j'ai également réplacé les propriétés de configuration pour la newsletter dans les préférences de l'utilisateur.
Je les avais mises dans un objet Tan_Private_Newsletter, n'importe quoi…
Pour résumer le système donc,
si l'utilisateur a dit:
oui : repasser automatiquement mes vieilles annonces en tête de liste :
alors ses annonces, au moment de l'expiration, au lieu d'expirer se republient;
Si il a dit non, il recevra le mail de relance et si il ne relance pas l'annonce expirera définitivement;
J'ai bien fait d'écrire ces lignes car je me rends compte que j'ai encore fait une boulette au niveau
de la logique business:
si l'utilisateur a choisi oui, alors il ne doit pas recevoir le mail de relance non plus.
17h52
Ptite correction…
Ah ben non c'était déjà fait…
Bon, la suite;..
TAO : système de remise de cadeau à améliorer
Cadeau TAO
L'identifiant unique à mettre à jour pour éviter toute gruge...
attribuer l'identifiant à un pseudo utilisateur.
Ouai, alors logiquement il doit yavoir un code qqpart qui est généré lorsqu'un commerçant veut faire
un cadeau par l'intermédiaire du site;
Ce code permet à l'utilisateur unique qui en bénéficie de prouver son identité au moment où il va chercher physiquement
son cadeau.
Même si c'est pour l'instant un système que personne n'utilise et donc qu'il n'y a pas de gruge pour le moment
(hey pas con),
je vais quand même sécuriser un peu le périmètre car actuellement,
le code est simplement un code choisi par le commerçant pour un cadeau donné.
Imaginons que je m'appelle X, et j'ai l'esprit tordu;
Le commerçant Y fait un cadeau via Tours annonces.
Je l'achète et donc je choppe le code;
Avec le code je le file à tous mes potes, disons Z et B.
Vous me direz que le commerçant attribue un code par cadeau, donc est-ce vraiment grave…
18h sport
19h Joomla
21h Maya
Divertissement …
23h17 : Tours annonces
Bon, qu'est ce qu'il faut faire ?
Ah oui, les codes …
Ben en fait, c'était de la parano non,
si le gars arrive avec son code, on lui donne un cadeau, si un deuxième gars se pointe avec le même code, c'est
que c'est une arnarque.
C'est pas vraiment un problème de code, c'est plutôt …
un problème de bon sens…
Bref, celle là était déjà résolue en fait, suivant.;.
Je viens de m'apercevoir
que les catégories que j'ai faites pour rencontre n'apparaissent pas dans le formulaire,
un peu bête…
bon…
pour l'instant je les basculerai manuellement si je juge une annonce trop choquante,
mais en fait même une annonce choquante pour l'instant apparaîtra sur la page d'accueil,
je n'ai fait un filtre que sur les listes.
Donc il faudrait faire le filtre sur la page d'accueil, faisons cela tout de suite;..
23h32 : le filtrage sur la page d'accueil est opé;
La suite…
Commerce : stats
Commerce : stats publiques
Donner la possibilité au commerçant de choisir d'afficher ses stats publiquement ou pas.
Bah, juste un champ en plus dans la table utilisateur_tan
Pas besoin de faire une table exprès pour les commerçants, je pense,
vu que potentiellement, tout utilisateur peut être commerçant.
ann_ : un setting concernant les annonces
com_ : un setting concernant un commerce
Donc là faudrait rajouter com_afficher_stat
et les constantes qui posent le système :
Tan_Kustom_UtilisateurTan
const COMMERCE_AFFICHER_STATISTIQUES_OUI = '1';
const COMMERCE_AFFICHER_STATISTIQUES_NON = '0';
le nouveau schéma sql
sch-utilisateurtan.png
Par défaut, tous les commerces auront leurs stats affichées publiquement, car c'est le cas
actuellement.
Si ils cochent l'option non, les stats ne seront plus accessibles, sauf depuis leur compte.
Non, en fait, je pense que le mieux, c'est que le commerçant ait un accès public depuis son compte.
Si il met l'option à non, cela désactive simplement l'affichage sur le site, pour tout le monde.
00h13 : le système de désactivation des stats est opé.
Reste à refaire une page permettant de visionner ses stats pour un commerce.
00h23 : ok, c'est opé.
J'ai réutilisé le même script d'affichage, en le dérivant,
ça tire légèrement sur la propreté, mais bon,
j'évite de dupliquer et
ça fait tellement gagner de temps.
L'idéal en réalité aurait été d'encapsuler la logique d'affichage du script dans un objet (ah toujours les objets…)
Finalement, je crois que je vais tout refaire en objet, enfin non c'est lent,
mais les parties clés…
Quand j'aurais le temps, ce qui n'est absolument pas le cas là.
Je pense que je vais faire la mise à jour maintenant,
mais juste par curiosité, voyons le tâche qui nous attend par la suite.
Navigation annonce
Ajouter une quickpage nav :
une petite boîte dans laquelle l'utilisateur tape directement le numéro
de la page sur laquelle il souhaite se rendre.
Ah oui, ça c'est sympa, bon je le ferais demain….
mise à jour...
ok nickel;
00h47
Sinon, dernier truc, cette annonce :
Travesti Ocasionnelle, cherche relation(s) avec Homme(s) 50 ans et + Pour rencontre(s) hebdomadaire.
Petite, Ronde, Sexy aimant lingerie et talons Hauts. Chatain, yeux verts et petites lunettes.
Je fais quoi, c'est hard ?
Il n'y a pas de photo choquante, le titre de l'annonce n'est pas hard, ce n'est qu'en cliquant sur l'annonce
qu'on voit que c'et une annonce "originale".
Pas de mamie choquée au premier abord.
Je n'ai pas envie de brimer plus que ça, ce n'est pas mon rôle.
Je laisse, c'est du soft.
00h53 : pas super en forme,
mais je peux commencer un peu à dégrossir la suite :
Navigation annonce
Ajouter une quickpage nav :
une petite boîte dans laquelle l'utilisateur tape directement le numéro
de la page sur laquelle il souhaite se rendre.
Je vois bien ça comme une modification de liste5,
ca serait plus facile pour moi.
Plutôt que de retaper toutes les occurences, même si il n'y a pas bcp d'occurences, en l'occurence.
Non, je veux pas faire du travail de singouin, je vais rajouter le ptit module,
Quoique, en fait la petite boîte irait bien sur la droite des infos textuelles du moteur de recherche.
Ce qui m'inquiète c'est si l'utilisateur fait une recherche super longue, du coup …
ben en css, si je résouds le conflit;… ?
Bon ça me casse le crâne je verrais ça demain...
PATCH***************************************
Tan_Private_NewsLetter
Tan_Private_NewsLetterCreator
Tan_Private_NewsLetterCreator_Evolution
Tan_Kustom_UtilisateurTan
Y_Tan_Commerce_FetchField
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL';
CREATE TABLE IF NOT EXISTS `tan`.`evolution_changelog` (
`id` INT(11) NOT NULL AUTO_INCREMENT ,
`evolution_version_id` INT(11) NOT NULL ,
`date` DATETIME NOT NULL ,
`titre` VARCHAR(255) NOT NULL ,
`description` TEXT NOT NULL ,
`id_todo_suggestion` INT(11) NOT NULL ,
PRIMARY KEY (`id`) ,
INDEX `fk_evolution_changelog_evolution_version1` (`evolution_version_id` ASC) ,
CONSTRAINT `fk_evolution_changelog_evolution_version1`
FOREIGN KEY (`evolution_version_id` )
REFERENCES `tan`.`evolution_version` (`id` )
ON DELETE CASCADE
ON UPDATE NO ACTION)
ENGINE = InnoDB
DEFAULT CHARACTER SET = latin1
COLLATE = latin1_swedish_ci;
CREATE TABLE IF NOT EXISTS `tan`.`evolution_version` (
`id` INT(11) NOT NULL AUTO_INCREMENT ,
`titre` VARCHAR(255) NOT NULL ,
`commentaire` TEXT NOT NULL ,
`date_debut` DATE NOT NULL ,
`date_fin` DATE NOT NULL ,
`version` VARCHAR(5) NOT NULL ,
PRIMARY KEY (`id`) )
ENGINE = InnoDB
DEFAULT CHARACTER SET = latin1
COLLATE = latin1_swedish_ci;
SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
ALTER TABLE `tan`.`utilisateur_tan` ADD COLUMN `abonne_news_evolution` CHAR(1) NOT NULL AFTER `biographie` ;
ALTER TABLE `tan`.`utilisateur_tan` ADD COLUMN `ann_relance_auto` CHAR(1) NOT NULL AFTER `abonne_news_evolution` ;
ALTER TABLE `tan`.`utilisateur_tan` ADD COLUMN `com_afficher_stat` CHAR(1) NOT NULL AFTER `ann_relance_auto` ;
update utilisateur_tan set abonne_news_evolution='1';
update utilisateur_tan set ann_relance_auto='1';
update utilisateur_tan set com_afficher_stat='1';