Модуль "Галерея" (beta)
То самое вступление
Друзья и товарищи, а так же проходящие мимо.
У меня давным-давно в планах было написать модуль галерея. Он придавал бы блогосоциалке больше той самой социальности, которой часто не хватает.
Времени всё не хвататло и вот, благодаря новому заказчику, модуль всё-таки вышел в свет.
С удовольствием делюсь им с сообществом и выслушиваю предложения по доработке.
Хочу подчеркнуть что модуль нуждается в доработке (как минимум в нормальном css-оформлении). Если кто-нибудь может этим заняться было бы очень неплохо.
Так же нуждается в доработке функция обработки загруженных изображений (по-моему она медленная).
Функционал
Все скриншоты сделаны с версткой заказчика. К сожалению скопировать всем я ее не могу:(
По этому нужен новый дизайн. Если кто-нить наверстает, я вставлю:)
Галерея состоит из альбомов.
У каждого альбома есть
Существует 3 области видимости: открытый, для друзей и личный.
После добавления альбома мы попадаем на страничку
С нее мы можем
Мы видим: Описание альбома, список всех альбомов пользователя, обложку альбома(если есть), кнопку редактирования и удаления альбома, а так же добавлений фотографий (для владельцев и администраторов).
Затем идет коллаж фоток.
Если Вы администратор или владелец, вы можете выбрать обложку или удалить фотографии.
При клике на фотографию она открывается.
Если удаляется фотография-обложка, обложкой ставится первая попавшая. При добавлении первой фотографии, она ставится обложкой.
Добавление фотографий осуществляется с помощью флеш-загрузчика
Загрузчик позволяет загружать много фотографий (выделяя сразу несколько файлов). Есть прогрессбар загрузки, а так же мини-копии.
При инициализации загрузчик заменяет div-элемент с input'ами, так что если у пользователя отсутствует флеш, он сможет загрузить файлы.
О реализации
2 таблички — album и image, файлы загружаются в uploads\images\gallery\userId\albumId.
Флеш-загрузчик передает поочередно файлы в include\ajax\upload.php. Туда же с помощью сессии передается текущий альбом. Там просиходит обработка и вызов функции аплоада, которая уже создает эскизы.
При загрузки не через flash срабатывает другой обработчик из экшена и так же вызывает функцию аплоада для каждой фотки.
Максимальный размер файла задается в javascripte (шаблон addimages.tpl).
Установка
1. Выполняем sql-запрос из gallery.sql
2. Копируем всё из папки gallery в корень livestreet
3. В /config/config.route.php в массив «page» добавляем:
'gallery' => 'ActionGallery',
4. В /config/config.table.php добавляем:
define('DB_TABLE_GALLERY_ALBUM',DB_PREFIX_TABLE.'gallery_album');
define('DB_TABLE_GALLERY_IMAGE',DB_PREFIX_TABLE.'gallery_image');
5. В Файле header.tpl прописываем следующие строки:
<style media="all" type="text/css">@import "{$DIR_STATIC_SKIN}/swfupload/default.css";</style>
<style media="all" type="text/css">@import "{$DIR_STATIC_SKIN}/swfupload/addition.css";</style>
<script type="text/javascript" src="{$DIR_WEB_ROOT}/include/ajax/swfupload/swfupload.js"></script>
<script type="text/javascript" src="{$DIR_WEB_ROOT}/include/ajax/swfupload/handlers.js"></script>
6. В файл includes/function.php вставляем в самый конец функцию из func_img_resize1.php
7. Проставляем ссылки в шаблоны:
Случайные альбомы: {$DIR_WEB_ROOT}/gallery
Альбомы текущего пользователя: {$DIR_WEB_ROOT}/gallery/{$oUserCurrent->getLogin()}
Остальные ссылки будет видно на страницах.
110 комментариев
а если трафик на хостинге/впс лимитирован? хозяин попадает на бабки :-)
А в целом, поставил плюс
Подмена js там вроде защищена считыванием сессии. (т.е. в джаваскрипт прописывается текущая сессия)
если вы сможете таким образом быстро (пока вас незабанил владелец сайта) сгенерировать более 100 гигов входящего трафика, то да, хозяин попадает на бабки
Разумеется, можно специальным образом сформировать POST-запрос чтобы заголовок был с малым значением, а тело запроса огромным, но это уже через стандартный интерфейс браузера не сделать %-)
Ограничения на уровне PHP самые слабые, т.к. сработают уже после окончания POST-запроса с файлом в теле.
Ограничения в веб-сервере на фактического тело запроса, типа директивы LimitRequestBody в апаче уже значительно жестче, т.к. в этом случае веб-сервер разорвет соединение как только тело запроса превысит указанный размер.
Ну и ограничения на уровне заголовков, например, упомянутый Content-Length. Веб-клиент должен при отсылке multipart-формы установить такой заголовок со значением размера тела запроса. Как сказано выше, подделать заголовок технически не составляет никакого труда, но в этом случае уже вступает в действие лимит на фактически принятый запрос, однако, в случае добропорядочного гражданина, человеку нет необходимости ждать окончания аплоада чтобы узнать, что его файл имеет размер больше допустимого, сообщение об ошибке вывалится в самом начале аплоада.
но как видно, статье уже скоро как 2 года, современные браузеры ведут себя более адекватно.
все это используется крайне редко, то отдельные модули, то настройки которых нет в конфиге по-умолчанию и как следствие в 99% вам ничего не помешает.
На мой взгляд ограничения апача уже сложно обойти)
причем вам же будет хуже, они забьют все доступные слоты для коннекта и будет отказ в обслуживании. это не та тема для подобного обсуждения. я в этом больше не участвую
или нет ограничений по расширению? и можно грузить хоть .exe? или будут менять расширения чтобы загрузить гигабайты? да это один случай на миллион можно не запариваться.
Пока не ставил — но
1)я думаю что все таки css+js добавлять в header общий это плохо — 48 килобайт лишнего кода загружается даже если пользователь будет заходить только на главную — посему нужно подключать яваскрипт и css при конкретном экшене…
2)в classes/modules/gallery пусто… странно это… так и задумано без маппера и класса?
В любом случае за модуль большое спасибо — завтра потестирую)
У меня, например, css и js подгружаются в зависимости от экшена.
Пусто?? ))) ща перезалью)))
Еще непонятные в DIR_STATIC_SKIN/actions/albums.tpl
<div class="post-info">
<div class="wrap">
<strong><a href="
<strong><a href="
<a href="
<a href="#"><img src="
</div>
див от заказчика видимо остался)
завтра протестирую ;)
сегодня посмотрю
Случайные
Альбомы пользователя
При нажатии на первую — пусто, при нажатии на вторую — страницы не существует ошибка 404. Что не так делаю?
страница должна быть. В config.route.php прописал? Заходишь под пользователем?
В config.route.php прописано 'gallery' => 'ActionGallery', захожу под пользователем, в header.tpl прописал в head <style media="all" type="text/css">@import "{$DIR_STATIC_SKIN}/swfupload/default.css";</style>
<style media="all" type="text/css">@import "{$DIR_STATIC_SKIN}/swfupload/addition.css";</style>
<script type="text/javascript" src="{$DIR_WEB_ROOT}/include/ajax/swfupload/swfupload.js"></script>
<script type="text/javascript" src="{$DIR_WEB_ROOT}/include/ajax/swfupload/handlers.js"></script>
Ссылки прописал так <A href="{$DIR_WEB_ROOT}/gallery/">Случайные</A>
<A href="{$DIR_WEB_ROOT}/gallery/userLogin/">Альбомы</A> Ну и все остальное выполнил…
а настройка ограничений использования оперативки интерпретатором в документации к php написано
Люди, я сделал так: <A href="{$DIR_WEB_ROOT}/gallery/ {$oUserCurrent->getLogin()}/">Альбомы</A> У кого нормально работает подскажите пожалуйста что надо сделать?
{if $oUserCurrent}
<A href="{$DIR_WEB_ROOT}/gallery/ {$oUserCurrent->getLogin()}/">Альбомы</A>
{/if}
Пробел лишний закрался, нужно так:
{if $oUserCurrent}
<A href="{$DIR_WEB_ROOT}/gallery/{$oUserCurrent->getLogin()}/">Альбомы</A>
{/if}
{if $oUserCurrent}
<A href="{$DIR_WEB_ROOT}/gallery/{$oUserProfile->getLogin()}/">Альбомы</A>
{/if}
Вот так лучше…
А то если ссылку на галлери ставить в профиле, получается что зашел в чужой профиль а оттуда ссылка на свой галлери :)
QL-запрос:
CREATE TABLE IF NOT EXISTS `prefix_gallery_album` (
`album_id` int( 11 ) NOT NULL AUTO_INCREMENT , `album_user_id` int( 11 ) NOT NULL , `album_title` varchar( 200 ) CHARACTER SET utf8 NOT NULL ,
`album_description` text COLLATE utf8_bin,
`album_type` enum( 'personal', 'open', 'friend' ) COLLATE utf8_bin NOT NULL default 'open',
`album_date_add` datetime NOT NULL ,
`album_date_edit` datetime NOT NULL ,
`album_cover_image_id` int( 11 ) default NULL ,
PRIMARY KEY ( `album_id` ) ,
KEY `user_id` ( `album_user_id` )
) ENGINE = MYISAM DEFAULT CHARSET = utf8 COLLATE = utf8_bin AUTO_INCREMENT =21;
Ответ MySQL: Документация
#1064 — You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'CREATE TABLE IF NOT EXISTS `prefix_gallery_album` (
`album_id` int(11) NOT' at line 1
Что с этим делать?
Выбираю файл начинается загрузка и все. Дальше ничего не происходит :(
Где копать?
PS. Тестирую на локалке, MySQL с поддержкой UTF-8 и InnoDB, для PHP установлено расширение mbstring.
Вот, чего то не хватает.
1. Функцию вставил в function.php?
2. Посмотри логи апача.
3. Если не помогает — выключи джаваскрипт(или удали swfuploader из header.tpl) и попробуй загузить фотки обычным загрузчиком.
Посмотри какие там ошибки выпадут.
не найдено это:
include/ajax/swfupload/undefined
на том скриншоте ссылка на это:
файл: addimages.tpl
// Button Settings
button_image_url : "../applicationdemo/images/SmallSpyGlassWithTransperancy_17x18.png", // Relative to the SWF file
убрал, ошибки нет, но все равно не грузит.
если пройти на
include/ajax/swfupload/swfupload.swf
то выдат ошибку, типа нету
include/ajax/swfupload/undefined
и еще не находит кнопку отмены
templates/skin/habra/images/cancelbutton.gif
да, загрузчик находит но нету undefined, мне кажется что именно в этом проблема
Плиз, помогите, так хочется этим движком попользоваться.
в шапке написано
а тут
/include/ajax/swfupload/js/handlers.j
Цитирую benone С удовольствием делюсь им с сообществом и выслушиваю предложения по доработке и повторяю вопрос. Может кто сделал уже рейтинг фото, разбивку на страницы и навигацию по галерее. Ведь отлично все сделано, загружать можно сразу хоть по 20 фоток, работает шустро, без глюков. Жаль если так все и останется, не до конца все таки сделано. Короче мне нужно вот это. Если кто сделает — готов оказать материальное вознаграждение.
Честно говоря, растерялся от обилия информации. С чего начать?
Здравствуйте! Хочу прикруть вот такую штуку к галерее:
Цель — чтобы изображения со страницы gallery/user/## отображались не в новом окне, а в окошке скрипта, по аналогии с Lightbox. Если я правильно понял, нужно править шаблон album.tpl, добавить фразу rel=«designSlide»:
<a href="{$oImage->getPath()}" rel="designSlide"><img src="{$oImage->getImagePath(200)}" /></a>
Сам скрипт добавить по аналогии с 5-м пунктом установки галереи:
<script type="text/javascript" src="{$DIR_WEB_ROOT}/include/mooSlideX.js"></script>.
Но похоже что-то упустил, не работае..=// Кто подскажет решение?
Рейтинг фото — не знаю насколько нужен, а вот комменты к фото — это было бы здорово. Если модуль комментирования отдельно вставляется к странице с топиком, то наверное можно его и к фотографии привязать, «сказав» ему, что это вариант топика.
Всем здрасте!
Модуль очень понравился, установил хорошо, но нашел такой баг или это только у меня:
при попытке создать альбом в названии которого один символ или цифра выдает ошибку
Fatal error: Call to a member function getTitle() on a non-object in Z:\home\ls.loc\www\templates\compiled\%%47^47C^47C5FDA3%%album.tpl.php on line 10
Но у меня не работает. Сделал все как по инструкции, но в самом конце загрузки изображения, когда выводится надпись «Создание уменьшенной копии» появляется окошко с 400 ошибкой и картинка не загружается.
Где копать?
В то время, как на локальной версии все работает прекрасно, на хостинге вдруг возникла проблема.
А возникла именно в файле upload.php. Все обрывается в самом начале, ибо:
В общем, файл "./config/config.ajax.php" успешно инклюдится, но $oEngine->InitModules(); не срабатывает.
Перенес весь блок кода из config.ajax.php сразу в upload.php — та же ерунда.
Закомментил строку с проверкой авторизации — тут же ошибка на $oAlbum.
Такое ощущение, что upload.php вообще лежит не на хостинге вместе с остальными, а где-то в космосе, и оттуда нихрена не видит.
Кирюх, чего я не так делаю? Файлы перенес все до единого, строки все прописаны, функции дописаны, все проверил по несколько раз.
Обратился к файлу (upload.php) напрямую. Дай-ка мне, — говорю, — дамп данных юзера!
Н-н-на! — говорит мне файл и вываливает как на духу все мои данные. Т.е. видит, видит, зараза такая.
Какого ж тогда рожна он не видит их при попытке аплоада?
Мэйби, какие-то секьюрные настройки сервера?
Fatal error: Class 'LsGallery' not found in /usr/local/www/www.bpm49.ru/www/myblog/classes/engine/Engine.class.php on line 98
И вместо галереи — вот:
Fatal error: Uncaught exception 'Exception' with message 'Не найден класс модуля — Gallery' in /home/vshosts/hosts/u14984/clubmeteor.ru/www/classes/engine/Engine.class.php:95 Stack trace: #0 /home/vshosts/hosts/u14984/clubmeteor.ru/www/classes/engine/Engine.class.php(183): Engine->LoadModule('Gallery', true) #1 /home/vshosts/hosts/u14984/clubmeteor.ru/www/classes/engine/Action.class.php(268): Engine->_CallModule('Gallery_getAlbu...', Array) #2 [internal function]: Action->__call('Gallery_getAlbu...', Array) #3 /home/vshosts/hosts/u14984/clubmeteor.ru/www/classes/actions/ActionGallery.class.php(219): ActionGallery->Gallery_getAlbumsRandom(5) #4 /home/vshosts/hosts/u14984/clubmeteor.ru/www/classes/engine/Action.class.php(103): eval()'d code(1): ActionGallery->EventShowRandomAlbums() #5 /home/vshosts/hosts/u14984/clubmeteor.ru/www/classes/engine/Action.class.php(103): eval() #6 /home/vshosts/hosts/u14984/clubmeteor.ru/www/classes/engine/Router.class.php(171): Action->ExecEvent() #7 /home/vshosts/hosts/u14 in /home/vshosts/hosts/u14984/clubmeteor.ru/www/classes/engine/Engine.class.php on line 95
Кто-нибудь встречал такое?
Если только за определённую плату..:)
Функционал остался который был за исключением некоторых функций, но есть некоторые баги, хотя принципе работает стабильно и неплохо..:)
Я не претендую на развитие копии плагина «Gallery» для 0.4.2…
Я с начало решил его купить, но не дождавшись ответа попробовал сам переделать Модуль для версии 0.3.? в Плагин 0.4.2 и просто отписался что у меня это получилось..:) Да, там пока ограничен функционал, но зато на данный момент открыт исходный код который я могу переделывать под себя..:) И тем более мне нужно было как раз открытый код, так как мне даже не так важна Gallery на данный момент, как подключение этого модуля к другому плагину, а это можно сделать только с открытым исходным кодом..:)
И на мой взгляд я нечего не нарушил, так-как модуль для версии 0.3.? я прямо скачал из этой темы, если я ошибаюсь поправьте меня..;)
С наступившим всех, Новым годом..=)