001: <?
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: function search($template,$word,$first,$idc,$langue,$Url,$create,$update,$categorie)
054:          {
055:          $mots = split( " ", strtolower($word));
056:          $i=0;
057:          # Recherche des requetes booleenes
058:          while( list($key,$valeur) = each ($mots))
059:                 {
060:                 if    ($valeur == '+') {$ind_and[]=$i;} # Reperage de la position des mots 'and'
061:                 else if ($valeur == '-') {$ind_not[]=$i;} # Reperage de la position des mots 'not'
062:                 else {$mots_tmp[]=$valeur;}
063:                 $i++;
064:                 }
065:          # Recherche SQL
066:          $tab = search_word(join("','",$mots_tmp),$idc,'','','','','');
067:          # On supprime tout ceux qui ne repondent pas aux criteres and si present
068:          if (is_array($ind_and))
069:              {while( list($key,$ind) = each($ind_and)) {while( list($url,$tab_url) = each ($tab))
070:                        {if (!appartient($mots[$ind+1],$tab_url[5])) {unset($tab[$url]);}}}reset($tab);}
071:          # On supprime tout ceux qui ne repondent pas aux criteres not si present
072:          if (is_array($ind_not))
073:              {while( list($key,$ind) = each($ind_not)) {while( list($url,$tab_url) = each ($tab))
074:                        {if (appartient($mots[$ind+1],$tab_url[5])) {unset($tab[$url]);}}}reset($tab);}
075:          $indice=0;$nbResultPerPage=10;
076:          $lasto = $first + $nbResultPerPage;
077:          # On met en forme le resultat
078:          if (is_array($tab))
079:              {
080:              while( list($url,$tab_url) = each ($tab))
081:                 {
082:                 $indiceG=$indice+1;
083:                 list($titre,$description,$facteur,$langue,$last_update,$mot)=$tab_url;
084: 
085:                 if (($indice>=$first)&&($indice<$lasto)) {eval($template);}
086:                 # Constitution des liens suivants / precedents
087:                 if (!($indice%$nbResultPerPage))
088:                         {
089:                         $nbPage++;
090:                         if ($indice==$first) {$links.="$nbPage- ";}
091:                         else {$links.='<a href="'.get_link($indice,$word,$idc).'">'.$nbPage.'</a>- '."\n";}
092:                         }
093:                 $indice++;
094:                 }
095:              }
096:          if ($indice) {$indice="$indice sites trouves";}
097:          else {$indice="<p>Aucun document trouvé.</p>";}
098:          return array($resultat,$links,$indice);
099:          }
100: 
101: /*
102: 
103: Construction de la requete SQL. Son exploitation est faite par search
104: 
105:  $tab    : Reference du hash où mettre le resultat
106:  $word   : Mot recherché
107:  $id     : Id du site dans lequel effectué la recherche
108:  $langue : Restriction par langue (facultatif)
109:  $Url    : Restriction par url
110:  $create : Restriction par date inscription
111:  $update : Restriction par date de mise à jour des pages
112:  $catego : Restriction par categorie
113: 
114: Retourne le tableau avec le resultat de la recherche
115: Le hash est constitué comme tel:
116: 
117:       $tab{$url}[0] : titre
118:       $tab{$url}[1] : description
119:       $tab{$url}[2] : facteur
120:       $tab{$url}[3] : langue
121:       $tab{$url}[4] : date de dernière modification
122:    @{$$tab{$url}[5]}: liste des mots trouves pour cet url
123: 
124: */
125: function search_word($word,$idc,$langue,$Url,$create,$update,$categorie)
126:          {
127:          global $prefix;
128:          global $database;
129:          if ($langue) {$langue=" and langue='$langue' ";} else {$langue= ' ';}
130:          if (($Url)&&($Url != 'http://')) {$Url=" and url like '$Url%' ";}          else {$Url=' ';}
131:          if ($create) {$create="and unix_timestamp('$create')< unix_timestamp(last_check) ";}  else {$create=' ';}
132:          if ($update) {$update="and unix_timestamp('$update')< unix_timestamp(last_update) ";} else {$update=' ';}
133:          if ($categorie) {}
134:          else {$categorie=' ';}
135:          $requete = "
136:                 select facteur,url,titre,description,langue,last_update,mot
137:                 from   ".$prefix.$idc."links l,".$prefix.$idc."relation r
138:                 where  r.id_site=l.id
139:                 and    r.mot in ('$word')
140:                 $langue $Url $create $update $categorie
141:                 order  by facteur desc";
142:          $result = mysql_db_query($database,$requete);
143:          if (!$result) {print "$requete";return ;}
144:          $RowCount = MySQL_NUMROWS($result);
145:          while ($i<$RowCount)
146:                 {
147:                 list ($facteur,$url,$titre,$description,$langue,$last_update,$mot)= mysql_fetch_row($result);
148:                 $tab[$url][0] = $titre;
149:                 $tab[$url][1]=$description;
150:                 $tab[$url][2]+=$facteur;
151:                 $tab[$url][3]=$langue;
152:                 $tab[$url][4]=$last_update;
153:                 $tab[$url][5][]=$mot;
154:                 $i++;
155:                 }
156:          return $tab;
157:          }
158: 
159: /*
160: 
161: Fonction retournant la liste des categories de la categorie $id dans le site $idr
162: 
163:  $id       : Id de la categorie de depart. Si undef, 0 est utilisé (Considéré comme le "Home")
164:  $idr           : Id du responsable
165:  $template : Masque HTML pour le resultat de chaque lien. Si undef, le masque par defaut
166:              (defini en haut de ce module) sera utlise
167: 
168: Retourne ($resultat,$nom_categorie) :
169: 
170:  $resultat : Buffer contenant la liste des sites formatées en ft de $template
171:  $nom_categorie : Nom court de la categorie
172: 
173: */
174: 
175: function categories_in_categorie($id,$idr,$template)
176:          {
177:          global $database;
178:          global $prefix;
179:          if (!$idr) {$idr=1;}
180:          if (!$id) {$id=0;}
181:          $requete = "select id,nom,parent from ".$prefix.$idr."categorie";
182:          $result = mysql_db_query($database,$requete);
183:          $RowCount = MySQL_NUMROWS($result);
184:          $i=0;
185:          while ($i<$RowCount)
186:                 {
187:                 list ($idc,$nom,$parent)= mysql_fetch_row($result);
188:                 $tab[$idc][0]=$nom;
189:                 $tab[$idc][1]=$parent;
190:                 $i++;
191:                 }
192:         while( list($key,$val) = each ($tab))
193:                 {
194:                 $nom=$tab[$key][0];
195:                 $parent=$tab[$key][1];
196:                 $nom_complet="<a href=\"".getenv('SCRIPT_NAME')."?browse=1&id=$idr\">Accueil</a>".getParent($key,$idr,$tab);
197:                 $links = get_link_categorie($key,$idr);
198:                 if ($parent==$id) {eval($template);}
199:                 }
200:         if ($i==0) {$resultat="<p>Plus de catégorie</p>";}
201:         if ($id!=0) {$titre = "<a href=\"".getenv('SCRIPT_NAME')."?browse=1&id=$idr\">Accueil</a> ".getParent($id,$idr,$tab);}
202:         else {$titre=" ";}
203:         return array($resultat,$titre);
204:         }
205: 
206: /*
207: 
208: Fonction retournant la liste des pages de la categorie $id dans le site $idr
209: 
210:  $id       : Id de la categorie de depart. Si undef, 0 est utilisé (Considéré comme le "Home")
211:  $idr           : Id du responsable
212:  $template : Masque HTML pour le resultat de chaque lien. Si undef, le masque par defaut
213:              (defini en haut de ce module) sera utlise
214: 
215: Retourne le buffer contenant la liste des sites formatées en ft de $template
216: 
217: */
218: 
219: function sites_in_categorie($id,$idr,$template)
220:          {
221:          global $database;
222:          global $prefix;
223:          $indiceG=1;$facteur=100;
224:          if (!$idr) {$idr=1;}
225:          if (!$id) {$id=0;}
226:          $i=0;
227:          $requete = "select url,titre,description,langue,last_update from ".$prefix.$idr."links where categorie=$id and browse_categorie='1' and parse='1'";
228:          $result = mysql_db_query($database,$requete);
229:          $RowCount = MySQL_NUMROWS($result);
230:          while ($i<$RowCount)
231:                 {
232:                 list ($url,$titre,$description,$langue,$last_update)= mysql_fetch_row($result);
233:                 eval($template);
234:                 $indiceG++;$i++;
235:                 }
236:         if ($i==0) {$resultat="<p>Pas de pages dans cette catégorie</p>";}
237:         return $resultat;
238:         }
239: 
240: /*
241: 
242: Rend la chaine correspondante à la catégorie $id avec ses rubriques parentes
243: 
244: */
245: 
246: function getParent($id,$idr,$tab)
247:         {
248:         if (($tab[$id][1]!=0)&&($tab[$id][0])) {$parent = getParent($tab[$id][1],$idr,$tab);}
249:         if (!$tab[$id][0]) {$tab[$id][0]='Home';}
250:         $parent.="&gt;<a href=\"".get_link_categorie($id,$idr).'">'.$tab[$id][0]."</a>";
251:         return $parent;
252:         }
253: function getWLParent($id,$idr,$tab)
254:         {
255:         if (($tab[$id][1]!=0)&&($tab[$id][0])) {$parent = getWLParent($tab[$id][1],$idr,$tab);}
256:         if (!$tab[$id][0]) {$tab[$id][0]='Home';}
257:         $parent.="&gt;".$tab[$id][0];
258:         return $parent;
259:         }
260: /*
261: 
262: Retourne 1 si $var appartient à $liste, 0 sinon.
263: 
264: */
265: function appartient($var,$liste)
266:          {
267:          while( list($key,$val) = each ($liste)) {if ($val==$var) {return 1;}}
268:          return 0;
269:          }
270: /**
271:  * Retourne l'URL correspondant à la page no $no_page dans la recherche en cours
272:  */
273: function get_link($no_page,$word,$id)
274:          {
275:          $buf = getenv('SCRIPT_NAME')."?word=".urlencode($word)."&id=".$id."&first=".$no_page;
276:          if ($nbResultPerPage) {$buf.="&nbResultPerPage=".$nbResultPerPage;}
277:          return $buf;
278:          }
279: /**
280:  * Retourne l'URL correspondant à la categorie no $no_categorie
281:  */
282: function get_link_categorie($no_categorie,$id) {return getenv('SCRIPT_NAME')."?categorie=$no_categorie&id=$id";}
283: 
284: /**
285:  * Retourne le nom du site dans la table responsable correspondant à l'id $id
286:  */
287: 
288: function get_name_site($id,$prefix)
289:         {
290:         #$result = mysql_db_query("circa","select titre from ".$this->{PREFIX_TABLE}."responsable where id=$id");
291:         #$sth->execute() || print "Erreur: $DBI::errstr\n";
292:         #my ($titre)=$sth->fetchrow_array;
293:         #$sth->finish;
294:         return $titre;
295:         }
296: 
297: function get_liste_categorie($idr)
298:          {
299:          global $database;
300:          global $prefix;
301:          $requete = "select id,nom,parent from ".$prefix.$idr."categorie";
302:          $result = mysql_db_query($database,$requete);
303:          $RowCount = MySQL_NUMROWS($result);
304:          $i=0;
305:          while ($i<$RowCount)
306:                 {
307:                 list ($idc,$nom,$parent)= mysql_fetch_row($result);
308:                 $tab[$idc][0]=$nom;
309:                 $tab[$idc][1]=$parent;
310:                 $i++;
311:                 }
312:         while( list($key,$val) = each ($tab))
313:                 {
314:                 $nom=$tab[$key][0];
315:                 $parent=$tab[$key][1];
316:                 $buf.="<option value=\"$key\">".getWLParent($key,$idr,$tab)."</option>";
317:                 }
318:         return $buf;
319:         }
320: 
321: function addSite($url,$categorie)
322:          {
323:          global $database;
324:          global $prefix;
325:          global $idr;
326:          $requete="insert into ".$prefix.$idr."links (url,titre,description,langue,valide,categorie,browse_categorie)
327:                    values ('$url',' ',' ','fr',0,$categorie,'1')";
328:          $result = mysql_db_query($database,$requete);
329:          }
330: ?>