Wikini

FonctionDeSelectionDePage

PagePrincipale :: DerniersChangements :: DerniersCommentaires :: ParametresUtilisateur :: Vous êtes ec2-34-236-152-203.compute-1.amazonaws.com
Les fonctions de WikiNi manipulant des données relatives à des pages pourraient gagner à sélectionner, positivement ou négativement, les pages sur lesquelles elles portent leur action (je ne sais pas si je suis très clair).
En d'autres termes, il peut être intéressant de généraliser deux paramètres à toutes les fonctions :

Les applications sont très nombreuses ; je vais tâcher de lister ci-dessous toutes les actions et les handler pour voir les applications possibles.

Applications pour les actions

Applications pour les handlers


Solution 1 : intégration de la sélection dans chaque requête SQL

Pour que cela soit efficace, il faudrait que ces fonctions soient intégrées au coeur de WikiNi. On peut partir du code proposé par ProgFou pour améliorer la fonction recentchanges (quelques modifications cosmétiques par mes soins) :

<?php
function LoadRecentlyChanged($limit=50$exclude="")
{
    
$limit= (int) $limit;
    if (
$pages $this->LoadAll("select tag, time, user, owner from ".$this->config["table_prefix"]."pages where latest = 'Y' and comment_on = ''".$this->QueryMakeExclude($exclude)." order by time desc limit $limit"))
    {
        foreach (
$pages as $page)
        {
            
$this->CachePage($page);
        }
        return 
$pages;
    }
}
 
function 
QueryMakeExclude($exclude$field="tag")
{
    if (!
$exclude) return "";
    
$tags explode(";"$exclude);
    foreach (
$tags as $key => $tag)
    {
        
$tags[$key] = $field." NOT LIKE '".mysql_escape_string($tags[$key])."'";
    }
    
// Return a string like " AND (tag NOT LIKE ThisPage and tag NOT LIKE ThisOtherPage)"
    
return " AND (" implode(" and "$tags) . ")";
}
?>

Deux choses à noter ici :
-- ProgFou

La fonction de sélection positive reste à écrire : "QueryRefine?" ? (ou autre nom). Quelque chose dans ce goût là (non testé) :
<?php
function QueryRefine($linked_to$field="tag")
{
    
// Usage : $this->QueryRefine("LaDocumentation;LesFAQ", "");
    // Create the string to refine the query on pages linking to LaDocumentation and LesFAQ pages
    
if (!$linked_to) return "";
    
$result = Array();
    foreach (
explode(";"$linked_to) as $tag)
    {
        
$linked_pages $this->LoadPagesLinkingTo($tag);
        foreach (
$linked_pages as $linked_page)
        {
            
$result[] = $field." LIKE '".mysql_escape_string($linked_page)."'";
        }
    }
    
// Return a string like " AND (tag LIKE ThisPage and tag LIKE ThisOtherPage)"
    
return " AND (" implode(" and "$result) . ")";
}
?>

-- CharlesNepote

Je me suis permis de ré-écrire QueryRefine... ;-)
À noter que chez moi la fonction LoadPagesLinkingTo accepte aussi un paramètre exclude. -- ProgFou

J'aimerais bien qu'on essaye d'avancer sur ce sujet qui me paraît très intéressant. Sans se précipiter non plus. Il faudrait, je pense :
Qu'en pensez-vous ?
ProgFou, ces fonctions ont semble-t'il déjà été testé chez toi : qu'en est-il ? Y a-t'il des effets de bord ?
-- CharlesNepote

Plus j'y repense et plus je me dit qu'un filtre placé au niveau des requêtes SQL peut rapidement devenir gênant, voir dangeureux... Que se passerait-il avec un paramètre exlude trop long ? De même, si linked_to contient une (ou plusieurs !) page ayant beaucoup de liens, la requête SQL va rapidement exploser ! Un calcul simple : pour chaque page on aura souvent plus de 20 caractères (par exemple avec " and tag LIKE 'UneDoc?'"), donc pour 20 liens dans une page ça nous fait déjà 400 caractères... Il va donc faloir trouver une autre solution (sélection à un niveau plus haut), ou bien imposer des limites sur l'usage de ces options... Je continue d'y réfléchir... -- ProgFou


Solution 2 : intégration de la sélection dans la fonction LoadAll

Quelques nouvelles idées :
-- ProgFou



Il n'y a pas de commentaire sur cette page. [Afficher commentaires/formulaire]