Автор Тема: Поиск галереи на файлах  (Прочитано 5723 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн jean179

  • Главный модератор
  • Продвинутый
  • *****
  • Сообщений: 483
  • jean179.ru
    • Просмотр профиля
    • Отдых в Анапе в частном секторе
  • Версия modx: 1.12
Поиск галереи на файлах
« : 15 Январь 2012, 10:44:21 »
Может кто встречал такую?
Требования:
1. нет админки.
2. при первом вызове делает превьюшки сама
3. желательно шаблон отдельно в чанке
4. описание фоток бралось бы из текстового файла в этой папки.
Как это должно выглядеть: на страницы есть вызов снипета с указанием директории. При просмотре страницы снипет заглядывает в указанную директорию и если нет превьюшек их делает. Затем ищет и считывает файл с описаниями и затем выводит галерею по заданному шаблону с описаниями картинок. Предварительно я заливаю картинки и файл описаний по FTP.

Оффлайн artdevue

  • Разбирающий
  • **
  • Сообщений: 71
    • Просмотр профиля
    • ArtDeVue
  • Версия modx: Revo latest
Re: Поиск галереи на файлах
« Ответ #1 : 15 Январь 2012, 13:43:29 »
Это ваш пост на http://community.modx-cms.ru/blog/questions/5912.html[/size][/font]
Я Вам дал ссылку [/font][/size][/font]community.modx-cms.ru/blog/questions/2301.html где я примерное делал.
1) нет админки
2) при первом вызове, ставите phpthumbof
3) шаблон вставляется одной строчкой
4) это нужно вам немного доработать


Я думаю, что именно под вашу задачу, вам немного нужно допилить и всё.


Оффлайн jean179

  • Главный модератор
  • Продвинутый
  • *****
  • Сообщений: 483
  • jean179.ru
    • Просмотр профиля
    • Отдых в Анапе в частном секторе
  • Версия modx: 1.12
Re: Поиск галереи на файлах
« Ответ #2 : 15 Январь 2012, 16:54:44 »
Да, это мой пост. И ники топикстартеров одинаковые  :-D.

Так, секундочку. Я делаю снипет по указанному адресу выводящие картинки. А внутри прописываю вызов снипета по условию (если в первый раз) и дописываю себе уже чтение из файла описание картинок?

Хм. Я с такой позиции не думал. В любом случае нужно будет поэкспеременитровать. Спасибо за мысль.

Оффлайн jean179

  • Главный модератор
  • Продвинутый
  • *****
  • Сообщений: 483
  • jean179.ru
    • Просмотр профиля
    • Отдых в Анапе в частном секторе
  • Версия modx: 1.12
Re: Поиск галереи на файлах
« Ответ #3 : 16 Январь 2012, 00:16:28 »
Итак была задача: сделать галерею изображений к странице без админки и без лишних наворотов.

Требовалось (техническое задание)
1. по FTP заливались картинки в размере и файл с названиями картинок в отдельную директорию.
2. скрипт вызывался на странице с указанием директории, размером превьюшек и высотой и шириной превьюшки
3. скрипт автоматом просматривал директорию, считывал названия файлов из файла описания и, если первый раз, то делал отдельную дирректорию и туда складывал превьюшки.
4. ну и, соответственно, выводил это на запрашиваемой странице.

Ну поиски в интернете на предмет расширений готовых или которые можно было быстро допилить результатов не дали. На этом сайте поймал пару советов по поводу поиска и дали вариант решения, который меня не устраивал. Пару табуреток поймал за лень: «или мне Вам дописать».

В общем разозлился я и накорябол своей первый сниппет. Все цели решил, правда ушел на все-про все 1/2 воскресного дня :). Ну и изучил на практике чуток PHP. Блин, какой же кайф после с++ и pascal!

Вот исходник чего получилось. Документировал все подробно. Кто хочет — может поправить.


<?php
/**
 * @name DirGallery
 * @author Evgeny Vershinin <jean179@mail.ru>
 * @license GPLv3
 * @version 0.1
 * Исходники взяты и идея взята от webvsem с форума <http://forum.santafox.ru/index.php?topic=1272.msg8101#msg8101>
 *
 * &folder=`foldername`
 * Папка для отображения. Должна быть внутри assets/images/ 
 *
 * &width=`120` - Optional
 * Ширина изображения. Задается для уменьшения картинки
 *
 * &height - `90` - Optional
 * Высота изображения. Задается для уменьшения картники
 * 
 * $tpl - `<div class="photo"><a href="[+images+]"><img src="[+thumbs+]" alt="[+title+]" /></a></div>`
 * Шаблон вывода галереи
 *
 * Используются следующие плейсхолдеры
 * images - ссылка на большое изображение
 * thumbs - ссылка на мальенькое изображение
 * title -  название фотографии
 *     
 */     

// Этап 1. Установка входящих значений
==================================================================
if (!isset($folder)) {
  die('Не установлена директория, в которой хранятся изображения');
}
$tpl = (isset($tpl )) ? $modx->getChunk($tpl) : '<div class="photo"><a href="[+images+]"><img src="[+thumbs+]" alt="[+title+]" /></a></div>';

// Устанавливаю размер превьюшек
$width = (isset($width)) ? $width : 120;
$height = (isset($height)) ? $height : 90;

// Этап 2. Проверка входящих значений
//================================================================
$fullpath = $modx->config['base_path'] . 'assets/images/' . $folder . '/';
$dir1 = "assets/images/$folder/"; //указываем директорию с файлами изображений
if (!is_dir($fullpath)) {
    $modx->logEvent(1, 3, 'Не найденна директория: ' . $fullpath, 'куда обращается сниппет DirGallery');
    return 'Ошибка: Сниппет DirGallery не нашел указанную директорию.';
}
$thumbsdir = "thumbs/";
$out='';

// Этап 3. Работа скрипта
==================================================================

//Создаем директорию для превьюшек
if (!is_dir($fullpath)) {
  mkdir($fullpath);
  mkdir($fullpath.$thumbsdir);
}

$dir=dir($fullpath);

//Считываем файл с названиями фотографий
//==========================================================
$file = $fullpath."images.txt"; //название файла в дирректории по умолчанию
$h = fopen($file,"r"); //открываем файл на чтение
$i = 0; //обнуляем счетчик для цикла
while (!feof ($h)) {
    $content[$i] = fgets($h); //читаем строку
    ++$i;
}
fclose($h);


$i = 0; //снова обнуляем счетчик для цикла
while(false !== ($e = $dir->read())) //цикл чтения директории
{
   //определяем условие для считывания файлов с подстановкой расширения *jpg
   if(stripos($e,'.jpg'))
   {
     //вывод изображений-ссылок, если надо, то уменьшаем
     //если появились новые файлы, то автоматом делаем превьху
      makethumb($e, $folder, $width, $height);

    //Последовательно заменяем плейсхолдеры на значения - отрабатываем чанк
    //изначально писалось для файла, а не в внутри MODx, потому API не исползую
    $txt = $tpl;
    $txt = str_replace("[+images+]", $dir1.$e  , $txt);
      $txt = str_replace("[+thumbs+]", $dir1.$thumbsdir.$e , $txt);
     $txt = str_replace("[+title+]", $content[$i] , $txt);
      //Какой кай php! Вот и ве замены. Не то что Pascal!!!
      
    $out .= $txt."\n";
     ++$i; //увеличиваем счетчик текущей позации файла на единичку
   }

}


function makethumb($filename, $dir, $width, $height) {
 
  $d = "assets/images/$dir/"; //указываем директорию с файлами изображений
  //снова получаем полный путь
  $fullpath=$_SERVER['DOCUMENT_ROOT']."/$d";
  $thumbsdir = "thumbs/";
  $currthumbfile = "$fullpath{$thumbsdir}$filename";
 
  if (!is_dir($fullpath.$thumbsdir)) mkdir($fullpath.$thumbsdir);
 
  if (!is_file($currthumbfile)) {
    //$ratio=4;         //Отношение imageSize / thumbnailImageSize
    $quality = 90;      //Качество уменьшенной картинки (0: worst to 100:best)
   
    //получаем размуры исходника в массив
    $size = GetImageSize("$fullpath/$filename");
    //пробуем создать картинку
    $im = @imagecreatefromjpeg("$fullpath/$filename");
   
    //Находим отношения сторон
    $wm = $size[0] / $width;
    $hm = $size[1] / $height;
   
    //Находим минимальное отношение строрн источника и превьюхи
    $min = ($wm > $hm) ? $hm : $wm;

    //Расчитываем обрезание по большей стороне
    $ah = intval ($size[1] / $min);
    $aw = intval ($size[0] / $min);
   
    // Начальные координаты куда копируем
    $destX = 0;
    $destY = 0;
    if ($aw < $width)  $destX = intval(($width  - $aw)/2);
    if ($ah < $height) $destY = intval(($height - $ah)/2);

    // Начальные координаты откуда копируем
    // Расчитано на вырезание из центра. Таки образом не будут полей
    $srcX = ($size[0] - intval ( $width * $min))/2;
    $srcY = ($size[1] - intval ( $height * $min))/2;
   
    // Создаем изображения
    $image_small = imagecreatetruecolor($width, $height);
    $white=ImageColorAllocate($image_small,255,255,255);
    if ($im)
    {
       Imagecopyresampled($image_small, $im, $destX, $destY, $srcX, $srcY, $aw,$ah, $size[0],$size[1]);
       Imagejpeg($image_small, $currthumbfile, $quality);
       // Освобождаем память
      ImageDestroy($im);
       ImageDestroy($image_small);
    }
  }
}

//Выводим на страницу, откуда вызвали
return $out;
?>


Надел каску, залег в окопе и жду табуреток ;)))

Оффлайн artdevue

  • Разбирающий
  • **
  • Сообщений: 71
    • Просмотр профиля
    • ArtDeVue
  • Версия modx: Revo latest
Re: Поиск галереи на файлах
« Ответ #4 : 16 Январь 2012, 01:22:38 »
ну, лень парой нужно и побеждать.....  ;D .
Видите, почти и вышло!!!! конечно немного лишних телодвижений у вас в коде, но скажу честно молодцы.
Скажу теперь своё слово.  ;D
Не вижу смысла не использовать готовой галереи для Ево, почему....
В вашем скрипте - нужен файл с названиями фотографий, это представляете при пакетных загрузках, что будет. Я так понимаю, здесь вы хотели упростить работу, но вы наоборот её усложнили для менеджера или пользователя.
Ваш файл работает только с jpg изображениями....
могу дальше продолжить, но мне кажется этого достаточно

Подсказка, если хотите файлы заливать по FTP и упростить работу, не нужны текстовые файлы, название можно брать с помощью exif_read_data,
к примеру
exif_imagetype - определяет тип изображенияexif_read_data — читает шапки EXIF в JPEG или TIFF
exif_thumbnail - запрашивает внедрённую уменьшенную версию/thumbnail изображения TIFF или JPEG
getimagesize - получает размер изображения
read_exif_data - читает header-информацию, хранимую в изображениях TIFF и JPEG
потом, уже создаёте превью изображения (лучше воспользоваться готовыми расширениями, потому-что у вас там тоже косяков хватает) и сохраняете титлы к примеру или в файл или в чанк

Оффлайн jean179

  • Главный модератор
  • Продвинутый
  • *****
  • Сообщений: 483
  • jean179.ru
    • Просмотр профиля
    • Отдых в Анапе в частном секторе
  • Версия modx: 1.12
Re: Поиск галереи на файлах
« Ответ #5 : 16 Январь 2012, 07:58:28 »
Нет, тут я получил тот инструмент, что я хотел. Такая галерея заточена четко под каталог. Каталог наполняю я и только я. Т.е. я понимаю что делаю. Галерея нужна для вывода фотографий в конце описания, допустим, товара.

Теперь что касается "запутаться" - тут нужно делать именно структуру, повторяющуюся как у каталога, а затем либо распарсивать путь, либо кидать все в одну папку. Еще не решил. В любом случае это легко будет для поддержки и синхронизации/резервного копирования.

Галерея Evo - это моя любимая галерея. Туда бы еще пару полей мне воткнуть - и я бы был на седьмом небе от счастья! Но она нужна именно для нормальной галереи. И эти вхождения одной в другую запутывают и мешают. Для каталога, мне кажется, нужно проще, "дубовей" решение.

Почему я сделал решение на файле описания, а не на EXIF? Как программист, я согласен с вами : такое решение лучше, но как пользователь - нафиг мне такие заморочки! Тут или я забиваю в файлик описания, которые я хочу в любом текстовом редакторе, либо ищу и ставлю графический просмотровщих и там уже вношу это поле в сам файл. А если я его ужму- отредактирую? Данные теряются. А может нет. Короче нужно делать кучу лишних движений. Легче сделать файлик описаний на каждую директорию. Так что принциа KISS торжествует!

Галерея мне нужна для jpg и потому я не стал делать поддержку png,gif,tiff. Мне не нужны пока водяные знаки, потому и не стал с этим разбираться. Хотя вот это нужно будет и реализовать - но это для болших изображений. Хм. Нужно подумать как сделать флаг, что уже переделал фотки в стандарте - может переименовывать?

Что касается кода. Я знаю, что можно было уменьшить количество переменных, но я делал для читабельности текста. Если у вас есть замечания как улучшить - с удовольствием выслушаю!




Оффлайн jean179

  • Главный модератор
  • Продвинутый
  • *****
  • Сообщений: 483
  • jean179.ru
    • Просмотр профиля
    • Отдых в Анапе в частном секторе
  • Версия modx: 1.12
Re: Поиск галереи на файлах
« Ответ #6 : 31 Январь 2012, 14:22:11 »
Я тут даработал свой синппет и ввелновый функционал: когда нет файла с описаниями, то он выводит в описании имена файлов.
<?php
/**
 * @name DirGallery
 * @author Evgeny Vershinin <jean179@mail.ru>
 * @license GPLv3
 * @version 0.2
 * Исходники и идея взята от webvsem с форума <http://forum.santafox.ru/index.php?topic=1272.msg8101#msg8101>
 *
 * &folder=`foldername`
 * Папка для отображения. На конце не должно быть "/" !
 *
 * &width=`120` - Optional
 * Ширина изображения. Задается для уменьшения картинки
 *
 * &height - `90` - Optional
 * Высота изображения. Задается для уменьшения картники
 * 
 * $tpl - `<div class="photo"><a href="[+images+]"><img src="[+thumbs+]" alt="[+title+]" /></a></div>`
 * Шаблон вывода галереи
 *
 * Используются следующие плейсхолдеры
 * images - ссылка на большое изображение
 * thumbs - ссылка на мальенькое изображение
 * title -  название фотографии
 *     
 */     

// Этап 1. Установка входящих значений
//==================================================================
$out = '';  //Обнуляем выходную переменную
$folder .= '/';
if (!isset($folder)) {
  $out = 'Не установлена директория, в которой хранятся изображения';
  return $out;
}

$tpl = (isset($tpl )) ? $modx->getChunk($tpl) : '<div class="gal-cat">
    <a href="[+images+]" title="Фотогалерея: [+title+] " rel="gallery">
        <img src="[+thumbs+]" class="imgl" alt="Фотогалерея [*pagetitle*]: превью фотографии [+title+]" /></a></div>';

// Устанавливаю размер превьюшек
$width = (isset($width)) ? $width : 120;
$height = (isset($height)) ? $height : 90;

// Этап 2. Проверка входящих значений
//================================================================
$fullpath = $modx -> config['base_path'] . $folder . '/';
if (!is_dir($fullpath)) {
    $modx->logEvent(1, 3, 'Не найденна директория: ' . $fullpath. ' куда обращается сниппет DirGallery');
    $out = 'Ошибка: Сниппет DirGallery не нашел указанную директорию.';
    return $out;
}

$thumbsdir = "thumbs/";

// Этап 3. Работа скрипта
//==================================================================

//Создаем директорию для превьюшек
if (!is_dir($fullpath)) {
  mkdir($fullpath);
  mkdir($fullpath.$thumbsdir);
}

$dir = dir($fullpath);

//Считываем файл с названиями фотографий
//==========================================================
$file = $fullpath."images.txt"; //название файла в дирректории по умолчанию
$i = 0; //обнуляем счетчик для цикла

if (file_exists($file)) {
    $h = fopen($file,"r"); //открываем файл на чтение
    while (!feof ($h)) {
        $content[$i] = fgets($h); //читаем строку
        ++$i;
    }
    fclose($h);
}
else {
    $content = '';
}

$i = 0; //снова обнуляем счетчик для цикла

while(false !== ($image_name = $dir->read())) //цикл чтения директории
{
    //определяем условие для считывания файлов с подстановкой расширения *jpg
    if (stripos($image_name,'.jpg'))
    {
        makethumb($image_name, $folder, $width, $height);
        //Последовательно заменяем плейсхолдеры на значения - отрабатываем чанк
        $txt = $tpl;
        $txt = str_replace("[+images+]", $folder. $image_name  , $txt);
        $txt = str_replace("[+thumbs+]", $folder. $thumbsdir.$image_name , $txt);
        //если файла с описаниями не было, то просто вставляем имена файлов
        if ($content) { 
          $txt = str_replace("[+title+]", $content[$i] , $txt);
        } else {
          $txt = str_replace("[+title+]", $image_name , $txt);
        }
           
        $out .= $txt."\n";
         ++$i; //увеличиваем счетчик текущей позации файла на единичку
    }

}

    function makethumb($filename, $dir, $width, $height) {
     
      //$d = "assets/images/$dir/"; указываем директорию с файлами изображений
      //снова получаем полный путь
      $fullpath=$_SERVER['DOCUMENT_ROOT']."/$dir";
      $thumbsdir = "thumbs/";
      $currthumbfile = "$fullpath{$thumbsdir}$filename";
     
      if (!is_dir($fullpath.$thumbsdir)) mkdir($fullpath.$thumbsdir);
     
      if (!is_file($currthumbfile)) {
        //$ratio=4;         //Отношение imageSize / thumbnailImageSize
        $quality = 90;      //Качество уменьшенной картинки (0: worst to 100:best)
       
        //получаем размуры исходника в массив
        $size = GetImageSize("$fullpath/$filename");
        //пробуем создать картинку
        $im = @imagecreatefromjpeg("$fullpath/$filename");
       
        //Находим отношения сторон
        $wm = $size[0] / $width;
        $hm = $size[1] / $height;
       
        //Находим минимальное отношение строрн источника и превьюхи
        $min = ($wm > $hm) ? $hm : $wm;
   
        //Расчитываем обрезание по большей стороне
        $ah = intval ($size[1] / $min);
        $aw = intval ($size[0] / $min);
       
        // Начальные координаты куда копируем
        $destX = 0;
        $destY = 0;
        if ($aw < $width)  $destX = intval(($width  - $aw)/2);
        if ($ah < $height) $destY = intval(($height - $ah)/2);
   
        // Начальные координаты откуда копируем
        // Расчитано на вырезание из центра. Таки образом не будут полей
        $srcX = ($size[0] - intval ( $width * $min))/2;
        $srcY = ($size[1] - intval ( $height * $min))/2;
       
        // Создаем изображения
        $image_small = imagecreatetruecolor($width, $height);
        $white=ImageColorAllocate($image_small,255,255,255);
        if ($im)
        {
            Imagecopyresampled($image_small, $im, $destX, $destY, $srcX, $srcY, $aw,$ah, $size[0],$size[1]);
            Imagejpeg($image_small, $currthumbfile, $quality);
            // Освобождаем память
          ImageDestroy($im);
            ImageDestroy($image_small);
        }
      }
    }


//Выводим на страницу, откуда вызвали
return $out;
?>

сниппет работает. Работу можно посмотреть в карточке каталог

Оффлайн ¥ota

  • Администратор
  • Разработчик
  • *****
  • Сообщений: 752
    • Просмотр профиля
    • Портфолио web-мастера
  • Версия modx: Evo, Revo
Re: Поиск галереи на файлах
« Ответ #7 : 31 Январь 2012, 18:35:20 »
Евгений, если вы не возражаете, то после тестирования и доработок сниппет можно будет перенести в Полезные решения для Evolution.

Оффлайн jean179

  • Главный модератор
  • Продвинутый
  • *****
  • Сообщений: 483
  • jean179.ru
    • Просмотр профиля
    • Отдых в Анапе в частном секторе
  • Версия modx: 1.12
Re: Поиск галереи на файлах
« Ответ #8 : 31 Январь 2012, 19:21:50 »
Нет, конечно. А какие доработки вы хотите внести?

Оффлайн ¥ota

  • Администратор
  • Разработчик
  • *****
  • Сообщений: 752
    • Просмотр профиля
    • Портфолио web-мастера
  • Версия modx: Evo, Revo
Re: Поиск галереи на файлах
« Ответ #9 : 31 Январь 2012, 19:32:59 »
Но вдруг еще появятся в процессе:

Я тут доработал свой синппет

Оффлайн jean179

  • Главный модератор
  • Продвинутый
  • *****
  • Сообщений: 483
  • jean179.ru
    • Просмотр профиля
    • Отдых в Анапе в частном секторе
  • Версия modx: 1.12
Re: Поиск галереи на файлах
« Ответ #10 : 31 Январь 2012, 21:12:57 »
А, понятно. В принципе есть идеи, но уже не хочется их реализовывать, поскольку улучшение реального функционала не будет, а лишь защита от дурака.

1. В частности если будет последний слеш в пути - сниппет не будет работать (но это легко определяется и исправляется разработчиком).
2. Исключение файла из сканирования - допустим хранить в сниппете и главную картинку статьи каталога - решается картинкой в папке уровнем выше.