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
**** 04-05-2010
06h19 : start J'aimerais résoudre ce problème, et passer ma journée à le faire : le problème des alertes. Mais essayons de respecter la discipline, c'est à dire relativiser l'urgence et accorder notre confiance en l'organisation souhaitée par notre esprit abstraitement logique. maintenance tours annonces. Mise à jour d'un script permettant une erreur utilisateur. Mettons en place un script qui m'affiche le style d'affichage qu'utilisent les utilisateurs et dans quelles proportions. prenons le dernier échantillon de la table statistique réflexion interne select * from statistique where uri like '/annonces/liste-annonce%' and ip != '88.191.59.71' ==> 5 811 résultats select * from statistique where uri like '/annonces/liste-annonce%' and uri like '%y=w%' and ip != '88.191.59.71' ==> 5294 select * from statistique where uri like '/annonces/liste-annonce%' and uri like '%y=j%' and ip != '88.191.59.71' ==> 312 select * from statistique where uri like '/annonces/liste-annonce%' and uri like '%y=g%' and ip != '88.191.59.71' ==> 170 A continuer... 07h14 : entraînement sysadmin... 09h30 : tours annonces. donc notre système d'alerte.. Chaque fois qu'un utilisateur poste une annonce, on regarde si il y a des alertes qui correspondent à l'annonce postée, et si c'est le cas on envoie un mail au propriétaire de l'alerte. La technique la plus logique à mon avis, c'est de créer une table alerte qui contient l'ensemble des alertes postées par des utilisateurs. A chaque fois qu'une annonce est postée, elle est comparée à chacune des alertes. Peut être qu'avant de spéculer de nombreuses heures sur la meilleure technique (la plus adaptée), il est préférable de faire un pas concret afin de donner une direction, et matière à réflexion; Nous allons donc commencer par coder le système qui permet de mettre une alerte de type expression : je cherche une culotte. Je fais une alerte sur le mot culotte. Chaque fois qu'une annonce est postée, un script, appelons le "responsable des alertes pour les annonces", ou plus compact : "responsable-alerte-annonce", bref, ce script cherche si l'annonce contient le mot culotte et si c'est le cas inscrit une entrée dans une table alerte_trouvee (ça c'et pour nos statistiques perso) et envoie un notification à celui qui a réclamé l'alerte. La notification = envoi d'un mail (optionnel), envoi d'un message dans le compte de l'utilisateur. Pour les notifications système, on utilisera la fonction envoyer_message_systeme /* Fonction qui envoie une notification système: * * La notification système envoie systèmatiquement un message_système qui est récupérable dans le compte de l'utilisateur. * En outre, si l'utilisateur concerné peut configurer les options de son profil de telle manière à faire ou ne pas faire une redirection supplémentaire du message * vers sa boîte mail personnelle (celle qui est actuellement renseignée sur son compte) * */ Bon maintenant créons les tables... Une table alerte Pour l'instant notre table alerte ne contient qu'un champ expression. sch-alerte.png La table alerte_trouvee aurait pu s'appeler alerte_stat, ce sont des stats, donc pas de liens forts avec alerte. Maintenant pour les tests, il nous importe peu d'avoir un formulaire, nous rentrerons directement les données à la main. Ce que nous voulons voir c'est comment le script responsable-alerte-annonce va faire sa loop... Alors, heureusement qu'on a fait un pas dans le concret, car notre logique nous aurait plantée : en fait ce n'est pas à la sortie du formulaire qu'il faut poster la fonction, mais plutôt au moment où l'annonce est validée. DEJA tu vois… ben oui, si l'annonce est pas validée ça sert à rien de faire une alerte. Bonne nouvelle, ça évite que l'utilisateur s'en prenne plein la gueule ;). J'utiliserai le snippet suivant require_once $pathPrefix . 'fonction/alerte.php'; $aMatches = getAlerteMatchesFromAlerteAnnonceObj($oAlerteAnnonce); sendNotificationFromAlerteMatches($aMatches); Il me reste plus qu'à coder les fonctions... Je place ce snippet en sortie de validation d'une nouvelle annonce. $oAlerteAnnonce est mon objet qui contient les propriétés dont j'ai besoin pour faire mes comparaisons, En l'occurence il contient pour l'instant la propriété id, et expression, qui est en fait une concaténation des champs titre et description de l'annonce. Rien à voir mais ceci peut être intéressant : http://www.discodog.fr/content-spinning.html 12h52 : voici mon code de base : function getAlerteMatchesFromOAlerteAnnonce($oAlerteAnnonce) { $ret = array(); // tableau contenant les entrées de la table alerte qui matchent avec les critères de l'objet AlerteAnnonce $stmt = "select id, expression, utilisateur_id from alerte"; $r = Ling_Sql_Basic::freeFetchAll($stmt, array()); if (!empty($r)) { foreach($r as $row) { /*******************************************************************************/ // Init /*******************************************************************************/ $bExp = false; // boolan expression did match ? extract($row); /*******************************************************************************/ // MATCH EXPRESSION /*******************************************************************************/ if (stristr(supprime_accents($oAlerteAnnonce->expression), supprime_accents($expression)) !== false) { $bExp = true; } /*******************************************************************************/ // Compilation des résultats /*******************************************************************************/ if (true === $bExp) { t("match de expression pour alert n°$id"); $ret[] = $row; } else { t("Aucun résultat avec expr=$expression et l'expression ". $oAlerteAnnonce->expression .""); } } } return $ret; } /* * Envoie des notifications système à tous les utilisateurs qui possèdent une * alerte présente dans le tableau passé en paramètre. */ function sendNotificationFromAlerteMatches($rowsAlerte) { a($rowsAlerte); } Je pense qu'on est parti pour utiliser cette technique, alonzo… Le prochain vrai problème va être au moment de la compilation des résultats. En effet on peut imaginer dès maintenant une interface utilisateur la plus simple possible ******************* formulaire d'alerte ******************* 13h musique 14h tours annonces Avec le formulaire ci-dessous, recevez des alertes mail chaque fois qu'une annonce correspond à vos critères. Remplissez les critères ci-dessous et cliquez sur envoyer pour créer une alerte mail. M'alerter lorsque une annonce contient le mot :_______ ET/OU M'alerter lorsque une annonce est postée dans la catégorie __________ ET/OU M'aleter lorsque une annonce est postée dans la commune __________ ET/OU M'alerter lorsque une annonce est postée avec un prix ET/OU -indifférent ET/OU -compris entre ____ et ______ (Si l'utilisateur choisit catégorie immobilier les champs surface et type de bien apparaissent) (Si l'utilisateur choisit catégorie véhicule le champ marque apparaît) En fait c'est un peu comme le moteur de recherche… Par contre le traitement des données est différent. Comment faire pour savoir si l'utilisateur a choisi le critère mot ET catégorie ou bien mot OU catégorie. Je vois 2 solutions : soit on met un symbole au début de chaque champ, par exemple un "+" ou un "," soit on ajoute un champ dans la table qui contient une chaîne de caractères d'autant de caractères que de critères, chaque caractère symbolisant le comportement à adopter. En fait il faut faire la distinction entre paramètres facultatifs et obligatoires. Non, en fait on va faire plus simple, tous les params sont obligatoires. Si le gars veut un truc complexe il fait plusieurs alertes… du coup c'est que des ET, donc au niveau du script, si c'est rempi, on prend en compte, sinon on ne prend pas en compte. Code time... fac : les alertes mail : il s'agit d'un système qui vous alerte automatiquement (par mail) de la parution d'une annonce correspondant aux critères que vous définissez dans l'alerte. Par exemple, vous pouvez décider d'être alerté lorsque une annonce de la catégorie animaux paraît. Voici mon schéma avec tous les critères actuellement : sch-alerte2.png Et enfin on ajoute le champ statut qui prend en compte l'état actif ou non actif de l'alerte. sch-alerte3.png 16h39 : le script d'alerte me semble correct. 16h59 : interfacage du script pour le placer dans le script de validation d'une annonce. 18h00 : sport 19h : Joomla 21h : Maya 22h46 : mal aux yeux, j'arrête. Concernant l'alerte annonce je pense avoir fini demain. On verra. ************************************************************************ PATCH SQL 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`.`alerte_trouvee` ( `id` INT(11) NOT NULL AUTO_INCREMENT , `date` DATE NOT NULL , `alerte_id` INT(11) NOT NULL , PRIMARY KEY (`id`) ) ENGINE = InnoDB DEFAULT CHARACTER SET = latin1 COLLATE = latin1_swedish_ci; CREATE TABLE IF NOT EXISTS `tan`.`alerte` ( `id` INT(11) NOT NULL AUTO_INCREMENT , `utilisateur_id` INT(11) NOT NULL , `statut` CHAR(1) NOT NULL , `gen_expression` VARCHAR(64) NOT NULL , `gen_commune` INT(11) NOT NULL , `gen_categorie` INT(11) NOT NULL , `gen_primin` INT(11) NOT NULL , `gen_primax` INT(11) NOT NULL , `imm_typ` INT(11) NOT NULL , `imm_surmin` INT(11) NOT NULL , `imm_surmax` INT(11) NOT NULL , `veh_mar` INT(11) NOT NULL , PRIMARY KEY (`id`) , INDEX `fk_alerte_utilisateur1` (`utilisateur_id` ASC) , CONSTRAINT `fk_alerte_utilisateur1` FOREIGN KEY (`utilisateur_id` ) REFERENCES `tan`.`utilisateur` (`id` ) ON DELETE CASCADE ON UPDATE NO ACTION) 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; ********************************************************* Classe : Tan_Private_AlerteAnnonce