Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> галерея 
:(
    Опции темы
Aliance
Дата 8.2.2007, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 14
Всего: 137



Стоит задача, написать галерею. Прочитал неплохую тему http://forum.vingrad.ru/topic-61023.html, но она к сожалению рано умерла.
Открыл новую, т.к. я вижу свою галерею несколько иначе, чем автор той темы.

Сперва стал продумывать, что мне нужно. Пока что самое основное - на главной список n-нного кол-ва ссылок на юзеров, разместивщих свои фотки. При клике на ссылку попадаем на юзера, где видны все его фотки. При навигации по ним, фотки соотв. меняются.

Далее, у фотки есть заголовок, дата добавления.

Каждую фотку можно комментировать.

Есть админка, тут вопросов нет у меня.

Начинаю проектирование БД. Сперва создал (пока мысленно) основную таблицу
Код

CREATE TABLE `gallery` (
`id` SMALLINT( 5 ) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`title` VARCHAR( 50 ) NOT NULL DEFAULT 'без названия',
`date` DATETIME NOT NULL
) TYPE = MYISAM ;


И тут у меня возник вопрос: мне нужно делать превьюшки строгого размера, а при клике открывать уже реальный размер фото. Как хранить фотки - прямо в отдельном файле или же в БД. Второе никогда не делал, посоветуйте, что лучше. И есть хранить в БД, то как делается ограничение по размеру картинки?

Прошу навести меня на путь истинный, если есть недочеты в моем шаблоне - подсказать как исправить, возможно предложить свои варианты.

Готовыми галереями не хочу пользоваться.
PM MAIL WWW ICQ Skype   Вверх
-=Ustas=-
Дата 8.2.2007, 23:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ustix IT Group
****


Профиль
Группа: Участник Клуба
Сообщений: 2222
Регистрация: 21.1.2005
Где: Краснодар

Репутация: 32
Всего: 69



Я бы сделал так (на вскидку)

Код

CREATE TABLE `gallery_items` (
    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
    `user_id` INT UNSIGNED NOT NULL DEFAULT '0', # Владелец картинки
    `category_id` INT UNSIGNED NOT NULL DEFAULT '0', # Категория родитель
    `title` VARCHAR( 50 ) NOT NULL DEFAULT '',
    `date` INT NOT NULL DEFAULT '0', # Лучше все-таки Unix-timestamp хранить, тебе же легче будет
    `path` VARCHAR(255) NOT NULL DEFAULT '', # Путь к картинке
    `resolution_x` INT UNSIGNED NOT NULL DEFAULT '0',
    `resolution_y` INT UNSIGNED NOT NULL DEFAULT '0'
) TYPE = MYISAM ;

CREATE TABLE `gallery_categories` (
    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
    `user_id` INT UNSIGNED NOT NULL DEFAULT '0', # Владелец каталога
    `title` VARCHAR( 50 ) NOT NULL DEFAULT '', # Название категории
    `path` VARCHAR(255) NOT NULL DEFAULT '' # Путь к каталогу данной категории
) TYPE = MYISAM ;

CREATE TABLE `gallery_users` (
    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
    `login` VARCHAR( 40 ) NOT NULL DEFAULT '', # Логин владельца
    `password` VARCHAR( 40 ) NOT NULL DEFAULT '', # Пароль
    `login` VARCHAR( 40 ) NOT NULL DEFAULT '', # E-mail владельца
    `total_images` INT UNSIGNED NOT NULL DEFAULT '0', # Количество изображений, которые имеет данный юзер
) TYPE = MYISAM ;


Ну и т.д. и т.п. можно еще наворачивать до беспредела. Но в основном я думаю суть будет ясна. Пользователь может разбивать свои картинки по каталогам (соотвественно создается каталог на диске, допустим sha1( user_id.gallery_categories_id.login.mktime() ) чтоб было уникальное имя каталога и не совпало у другого юзера). total_images будет перезаписываться у пользователя во время вставки, типа gallery_users.total_images = gallery_users.total_images + 1, и обратно при удалении.

Размеры картинки, типа превьюшки и т.д. будут меняться налету при вызове, либо можно добавить поля 

Код

`big_path` VARCHAR(255) NOT NULL DEFAULT '', # Реальная картинка
`small_path` VARCHAR(255) NOT NULL DEFAULT '', # Превьюшка


и это будет происходить при вставке новой. Функция ресайза довольна проста, если делать при вставке, то тебе потом никаких телодвижений делать не придется smile


--------------------
В искаженном мире все догмы одинаково произвольны, включая догму о произвольности догм.
-----
PM WWW ICQ Skype   Вверх
Aliance
Дата 9.2.2007, 00:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 14
Всего: 137



Извеняюсь, что сразу не сказал. Мне пока НЕ нужны категории, никаких наворотов. Авторизация УЖЕ ЕСТЬ.

Пока вопросов два: где хранить изображения, и если в БД - то опишите плюсы минусы и скажите на словах, как работать.
А второй - как организовать ресайх картинок - до/после/во время..

Это сообщение отредактировал(а) Aliance - 9.2.2007, 00:45
PM MAIL WWW ICQ Skype   Вверх
-=Ustas=-
Дата 9.2.2007, 01:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ustix IT Group
****


Профиль
Группа: Участник Клуба
Сообщений: 2222
Регистрация: 21.1.2005
Где: Краснодар

Репутация: 32
Всего: 69



Цитата(Aliance @  9.2.2007,  00:43 Найти цитируемый пост)
Мне пока НЕ нужны категории, никаких наворотов

Ну я бы не сказал, что это такие уж и навороты... Скорее стандартная функциональность, которую как говориться must have. Тем более что это долго не затянет...

Цитата(Aliance @  9.2.2007,  00:43 Найти цитируемый пост)
и если в БД - то опишите плюсы минусы и скажите на словах, как работать.

Aliance, не в коем случае в БД! Ну хоть ты то прислушайся smile Только что оттуда - http://forum.vingrad.ru/topic-135003/15.html#entry1029404. Мы плохого не советуем  smile 
Цитата(Aliance @  9.2.2007,  00:43 Найти цитируемый пост)
А второй - как организовать ресайх картинок - до/после/во время..

Здесь уже дело сугубо личное.  Я как то раньше писал себе функцию, которую и по сей день пользую. Она прапорционально меняет размер относительно исходного размера.
Код

<?php

function ImageResize( $src, $width = 100, $height = 100, $resize = 'w', $dest = FALSE, $rgb=0xFFFFFF, $quality=100 )
{
    if ( !file_exists( $src ) ) {

        return FALSE;
    }
    $size = getimagesize( $src );

    if ( $resize == 'w' ) {
        if ( $size[0] > $width ) {
            $proportion = ( $width * 100 ) / $size[0];
            $height = ( $size[1] * $proportion ) / 100;
        }
    } else {
        if ( $size[1] > $height ) {
            $proportion = ( $height * 100 ) / $size[1];
            $width = ( $size[0] * $proportion ) / 100;
        }
    }

    if (!isset( $proportion ) ) {
        $width  = $size[0];
        $height = $size[1];
    }

    if ( $size === false ) {

        return FALSE;
    }

    $format = strtolower( substr( $size['mime'], strpos($size['mime'], '/' ) + 1 ) );
    $icfunc = 'imagecreatefrom'.$format;
    if ( !function_exists( $icfunc ) ) {

        return FALSE;
    }

    header( 'Content-type: '.$size['mime'] );

    $x_ratio = $width / $size[0];
    $y_ratio = $height / $size[1];
    $ratio       = min( $x_ratio, $y_ratio );
    $use_x_ratio = ( $x_ratio == $ratio );
    $new_width   = $use_x_ratio  ? $width  : floor( $size[0] * $ratio );
    $new_height  = !$use_x_ratio ? $height : floor( $size[1] * $ratio );
    $new_left    = $use_x_ratio  ? 0 : floor( ( $width - $new_width ) / 2 );
    $new_top     = !$use_x_ratio ? 0 : floor( ( $height - $new_height ) / 2 );
    $isrc  = $icfunc( $src );
    $idest = imagecreatetruecolor( $width, $height );
    imagefill( $idest, 0, 0, $rgb );
    imagecopyresampled( $idest, $isrc, $new_left, $new_top, 0, 0, $new_width, $new_height, $size[0], $size[1] );

    if ( $format == 'gif' ) {

        imagegif( $idest );
        
    } elseif ( $format == 'png' ) {

        imagepng( $idest );
        
    } else {

        imagejpeg( $idest, FALSE, $quality );
    }

    imagedestroy( $isrc );
    imagedestroy( $idest );

    return TRUE;


?>

Смотри какие тут плюсы и минусы. Можно делать на выводе (на лету) выдавать превьюшки, минус этого подхода - это лишнее процессорное время на работу ресайза, в то время, как мы стремимся отдавать пользователям инфу как можно быстрее. Поэтому лучше один раз при сохранении отресайзить и всё, при выдаче тогда никаких ресайзов не будет - это плюс. Ну а дальше смотри  smile 
ЗЫ. Эту функцию можно переписать на сохранение маленьких копий, там пара-тройка строк кода.

Это сообщение отредактировал(а) -=Ustas=- - 9.2.2007, 01:20


--------------------
В искаженном мире все догмы одинаково произвольны, включая догму о произвольности догм.
-----
PM WWW ICQ Skype   Вверх
Aliance
Дата 9.2.2007, 01:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 14
Всего: 137



Цитата(-=Ustas=- @  9.2.2007,  02:15 Найти цитируемый пост)
Ну я бы не сказал, что это такие уж и навороты... Скорее стандартная функциональность, которую как говориться must have. Тем более что это долго не затянет...

Мне оно просто не нужно. Вообще smile Хотя, если юзеры попросят - тогда и сделаю =)

Цитата(-=Ustas=- @  9.2.2007,  02:15 Найти цитируемый пост)
Aliance, не в коем случае в БД! Ну хоть ты то прислушайся  Только что оттуда - http://forum.vingrad.ru/topic-135003/15.html#entry1029404. Мы плохого не советуем   

А почему, не понимаю. И вообще, зачем тогда сделано хранение в БД бинарных данных?

Т.е. создать поле аля path и хранить там путь? Ок.

Еще, почему "Лучше все-таки Unix-timestamp хранить, тебе же легче будет"
PM MAIL WWW ICQ Skype   Вверх
-=Ustas=-
Дата 9.2.2007, 08:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ustix IT Group
****


Профиль
Группа: Участник Клуба
Сообщений: 2222
Регистрация: 21.1.2005
Где: Краснодар

Репутация: 32
Всего: 69



Цитата(Aliance @  9.2.2007,  01:48 Найти цитируемый пост)
Т.е. создать поле аля path и хранить там путь? Ок.

Совершенно верно.
Цитата(Aliance @  9.2.2007,  01:48 Найти цитируемый пост)

А почему, не понимаю. И вообще, зачем тогда сделано хранение в БД бинарных данных?

А чтобы было. Бывают такие ситуации когда нет возможности доступа к дисковому пространству - вот в этом случае хранение блобов в БД оправдано.
Цитата(Aliance @  9.2.2007,  01:48 Найти цитируемый пост)
Еще, почему "Лучше все-таки Unix-timestamp хранить, тебе же легче будет" 

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

date( 'Y.m.d H:i:s', $my_timestamp );
// или тут же можешь по другому
date( 'd.m.Y H:i', $my_timestamp );


Добавлено @ 08:41 
Если одним словом, то неограниченная гибкость в работе с датой в этом формате  smile 


--------------------
В искаженном мире все догмы одинаково произвольны, включая догму о произвольности догм.
-----
PM WWW ICQ Skype   Вверх
Aliance
Дата 9.2.2007, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 14
Всего: 137



-=Ustas=-, огромное спасибо, последний вопрос. На счет как сохранять содержимое?
Есть input:file форма. Пользователь загружает фото. Оно у скрипта в переменной, скажем. Мне нужно его сохранить в файл *.png с именем в формате user_name . number_of_foto . Мне пользоваться функцией imagecreate() ?
PM MAIL WWW ICQ Skype   Вверх
-=Ustas=-
Дата 9.2.2007, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ustix IT Group
****


Профиль
Группа: Участник Клуба
Сообщений: 2222
Регистрация: 21.1.2005
Где: Краснодар

Репутация: 32
Всего: 69



Цитата(Aliance @  9.2.2007,  10:52 Найти цитируемый пост)
Мне нужно его сохранить в файл *.png с именем в формате user_name . number_of_foto . Мне пользоваться функцией imagecreate() ? 

Ну в принципе да, функции imagejpeg, imagegif, imagepng сохраняют в файл.


--------------------
В искаженном мире все догмы одинаково произвольны, включая догму о произвольности догм.
-----
PM WWW ICQ Skype   Вверх
Aliance
Дата 9.2.2007, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 14
Всего: 137



Уже почти все ясно. Дайте совет, как лучше сделать главную страницу? Я думаю так:
ссылки всех, кто выложил свои фотки (записи в БК с 0 по 50 скажем)
внизу ссылка, ждем ее и добавляем свою фотку.
жмем на ссылке кого-то и видим все фотки, если это ты - то плюс админка (если ты админ - то админка на всех)
на главной еще сортировка и поиск.

Может что-то еще?
PM MAIL WWW ICQ Skype   Вверх
-=Ustas=-
Дата 10.2.2007, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ustix IT Group
****


Профиль
Группа: Участник Клуба
Сообщений: 2222
Регистрация: 21.1.2005
Где: Краснодар

Репутация: 32
Всего: 69



Цитата(Aliance @  9.2.2007,  21:15 Найти цитируемый пост)
Уже почти все ясно. Дайте совет, как лучше сделать главную страницу? Я думаю так:

Ну тут уже полет дизайнерской мысли  smile 
Цитата(Aliance @  9.2.2007,  21:15 Найти цитируемый пост)
жмем на ссылке кого-то и видим все фотки, если это ты - то плюс админка (если ты админ - то админка на всех)
на главной еще сортировка и поиск.

Да, нормально  smile 


--------------------
В искаженном мире все догмы одинаково произвольны, включая догму о произвольности догм.
-----
PM WWW ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0910 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.