Vous n'êtes pas identifié(e).
13 février 2024 Sortie de Dotclear 2.29
Pages : 1
Bonjour,
Je cherche à faire un carousel chargeant dynamiquement (c'est-à-dire au fur et à mesure où elles sont affichées) les images des billets.
J'ai un carousel qui fonctionne très bien sur ce principe, et qui utilise les images des galeries. Je cherche maintenant à appliquer cela aux images des billets eux-mêmes, en réutilisant (non sans honte) une partie du code du plugin listImages.
Le script jcarousel fait donc appel à un fichier php qui se charge de renvoyer un tableau contenant les infos (url, src et title) des images à afficher.
Voici ce que contient ce fichier php :
<?php
// Array indexes are 0-based, jCarousel positions are 1-based.
$first = max(0, intval($_GET['first']) - 1);
$last = max($first + 1, intval($_GET['last']) - 1);
$length = 100;
// ---
global $core;
$core->blog = new dcBlog($core, 'biblio');
$media = new dcMedia($core);
$sizes = implode('|',array_keys($media->thumb_sizes));
$size = 's';
$p_url = $core->blog->settings->system->public_url;
$p_root = $core->blog->public_path;
$p_site = preg_replace('#^(.+?//.+?)/(.*)$#','$1',$core->blog->url);
$pattern_path = '(?:'.preg_quote($p_site,'/').')?'.preg_quote($p_url,'/');
$pattern_src = sprintf('/src="%s(.*?\.(?:jpg|jpeg|gif|png|JPEG|JPG|GIF|PNG))"/msu',$pattern_path);
$a = 0;
$params["order"] = "post_dt DESC";
$params['post_type'] = "post";
$_ctx->posts = $core->blog->getPosts($params); unset($params);
while ($_ctx->posts->fetch()) :
$subject = ($from != 'content' ? $_ctx->posts->post_excerpt_xhtml : '').($from != 'excerpt' ? $_ctx->posts->post_content_xhtml : '');
if (preg_match_all('/<img(.*?)\/\>/msu',$subject,$m) > 0) :
$i = (!preg_match($pattern_src,$m[1][0],$src) ? '' : $src[1]);
if ($i != '') :
$info = path::info($i);
$base = $info['base'];
if (substr($info['dirname'],-1) != '/') $info['dirname'] .= '/';
if (substr($root,-1) != '/') $root .= '/';
if (preg_match('/^\.(.+)_('.$sizes.')$/',$base,$q)) $base = $q[1];
$res = false;
if ($size != 'o' && file_exists($p_root.$info['dirname'].'.'.$base.'_'.$size.'.jpg')) {
$res = '.'.$base.'_'.$size.'.jpg'; $media_info = getimagesize($p_root.$info['dirname'].$res);
} else {
$f = $p_root.$info['dirname'].$base;
if (file_exists($f.'.'.$info['extension'])) {
$res = $base.'.'.$info['extension'];
} elseif (file_exists($f.'.jpg')) {
$info['extension'] = 'jpg'; $res = $base.'.'.$info['extension'];
} elseif (file_exists($f.'.jpeg')) {
$info['extension'] = 'jpeg'; $res = $base.'.'.$info['extension'];
} elseif (file_exists($f.'.png')) {
$info['extension'] = 'png'; $res = $base.'.'.$info['extension'];
} elseif (file_exists($f.'.gif')) {
$info['extension'] = 'gif'; $res = $base.'.'.$info['extension'];
}
}
if ($res !== false) :
$images[$a]['src'] = $p_url.(dirname($i) != '/' ? dirname($i) : '').'/'.$res;
$images[$a]['url'] = $_ctx->posts->getURL();
$images[$a]['title'] = html::escapeHTML($_ctx->posts->post_title);
if ($a == $length) break;
$a++;
endif;
endif;
endif;
endwhile;
$_ctx->posts = null;
$total = count($images);
$selected = array_slice($images, $first, $length);
$images = null;
// ---
header('Content-Type: text/xml');
echo '<data>';
// Return total number of images so the callback
// can set the size of the carousel.
echo ' <total>'.$total.'</total>';
foreach ($selected as $img) {
echo ' <image>'
.' <url>'.$img['url'].'</url>'
.' <src>'.$img['src'].'</src>'
.' <title>'.$img['title'].'</title>'
.' </image>';
}
echo '</data>';
?>
Le résultat, le voilà : on peut voir sur mon blog de tests, sous le titre "C'est vous qui le dites !", qu'aucune image ne s'affiche...
Pourquoi ? Mystère... Il serait pourtant intéressant, dans un carousel, de na pas "simplement" charger TOUTES les images de tous les billets (ça ferait beaucoup trop), mais de ne les charger que quand on a besoin de les afficher...
Quelqu'un aurait-il une idée ?
Dernière modification par fix (2012-02-08 23:05:57)
Hors ligne
Pages : 1
Vous n'êtes pas identifié(e).