PHP Галерия с картинки без база данни

HunteR

Super Moderator
Здравейте, имах малко свободно време и реших да спретна една галерийка :)
Самата галерия не използва база данни, а зарежда снимките направо от директориите.
Системата се състои от 1 php файл.

Нека преди да дам кода да кажа няколко думи и за самата система.
Значи като за начало си правите папка "pics". В нея ще бъдат слагани самите картинки.
Галерията разполага с категории. Тези категории са различните папки в папката "pics".
С прости думи. Ако в папката pics направите друга папка примерно "Животни", вече си имате категория Животни.
Ако направите още една папка "Коли" вече си имате категория с коли :)
Ако вътре в папката Животни направите папка "Котки" вече си имате под категория на категорията Животни.
И така може да си правите колкото поискате категории и под категории :)

Забравих също да спомена, че кода си има и странициране :)

Ето го кода:
Код:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<html>
<head>
<title>PHP Галерия</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
</head>

<body>

<?php

// КОНФИГУРАЦИЯ //

$pics_folder = "pics"; // в коя папка са картинките и категориите
$max_width = 150; // максимална широчина
$max_height = 150; // максимална височина
$pics_per_page = 25; // по колко картинки на страница
$pics_ex = array('jpg','jpeg','gif','png'); // кои файлове да зачита като картинки

// КРАЙ НА КОНФИГУРАЦИЯТА //

function resize($pic)
{
    global $max_width, $max_height;
    $max_width_pic = $max_width;
    $max_height_pic = $max_height;
    list($width,$height) = getimagesize($pic);
    $ratio = $width / $height;
    
    if ($width > $max_width_pic || $height > $max_height_pic)
    {
        if ($width > $height)
        {
            $width = $max_width_pic;
            $height = $width / $ratio;
        }
        elseif ($width < $height)
        {
            $height = $max_height_pic;
            $width = $height * $ratio;
        }
        elseif ($width == $height)
        {
            $width = $max_width_pic;
            $height = $max_height_pic;
        }
    }
    $width = intval($width);
    $height = intval($height);
    return array("width" => $width, "height" => $height);
}

$pics_folder = preg_replace('/[\/]+/', '/', $pics_folder.'/');

function all_images()
{
    global $pics_folder, $pics_ex;
    $folders = array($pics_folder);
    $checked = array($pics_folder);
    $out_files = array();
    while (count($folders))
    {
        foreach ($folders as $folder)
        {
            array_shift($folders);
            $dir = opendir($folder);
            while ($file = readdir($dir))
            {
                if ($file != '.' && $file != '..')
                {
                    if (is_file($folder.$file) && in_array(strtolower(end(explode(".", $file))), $pics_ex))
                    {
                        $out_files[] = $folder.$file;
                    }
                    elseif (is_dir($folder.$file) && !in_array($folder.$file.'/', $checked))
                    {
                        $folders[] = $folder.$file.'/';
                        $checked[] = $folder.$file.'/';
                    }
                }
            }
        }
    }
    return $out_files;
}

$all_images = all_images();

$category = false;
if (preg_match('/^[a-zа-я]+((->)[a-zа-я]+)*$/i', $_GET['kat']))
{
    $category = (is_dir($pics_folder.str_replace('->', '/', $_GET['kat']))) ? str_replace('->', '\/', $_GET['kat']) : false;
}

$out_images = array();
foreach ($all_images as $image)
{
    $raz = explode("/", $image);
    array_shift($raz);
    array_pop($raz);
    
    if ($category && !preg_match("/^$category/", implode("/", $raz))) continue;
    $out_images[] = $image;
}

$masiv = @array_chunk($out_images, $pics_per_page, true);

$stranici = floor(count($out_images) / $pics_per_page);
if ((count($out_images) % $pics_per_page) > 0) { $stranici++; }

if (is_numeric($_GET['page']) && $_GET['page'] <= $stranici) {
    $page = $_GET['page'];
} else {
    $page = 1;
}

$red = 1;
echo "<table border=\"0\">
<tr>\n";
foreach ($masiv[($page - 1)] as $pic)
{
    $resize = resize($pic);
    $razp = explode("/", $pic);
    array_shift($razp);
    array_pop($razp);
    
    $kat = array();
    for ($i=0;$i<count($razp);$i++)
    {
        $url = array();
        for($i2=0;$i2<=$i;$i2++)
        {
            $url[] = $razp[$i2];
        }
        $kat[] = '<a href="?kat='.implode("->", $url).'">'.$razp[$i].'</a>';
    }
    
    echo "<td><a href=\"{$pic}\" target=\"_blank\"><img src=\"{$pic}\" width=\"".$resize['width']."\" height=\"".$resize['height']."\" border=\"0\"></a><br />Категория:<br />".((count($kat)) ? implode(" -> ", $kat) : "Няма")."</td>\n";
    if ($red == floor(sqrt($pics_per_page))) { $red = 1; echo "</tr><tr>\n"; } else { $red++; }
}
echo "</tr>
</table>";

echo "<br><br><br />Страници: ";
for ($i=1;$i<=$stranici;$i++) {
    if ($page != $i) {
        echo "<a href=\"?page=$i".(($category) ? '&kat='.$_GET['kat'] : '')."\">$i</a> ";
    } else {
        echo "$i ";
    }
}
?>

</body>
</html>

Автора на кода съм аз и ще помоля ако го разпространявате да споменавате източник - Web-Tourist и автор - аз :D

Чудех се дали да го пусна като урок, но сигурно ще го направя утре, че вече ми се спи, а и е късно :D

Хайде, надявам се да има доволни от кодчето :p


EDIT: Еми така е толкова ми се спи, че даже не съм видял, че пускам темата в PHPBB категорията :oops:
Ще помоля някой модератор да я премести в PHP и MySQL кодове :)
 
Работи галерията,но малко седи недовършено, ето моето ДЕМО:
http://momenti.info/hGallery

Може би с нещо от сорта на Lightwindow или отделен фрейм за уголемената картинка..
:)
 
Doris каза:
Работи галерията,но малко седи недовършено, ето моето ДЕМО:
http://momenti.info/hGallery

Може би с нещо от сорта на Lightwindow или отделен фрейм за уголемената картинка..
:)
Да, сега това ще правя с jquery :)
След малко ще пусна новия код, с малко подобрения и предполагам ще бъде завършения вид на кода :)

ЕДИТ: Няма да е зле някой да премести темата в PHP кодове :)
 
Категориите са дадени като линкове, пък като кликнеш на тях нищо не става? :roll:
 
Doris каза:
Категориите са дадени като линкове, пък като кликнеш на тях нищо не става? :roll:
Ахам, да забелязах.
Както винаги бях объркал :)
Качил съм нов архив с нови файлове.
Вече категориите ги показва като цъкнеш на самата картинка :p

Download: LINK
 
Doris каза:
Показват се заедно с таговете.
Я дай скрийн, защото не те разбрах.
Как така се показват с таговете ?
 
Това, като посочиш с мишката:
pr.jpg


Сигурно лесно ще го оправиш. :)

Галерията би могла да има добри приложения:
Като си подредиш снимките и им намалиш размера с някоя програма за обща обработка на снимки, качваш ги всички накуп и готово.
През лятото за да изтрия излишните картинки от един сайт трябваше да свалям цялата директория за да ги разгледам на компютъра, а с нея могат направо да се откриват.
 
Еми то това е сложено като title, защото ако го няма като цъкнеш на картинката няма да ти се покаже категорията.
Пък и не мисля, че е голям проблем ако това си е така.
Ако някой разбира повече от jquery може да го редактира :)
 
може ли дами кажеш как да махна категориите и да сложа повече снимки на ред
 
beta16 каза:
може ли дами кажеш как да махна категориите и да сложа повече снимки на ред
Доста модване ще е докато магнеш напълно категориите.
А за снимките направи да са 49 на страница. Скрипта автоматично ще ги сложи по 7 на ред :)
 
Strict Standards: Only variables should be passed by reference in /var/www/html/pics/index.php on line 72

Strict Standards: Only variables should be passed by reference in /var/www/html/pics/index.php on line 72

Strict Standards: Only variables should be passed by reference in /var/www/html/pics/index.php on line 72

Strict Standards: Only variables should be passed by reference in /var/www/html/pics/index.php on line 72

Strict Standards: Only variables should be passed by reference in /var/www/html/pics/index.php on line 72

Strict Standards: Only variables should be passed by reference in /var/www/html/pics/index.php on line 72
и знам от какво е :)
if (is_file($folder.$file) && in_array(strtolower(end(explode(".", $file))), $pics_ex))
и на мен ми се е слочвало без да схващам защо, но трябва да разделиш тези функции с променливи
в смисъл
Код:
$ext = explode(".", $file);
$ext = strtolower(end($ext));
if (is_file($folder.$file) && in_array($ext, $pics_ex) .......
заради end(explode(... се получава най-вероятно, поне при мен :)

p.s. да, след това се махна грешката :)
 
HunteR каза:
beta16 каза:
може ли дами кажеш как да махна категориите и да сложа повече снимки на ред
Доста модване ще е докато махнеш напълно категориите.
А за снимките направи да са 49 на страница. Скрипта автоматично ще ги сложи по 7 на ред :)
е да ама аз искам да са по 7 на ред на и така 3 реда на долу а можеш ли да се пробваш да махнеш категориите колко можеш че мн ми забива от тях
 
Можели някой да ми каже как да изкарам категориите?
Да са отстрани че нещо не ми излизат :(
 
Понеже получавам ЛС с въпроси за списъка с категориите в галерията на Hunter, ще сложа тук линкове към две теми, където се вижда как става:
http://web-tourist.net/forum/viewtopic.php?p=367230&highlight=#367230
http://web-tourist.net/forum/viewtopic.php?p=368142&highlight=#368142

Има и един по-прост начин:
http://momenti.info/hGallery/indexr.php
http://momenti.info/hGallery/indexr.rar
но се губи първоначалния замисъл за универсалност.
 
Doris каза:
Понеже получавам ЛС с въпроси за списъка с категориите в галерията на Hunter, ще сложа тук линкове към две теми, където се вижда как става:
http://web-tourist.net/forum/viewtopic.php?p=367230&highlight=#367230
http://web-tourist.net/forum/viewtopic.php?p=368142&highlight=#368142

Има и един по-прост начин:
http://momenti.info/hGallery/indexr.php
http://momenti.info/hGallery/indexr.rar
но се губи първоначалния замисъл за универсалност.
Мерси много!
 

Горе