Dotclear

Vous n'êtes pas identifié(e).

Annonce

13 février 2024 Sortie de Dotclear 2.29

#1 2009-01-29 07:40:41

Anar
Membre
Inscription : 2008-11-27

Comment recuperer l'URL de la balise {{tpl:EntryFirstImage}} ?

Bonjour,

j'utilise assez souvent la balise {{tpl:EntryFirstImage}} que je trouve tres pratique.
Pour ceux qui ne la connaissent pas, cette balise renvoie la première image trouvée dans un post.

Ce que je voudrais faire, c'est récuperer l'URL de cette image.
Mais comme je suis une burne en programmation, je ne sais pas si c'est possible et si oui comment le faire.

Quelqu'un aurait il la solution ?
L'idéal serait une balise du genre {{tpl:EntryFirstImageURL}}...

Cordialement

Hors ligne

#2 2009-01-29 08:49:00

Philippe
Stagiaire
Lieu : Toulon
Inscription : 2004-06-13
Site Web

Re : Comment recuperer l'URL de la balise {{tpl:EntryFirstImage}} ?

Il faudrait créer la balise dans le fichier _public.php de ton thème, en prenant pour exemple la fonction EntryFirstImageHelper dans inc/public/lib.tpl.context.php pour extraire l'attribut src de l'image et son chemin dans le répertoire public, mais ça demande un peu de connaissances.

Hors ligne

#3 2009-01-29 09:09:39

Anar
Membre
Inscription : 2008-11-27

Re : Comment recuperer l'URL de la balise {{tpl:EntryFirstImage}} ?

Merci Amalgame pour cette piste de recherche.

J'ai jeté un coup d'oeil au fichier que tu mentionnes et effectivement "çà demande un peu de connaissances" !
Je crois que je vais perdre quelques cheveux...

Cordialement.

Hors ligne

#4 2009-01-29 09:18:38

adjaya
Membre
Lieu : Provence - Luberon
Inscription : 2006-09-05
Site Web

Re : Comment recuperer l'URL de la balise {{tpl:EntryFirstImage}} ?

Bonjour
J'avais proposer une solution pour ne chercher l'image que dans la categorie ici : http://forum.dotclear.net/viewtopic.php … 50#p237150

J'ai repris le code pour y ajouter l'attribut src_only à {{tpl:EntryFirstImage}}, ce qui donne dans un fichier _public.php du thème :

<?php
# -- BEGIN LICENSE BLOCK ----------------------------------
#
# This file is part of Dotclear 2.
#
# Copyright (c) 2003-2008 Olivier Meunier and contributors
# Licensed under the GPL version 2.0 license.
# See LICENSE file or
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
#
# -- END LICENSE BLOCK ------------------------------------
if (!defined('DC_RC_PATH')) { return; }

# Surcharge EntryFirstImage
$GLOBALS['core']->tpl->addValue('EntryFirstImage',array('tplMytpl','MyEntryFirstImage'));
	
class tplMytpl
{
	/*dtd
	<!ELEMENT tpl:EntryFirstImage - O -- Extracts entry first image if exists -->
	<!ATTLIST tpl:EntryAuthorEmail
	size			(sq|t|s|m|o)	#IMPLIED	-- Image size to extract
	class		CDATA		#IMPLIED	-- Class to add on image tag
	with_category	(1|0)		#IMPLIED	-- Search in entry category description if present (default 0)
	with_post	(1|0)		#IMPLIED	-- Search in entry post content if present (default 1)
	src_only	(1|0)		#IMPLIED	--  return src only if present (default 0)
	>
	*/
	public static function MyEntryFirstImage($attr)
	{
		$size = !empty($attr['size']) ? $attr['size'] : '';
		$class = !empty($attr['class']) ? $attr['class'] : '';
		$with_category = !empty($attr['with_category']) ? 'true' : 'false';
		$with_post = 'true';
		if (isset($attr['with_post'])) {
			$with_post = !empty($attr['with_post']) ? 'true' : 'false';
		}
		$src_only = !empty($attr['src_only']) ? 'true' : 'false';

		return
		"<?php echo tplMytpl::EntryFirstImageHelper('".addslashes($size)."',".
		$with_category.",".$with_post.",".$src_only.",'".addslashes($class)."'); ?>";
	}
	
	# First post image helpers
	public static function EntryFirstImageHelper($size,$with_category=false,$with_post=true,$src_only=false,$class="")
	{
		if (!preg_match('/^sq|t|s|m|o$/',$size)) {
			$size = 's';
		}
		
		global $core, $_ctx;
		
		$p_url = $core->blog->settings->public_url;
		$p_site = preg_replace('#^(.+?//.+?)/(.*)$#','$1',$core->blog->url);
		$p_root = $core->blog->public_path;
		
		$pattern = '(?:'.preg_quote($p_site,'/').')?'.preg_quote($p_url,'/');
		$pattern = sprintf('/<img.+?src="%s(.*?\.(?:jpg|gif|png))"/msu',$pattern);
		
		$src = '';
		
		# We first look in post content
		if ($with_post && $_ctx->posts )
		{
			$subject = $_ctx->posts->post_excerpt_xhtml.$_ctx->posts->post_content_xhtml.$_ctx->posts->cat_desc;
			if (preg_match_all($pattern,$subject,$m) > 0)
			{
				foreach ($m[1] as $i) {
					if (($src = self::ContentFirstImageLookup($p_root,$i,$size)) !== false) {
						$src = $p_url.(dirname($i) != '/' ? dirname($i) : '').'/'.$src;
						break;
					}
				}
			}
		}
		
		# No src, look in category description if available
		if (!$src && $with_category && $_ctx->categories)
		{
			if (preg_match_all($pattern,$_ctx->categories->cat_desc,$m) > 0)
			{
				foreach ($m[1] as $i) {
					if (($src = self::ContentFirstImageLookup($p_root,$i,$size)) !== false) {
						$src = $p_url.(dirname($i) != '/' ? dirname($i) : '').'/'.$src;
						break;
					}
				}
			};
		}
		
		if ($src) {
			if ($src_only)
			{
				echo $src;
			}
			else
			{
				echo '<img alt="" src="'.$src.'" class="'.$class.'" />';
			}
		}
	}
	
	private static function ContentFirstImageLookup($root,$img,$size)
	{
		# Get base name and extension
		$info = path::info($img);
		$base = $info['base'];
		
		if (preg_match('/^\.(.+)_(sq|t|s|m)$/',$base,$m)) {
			$base = $m[1];
		}
		
		$res = false;
		if ($size != 'o' && file_exists($root.'/'.$info['dirname'].'/.'.$base.'_'.$size.'.jpg'))
		{
			$res = '.'.$base.'_'.$size.'.jpg';
		}
		else
		{
			$f = $root.'/'.$info['dirname'].'/'.$base;
			if (file_exists($f.'.'.$info['extension'])) {
				$res = $base.'.'.$info['extension'];
			} elseif (file_exists($f.'.jpg')) {
				$res = $base.'.jpg';
			} elseif (file_exists($f.'.png')) {
				$res = $base.'.png';
			} elseif (file_exists($f.'.gif')) {
				$res = $base.'.gif';
			}
		}
		
		if ($res) {
			return $res;
		}
		return false;
	}
}
?>

Normalement, avec ce code tu doit pouvoir récupérer juste le src ainsi :

{{tpl:EntryFirstImage src_only="1"}}

J'ai pas la possibilité de tester ca pour l'instant, si j'ai pas fait d'erreur ca devrait marcher, tiens moi au courant.


Photo, Art et Création Numérique : http://benoit-grelier.photo7.fr/

Hors ligne

#5 2009-01-29 09:24:35

Anar
Membre
Inscription : 2008-11-27

Re : Comment recuperer l'URL de la balise {{tpl:EntryFirstImage}} ?

OK ! Merci Adjaya !

Je teste çà aujourd'hui (normalement... ) et te tiens au courant...

Hors ligne

#6 2009-01-29 10:20:49

Anar
Membre
Inscription : 2008-11-27

Re : Comment recuperer l'URL de la balise {{tpl:EntryFirstImage}} ?

Adjaya,

j'ai pu testé ton bout de code et peux te confirmer qu'il fonctionne bien !
Ai-je besoin de l'ensemble du code que tu as fourni ou bien certaines parties ne concernent pas mon besoin ?

Donc maintenant que çà marche j'ai encore une bidouille à faire.
Je voudrais recuperer l'URL de l'image en taille d'origine.

Bref lorsque ta fonction {{tpl:EntryFirstImage src_only="1"}} renvoie

          blog/toto/public/images/.nom_image_s.jpg

j'aimerais récupéré

          blog/toto/public/images/nom_image.jpg

c'est à dire virer le "." au début du nom du fichier image ainsi que le "_s" (ou "_t" ou "_sq"...).

Ca ne dois plus être très dur maintenant aussi je vais essayer de comprendre ton bout de code...

Encore mille merci Adjaya !
Je me rapproche de mon besoin...

Si je n'arrive pas à faire cette dernière modif (j'aimerais quand meme essayé...), pourras tu éventuellement m'aider ?

Quand je vois que tu as fait tout ce bout de code en aveugle (sans tester) et qu'il fonctionne, je me dis que cette dernière modif doit être un jeu d'enfant pour toi...

Tres cordialement.

Hors ligne

#7 2009-01-29 10:40:45

adjaya
Membre
Lieu : Provence - Luberon
Inscription : 2006-09-05
Site Web

Re : Comment recuperer l'URL de la balise {{tpl:EntryFirstImage}} ?

Y'a rien à coder pour la taille, c'est prévu d'origine avec l'attribut size :
size            (sq|t|s|m|o)    #IMPLIED    -- Image size to extract,
donc pour la taille originale  et juste le src, c'est :

{{tpl:EntryFirstImage src_only="1" size="o"}}

Photo, Art et Création Numérique : http://benoit-grelier.photo7.fr/

Hors ligne

#8 2009-01-29 10:53:06

adjaya
Membre
Lieu : Provence - Luberon
Inscription : 2006-09-05
Site Web

Re : Comment recuperer l'URL de la balise {{tpl:EntryFirstImage}} ?

PS : Pour ta question _"Ai-je besoin de l'ensemble du code que tu as fourni ou bien certaines parties ne concernent pas mon besoin ?"
En fait le code proposé est juste une adaptation du code d'origine pour y ajouter quelques options avec de nouveaux attributs, c'est la démarche la plus simple à mon sens pour pas réinventer la roue.


Photo, Art et Création Numérique : http://benoit-grelier.photo7.fr/

Hors ligne

#9 2009-01-29 11:09:09

Anar
Membre
Inscription : 2008-11-27

Re : Comment recuperer l'URL de la balise {{tpl:EntryFirstImage}} ?

Merci Adjaya !

C'est génial...
J'aivais bien essayé de comprendre le code et de l'adapter sans succés avant de lire tes derniers posts !

C'est nickel comme çà...

Hors ligne

#10 2013-03-08 19:12:14

dub
Membre
Inscription : 2013-03-08
Site Web

Re : Comment recuperer l'URL de la balise {{tpl:EntryFirstImage}} ?

Bonjour,

Excusez-moi de déterrer ce post, mais j'ai voulu tester ce script pour récupérer le format original de la première image trouvée dans le post et je m'aperçois qu'il ne marche pas si l'image originale uploadée (et à partir desquelles ont été générées les miniatures) est autre chose qu'un .jpg bien que la fin du script semble rechercher la bonne extension.

Personnellement je n'avais pas réinventé la roue avant de trouver ce script mais juste ajouté ces quelques lignes à mon <head>

<?php
$nb_img_preview = preg_match_all('/<img [^>]*src=["|\']([^"|\']+)/i', $_ctx->posts->post_excerpt, $matches_preview);
$nb_img_post = preg_match_all('/<img [^>]*src=["|\']([^"|\']+)/i', $_ctx->posts->post_content, $matches_post);
$remplacements = array('_t.' => '.', '_o.' => '.', '_m.' => '.', '_sq.' => '.', '_s.' => '.', '/.' => '/' );

    if ($nb_img_preview) {
         if (substr($matches_preview[1][0], 0, 7) == 'http://' || substr($matches_preview[1][0], 0, 8) == 'https://') {
         echo "<meta property=\"og:image\" content=\"".strtr($matches_preview[1][0],$remplacements)."\" />\n";
         } else {
         echo "<meta property=\"og:image\" content=\"http://www.partytime.fr".strtr($matches_preview[1][0],$remplacements)."\" />\n";
         }
    } elseif ($nb_img_post) {
         if (substr($matches_post[1][0], 0, 7) == 'http://' || substr($matches_post[1][0], 0, 8) == 'https://') {
         echo "<meta property=\"og:image\" content=\"".strtr($matches_post[1][0],$remplacements)."\" />\n";
         } else {
         echo "<meta property=\"og:image\" content=\"http://www.partytime.fr".strtr($matches_post[1][0],$remplacements)."\" />\n";
         }
    } else {
    echo "<meta property=\"og:image\" content=\"http://www.partytime.fr/images/header.jpg\" />\n";
    } 

?>

Dernière modification par dub (2013-03-08 19:16:08)


Créateur, contributeur, développeur, webmaster et administrateur de Party Time

Hors ligne

#11 2013-03-08 21:02:45

patidou
Membre
Inscription : 2004-11-14
Site Web

Re : Comment recuperer l'URL de la balise {{tpl:EntryFirstImage}} ?

Regarde dans le thème Polyvalence, il y a tout ce que tu veux faire. ;-)


«Quand j'étais petit, je voulais être maître du monde. Maintenant que je suis grand, j'arrive à peine à être maître de moi-même.» Le Chat/Philippe Geluk.
Dotclear a besoin de vous

Hors ligne

#12 2013-03-08 21:38:33

Jean-Michel
Modérateur à ailes d'ange
Lieu : Paris
Inscription : 2006-08-22
Site Web

Re : Comment recuperer l'URL de la balise {{tpl:EntryFirstImage}} ?

dub a écrit :

Personnellement je n'avais pas réinventé la roue avant de trouver ce script mais juste ajouté ces quelques lignes à mon <head>

Le mettre dans un _public.php, c'est quand même mieux :)

Hors ligne

#13 2013-03-08 22:03:20

dub
Membre
Inscription : 2013-03-08
Site Web

Re : Comment recuperer l'URL de la balise {{tpl:EntryFirstImage}} ?

Merci pour le conseil, mais malheureusement non, il n'y a pas tout ce que je veux faire :)

En gros, je veux pouvoir renseigner la balise meta og:image par l'url de l'image la plus grande possible (donc l'originale uploadée) contenue dans l'aperçu, sinon dans le post.

Précédemment je récupérais bêtement l'url de la miniature trouvée dans l'aperçu sinon dans le post, mais dernièrement Faceb**k a apparemment changé sa politique en n'acceptant que les images supérieures à 200px en hauteur et largeur.


Créateur, contributeur, développeur, webmaster et administrateur de Party Time

Hors ligne

#14 2013-03-08 22:22:37

patidou
Membre
Inscription : 2004-11-14
Site Web

Re : Comment recuperer l'URL de la balise {{tpl:EntryFirstImage}} ?

Avec la fonction du thème polyvalence, tu peux passer la taille d'image en paramètre. Sinon Facebook accepte bien la taille médium (500 pixels par défaut si je me souviens bien), essaye sur mon site avec une photo de galerie. ;-)


«Quand j'étais petit, je voulais être maître du monde. Maintenant que je suis grand, j'arrive à peine à être maître de moi-même.» Le Chat/Philippe Geluk.
Dotclear a besoin de vous

Hors ligne

#15 2013-03-08 22:24:58

patidou
Membre
Inscription : 2004-11-14
Site Web

Re : Comment recuperer l'URL de la balise {{tpl:EntryFirstImage}} ?


«Quand j'étais petit, je voulais être maître du monde. Maintenant que je suis grand, j'arrive à peine à être maître de moi-même.» Le Chat/Philippe Geluk.
Dotclear a besoin de vous

Hors ligne

#16 2013-03-08 22:54:58

dub
Membre
Inscription : 2013-03-08
Site Web

Re : Comment recuperer l'URL de la balise {{tpl:EntryFirstImage}} ?

Le problème c'est que la taille medium n'existe que si l'image originale est supérieure en taille à 500px (c'est 600px par défaut) ce qui n'est pas le cas si l'originale fait par exemple : 400 x 300px

Je crois que le plus simple reste à indiquer au gars qui poste les news de ne mettre que des images assez grandes et de régler dans mes paramètres la taille small à 360px (pour une miniature en 16:9, ça fait une hauteur > à 200px donc ok).

Merci quand même pour les infos. Je vais pouvoir cleaner un peu mon code en chargeant le fichier _public.php


Créateur, contributeur, développeur, webmaster et administrateur de Party Time

Hors ligne

#17 2013-03-08 23:02:20

Jean-Michel
Modérateur à ailes d'ange
Lieu : Paris
Inscription : 2006-08-22
Site Web

Re : Comment recuperer l'URL de la balise {{tpl:EntryFirstImage}} ?

Perso, les images de mon blog font généralement 448x298px et jamais de soucis pour que ça passe en miniature sur Facebook.

Hors ligne

#18 2013-03-09 08:52:52

patidou
Membre
Inscription : 2004-11-14
Site Web

Re : Comment recuperer l'URL de la balise {{tpl:EntryFirstImage}} ?

Tu te prends la tête pour rien, perso mes originaux font 800 px de large et j'ai laissé les réglages par défaut. Et ça marche.

Franchement laisse tomber le code que tu nous présente plus haut c'est une horreur. Avec dotclear, c'est mieux de créer une nouvelle balise de template. ;-)


«Quand j'étais petit, je voulais être maître du monde. Maintenant que je suis grand, j'arrive à peine à être maître de moi-même.» Le Chat/Philippe Geluk.
Dotclear a besoin de vous

Hors ligne

#19 2013-03-09 09:02:05

patidou
Membre
Inscription : 2004-11-14
Site Web

Re : Comment recuperer l'URL de la balise {{tpl:EntryFirstImage}} ?

Ajoute un fichier _public.php dans ton thème et colle le code suivant :

<?php
if (!defined('DC_RC_PATH')) { return; }

$core->tpl->addValue('MyEntryFirstImageURL',array('tplPolyvalenceTpl','MyEntryFirstImageURL'));


class tplPolyvalenceTpl
{
	public static function MyEntryFirstImageURL($attr)
	{
		$size = !empty($attr['size']) ? $attr['size'] : '';
		$class = !empty($attr['class']) ? $attr['class'] : '';
		$with_category = !empty($attr['with_category']) ? 'true' : 'false';
		
		return "<?php echo tplPolyvalenceTpl::MyEntryFirstImageURLHelper('".addslashes($size)."',".$with_category.",'".addslashes($class)."'); ?>";
	}
	public static function MyEntryFirstImageURLHelper($attr)
	{
		global $core, $_ctx;
		
		$media = new dcMedia($core);
		$sizes = implode('|',array_keys($media->thumb_sizes)).'|o';
		if (!preg_match('/^'.$sizes.'$/',$size)) {
			$size = 'm';
		}
		$p_url = $core->blog->settings->system->public_url;
		$p_site = preg_replace('#^(.+?//.+?)/(.*)$#','$1',$core->blog->url);
		$p_root = $core->blog->public_path;
		
		$pattern = '(?:'.preg_quote($p_site,'/').')?'.preg_quote($p_url,'/');
		$pattern = sprintf('/<img.+?src="%s(.*?\.(?:jpg|jpeg|gif|png))"[^>]+/msu',$pattern);
		
		$src = '';
		$alt = '';
		
		# We first look in post content
		if ($_ctx->posts)
		{
			$subject = $_ctx->posts->post_excerpt_xhtml.$_ctx->posts->post_content_xhtml;
			if (preg_match_all($pattern,$subject,$m) > 0)
			{
				foreach ($m[1] as $i => $img) {
					if (($src = self::ContentFirstImageLookup($p_root,$img,$size)) !== false) {
						$src = $p_url.(dirname($img) != '/' ? dirname($img) : '').'/'.$src;
						if (preg_match('/alt="([^"]+)"/',$m[0][$i],$malt)) {
							$alt = $malt[1];
						}
						break;
					}
				}
			}
		}
		
		# No src, look in category description if available
		if (!$src && $with_category && $_ctx->categories)
		{
			if (preg_match_all($pattern,$_ctx->categories->cat_desc,$m) > 0)
			{
				foreach ($m[1] as $i => $img) {
					if (($src = self::ContentFirstImageLookup($p_root,$img,$size)) !== false) {
						$src = $p_url.(dirname($img) != '/' ? dirname($img) : '').'/'.$src;
						if (preg_match('/alt="([^"]+)"/',$m[0][$i],$malt)) {
							$alt = $malt[1];
						}
						break;
					}
				}
			};
		}
		if ($src) {
			return $p_site.$src;
		}
	}
	private static function ContentFirstImageLookup($root,$img,$size)
	{		
		global $core;
		# Get base name and extension
		$info = path::info($img);
		$base = $info['base'];
		
		$media = new dcMedia($core);
		$sizes = implode('|',array_keys($media->thumb_sizes));
		if (preg_match('/^\.(.+)_('.$sizes.')$/',$base,$m)) {
			$base = $m[1];
		}
		
		$res = false;
		if ($size != 'o' && file_exists($root.'/'.$info['dirname'].'/.'.$base.'_'.$size.'.jpg'))
		{
			$res = '.'.$base.'_'.$size.'.jpg';
		}
		else
		{
			$f = $root.'/'.$info['dirname'].'/'.$base;
			if (file_exists($f.'.'.$info['extension'])) {
				$res = $base.'.'.$info['extension'];
			} elseif (file_exists($f.'.jpg')) {
				$res = $base.'.jpg';
			} elseif (file_exists($f.'.jpeg')) {
				$res = $base.'.jpeg';
			} elseif (file_exists($f.'.png')) {
				$res = $base.'.png';
			} elseif (file_exists($f.'.gif')) {
				$res = $base.'.gif';
			}
		}
		
		if ($res) {
			return $res;
		}
		return false;
	}
}




?>

Et ensuite dans tes fichiers html utilise :

	<meta property="og:image" content="{{tpl:MyEntryFirstImageURL whith_category="1" size="m"}}" />

«Quand j'étais petit, je voulais être maître du monde. Maintenant que je suis grand, j'arrive à peine à être maître de moi-même.» Le Chat/Philippe Geluk.
Dotclear a besoin de vous

Hors ligne

#20 2013-03-09 09:03:11

patidou
Membre
Inscription : 2004-11-14
Site Web

Re : Comment recuperer l'URL de la balise {{tpl:EntryFirstImage}} ?

Et merci adjaya qui m'a soufflé cette solution à l'époque :-)


«Quand j'étais petit, je voulais être maître du monde. Maintenant que je suis grand, j'arrive à peine à être maître de moi-même.» Le Chat/Philippe Geluk.
Dotclear a besoin de vous

Hors ligne

#21 2013-03-09 09:09:50

patidou
Membre
Inscription : 2004-11-14
Site Web

Re : Comment recuperer l'URL de la balise {{tpl:EntryFirstImage}} ?

Ah oui faut changer "tplPolyvalenceTpl" par un nom à toi…


«Quand j'étais petit, je voulais être maître du monde. Maintenant que je suis grand, j'arrive à peine à être maître de moi-même.» Le Chat/Philippe Geluk.
Dotclear a besoin de vous

Hors ligne

#22 2013-11-13 10:49:42

terresdefrance
Membre
Lieu : France
Inscription : 2012-11-18

Re : Comment recuperer l'URL de la balise {{tpl:EntryFirstImage}} ?

Merci Adjaya ! Sauvé !

Hors ligne

Vous n'êtes pas identifié(e).

Pied de page des forums

Sites map