ToursAnnonces.fr

Tours annonces est un ensemble de services conçus pour vous faciliter la vie au quotidien : petites annonces, emploi, annuaires, services et bien + ...

Inscrivez-vous Vous êtes nouveau ?
Vous avez un compte ?
Aide

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




AgenceWeb37, agence web de création de site vitrine en Indre et Loire (37)
0.0093259811401367