Данная галерея работает только на этом движке, так как включает в себя функции из курсов.
Ещё одно замечание, для навигации я использовал Навигатор, который упростил из данного Пагинатора в курсах, так как мне не нужны были параметр 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_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 ;
-- Структура таблицы `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 написал(а):
Сейчас сделаю, передохну
кофе выпью, перекурю и кину.

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

Спустя 2 часа, 28 минут, 35 секунд (26.01.2011 - 15:57) Evilsoul написал(а):
Есть небольшой косяк в read_controller
Нужно так писать:
Интересно, а в ИЕ6 работало и так и так :)
Нужно так писать:
$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 вв. до Р. Х.
Для того что бы увидеть радугу нужно пережить дождь.
Женщины: Хочется чего-то красного но синего.