Разделы

[plugin]DirectResizeLite 0.0.1

Занимаясь документацией для MODx-cms.ru, решил приложить скриншоты и логичным продолжением этой мысли стало желание сделать так, чтобы выводились привьюшки, а по щелчку хайслайдом показывалась большая картинка. Сказано сделано, тем более я прекрасно помню, что этим должен заниматься DirectResize.

Скачал из официального репозитория версию 0.8.0.2, не заработало. Затем скачал по совету знакомого новую версию с форума DirectResize 0.9.0, но снова не заработало. Что тут поделаешь? Полез в код.

Буквально сразу выяснилось, что теперь DirectResize использует phpthumb и даже перенял у него нехорошую привычку отдавать картинки через image.php. А для красивости предлагается внести изменения в .htaccess (кстати, мы с burik уже давно разобрались, что MODx позволяет делать подобные красивости и без изменений в .htaccess и видимо как-нибудь об этом расскажем). Все сделал, все настроил — не работает…

Но помню я, что было золотое время когда DirectResize работал буквально в два шага «поставил — работает». И в конечном итоге добрался я до сайта, где это все работает. Но оказалось, что тот DirectResize имеет похоже французские корни (комменты и переменные), да и работает он только с lightbox.

Короче я слегка подпилил его для работы с highslide и решил выложить сюда. Вдруг еще кому-то понадобится такая облегченная версия. Возможно в будущем я ее сам переработаю, а может быть кто-то другой возьмется.

Плагин DirecrResizeLite
Вешается на событие OnWebPagePrerender.

// vos paramètres :
$path			= "assets/images/cache";							//... path to thumbnails
$prefix			= "page_";											//... prefix for thumbnails
$r				= 0;												//... rule for resizing (0: based on w and h ; 1: based on w ; 2: based on h ; 3: w max et h max ; 4: img mini to fill a container of w x h)
$q_jpg			= 90;												//... image quality from 0 to 100 (big quality) for jpg
$q_png			= 0;												//... image quality from 0 (no compression) to 9 for png
$lien_base		= "assets/images";									//... folder path where to resize images
$lien_plugin 	= "assets/plugins/directresize/directResize.php";	//... path to plugin file
$lightbox		= 2;												//... activation fo lightbox 0: non actived; 1: actived for img tag containing lightbox in their class; 2: activated for all images smaller than their original
$lightbox_w		= 700;												//... max width for lightbox
$lightbox_h		= 500;												//... max height for lighbox

// traitement des variables
//$path	= str_replace("/","%2F",$path);
if (substr($prefix,-1) != "_") $prefix .= "_";

// inclusion de la fonction directResize
include $lien_plugin;


$e = &$modx->Event;
switch ($e->name) {
	case "OnWebPagePrerender":
		$o = $modx->documentOutput; 		//... récupère la totalité du code de la page

		$reg = "/<img[^>]*>/";									//... pattern de recherche des balises d'image
		preg_match_all($reg, $o, $imgs, PREG_PATTERN_ORDER); 	//... recherche toutes les occurances d'image
		for($n=0;$n<count($imgs[0]);$n++){
			//-----------------------
			$lien_img = eregi_replace("^.+src=('|\")","",$imgs[0][$n]);						//... récupère le lien de l'image
			$lien_img = eregi_replace("('|\").*$","",$lien_img);										//... récupère le lien de l'image
			//-----------------------
			if (substr($lien_img,0,strlen($lien_base)) == $lien_base){									//... si l'image est dans le bon dossier
				$img = strtolower($imgs[0][$n]);
				$verif_balise = sizeof(explode("width",$img)) + sizeof(explode("height",$img)) - 2;
				if ($verif_balise > 0){																	//... s'il y a au moins une valeur de height ou width
					####################################### Miniature de la page ###############################################################
					preg_match("/height *(:|=) *[\"']* *\d+ *[\"']*/",$img,$array);						//... récupère la balise height et sa valeur
					sizeof(explode(":",$array[0])) > 1 ? $style = true : $style = false;				//... défini s'il s'agit d'une taille précisée dans le style ou dans les attributs d'image
					$heigth = ereg_replace("[^0123456789]","",$array[0]);								//... taille en height
					//-------------------
					preg_match("/width *(:|=) *[\"']* *\d+ *[\"']*/",$img,$array);						//... récupère la balise width et sa valeur
					$width = ereg_replace("[^0123456789]","",$array[0]);								//... taille en width
					//-------------------
					if ($style) {
						$imgf = eregi_replace("(height|HEIGHT|Height) *: *[0123456789]* *(px)* *","",$imgs[0][$n]);				//... supprime les balise height
						$imgf = eregi_replace("(width|WIDTH|Width) *: *[0123456789]* *(px)* *","",$imgf);				//... supprime les balise width
					} else {
						$imgf = eregi_replace("(height|HEIGHT|Height) *= *[\"']* *[0123456789]* *(px)* *[\"']*","",$imgs[0][$n]);//... supprime les balise height
						$imgf = eregi_replace("(width|WIDTH|Width) *= *[\"']* *[0123456789]* *(px)* *[\"']*","",$imgf);	//... supprime les balise width
					}
					//-------------------
					preg_match("/^.+(src|Src|SRC)=('|\")/",$imgf,$lien_g);								//... récupère la partie gauche de la balise
					$imgf = eregi_replace("^.+src=('|\")","",$imgf);										//... récupère la partie droite de la balise
					preg_match("/('|\").*$/",$imgf,$lien_d);
					//-------------------
					$lienRedim = directResize($lien_img,$path,$prefix,$width,$heigth,$r,$q_jpg,$q_png);
					//-------------------
					$nouvo_lien = $lien_g[0].$lienRedim.$lien_d[0];										//... formation du lien final
					
					####################################### Traitement pour Lightbox ###############################################################
					preg_match("/highslide/",strtolower($imgs[0][$n]),$verif_light);
					if (($lightbox == 1 && $verif_light[0] == "highslide") || ($lightbox == 2 && substr($lien_img,0,strlen($lien_base)) == $lien_base)){			//... si lightbox activé pour cette image
						$size 			= getimagesize($lien_img);										//... récupère les tailles de l'image originale
						$img_src_w 		= $size[0];
						$img_src_h 		= $size[1];
						
						$alt 	= "";
						$title	= "";
						preg_match("/(alt|Alt|ALT) *= *[\"|'][^\"']*[\"']/",$imgs[0][$n],$array);		//... vérifie si la balise alt est définie et récupération
						if ($array[0] <> ""){
							$alt = eregi_replace("alt *= *[\"|']","",$array[0]);
							$alt = eregi_replace("[\"']*","",$alt);
							$alt = trim($alt);
						}
						preg_match("/(title|Title|TITLE) *= *[\"|'][^\"']*[\"']/",$imgs[0][$n],$array);	//... vérifie si la balise title est définie et récupération
						if ($array[0] <> ""){
							$title = eregi_replace("title *= *[\"|']","",$array[0]);
							$title = eregi_replace("[\"']*","",$title);
							$title = trim($title);
						}
						if ($alt <> "" || $title <> ""){
							$legende = " title=\"$alt";
							if ($alt <> "" && $title <> "") $legende .= "<br />";
							if ($title <> "") $legende .= "<span style='font-weight:normal; font-size: 9px'>$title</span>";
							$legende .= "\" ";
						} else {
							$legende = "";
						}
						
						if ($img_src_w > $width || $img_src_h > $height){								//... si l'image originale est plus grande que l'image affich?йe dans la page
							if ($img_src_w > $lightbox_w || $img_src_h > $lightbox_h){					//... si l'image originale est plus grande que la taille de zoom demand?йe --> redimentionnement
								$lienRedim = directResize($lien_img,$path,$prefix,$lightbox_w,$lightbox_h,3,$q_jpg,$q_png);
								//$nouvo_lien = "<a rel=\"lightbox\" ".$legende." href='".$lienRedim."' >".$nouvo_lien."</a>";
								$nouvo_lien = "<a class=\"highslide\" onclick=\"return hs.expand(this)\" ".$legende." href='".$lienRedim."' >".$nouvo_lien."</a>";
							} else {																	//... sinon, lien vers l'image d'origine
								//$nouvo_lien = "<a rel=\"lightbox\" ".$legende." href='".$lien_img."' >".$nouvo_lien."</a>";
								$nouvo_lien = "<a class=\"highslide\" onclick=\"return hs.expand(this)\" ".$legende." href='".$lien_img."' >".$nouvo_lien."</a>";
							}
						}
					}
					
					####################################### Remplacement final du lien d'image ###############################################################
					$o = str_replace($imgs[0][$n],$nouvo_lien,$o);										//... remplacement dans le rendu global
				}
			}
		}
		
		$modx->documentOutput = $o;
		break;
	default :
		return; // stop here - this is very important.
		break;
}


Также нужны файлики из этого архива: DirectResizeLite0.0.1.

Так как плагин самостоятельно не подключает нужный JS, то сделать это надо вручную:

Добавляем в шаблон вызов:

<script type="text/javascript" src="[(site_url)]assets/plugins/directresize/libs/highslide/highslide.packed.js"></script>
<script type="text/javascript">
hs.graphicsDir = '[(site_url)]assets/plugins/directresize/libs/highslide/graphics/';
hs.lang.creditsText = '';
</script>


PS: К сожалению символы некоторые в процессе потерялись, как вы можете заметить по коду.

UPD: нашелся автор сего французского произведения и тема на официальном форуме, где хранится последняя версия DirectResize (фр).
  • +2
  • 12 июля 2009, 01:18
  • Carw

Комментарии (10)

RSS свернуть / развернуть
+1
кстати, мы с burik уже давно разобрались, что MODx позволяет делать подобные красивости и без изменений в .htaccess и видимо как-нибудь об этом расскажем

Я думаю по завершении архива я приведу это описание (заодно будет и работающий пример). :)
avatar

burik

  • 12 июля 2009, 01:26
0
Какая эпопея с установкой.
в DirectResize 0.9.0 было пару нерабочих версий теперь все как обычно
главное в конфиги не забыть отключить красивый адрес тогда вообще проблем нет.

Я просто в дистрибьютив его добавил и все установил а он уже сразу есть.
avatar

fobazzz

  • 12 июля 2009, 22:59
0
Да меня, честно говоря, отдача статики через PHP сразу отпугнула… Поэтому до момента «работает» я так и не добрался — начал искать старую версию.
avatar

Carw

  • 12 июля 2009, 23:22
0
Обнаружились корни, добавил ссылку.
avatar

Carw

  • 13 июля 2009, 01:40
0
DirectResize 0.9.0 и DirectResize 0.8.0.2 рабочие скрипты — сам ими пользуюсь постоянно — и ставяться и работают.
avatar

ikarushka

  • 13 июля 2009, 18:21
0
Кстати, ссылка на скачивание не работает
avatar

WebraumZ

  • 16 июля 2009, 01:50
0
Исправил.
avatar

Carw

  • 16 июля 2009, 10:18
0
Установил этот плагин, но он работает с ошибкой: вместо маленькой превьюшки в статью вставляется огромный оригинал картинки. Что-то не срабатывает, но что?

пожалуйста, подскажите, очень нужно!

modx evo 1.02
avatar

OldHunterHank

  • 18 марта 2010, 18:02
0
Сам разобрался. Надо тупо создать папку assets/images/cache, где будут храниться превьюшки.
avatar

OldHunterHank

  • 19 марта 2010, 11:06
0
Странно дело — теперь другие картинки (которые имели ссылку) и выводяться в шаблоне без JavaScript — стали локальными!

* мне это не желательно (
avatar

doc555

  • 8 ноября 2010, 02:18

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.