Vous n'êtes pas identifié(e).
13 février 2024 Sortie de Dotclear 2.29
Bonjour
Je travaille sur la mise à jour d'un plugin pour Dotclear 2.6. Cette question n'est cependant pas spécifique à cette version :
Je cherche à récupérer la liste des billets moins le billet courant (son id est passé en GET) avec une seule requête, et j'aurais donc besoin de pouvoir ajouter un paramètre à la fonction getPosts.
Pour le moment, je fais appel à la fonction deux fois, ce qui marche bien, mais devrait pouvoir s'améliorer. Voici le code :
# Get posts without current
try {
global $core;
$my_params['no_content'] = true;
$my_posts = $core->blog->getPosts($my_params);
$id = $_GET['id'];
$ids = array ();
while ($my_posts->fetch())
{
if ($id != $my_posts->post_id) {
$ids[] = $my_posts->post_id;
}
}
if(!empty($ids)) {
$params['post_id'] = $ids;
$params['no_content'] = true;
$posts = $core->blog->getPosts($params);
$counter = $core->blog->getPosts($params,true);
$post_list = new adminPostList($core,$posts,$counter->f(0));
}
} catch (Exception $e) {
$core->error->add($e->getMessage());
}
Un sorcier pourrait-il me donner un coup de pouce ?
Merci tout plein :)
Hors ligne
Bonjour Philippe,
il "suffit" d'exclure le billet avec le paramètre "exclude_post_id" :
$my_params['exlude_post_id'] = (int) $_GET['id'];
$my_posts = $core->blog->getPosts($my_params);
Je préfère être atteint de parkinson plutôt qu'alzheimer : je prefère renverser un peu de ma bière plutôt qu'oublier de la boire !
Présentez vos photos simplement avec Phyxo !
Hors ligne
Merci nikrou
Je viens d'essayer ceci :
try {
global $core;
$my_params['no_content'] = true;
$my_params['exlude_post_id'] = $_GET['id'];
$posts = $core->blog->getPosts($my_params);
$counter = $core->blog->getPosts($my_params,true);
$post_list = new adminPostList($core,$posts,$counter->f(0));
} catch (Exception $e) {
$core->error->add($e->getMessage());
}
Mais le billet courant passé en get n'est pas exclu de la liste, et accessoirement les filtres ne marchent plus :(
Hors ligne
Hum... exclude_post_id avec un c après le x marche bien mieux ;)
Hors ligne
Hum... exclude_post_id avec un c après le x marche bien mieux ;)
C'était pour voir si tu suivais !
p.s: bon accessoirement j'ai effectivement oublié le C !
Je préfère être atteint de parkinson plutôt qu'alzheimer : je prefère renverser un peu de ma bière plutôt qu'oublier de la boire !
Présentez vos photos simplement avec Phyxo !
Hors ligne
Merci encore, ça va beaucoup plus vite \o/
Je veux maintenant simplifier une requête un peu plus complexe : récupérer la liste des billets qui ont une meta relatedEntries non vide
Pour l'instant j'ai ceci :
# Get posts with related posts
try {
global $core;
$my_params['no_content'] = true;
$my_posts = $core->blog->getPosts($my_params);
$meta =& $GLOBALS['core']->meta;
$ids = array ();
while ($my_posts->fetch())
{
$meta_rs = $meta->getMetaStr($my_posts->post_meta,'relatedEntries');
if ($meta_rs != '') {
$ids[] = $my_posts->post_id;
}
}
if(!empty($ids)) {
$params['post_id'] = $ids;
$params['no_content'] = true;
$posts = $core->blog->getPosts($params);
$counter = $core->blog->getPosts($params,true);
$post_list = new adminPostList($core,$posts,$counter->f(0));
}
} catch (Exception $e) {
$core->error->add($e->getMessage());
}
Peut-on simplifier cela de la même façon que précédemment ?
Hors ligne
Un truc de ce genre ?
# Get posts with related posts
try {
global $core;
$meta =& $GLOBALS['core']->meta;
$params = array('no_content' => true, 'meta_id' => 'relatedEntries');
$posts = $meta->getPostsByMeta($params);
$counter = $meta->getPostsByMeta($params,true);
$post_list = new adminPostList($core,$posts,$counter->f(0));
} catch (Exception $e) {
$core->error->add($e->getMessage());
}
Dyslexics have more fnu!
Hors ligne
Merci, je viens d'essayer mais relatedEntries n'est pas le meta_id mais le meta_type, et si je le remplace sur la ligne
$params = array('no_content' => true, 'meta_type' => 'relatedEntries');
j'obtiens une erreur :
Fatal error: Call to a member function f() on a non-object correspondant à la ligne
$post_list = new adminPostList($core,$posts,$counter->f(0));
Je suis perplexe, la fonction getPostsByMeta prend bien en paramètre le meta_type, non ?
Hors ligne
Si c'est un meta_type, alors ce n'est pas (encore) prévu dans le core, i lfaut ruser :
# Get posts with related posts
try {
$params = array(
'from' => ', '.$core->prefix.'meta META ',
'sql' => 'AND META.post_id = P.post_id '.
"AND META.meta_type = 'relatedEntries' ",
'no_content' => true
);
$posts = $core->blog->getPosts($params);
$counter = $core->blog->getPosts($params,true);
$post_list = new adminPostList($core,$posts,$counter->f(0));
} catch (Exception $e) {
$core->error->add($e->getMessage());
}
Dyslexics have more fnu!
Hors ligne
C'est presque bon... je dis presque car il y a un effet de bord :
Je stocke dans ce meta les ids des billets qui sont liés au billet en question. Si un billet est lié à un seul autre, ils ont chacun un meta de type relatedEntries avec l'id de l'autre billet, et ils apparaissent chacun dans la liste, c'est farpait :)
Mais si un billet est lié à plusieurs autres, il apparaît autant de fois, je voudrais qu'il n'apparaisse qu'une fois dans la liste retournée.
Hors ligne
ah oui, mais si tu donnes pas tous les éléments du contexte aussi :)
Il faut donc faire :
# Get posts with related posts
try {
$params = array(
'sql' => 'AND P.post_id IN (SELECT META.post_id FROM'.$this->core->prefix.'meta META WHERE META.post_id = P.post_id '.
"AND META.meta_type = 'relatedEntries' ) ",
'no_content' => true
);
$posts = $core->blog->getPosts($params);
$counter = $core->blog->getPosts($params,true);
$post_list = new adminPostList($core,$posts,$counter->f(0));
} catch (Exception $e) {
$core->error->add($e->getMessage());
}
Dyslexics have more fnu!
Hors ligne
ah oui, mais si tu donnes pas tous les éléments du contexte aussi :)
Désolé, tu connais mon expertise :P
Mais là ça coince sur le $this : Fatal error: Using $this when not in object context
Hors ligne
J'avais trouvé pour $core, mais il m'a fallu un moment pour ajouter l'espace manquante après FROM^^
Merci tout plein, ça fonctionne maintenant \o/
Hors ligne
Vous n'êtes pas identifié(e).