001: <?php
002: /*
003: CircaLib.php3 : provide function to perform search on Circa with PHP
004: Copyright 2000 A.Barbet alian@alianwebserver.com.  All rights reserved.
005: 
006: Revision 1.1  2000/11/23 22:51:17  Administrateur
007: addSite.php3
008: 
009: Revision 1.2  2000/10/27 16:01:12  Administrateur
010: - Navigation par categorie
011: - Passer le prefixe en variable globale
012: - Passer la database en variable globale
013: 
014: Revision 1.1  2000/10/22 22:43:47  Administrateur
015: Premiere version fonctionnelle. Supporte:
016: - Requetes booleenes
017: - Affichage par pages de 10 liens
018: 
019: */
020: 
021: /*
022: 
023: Fonction permettant d'effectuer une recherche par mot dans Circa
024: 
025: Paramètres :
026: 
027:  $template : Masque HTML pour le resultat de chaque lien. La liste des variables définies au
028:  moment du eval sont : $indiceG,$titre,$description,$url,$facteur,$last_update,$langue
029: 
030:   Exemple de masque :
031: 
032:   '"<p>$indiceG - <a href=\"$url\">$titre</a> $description<br>
033:    <font class=\"small\"><b>Url:</b> $url <b>Facteur:</b> $facteur
034:    <b>Last update:</b> $last_update </font></p>\n"'
035: 
036:  $mot    : Séquence des mots recherchés tel que tapé par l'utilisateur
037:  first   : Indice du premier site affiché dans le résultat
038:  $id     : Id du site dans lequel effectué la recherche
039:  $langue : Restriction par langue (facultatif)
040:  $Url    : Restriction par url : les url trouvées commenceront par $Url (facultatif)
041:  $create : Restriction par date inscription. Format YYYY-MM-JJ HH:MM:SS (facultatif)
042:  $update : Restriction par date de mise à jour des pages. Format YYYY-MM-JJ HH:MM:SS (facultatif)
043:  $catego : Restriction par categorie (facultatif)
044: 
045: Retourne ($resultat,$links,$indice)
046: 
047:  $resultat : Buffer HTML contenant la liste des sites trouves formaté en fonction
048:              de $template et des mots present dans $mots
049:  $links    : Liens vers les pages suivantes / precedentes
050:  $indice   : Nombre de sites trouves
051: 
052: */
053: 
054: include("foo.php");
055: include_once("bar.php");
056: 
057: function search($template,$word,$first,$idc,$langue,$Url,$create,$update,$categorie)
058:          {
059:          $mots = split( " ", strtolower($word));
060:          $i=0;
061:          # Recherche des requetes booleenes
062:          while( list($key,$valeur) = each ($mots))
063:                 {
064:                 if    ($valeur == '+') {$ind_and[]=$i;} # Reperage de la position des mots 'and'
065:                 else if ($valeur == '-') {$ind_not[]=$i;} # Reperage de la position des mots 'not'
066:                 else {$mots_tmp[]=$valeur;}
067:                 $i++;
068:                 }
069:          # Recherche SQL
070:          $tab = search_word(join("','",$mots_tmp),$idc,'','','','','');
071:          # On supprime tout ceux qui ne repondent pas aux criteres and si present
072:          if (is_array($ind_and))
073:              {while( list($key,$ind) = each($ind_and)) {while( list($url,$tab_url) = each ($tab))
074:                        {if (!appartient($mots[$ind+1],$tab_url[5])) {unset($tab[$url]);}}}reset($tab);}
075:          # On supprime tout ceux qui ne repondent pas aux criteres not si present
076:          if (is_array($ind_not))
077:              {while( list($key,$ind) = each($ind_not)) {while( list($url,$tab_url) = each ($tab))
078:                        {if (appartient($mots[$ind+1],$tab_url[5])) {unset($tab[$url]);}}}reset($tab);}
079:          $indice=0;$nbResultPerPage=10;
080:          $lasto = $first + $nbResultPerPage;
081:          # On met en forme le resultat
082:          if (is_array($tab))
083:              {
084:              while( list($url,$tab_url) = each ($tab))
085:                 {
086:                 $indiceG=$indice+1;
087:                 list($titre,$description,$facteur,$langue,$last_update,$mot)=$tab_url;
088: 
089:                 if (($indice>=$first)&&($indice<$lasto)) {eval($template);}
090:                 # Constitution des liens suivants / precedents
091:                 if (!($indice%$nbResultPerPage))
092:                         {
093:                         $nbPage++;
094:                         if ($indice==$first) {$links.="$nbPage- ";}
095:                         else {$links.='<a href="'.get_link($indice,$word,$idc).'">'.$nbPage.'</a>- '."\n";}
096:                         }
097:                 $indice++;
098:                 }
099:              }
100:          if ($indice) {$indice="$indice sites trouves";}
101:          else {$indice="<p>Aucun document trouvé.</p>";}
102:          return array($resultat,$links,$indice);
103:          }
104: 
105: /*
106: 
107: Construction de la requete SQL. Son exploitation est faite par search
108: 
109:  $tab    : Reference du hash où mettre le resultat
110:  $word   : Mot recherché
111:  $id     : Id du site dans lequel effectué la recherche
112:  $langue : Restriction par langue (facultatif)
113:  $Url    : Restriction par url
114:  $create : Restriction par date inscription
115:  $update : Restriction par date de mise à jour des pages
116:  $catego : Restriction par categorie
117: 
118: Retourne le tableau avec le resultat de la recherche
119: Le hash est constitué comme tel:
120: 
121:       $tab{$url}[0] : titre
122:       $tab{$url}[1] : description
123:       $tab{$url}[2] : facteur
124:       $tab{$url}[3] : langue
125:       $tab{$url}[4] : date de dernière modification
126:    @{$$tab{$url}[5]}: liste des mots trouves pour cet url
127: 
128: */
129: function search_word($word,$idc,$langue,$Url,$create,$update,$categorie)
130:          {
131:          global $prefix;
132:          global $database;
133:          if ($langue) {$langue=" and langue='$langue' ";} else {$langue= ' ';}
134:          if (($Url)&&($Url != 'http://')) {$Url=" and url like '$Url%' ";}          else {$Url=' ';}
135:          if ($create) {$create="and unix_timestamp('$create')< unix_timestamp(last_check) ";}  else {$create=' ';}
136:          if ($update) {$update="and unix_timestamp('$update')< unix_timestamp(last_update) ";} else {$update=' ';}
137:          if ($categorie) {}
138:          else {$categorie=' ';}
139:          $requete = "
140:                 select facteur,url,titre,description,langue,last_update,mot
141:                 from   ".$prefix.$idc."links l,".$prefix.$idc."relation r
142:                 where  r.id_site=l.id
143:                 and    r.mot in ('$word')
144:                 $langue $Url $create $update $categorie
145:                 order  by facteur desc";
146:          $result = mysql_db_query($database,$requete);
147:          if (!$result) {print "$requete";return ;}
148:          $RowCount = MySQL_NUMROWS($result);
149:          while ($i<$RowCount)
150:                 {
151:                 list ($facteur,$url,$titre,$description,$langue,$last_update,$mot)= mysql_fetch_row($result);
152:                 $tab[$url][0] = $titre;
153:                 $tab[$url][1]=$description;
154:                 $tab[$url][2]+=$facteur;
155:                 $tab[$url][3]=$langue;
156:                 $tab[$url][4]=$last_update;
157:                 $tab[$url][5][]=$mot;
158:                 $i++;
159:                 }
160:          return $tab;
161:          }
162: 
163: /*
164: 
165: Fonction retournant la liste des categories de la categorie $id dans le site $idr
166: 
167:  $id       : Id de la categorie de depart. Si undef, 0 est utilisé (Considéré comme le "Home")
168:  $idr           : Id du responsable
169:  $template : Masque HTML pour le resultat de chaque lien. Si undef, le masque par defaut
170:              (defini en haut de ce module) sera utlise
171: 
172: Retourne ($resultat,$nom_categorie) :
173: 
174:  $resultat : Buffer contenant la liste des sites formatées en ft de $template
175:  $nom_categorie : Nom court de la categorie
176: 
177: */
178: 
179: function categories_in_categorie($id,$idr,$template)
180:          {
181:          global $database;
182:          global $prefix;
183:          if (!$idr) {$idr=1;}
184:          if (!$id) {$id=0;}
185:          $requete = "select id,nom,parent from ".$prefix.$idr."categorie";
186:          $result = mysql_db_query($database,$requete);
187:          $RowCount = MySQL_NUMROWS($result);
188:          $i=0;
189:          while ($i<$RowCount)
190:                 {
191:                 list ($idc,$nom,$parent)= mysql_fetch_row($result);
192:                 $tab[$idc][0]=$nom;
193:                 $tab[$idc][1]=$parent;
194:                 $i++;
195:                 }
196:         while( list($key,$val) = each ($tab))
197:                 {
198:                 $nom=$tab[$key][0];
199:                 $parent=$tab[$key][1];
200:                 $nom_complet="<a href=\"".getenv('SCRIPT_NAME')."?browse=1&id=$idr\">Accueil</a>".getParent($key,$idr,$tab);
201:                 $links = get_link_categorie($key,$idr);
202:                 if ($parent==$id) {eval($template);}
203:                 }
204:         if ($i==0) {$resultat="<p>Plus de catégorie</p>";}
205:         if ($id!=0) {$titre = "<a href=\"".getenv('SCRIPT_NAME')."?browse=1&id=$idr\">Accueil</a> ".getParent($id,$idr,$tab);}
206:         else {$titre=" ";}
207:         return array($resultat,$titre);
208:         }
209: 
210: /*
211: 
212: Fonction retournant la liste des pages de la categorie $id dans le site $idr
213: 
214:  $id       : Id de la categorie de depart. Si undef, 0 est utilisé (Considéré comme le "Home")
215:  $idr           : Id du responsable
216:  $template : Masque HTML pour le resultat de chaque lien. Si undef, le masque par defaut
217:              (defini en haut de ce module) sera utlise
218: 
219: Retourne le buffer contenant la liste des sites formatées en ft de $template
220: 
221: */
222: 
223: function sites_in_categorie($id,$idr,$template)
224:          {
225:          global $database;
226:          global $prefix;
227:          $indiceG=1;$facteur=100;
228:          if (!$idr) {$idr=1;}
229:          if (!$id) {$id=0;}
230:          $i=0;
231:          $requete = "select url,titre,description,langue,last_update from ".$prefix.$idr."links where categorie=$id and browse_categorie='1' and parse='1'";
232:          $result = mysql_db_query($database,$requete);
233:          $RowCount = MySQL_NUMROWS($result);
234:          while ($i<$RowCount)
235:                 {
236:                 list ($url,$titre,$description,$langue,$last_update)= mysql_fetch_row($result);
237:                 eval($template);
238:                 $indiceG++;$i++;
239:                 }
240:         if ($i==0) {$resultat="<p>Pas de pages dans cette catégorie</p>";}
241:         return $resultat;
242:         }
243: 
244: /*
245: 
246: Rend la chaine correspondante à la catégorie $id avec ses rubriques parentes
247: 
248: */
249: 
250: function getParent($id,$idr,$tab)
251:         {
252:         if (($tab[$id][1]!=0)&&($tab[$id][0])) {$parent = getParent($tab[$id][1],$idr,$tab);}
253:         if (!$tab[$id][0]) {$tab[$id][0]='Home';}
254:         $parent.="&gt;<a href=\"".get_link_categorie($id,$idr).'">'.$tab[$id][0]."</a>";
255:         return $parent;
256:         }
257: function getWLParent($id,$idr,$tab)
258:         {
259:         if (($tab[$id][1]!=0)&&($tab[$id][0])) {$parent = getWLParent($tab[$id][1],$idr,$tab);}
260:         if (!$tab[$id][0]) {$tab[$id][0]='Home';}
261:         $parent.="&gt;".$tab[$id][0];
262:         return $parent;
263:         }
264: /*
265: 
266: Retourne 1 si $var appartient à $liste, 0 sinon.
267: 
268: */
269: function appartient($var,$liste)
270:          {
271:          while( list($key,$val) = each ($liste)) {if ($val==$var) {return 1;}}
272:          return 0;
273:          }
274: /**
275:  * Retourne l'URL correspondant à la page no $no_page dans la recherche en cours
276:  */
277: function get_link($no_page,$word,$id)
278:          {
279:          $buf = getenv('SCRIPT_NAME')."?word=".urlencode($word)."&id=".$id."&first=".$no_page;
280:          if ($nbResultPerPage) {$buf.="&nbResultPerPage=".$nbResultPerPage;}
281:          return $buf;
282:          }
283: /**
284:  * Retourne l'URL correspondant à la categorie no $no_categorie
285:  */
286: function get_link_categorie($no_categorie,$id) {return getenv('SCRIPT_NAME')."?categorie=$no_categorie&id=$id";}
287: 
288: /**
289:  * Retourne le nom du site dans la table responsable correspondant à l'id $id
290:  */
291: 
292: function get_name_site($id,$prefix)
293:         {
294:         #$result = mysql_db_query("circa","select titre from ".$this->{PREFIX_TABLE}."responsable where id=$id");
295:         #$sth->execute() || print "Erreur: $DBI::errstr\n";
296:         #my ($titre)=$sth->fetchrow_array;
297:         #$sth->finish;
298:         return $titre;
299:         }
300: 
301: function get_liste_categorie($idr)
302:          {
303:          global $database;
304:          global $prefix;
305:          $requete = "select id,nom,parent from ".$prefix.$idr."categorie";
306:          $result = mysql_db_query($database,$requete);
307:          $RowCount = MySQL_NUMROWS($result);
308:          $i=0;
309:          while ($i<$RowCount)
310:                 {
311:                 list ($idc,$nom,$parent)= mysql_fetch_row($result);
312:                 $tab[$idc][0]=$nom;
313:                 $tab[$idc][1]=$parent;
314:                 $i++;
315:                 }
316:         while( list($key,$val) = each ($tab))
317:                 {
318:                 $nom=$tab[$key][0];
319:                 $parent=$tab[$key][1];
320:                 $buf.="<option value=\"$key\">".getWLParent($key,$idr,$tab)."</option>";
321:                 }
322:         return $buf;
323:         }
324: 
325: function addSite($url,$categorie)
326:          {
327:          global $database;
328:          global $prefix;
329:          global $idr;
330:          $requete="insert into ".$prefix.$idr."links (url,titre,description,langue,valide,categorie,browse_categorie)
331:                    values ('$url',' ',' ','fr',0,$categorie,'1')";
332:          $result = mysql_db_query($database,$requete);
333:          }
334: ?>
335: