[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Галерея изображений (Админка)
Evilsoul
Построив движок по курсам IRBIS-team, решил сделать галерею изображений да бы проверить чему научился и смогу ли я вообще это сделать. Как приятно для самого себя оказалось - смог :).

Данная галерея работает только на этом движке, так как включает в себя функции из курсов.
Ещё одно замечание, для навигации я использовал Навигатор, который упростил из данного Пагинатора в курсах, так как мне не нужны были параметр colums и в ЧПУ параметр page который был значением ключа rem.

Ну, вроде бы как всё, поехали.

Структура такова:
  • папка с модулями: ./admin/galleries в ней (router.php, view.php) - они есть в курсах (read_controller.php, edit_controller.php)
  • папка со скинами: ../tpl/admin/galleries в ней (read_gallery, edit_gallery, row_gallery, row_image)
  • попки с изображениями: ./uploads/galleries - для загружаемых изображений ./uploads/galleries/preview - для создания изображений для предосмотра.

Таблицы базы:
Свернутый текст
--
-- Структура таблицы `irbis_galleries`
--

CREATE TABLE IF NOT EXISTS `irbis_galleries` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`title` varchar(150) NOT NULL,
`description` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=94 ;


Свернутый текст
--
-- Структура таблицы `irbis_images`
--

CREATE TABLE IF NOT EXISTS `irbis_images` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`aid` int(10) unsigned NOT NULL,
`subtitle` varchar(150) DEFAULT NULL,
`fname` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=175 ;

read_controller.php

<?php
/**
* Generation of page of an error at access out of system
* Генерация страницы ошибки при доступе вне системы
*/

if(!defined('IRB_KEY'))
{
header("HTTP/1.1 404 Not Found");
exit(file_get_contents('../../404.html'));
}
////////////////////////////////////////////////////////////
/**
* We connect a file of adjustment of connection with base
* Подключаем файл настройки соединения с базой
*/

include IRB_ROOT . '/libs/mysql.php';

$gallery = '';
$upload_dir = IRB_ROOT.'/uploads/galleries/';

$tpl = getTpl('admin/galleries/row_gallery');

$POST['value1'] = !empty($_POST['value1']) ? $_POST['value1'] : 'Нет названия';
$POST['value2'] = !empty($_POST['value2']) ? $_POST['value2'] : 'Нет описания';

/**
* Gallery creation
* Создание галереи
*/

if($ok) // если кнопка нажата, добавляем в базу галерею
{
mysqlQuery("INSERT INTO `".IRB_DBPREFIX."galleries`
SET
`title`='"
.mysql_escape_string($POST['value1'])."',
`description`='"
.mysql_escape_string($POST['value2'])."'
"
);
// ну а здесь переходим к контроллеру редактирования галереи
reDirect('rem=edit', 'num='.$GET['num'], 'id='.mysql_insert_id()); // Здесь функция mysql_insert_id() возвращает ИД добавленой строки
}
/**
* Gallery editing
* Редактирование галереи
*/

if(isset($_POST['gallery'])) // так как в шаблоне есть разные формы, нужна была ещё одна кнопка, её тоже можно было бы определить в variables.php
{
$POST['value6'] = !empty($POST['value6']) ? $POST['value6'] : 'Название галереи';
$POST['value7'] = !empty($POST['value7']) ? $POST['value7'] : 'Описание галереи';

mysqlQuery("UPDATE `". IRB_DBPREFIX ."galleries`
SET
`date`='"
.(int)$POST['value5'].'-'.(int)$POST['value4'].'-'.(int)$POST['value3'].' '.'00:00:00'."',
`title`='"
.mysql_escape_string($POST['value6'])."',
`description`='"
.mysql_escape_string($POST['value7'])."'
WHERE `id`="
.(int)$POST['value8']."
"
);

reDirect();
}

/**
* Gallery removal
* Удаление галереи
*/

if($delete)
{ // нам нужно получить имя вайлов которые нужно бует удалить из папок галерей, делаем выборку.
$res3 = mysqlQuery("SELECT `fname`
FROM `"
. IRB_DBPREFIX ."images`
WHERE `aid`="
.(int)$POST['value8']
);


while ($row = mysql_fetch_assoc($res3))
{
if(file_exists($upload_dir.$row['fname'])) // если файл существует удаляем его, если нет иём дальше
unlink($upload_dir.$row['fname']);

if(file_exists($upload_dir.'preview/small_'.$row['fname'])) // так же
unlink($upload_dir.'preview/small_'.$row['fname']);
}
// этот запрос уаляет строку из базы галереи и все строки из базы изображений где их aid = id галереи(этот ID в форме)
mysqlQuery("DELETE `". IRB_DBPREFIX ."galleries`, `". IRB_DBPREFIX ."images`
FROM `"
. IRB_DBPREFIX ."galleries`, `". IRB_DBPREFIX ."images`
WHERE `"
. IRB_DBPREFIX ."galleries`.`id`=". (int)$POST['value8'] ." AND `". IRB_DBPREFIX ."images`.`aid`=". (int)$POST['value8']
);


reDirect('num='.$GET['num']);
}

/**
* Generation gallery
* Генерация галереи
*/

include IRB_ROOT . '/libs/irb_navigator.php';
$paginator = new IRB_Navigator($GET['num'], IRB_NUM_GALLERIES_ON_PAGE);

$res = $paginator->countQuery("SELECT *,
DATE_FORMAT(`date`, '%d') AS `day`,
DATE_FORMAT(`date`, '%m') AS `month`,
DATE_FORMAT(`date`, '%Y') AS `year`
FROM `"
.IRB_DBPREFIX."galleries`
ORDER BY `id` DESC
"
);
$navigation = $paginator->createMenu();

while($row = mysql_fetch_assoc($res))
{
$row['num_month'] = $row['month']; // это номер месяца для формы (01, 03, 07 и т.д.)
$row['month'] = $month_string[$row['month']];
$row['title'] = htmlspecialchars($row['title']);
$row['description'] = htmlspecialchars($row['description']);
$row['link'] = href('rem=edit', 'num='.$GET['num'], 'id='.$row['id']);
// выбераем 4 изображения из базы (рандомом - функция RAND())
$res2 = mysqlQuery("SELECT `fname`
FROM `"
.IRB_DBPREFIX."images`
WHERE `"
.IRB_DBPREFIX."images`.`aid` = ". (int)$row['id'] ."
ORDER BY RAND()
LIMIT 4
"
);
// функция RAND() в применении с ORDER BY - оч. трудоемкая и не желательна лучше использовать LIMIT с какой строки начинаем, лимит строк
// ну к сожалению у меня не получилось избавится от РАНД что бы получить такой результат, видать ещё мозгов маловато :)

for($i = 1; 4 >= $i; $i++)
{
$row[$i] = mysql_fetch_assoc($res2); // здесь получаем массив от 1 до 4 и потом переписываем его в новый для формы
$row['img'.$i] = $upload_dir.'preview/small_' .htmlspecialchars(!empty($row[$i]['fname'])?$row[$i]['fname']:'none.png');
// ещё забыл добавить в папках галерей лежат пустые изображения none.png
}
// здесь ясно всё в обвертку и на прилавок
$gallery .= parseTpl($tpl, $row);
}


К этому контроллеру прилагается:
read_gallery.tpl
Свернутый текст
<div style="background-color:#dFd; border:2px solid green; margin:3px 3px 10px 3px; padding:5px;">
<h3>
Создание галереи</h3>
<form
action="" method="post">
<b>
Название галереи: </b>
<input
type="text" name="form[value1]" value="<?php echo $POST['value1'];?>" />    
<b>Описание галереи: </b>
<input
type="text" name="form[value2]" value="<?php echo $POST['value2'];?>" />
<input
type="submit" name="ok" value="Создать" />
</form>
</div>
<?php
echo $gallery; ?>
<center><?php
echo $navigation; ?></center>

и row_gallary.tpl
Свернутый текст

<div style="border:1px solid blue; margin:3px 3px 10px 3px; padding:5px; background-color:#ffffcc;">
<form
action="" method="post">
<input
style="float:right;" type="submit" name="delete" value="Удалить" onclick="return confirm('Вы действительно хотите удалить галерею: <?php echo $tpl_title; ?>?')" />
<input
style="float:right;" type="submit" name="gallery" value="Сохранить"/>
<a
href="<?php echo $tpl_link; ?>">Редактировать галерею</a>
<table
style="margin-bottom:10px; margin-top:10px">
<tr>
<td>
<b>
Дата создания:</b> 
</td>
<td>
<select
name="form[value3]">
<option
value="<?php echo $tpl_day; ?>"><?php echo $tpl_day; ?></option>
<option
value="<?php echo $tpl_day; ?>" disabled="disabled">---</option>
<option
value="01">01</option>
<option
value="02">02</option>
<option
value="03">03</option>
<option
value="04">04</option>
<option
value="05">05</option>
<option
value="06">06</option>
<option
value="07">07</option>
<option
value="08">08</option>
<option
value="09">09</option>
<option
value="10">10</option>
<option
value="11">11</option>
<option
value="13">13</option>
<option
value="14">14</option>
<option
value="15">15</option>
<option
value="16">16</option>
<option
value="17">17</option>
<option
value="18">18</option>
<option
value="19">19</option>
<option
value="21">21</option>
<option
value="22">22</option>
<option
value="23">23</option>
<option
value="24">24</option>
<option
value="25">25</option>
<option
value="26">26</option>
<option
value="27">27</option>
<option
value="28">28</option>
<option
value="29">29</option>
<option
value="30">30</option>
<option
value="31">31</option>
</select>
<select
name="form[value4]" >
<option
value="<?php echo $tpl_num_month; ?>"><?php echo $tpl_month; ?></option>
<option
value="<?php echo $tpl_num_month; ?>" disabled="disabled">----------</option>
<option
value="01">января</option>
<option
value="02">февраля</option>
<option
value="03">марта</option>
<option
value="04">апреля</option>
<option
value="05">мая</option>
<option
value="06">июня</option>
<option
value="07">июля</option>
<option
value="08">августа</option>
<option
value="09">сентября</option>
<option
value="10">октября</option>
<option
value="11">ноября</option>
<option
value="12">декабря</option>
</select>
<select
name="form[value5]">
<option
value="<?php echo $tpl_year; ?>"><?php echo $tpl_year; ?></option>
<option
value="<?php echo $tpl_year; ?>" disabled="disabled">------</option>
<option
value="2005">2005</option>
<option
value="2006">2006</option>
<option
value="2007">2007</option>
<option
value="2008">2008</option>
<option
value="2009">2009</option>
<option
value="2010">2010</option>
<option
value="2011">2011</option>
<option
value="2012">2012</option>
<option
value="2013">2013</option>
<option
value="2014">2014</option>
<option
value="2015">2015</option>
<option
value="2016">2016</option>
<option
value="2017">2017</option>
<option
value="2018">2018</option>
<option
value="2019">2019</option>
<option
value="2020">2020</option>
<option
value="2021">2021</option>
<option
value="2022">2022</option>
<option
value="2023">2023</option>
<option
value="2024">2024</option>
<option
value="2025">2025</option>
</select><br />
</td>
</tr>
<tr>
<td>
<b>
Название галереи: </b>
</td>
<td>
<input
type="text" name="form[value6]" size="51" maxlength="150" value="<?php echo $tpl_title; ?>"/><br/>
</td>
</tr>
<tr>
<td>
<b>
Описание: </b>
</td>
<td>
<textarea
cols="40" rows="3" name="form[value7]"><?php echo $tpl_description; ?></textarea>
<input
type="hidden" name="form[value8]" value="<?php echo $tpl_id; ?>" />
</td>
</tr>
</table>
<a
href="<?php echo $tpl_link; ?>"><img alt="" style="border:0;" src="<?php echo $tpl_img1; ?>" /></a>
<a
href="<?php echo $tpl_link; ?>"><img alt="" style="border:0;" src="<?php echo $tpl_img2; ?>"/></a>
<a
href="<?php echo $tpl_link; ?>"><img alt="" style="border:0;" src="<?php echo $tpl_img3; ?>"/></a>
<a
href="<?php echo $tpl_link; ?>"><img alt="" style="border:0;" src="<?php echo $tpl_img4; ?>"/></a><br />
</form>
</div>


edit_controller.php
/**
* Generation of page of an error at access out of system
* Генерация страницы ошибки при доступе вне системы
*/

if(!defined('IRB_KEY'))
{
header("HTTP/1.1 404 Not Found");
exit(file_get_contents('../../404.html'));
}
////////////////////////////////////////////////////////////
/**
* We connect a file of adjustment of connection with base
* Подключаем файл настройки соединения с базой
*/

include IRB_ROOT . '/libs/mysql.php';

if(empty($GET['id'])) // если мы пришли без ИД галереи, пойдем обратно к её выбору
reDirect('rem=read', 'num='.$GET['num']);

$image = '';
$info = '';
$upload_dir = IRB_ROOT . '/uploads/galleries/';

$POST['value1'] = !empty($POST['value1']) ? $POST['value1'] : 'Нет подписи изображения';

/**
* Image addition to gallery
* Добавление изображения к галереи
*/

if(isset($_POST['add']))
{
if(!empty($_FILES['file']['name'])) // если не пустое значение
{
// проверяем есть ли изображение с таким именем (можно назвать защита от f5)
if(!file_exists($upload_dir . $_FILES['file']['name']))
{
$extensions = array('JPG', 'jpg', 'JPEG', 'jpeg', 'PNG', 'png', 'GIF', 'gif');
// функция uploadHandle есть в курсах
$message = uploadHandle(5000, $extensions, $upload_dir); // Загружаем изображение на сервер
$info = $message['error'] ? $message['error'] : $message['info'];

if(file_exists($upload_dir . $_FILES['file']['name'])) // Если изображение загружено
{
// функцию imgResize покажу ниже
$preview = imgResize($upload_dir.$_FILES['file']['name'], // Создаем новое изображение для предосмотра из уже загруженного
$upload_dir.'preview/small_'.$_FILES['file']['name'],
120,
120
);

if($preview == true) // Ну и если изображение для преосмотра создано успешно, делаем запись в базу, ну а если нет, то и суда нет.
mysqlQuery("INSERT INTO `".IRB_DBPREFIX."images`
SET
`aid`="
.(int)$GET['id'].",
`subtitle`='"
.mysql_escape_string($POST['value1'])."',
`fname`='"
.mysql_escape_string($_FILES['file']['name'])."'
"
);
else
$info .= 'Не удалось создать изображение для предосмотра<br />';
}
}

else
$info .= 'Изображение с таким именем уже существует!<br />';
}
else
$info .= 'Нечего загружать<br />';
}
/**
* Change of the signature of the image
* Изменение подписи изображения
*/

if($ok)
{
$POST['value2'] = !empty($POST['value2']) ? $POST['value2'] : 'Нет подписи изображения';

mysqlQuery("UPDATE `". IRB_DBPREFIX ."images`
SET
`subtitle`='"
.mysql_escape_string($POST['value2'])."'
WHERE `id`="
.(int)$POST['value3']."
"
);

reDirect();
}

/**
* Image removal
* Удаление изображения
*/

if($delete) // аналог read_controller
{
if(file_exists($upload_dir.$POST['value4']))
unlink($upload_dir.$POST['value4']);

if(file_exists($upload_dir.'preview/small_'.$POST['value4']))
unlink($upload_dir.'preview/small_'.$POST['value4']);

$res3 = mysqlQuery("DELETE FROM `". IRB_DBPREFIX ."images`
WHERE `id`="
.(int)$POST['value3']);
if($res3 === true)
$info .= 'Изображение успешно удалено.';
}

/**
* Generation of images of gallery
* Генерация изображений галереи
*/

$res = mysqlQuery("SELECT `title`
FROM `"
. IRB_DBPREFIX ."galleries`
WHERE `id`="
.(int)$GET['id']
);

// если по какой-то причине нам не удалось сделать запрос, возвращаемся к выбору галереи
if(mysql_num_rows($res) == 0)
reDirect('rem=read', 'num='.$GET['num']);

$row = mysql_fetch_assoc($res);
$title = htmlspecialchars($row['title']);

$res2 = mysqlQuery("SELECT *
FROM `"
. IRB_DBPREFIX ."images`
WHERE `aid`="
.(int)$GET['id']. "
ORDER BY `id` DESC
"
);

if(mysql_num_rows($res2)>0)
{
$tpl = getTpl('admin/galleries/row_image');

while($row = mysql_fetch_assoc($res2))
{
$row['subtitle'] = htmlspecialchars($row['subtitle']);
$row['img'] = IRB_HOST . 'uploads/galleries/preview/small_' .htmlspecialchars($row['fname']);

$image .= parseTpl($tpl, $row);
}
}

else
$info .= 'В данной галереи изображения отсутствуют<br />';

К этому контроллеру прилагается:
edit_gallery.tpl
Свернутый текст


<h2>Редактирование галереи
<span style="color:red;"><?php echo $title; ?></span>
<a
style="font-size:12px; color:#fff;" href="<?php echo href('rem=read', 'num='.$GET['num']);?>"><< вернутся к выбору галереи</a>
</h2>
<center><p
style="color:red"><?php echo $info; ?></p></center>
<div
style="background-color:#dFd; border:2px solid green; margin:0 10px 0 10px; padding:5px;">
<form
action="" method="post" enctype="multipart/form-data">
<table>
<tr>
<td>
<b>
Добавить изображение: </b>
</td>
<td
colspan="2">
<input
type="file" name="file" size="57" /><br />
</td>
</tr>
<tr>
<td>
<b>
Подпись изображения: </b>
</td>
<td>
<input
type="text" name="form[value1]" size="70" maxlength="150" value="<?php echo $POST['value1']; ?>"/>
</td>
<td>
<input
type="submit" name="add" value="Добавить"/>
</td>
</tr>
</table>
</form>
</div>
<?php
echo $image; ?>
<div
style="clear:both;"></div>


row_gallery.tpl
Свернутый текст


<div align="center" style="float:left; margin:5px; padding:5px; border:1px solid #09f;">
<img
src="<?php echo $tpl_img; ?>"/><br/>
<form
action="" method="post">
<input
type="text" name="form[value2]" size="25" maxlength="150" value="<?php echo $tpl_subtitle;?>"/><br/>
<input
type="hidden" name="form[value3]" value="<?php echo $tpl_id; ?>" />
<input
type="hidden" name="form[value4]" value="<?php echo $tpl_fname; ?>" />
<input
type="submit" name="ok" value="Сохранить"/>
<input
type="submit" name="delete" value="Удалить" onclick="return confirm('Удалить изображение?')"/>
</form>
</div>




функция imgResize() я нашел её в интернете но мне не понравился результат её работы так как она при уменьшении прямоугольного изображения в квадратное заливала не достающие часть изображение (сверху - снизу, справа- слева) белым цветом и я её переделал вот так:
   /**  
* Function resize images
* Функция изменения изображения для превьюв
*
@param string $src - дериктория исходного файла
*
@param string $dest - имя генерируемого файла
*
@param int $width, $height - ширина и высота генерируемого изображения, в пикселях
*
@param int $quality - качество генерируемого JPEG, по умолчанию - максимальное (80)
*
@return value - сообщение о ходе выполнения
*/

function imgResize($src, $dest, $width, $height, $quality = 80)
{
if(!file_exists($src)) return false;

$size = getimagesize($src);

if($size === false) return false;

// Определяем исходный формат по MIME-информации, предоставленной
// функцией getimagesize, и выбираем соответствующую формату
// imagecreatefrom-функцию.

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

if (!function_exists($icfunc)) return false;

if($size[0] >= $size[1])
{
$difference = $size[0] - $size[1]; // Получаем разницу между шириной и высотой
$src_x = ceil($difference / 2); // Точка координат (половина разницы) по оси Х в оригинальном изображении для выделения копируэмой области
$src_y = 0; // Точка координат по оси У в оригинальном изображении для выделения копируэмой области
$src_w = $size[0] - $difference; // Ширина прямоугольника копируэмой области
$src_h = $size[1]; // Высота прямоугольника копируэмой области
}
else // здесь наоборот :)
{
$difference = $size[1] - $size[0];
$src_x = 0;
$src_y = ceil($difference / 2);
$src_w = $size[0];
$src_h = $size[1] - $difference;
}

$isrc = $icfunc($src);
$idest = imagecreatetruecolor($width, $height);

imagecopyresampled($idest, $isrc, 0, 0, $src_x, $src_y, $width, $height, $src_w, $src_h);

imagejpeg($idest, $dest, $quality);

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

return true;
}

И последнее:
  • два параметра ЧПУ я поменял местами, как по мне так проще num - номер страницы для навигатора и затем id - идентификатор
  • для админки думаю этого достаточно
  • а для самого сайта клиентам всё просто нужно укоротить :)
  • по желанию можно добавить навигацию для самой галереи в edit_controller
  • для просмотра полного изображения можно добавить модуль full_controller, но мне по душе лайтбоксы которых в паутине куча.

Спасибо за внимание, хотелось бы слышать Ваше мнение, замечания ну и прочие радости жизни B)




Спустя 10 минут, 7 секунд (26.01.2011 - 13:02) twin написал(а):
Архивчег бы еще...

Спустя 2 минуты, 51 секунда (26.01.2011 - 13:05) Evilsoul написал(а):
Сейчас сделаю, передохну smile.gif кофе выпью, перекурю и кину.

Спустя 22 минуты, 53 секунды (26.01.2011 - 13:28) Evilsoul написал(а):
Вот архивчеГ rolleyes.gif

Спустя 2 часа, 28 минут, 35 секунд (26.01.2011 - 15:57) Evilsoul написал(а):
Есть небольшой косяк в read_controller
Нужно так писать:
$row['img'.$i] = IRB_HOST.'uploads/galleries/preview/small_' .htmlspecialchars(!empty($row[$i]['fname'])?$row[$i]['fname']:'none.png');

Интересно, а в ИЕ6 работало и так и так :)

Спустя 18 часов, 36 минут, 20 секунд (27.01.2011 - 10:33) Evilsoul написал(а):
ещё одну вещь поправил в read_colntroller


// IRB_NUM_IMAGES_ON_PREV количество выводимых изображений для предосмотра

$row['link'] = href('rem=gallery', 'num='.$GET['num'], 'id='.$row['id']);
$link = '<a style="border:0;" href="'.$row['link'].'" >';

$res2 = mysqlQuery("SELECT `subtitle`, `fname`
FROM `"
.IRB_DBPREFIX."images`
WHERE `"
.IRB_DBPREFIX."images`.`aid` = ". (int)$row['id'] ."
ORDER BY RAND()
LIMIT "
.IRB_NUM_IMAGES_ON_PREV
);

$row['img'] = '';

for($i = 1; IRB_NUM_IMAGES_ON_PREV >= $i; $i++)
{
$row[$i] = mysql_fetch_assoc($res2);
$fname = !empty($row[$i]['fname'])?$row[$i]['fname']:'none.png';

$row['img'.$i] = "\t\t".$link."\n\t\t"
.'<img alt="'. $row[$i]['subtitle']
.
'" style="border:0;" src="'
.IRB_HOST.'uploads/galleries/preview/small_'.htmlspecialchars($fname)
.
'"/></a>'."\n";
$row['img'] .= $row['img'.$i];
}


_____________
Кто хочет, ищет возможности, кто не хочет - причины. /_ К. Маркс
Истенно велик тот человек который сумел овладеть своим временем. /_Гесиод VIII-VII вв. до Р. Х.
Медлительный непрерывно борится с бедами всю жизнь. /_Гесиод VIII-VII вв. до Р. Х.
Для того что бы увидеть радугу нужно пережить дождь.
Женщины: Хочется чего-то красного но синего.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.