Vous n'êtes pas identifié(e).
13 février 2024 Sortie de Dotclear 2.29
Bonjour
Je cherche à récupérer l'url de la première image de chacun des 5 derniers billets d'un autre blog que le blog courant
Pour cela, j'ai créé une balise de template dans le fichier _public.php de mon thème avec ceci :
$core->tpl->addValue('myTourismPostsList',array('b4businessTpl','myTourismPostsList'));
class b4businessTpl {
public static function myTourismPostsList()
{
return
'<?php $thisblog = $core->blog->id;
$core->setBlog(\'var\');
$params[\'no_content\'] = false;
$params[\'limit\'] = \'5\';
$params[\'post_type\'] = array(\'post\');
$params[\'post_status\'] = \'1\';
$rs = $core->blog->getPosts($params);
$size = \'m\';
$no_tag = 1;
$with_category = 0;
$class = \'\';
$content_only = 0;
$cat_only = 0;
$res = \'\';
while ($rs->fetch()) {
$res .= \'<p>titre : \'.html::escapeHTML($rs->post_title);
$res .= \' - image : \'.context::EntryFirstImageHelper($size, $no_tag,$with_category,$class,$content_only,$cat_only).\'</p>\';
}
$core->setBlog($thisblog);
unset ($params);
echo $res;
?>';
}
}
Le titre de chacun des 5 derniers billets du blog voulu est bien récupéré, preuve que ça marche à moitié, mais le code suivant ne retourne rien
context::EntryFirstImageHelper($size, $no_tag,$with_category,$class,$content_only,$cat_only)
(cette fonction est bêtement déduite de EntryFirstImage dans /dotclear/inc/public/class.dc.template.php et lib.tpl.context.php)
Une âme charitable pourrait m'aider à trouver la bonne syntaxe ?
Merci tout plein d'avance :)
Hors ligne
PS : Juste pour info, si j'essaie de récupérer les images avec la balise tpl du plugin listImages, ça fonctionne bien :
$res .= \'<p>\'.tplEntryImages::EntryImagesHelper($size, $html_tag, $link, $exif, $legend, $bubble, $from, $start, $length, $class, $alt, $img_dim, $def_size, $rs).\'</p>\';
sauf que cette balise n'a pas d'option pour retourner l'url seule...
Hors ligne
À première vue (du code de Dotclear) c'est un peu normal (j'ai pas beaucoup exploré) vu que context::EntryFirstImageHelper() s'appuie sur l'URL du blog courant pour bosser, si tu veux les images d'un autre blog, ça risque de faire des trucs bizarres :-)
Dotclear addicted since 2004
Hors ligne
Euh... oui mais non, je suis dans le bon blog avec $core->setBlog(\'var\'); au début de mon code (var est l'identifiant du blog)
D'ailleurs les titres des billets sont corrects
Hors ligne
...et avec tplEntryImages::EntryImagesHelper ça marche...
Hors ligne
En attendant une version de listImages qui permettent de récupérer uniquement l'URL de l'image, un petit preg_match() kivabien sur le retour de tplEntryImages::EntryImagesHelper() devrait te permettre de récupérer ça, non ?
Dotclear addicted since 2004
Hors ligne
Oui, c'est une bonne piste, je vais juste faire ça, sauf si tu sors rapidement une nouvelle version de ton plougue ^^
Merci pour l'astuce ;)
Hors ligne
Ça marche parfaitement \o/
$string = tplEntryImages::EntryImagesHelper($size, $html_tag, $link, $exif, $legend, $bubble, $from, $start, $length, $class, $alt, $img_dim, $def_size, $rs);
$url = preg_replace(\'#.*src="([^\"]+)".*#\', \'\1\', $string);
$url contient l'url de l'image
Je cherche maintenant à récupérer les 250 premiers caractères de chacun des billets. si je coince je reviens illico ;)
Hors ligne
Bonjour Philippe,
Pourriez-vous partager la fonction terminée svp ?
Dans un script exécuté dans le contexte de l'administration d'un plugin, je souhaiterais pouvoir à partir de l'ID d'un billet récupérer en sortie l'URL de la première image dudit billet.
Merci pour vos contributions !
Gilles
Hors ligne
Bonjour
Pfiou, c'est un peu vieux, mais en gros il faut faire une boucle en passant l'id du billet (25 dans mon exemple) à getPosts()
$params['post_id'] = '25';
$params['no_content'] = false;
$params['post_type'] = ['post'];
$rs = dcCore::app()->blog->getPosts($params);
while ($rs->fetch()) {
$ret = $rs->post_excerpt_xhtml . $rs->post_content_xhtml;
}
$array = [];
preg_match('/src="([^"]*)"/i', $ret, $array) ;
echo($array[1]) ;
Edit : expression régulière modifiée
Dernière modification par Philippe (2023-04-20 20:20:54)
Hors ligne
Merci beaucoup Philippe et même pas besoin de EntryFirstImageHelper ou d'une variante.
(question bonus : y-a-il une méthode/fonction dotclear tout prête pour tester qu'un lien est valide, autrement dit ne finisse pas sur une erreur 404 ?)
Gilles
Hors ligne
Pour les tests de liens, il n'y a pas à ma connaissance de méthode particulière dans dotclear.
Hors ligne
Je n'ai pas testé, mais quelque chose comme ça devrait fonctionner :
$status = 404;
$path = '';
$client = HttpClient::initClient('https://example.com/', $path);
if ($client !== false) {
$client->setTimeout(DC_QUERY_TIMEOUT);
$client->setHeadersOnly(true);
$client->setUserAgent($_SERVER['HTTP_USER_AGENT']);
$client->get($path);
$status = $client->getStatus();
}
if ($status !== 200) {
// Répond pas normalement — voir les codes retour HTTP
}
Dotclear addicted since 2004
Hors ligne
Vous n'êtes pas identifié(e).