[EVO] SimpleGallery: расширение функционала, часть 1

Среди достоинств SimpleGallery есть возможность изменять логику работы, не опасаясь потерять эти изменения с очередным обновлением (ну, почти не опасаясь).
Возможности даже три — можно писать плагины, можно расширять классы, можно загружать свои js-скрипты.
В этой статье опишу события для плагинов, а в следующий раз покажу пример более радикального вмешательства с изменением не только логики работы, но и интерфейса.


На сегодняшний день в SimpleGallery можно использовать четыре события.

OnFileBrowserUpload

Событие происходит после успешной загрузки файла.

Доступные переменные:
  • $filepath — путь к файлу, без слеша в конце (/var/www/test/www/assets/galleries/5);
  • $filename — имя файла (image.jpg);
  • $template — id шаблона галереи;
  • $rid- id ресурса с галереей.

Применение: обработка загруженных изображений и генерация превью.

OnSimpleGallerySave

Событие происходит после записи информации о файле в базу, т.е. после успешной загрузки файла и после сохранения формы редактирования.

Доступные переменные:
  • названия полей в базе (sg_id,sg_image и т.д.);
  • $template — id шаблона галереи;
  • $newDoc — если true, то событие произошло при добавлении данных о файле, иначе — при редактировании.
Для новых файлов это событие можно считать частным случаем события OnFileBrowserUpload, которое происходит после загрузки файлов вообще (т.е. и через управление файлами, и через KCFinder).

Применение: дополнительная обработка данных в БД.

OnSimpleGalleryDelete

Событие происходит после того, как из базы удаляется информация о файле.

Доступные переменные:
  • $id — значение поля sg_id для удаленного файла;
  • $filepath — путь к файлу, без слеша в конце;
  • $filename — имя файла;
  • $name — имя файла без расширения;
  • $ext — расширение файла;
  • $mime — MIME-тип файла;
  • $template — id шаблона галереи.

Применение: удаление сгенерированных при загрузке превьюшек.

OnSimpleGalleryRefresh

Событие происходит после того, как администратор нажмет соответствующую кнопку и позволяет выполнить какую-то обработку уже загруженных файлов. По сути это событие OnSimpleGallerySave с установленным флагом $newDoc.

Доступные переменные — те же, что и для OnSimpleGallerySave, кроме $newDoc.

Применение: пересоздать превью с новыми параметрами.

И чтобы было понятно, вот пример плагина, который:
  • создает превьюшки при загрузке и сохраняет их в подпапку small;
  • удаляет их при удалении картинок;
  • позволяет сгенерировать превьюшки для уже загруженных ранее картинок;
  • а также будет очищать поле sg_title для новых картинок (для тех, кто страдает seo).


$e = &$modx->event;
if ($e->name == "OnFileBrowserUpload" && isset($template)) {
	$thumb = new \Helpers\PHPThumb();
	$fs = \Helpers\FS::getInstance();
	$fs->makeDir($filepath.'/small');
	$thumb->create($filepath.'/'.$filename,$filepath.'/small/'.$filename,'w=350&h=245&zc=1&q=96&f=jpg');
}
if ($e->name == "OnSimpleGalleryRefresh") {
	$fs = \Helpers\FS::getInstance();
	$filepath = $fs->takeFileDir($sg_image);
	$filename = $fs->takeFileBasename($sg_image);
	$thumb = new \Helpers\PHPThumb();
	$fs->makeDir($filepath.'/small');
	$thumb->create($filepath.'/'.$filename,$filepath.'/small/'.$filename,'w=350&h=245&zc=1&q=96&f=jpg');
}
if ($e->name == "OnSimpleGalleryDelete") {
	$fs = \Helpers\FS::getInstance();
	$file = $filepath.'/small/'.$filename;
	if (file_exists($file)) unlink($file);
}
if ($e->name == "OnSimpleGallerySave") {
        if ($newDoc) {
    	    $data = new \SimpleGallery\sgData($modx);
            $data->edit($sg_id)->set('sg_title',' ')->save();
        }
}

Как видно из примера, в событиях доступны классы \SimpleGallery\sgData, \Helpers\FS и \Helpers\PHPThumb, чем я и воспользовался, чтобы не усложнять плагин.

Если выводить через sgLister, то нужно создать сниппет, который будет добавлять small/ перед именем файла:

<?php
//mythumb
$file = end(explode('/',$input));
return str_replace($file,$options.'/'.$file,$input);
?>

И указать параметры: &thumbSnippet=`mythumb` &thumbOptions=`small`.

11 комментариев

avatar
Очень широкие возможности открываются и все понятно написано, застопорились только на этом моменте: «в событиях доступны классы \SimpleGallery\sgData, \Helpers\FS и \Helpers\PHPThumb»

Где можно взять эти классы и куда их нужно загружать относительно корня сайта, чтобы все заработало?
avatar
Классы уже загружены, когда вызывается событие.
avatar
Раньше настолько вплотную с работой плагинов не сталкивались… Пытаемся понять почему может не работать. Стандартный функционал галереи работает нормально. Есть папка .sgThumbs и там есть миниатюры загруженных фотографий.

Но приведенный в этом примере плагин не работает. Папка small не создалась. Из другого примера точно так же не получилось нанести водяной знак.

Мы создаем новый плагин. События все отмечаем, на которые должен плагин срабатывать… А на вкладке «Конфигурация плагина» — ничего не заполняем?

И еще, точно в данном примере не пропущены никакие include вроде этого:
include_once(MODX_BASE_PATH. 'assets/plugins/simplegallery/lib/plugin.class.php')?
Комментарий отредактирован 2015-04-29 10:45:16 пользователем mikhael
avatar
С примером все в порядке, это в SimpleGallery поломалась работа с событиями. Обновляйте плагин (можно только этот файл: github.com/Pathologic/SimpleGallery/commit/71963cbb9bde39da5f0101fdb8b5dccfcbb9ca30).
avatar
Спасибо большое. Теперь все супер работает. Буквально за десять минут изменил немного код и теперь при загрузке картинок автоматом создается изображение с нанесенным водяным знаком и загружается в отдельную папку. Оригинал при этом тоже сохраняется на сервере.

Я думаю нужно побольше разных готовых примеров показать людям. Это поможет популяризировать галерею. Потому что с такими не сложными плагинами возможности намного шире и гибче чем у evogallery.

Читал остальные части по поводу расширенния функционала… Со временем тоже может понадобится. Будет возможность — пишите еще.

Было бы не плохо кстати посмотреть пример как прикрутить голосование к отдельным фотографиям. Отзывы. Тоже кому-то может понадобится в отдельных проектах.
Комментарий отредактирован 2015-04-29 12:50:31 пользователем mikhael
avatar
Событие OnSimpleGalleryRefresh вызывается по клику на кнопку «Обновить превью»?

Почемуто не работает… Может тоже где-то ошибка в коде?..
avatar
Может и ошибка, покажите код плагина.
avatar
Код берем из примера. Все остальные события срабатывают как положено. При загрузке файла — создается папка small с отредактированным изображением. При удалении файла в админке — удаляется файл изображения в корне и в папке small.

А вот при нажатии на Обновить превью — вызывается окошко где можно выбрать шаблон и после нажатия продолжить — показывает процесс. Но ничего не происходит. Папки не создаются.
Комментарий отредактирован 2015-07-31 14:46:47 пользователем mikhael
avatar
avatar
Супер. Спасибо большое. Все заработало как положено.
avatar
Добавил в комплект плагин для генерации превью при загрузке, а также сниппет, чтобы использовать эти превью в сниппете sgLister.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.