Файл: InstantSocial/uploud/core/classes/photo.class.php
Строк: 431
<?php
/******************************************************************************/
// //
// InstantCMS v1.9 //
// http://www.instantcms.ru/ //
// //
// written by InstantCMS Team, 2007-2011 //
// produced by InstantSoft, (www.instantsoft.ru) //
// //
// LICENSED BY GNU/GPL v2 //
// //
/******************************************************************************/
class cmsPhoto {
private static $instance;
public $upload_dir = ''; // директория загрузки
public $small_size_w = 96; // ширина миниатюры
public $small_size_h = ''; // высота миниатюры
public $medium_size_w = 480; // ширина среднего изображения
public $medium_size_h = ''; // высота среднего изображения
public $thumbsqr = 1; // квадратное изображение, да по умолчанию
public $is_watermark = 1; // накладывать ватермарк, да по умолчанию
public $is_saveorig = 0; // сохранять оригинал фото, нет по умолчанию
public $dir_small = 'small/'; // директория загрузки миниатюры
public $dir_medium = 'medium/'; // директория загрузки среднего изображения
private $where = '';
private $group_by = '';
private $order_by = '';
private $limit = '100';
// ============================================================================ //
// ============================================================================ //
private function __construct(){
$this->inDB = cmsDatabase::getInstance();
}
private function __clone() {}
public static function getInstance() {
if (self::$instance === null) {
self::$instance = new self;
}
return self::$instance;
}
// ============================================================================ //
// ============================================================================ //
private function resetConditions(){
$this->where = '';
$this->group_by = '';
$this->order_by = '';
$this->limit = '';
}
// ============================================================================ //
// ============================================================================ //
public function where($condition){
$this->where .= ' AND ('.$condition.')' . "n";
}
public function whereAlbumIs($album_id){
$this->where("f.album_id = '$album_id'");
return;
}
public function groupBy($field){
$this->group_by = 'GROUP BY '.$field;
}
public function orderBy($field, $direction='ASC'){
$this->order_by = 'ORDER BY '.$field.' '.$direction;
}
public function limit($howmany) {
$this->limitIs(0, $howmany);
}
public function limitIs($from, $howmany='') {
$this->limit = (int)$from;
if ($howmany){
$this->limit .= ', '.$howmany;
}
}
public function limitPage($page, $perpage) {
$this->limitIs(($page-1)*$perpage, $perpage);
}
// ============================================================================ //
// ============================================================================ //
/**
* Загружает фото файл
* @return array $file (filename, realfile)
*/
public function uploadPhoto($old_file=''){
// если каталог загрузки не определен, возвращаем ложь
if (!$this->upload_dir) { return false; }
$inCore = cmsCore::getInstance();
if ($_FILES['Filedata']['name']){
$inCore->includeGraphics();
$realfile = $this->inDB->escape_string($_FILES['Filedata']['name']);
$path_parts = pathinfo($realfile);
$ext = strtolower($path_parts['extension']);
// убираем расширение файла вместе с точкой
$realfile = substr($realfile, 0, strrpos($realfile, '.'));
if ($ext != 'jpg' && $ext != 'jpeg' && $ext != 'gif' && $ext != 'png' && $ext != 'bmp') { return false; }
$filename = md5(time().$realfile).'.jpg';
$uploadfile = $this->upload_dir . $realfile;
$uploadphoto = $this->upload_dir . $filename;
$uploadthumb['small'] = $this->upload_dir . $this->dir_small . $filename;
$uploadthumb['medium'] = $this->upload_dir . $this->dir_medium . $filename;
$uploadphoto = $this->upload_dir . $filename;
$source = $_FILES['Filedata']['tmp_name'];
$errorCode = $_FILES['Filedata']['error'];
if ($inCore->moveUploadedFile($source, $uploadphoto, $errorCode)) {
// удаляем предыдущий файл если необходимо
$this->deletePhotoFile($old_file);
if (!$this->small_size_h) { $this->small_size_h = $this->small_size_w; }
if (!$this->medium_size_h) { $this->medium_size_h = $this->medium_size_w; }
@img_resize($uploadphoto, $uploadthumb['small'], $this->small_size_w, $this->small_size_h, $this->thumbsqr);
@img_resize($uploadphoto, $uploadthumb['medium'], $this->medium_size_w, $this->medium_size_h, false, false);
if($this->is_watermark) { @img_add_watermark($uploadthumb['medium']); }
if(!$this->is_saveorig) { @unlink($uploadphoto); } elseif($this->is_watermark) { @img_add_watermark($uploadphoto); }
$file['filename'] = $filename;
$realfile_1251 = iconv('utf-8', 'cp1251', $realfile);
$file['realfile'] = $realfile_1251 ? $realfile_1251 : $realfile;
} else {
return false;
}
} else {
return false;
}
return $file;
}
// ============================================================================ //
// ============================================================================ //
/**
* Добавляет фото
* @param array $photo
* @param str $differ
* @return bool
*/
public function addPhoto($photo, $differ = ''){
$inCore = cmsCore::getInstance();
$inUser = cmsUser::getInstance();
$sql = "INSERT INTO cms_photo_files (album_id, title, description, pubdate, file, published, showdate, comments, user_id, owner)
VALUES ('{$photo['album_id']}', '{$photo['title']}', '{$photo['description']}', NOW(),
'{$photo['filename']}', '{$photo['published']}', '{$photo['showdate']}', 1, '{$inUser->id}', '{$differ}')";
$this->inDB->query($sql);
$photo_id = $this->inDB->get_last_id('cms_photo_files');
if ($photo['tags']){
$inCore->loadLib('tags');
cmsInsertTags($photo['tags'], 'photo', $photo_id);
}
cmsUser::checkAwards($inUser->id);
return $photo_id;
}
// ============================================================================ //
// ============================================================================ //
/**
* Обновляет данные фото
* @param array $photo
* @return bool
*/
public function updatePhoto($photo){
$inCore = cmsCore::getInstance();
$sql = "UPDATE cms_photo_files
SET title='{$photo['title']}',
file='{$photo['filename']}',
description='{$photo['description']}',
published='{$photo['published']}',
showdate='{$photo['showdate']}'
WHERE id = '{$photo['id']}'
LIMIT 1";
$this->inDB->query($sql);
if ($photo['tags']){
$inCore->loadLib('tags');
cmsInsertTags($photo['tags'], 'photo', $photo['id']);
}
return true;
}
// ============================================================================ //
// ============================================================================ //
/**
* Получает фото
* @param int $photo_id
* @param bool $is_full
* @return array $photo
*/
public function getPhoto($photo_id, $is_full = true){
if ($is_full) {
$f_sql = "INNER JOIN cms_users u ON u.id = f.user_id n LEFT JOIN cms_ratings_total r ON r.item_id = f.id AND r.target = 'photo'";
$f_sql_from = ', u.nickname, u.login, IFNULL(r.total_rating, 0) as rating';
} else {
$f_sql = '';
$f_sql_from = '';
}
$sql = "SELECT f.id, f.album_id, f.title, f.description, f.published, f.pubdate, f.file, f.hits, f.user_id, f.comments, a.user_id as auser_id, a.title cat_title, a.NSLeft, a.NSRight, a.NSDiffer as NSDiffer, a.nav album_nav, a.public, a.showtags a_tags, a.bbcode a_bbcode
{$f_sql_from}
FROM cms_photo_files f
INNER JOIN cms_photo_albums a ON a.id = f.album_id
{$f_sql}
WHERE f.id = '$photo_id' LIMIT 1";
$result = $this->inDB->query($sql);
$photo = $this->inDB->fetch_assoc($result);
if($photo) { $photo['pubdate'] = cmsCore::dateformat($photo['pubdate']); }
// Обновляем количество просмотров фотографии
($photo && $is_full) ? $this->inDB->query("UPDATE cms_photo_files SET hits = hits + 1 WHERE id = '$photo_id' LIMIT 1") : '';
return $photo ? $photo : false;
}
// ============================================================================ //
// ============================================================================ //
/**
* Удаляет фото
* @param int $photo_id
* @param str $file
* @return bool
*/
public function deletePhoto($photo_id, $file=''){
$inCore = cmsCore::getInstance();
if (!$file){
$file = $this->inDB->get_field('cms_photo_files', "id='{$photo_id}'", 'file');
}
if (!$file){ return false; }
$this->deletePhotoFile($file);
$inCore->deleteComments('photo', $photo_id);
$inCore->deleteRatings('photo', $photo_id);
$inCore->loadLib('tags');
cmsClearTags('photo', $photo_id);
$sql = "DELETE FROM cms_photo_files WHERE id = '$photo_id' LIMIT 1";
$this->inDB->query($sql);
return true;
}
// ============================================================================ //
// ============================================================================ //
/**
* Удаляет фотографии
* @param array $photo
* @return bool
*/
public function deletePhotos($id_list){
foreach($id_list as $key=>$id){
$this->deletePhoto($id);
}
return true;
}
// ============================================================================ //
// ============================================================================ //
/**
* Удаляет файл фото с папок загрузки
* @return bool
*/
public function deletePhotoFile($file=''){
if (!($file && $this->upload_dir)) { return false; }
@chmod($this->upload_dir . $file, 0777);
@unlink($this->upload_dir . $file);
@chmod($this->upload_dir . $this->dir_small . $file, 0777);
@unlink($this->upload_dir . $this->dir_small . $file);
@chmod($this->upload_dir . $this->dir_medium . $file, 0777);
@unlink($this->upload_dir . $this->dir_medium . $file);
return true;
}
// ============================================================================ //
// ============================================================================ //
/**
* Возвращает массив следующей/предыдущей фото
* метод полностью не доделан, не учитывается сортировка
* @param int $photo_id
* @param int $album_id
* @param str $nav
* @param str $orderby
* @return array $navigate
*/
public function getNavPhoto($photo_id, $album_id, $nav = 'next', $orderby = 'id'){
if($nav == 'next'){
$nav = '<';
$orderto = 'desc';
} else {
$nav = '>';
$orderto = 'asc';
}
$navigate = $this->inDB->get_fields('cms_photo_files', "id $nav $photo_id AND album_id = '$album_id' AND published=1", 'id, file', "$orderby $orderto");
return $navigate;
}
// ============================================================================ //
// ============================================================================ //
/**
* Создает корневой фотоальбом
* @param int $user_id
* @param str $differ
* @param str $title
* @return int $album_id
*/
public function createRootAlbum($user_id, $differ='', $title=''){
$inCore = cmsCore::getInstance();
$ns = $inCore->nestedSetsInit('cms_photo_albums');
$album_id = $ns->AddRootNode($differ);
$sql = "UPDATE cms_photo_albums
SET user_id = '$user_id',
title = '$title',
pubdate=NOW(),
orderform=0
WHERE id = '$album_id'";
$this->inDB->query($sql);
return $album_id;
}
// ============================================================================ //
// ============================================================================ //
/**
* Настройки по умолчанию для альбома
* @return array $album
*/
public function getDefaultAlbumConfig() {
$album = array(
'title'=>'',
'description'=>'',
'published'=>1,
'showdate'=>1,
'iconurl'=>'',
'orderby'=>'pubdate',
'orderto'=>'desc',
'public'=>1,
'perpage'=>20,
'cssprefix'=>'',
'thumb1'=>96,
'thumb2'=>600,
'thumbsqr'=>1,
'showtype'=>'thumb',
'nav'=>1,
'uplimit'=>100,
'maxcols'=>5,
'orderform'=>0,
'showtags'=>1,
'bbcode'=>0,
'is_comments'=>1
);
return $album;
}
// ============================================================================ //
// ============================================================================ //
/**
* Создает фотоальбом
* @param array $album
* @param str $differ
* @return bool
*/
public function createAlbum($differ='', $album){
$inCore = cmsCore::getInstance();
$ns = $inCore->nestedSetsInit('cms_photo_albums');
$album_id = $ns->AddNode($album['parent_id'], -1, $differ);
if(!$album_id) { return false; }
$d_album_cfg = $this->getDefaultAlbumConfig();
$album = array_merge($d_album_cfg, $album);
$sql = "UPDATE cms_photo_albums
SET title='{$album['title']}',
description='{$album['description']}',
published='{$album['published']}',
showdate='{$album['showdate']}',
iconurl='',
pubdate=NOW(),
orderby='{$album['orderby']}',
orderto='{$album['orderto']}',
public='{$album['public']}',
perpage='{$album['perpage']}',
cssprefix='{$album['cssprefix']}',
thumb1='{$album['thumb1']}',
thumb2='{$album['thumb2']}',
thumbsqr='{$album['thumbsqr']}',
showtype='{$album['showtype']}',
nav='{$album['nav']}',
uplimit='{$album['uplimit']}',
maxcols='{$album['maxcols']}',
orderform='{$album['orderform']}',
showtags='{$album['showtags']}',
bbcode='{$album['bbcode']}',
is_comments='{$album['is_comments']}',
user_id = '{$album['user_id']}'
WHERE id = '$album_id'";
$this->inDB->query($sql);
return true;
}
// ============================================================================ //
// ============================================================================ //
/**
* Возвращает id корневого альбома для заданного $differ
* @param str $differ
* @return int $album_id
*/
public function getRootAlbumId($differ = ''){
return $this->inDB->get_field('cms_photo_albums', "parent_id=0 AND NSDiffer = '$differ'", 'id');
}
// ============================================================================ //
// ============================================================================ //
/**
* Возвращает массив заданного альбома
* @param int $album_id
* @return array $album
*/
public function getAlbum($album_id){
return $this->inDB->get_fields('cms_photo_albums', "id = '$album_id' AND published = 1", '*');
}
// ============================================================================ //
// ============================================================================ //
/**
* Возвращает количество альбомов для заданного $differ
* @param str $differ
* @return int
*/
public function getAlbumsCount($differ){
return (int)$this->inDB->rows_count('cms_photo_albums', "NSDiffer = '$differ' AND parent_id > 0 AND published = 1");
}
// ============================================================================ //
// ============================================================================ //
/**
* Возвращает альбомы
* @param int $parent_id
* @param str $differ
* @param int $page
* @param int $perpage
* @param str $orderby
* @param str $orderto
* @param bool $is_admin
* @param bool $is_moder
* @return array $albums
*/
public function getAlbums($parent_id=0, $differ, $page=1, $perpage=0, $orderby='id', $orderto='DESC', $is_admin=false, $is_moder=false){
$inCore = cmsCore::getInstance();
if (!$parent_id) {
$parent_where = 'a.parent_id > 0';
}
if ($parent_id) {
$parent = $this->inDB->get_fields('cms_photo_albums', "id = '{$parent_id}'", 'NSLeft, NSRight');
$parent_where = "a.NSLeft >= {$parent['NSLeft']} AND a.NSRight <= '{$parent['NSRight']}'";
}
$sql = "SELECT a.id, a.title, a.pubdate, a.iconurl, f.file, IFNULL(COUNT(f.id), 0) as content_count
FROM cms_photo_albums a
LEFT JOIN cms_photo_files f ON f.album_id = a.id AND f.published = 1
WHERE a.NSDiffer='$differ' AND {$parent_where} AND a.published = 1
GROUP BY a.id
ORDER BY a.$orderby $orderto
";
$sql .= $perpage ? "LIMIT ".(($page-1)*$perpage).", $perpage" : '';
$result = $this->inDB->query($sql);
$albums = array();
if (!$this->inDB->num_rows($result)){ return false; }
while ($album = $this->inDB->fetch_assoc($result)){
if ($is_admin || $is_moder){
$album['on_moderate'] = $this->inDB->rows_count('cms_photo_files', 'album_id='.$album['id'].' AND published = 0');
}
$album['file'] = $album['iconurl'] ? $album['iconurl'] : $album['file'];
$album['file'] = $album['file'] ? $album['file'] : 'no_image.png';
$album['pubdate'] = $inCore->dateFormat($album['pubdate']);
$albums[] = $album;
}
return $albums;
}
// ============================================================================ //
// ============================================================================ //
/**
* Возвращает все родительские альбомы
* @param int $left_key
* @param int $right_key
* @return array $path
*/
public function getAlbumPath($left_key, $right_key, $differ='') {
$path = array();
$sql = "SELECT id, title, NSLevel
FROM cms_photo_albums
WHERE NSLeft <= $left_key AND NSRight >= $right_key AND parent_id > 0 AND NSDiffer = '$differ'
ORDER BY NSLeft";
$result = $this->inDB->query($sql);
if (!$this->inDB->num_rows($result)) { return false; }
while($cat = $this->inDB->fetch_assoc($result)){
$path[] = $cat;
}
return $path;
}
// ============================================================================ //
// ============================================================================ //
/**
* Редактирует альбом
* @param int $album_id
* @param int $parent_id
* @param str $differ
* @param str $title
* @param str $description
* @return bool
*/
public function editAlbum($differ='', $album){
if(!$album) { return false; }
$inCore = cmsCore::getInstance();
$old_parent = $this->inDB->get_field('cms_photo_albums', "id = '{$album['id']}'", 'parent_id');
if ($album['parent_id'] && $old_parent != $album['parent_id']){
$ns = $inCore->nestedSetsInit('cms_photo_albums');
$ns->MoveNode($album['id'], $album['parent_id'], -1, $differ);
}
foreach($album as $field=>$value){
$set .= "{$field} = '{$value}',";
}
$set = rtrim($set, ',');
$sql = "UPDATE cms_photo_albums
SET {$set}
WHERE id = '{$album['id']}'";
$this->inDB->query($sql);
return true;
}
// ============================================================================ //
// ============================================================================ //
/**
* Удаляет альбом
* @param int $album_id
* @param str $differ
* @return bool
*/
public function deleteAlbum($album_id, $differ = '') {
if(!$album_id) { return false; }
$inCore = cmsCore::getInstance();
//устанавливаем нужный альбом
$this->whereAlbumIs($album_id);
$photos = $this->getPhotos(true);
if ($photos){
foreach($photos as $photo){
$this->deletePhoto($photo['id'], $photo['file']);
}
}
$inCore->deleteComments('palbum', $album_id);
$ns = $inCore->nestedSetsInit('cms_photo_albums');
return $ns->DeleteNode($album_id, $differ);
}
// ============================================================================ //
// ============================================================================ //
/**
* Обновляет иконку альбома
* @param int $album_id
* @param str $file
* @return bool
*/
public function updateAlbumIcon($album_id, $file){
$sql = "UPDATE cms_photo_albums SET iconurl='$file' WHERE id = '$album_id'";
$this->inDB->query($sql);
return true;
}
// ============================================================================ //
// ============================================================================ //
/**
* Возвращает список options альбомов для заданного $differ
* @param str $differ
* @param str $selected
* @return str
*/
public function getAlbumsOption($differ, $selected=''){
$inCore = cmsCore::getInstance();
$cats_options = $inCore->getListItems('cms_photo_albums', $selected, 'id', 'ASC',"parent_id > 0 AND NSDiffer='$differ'");
return $cats_options;
}
// ============================================================================ //
// ============================================================================ //
/**
* Возвращает массив фотографий по заданным условиям
* @param bool $show_all
* @param bool $is_rating
* @return array $photos
*/
public function getPhotos($show_all = false, $is_rating = false, $is_users = false){
$inCore = cmsCore::getInstance();
//подготовим условия
$pub_where = ($show_all ? '1=1' : 'f.published = 1');
$r_join = $is_rating ? "LEFT JOIN cms_ratings_total rt ON rt.item_id = f.id AND rt.target='photo'" : '';
$r_join .= $is_users ? "LEFT JOIN cms_users u ON u.id = f.user_id" : '';
$r_select = $is_rating ? ', IFNULL(rt.total_rating, 0) as rating' : '';
$r_select .= $is_users ? ', u.login, u.nickname' : '';
$sql = "SELECT f.id, f.album_id, f.title, f.description, f.published, f.pubdate, f.file, f.hits{$r_select}
FROM cms_photo_files f
{$r_join}
WHERE {$pub_where}
{$this->where}
{$this->group_by}
{$this->order_by}n";
if ($this->limit){
$sql .= "LIMIT {$this->limit}";
}
$result = $this->inDB->query($sql);
if(!$this->inDB->num_rows($result)){ return false; }
$photos = array();
while ($photo = $this->inDB->fetch_assoc($result)){
$photo['pubdate'] = $inCore->dateFormat($photo['pubdate']);
$photos[] = $photo;
}
$this->resetConditions();
return $photos;
}
/* ========================================================================== */
/* ========================================================================== */
/**
* Возвращает количество фотографий по заданным условиям
* @param bool $show_all
* @return int
*/
public function getPhotosCount($show_all = false){
//подготовим условия
$pub_where = ($show_all ? '1=1' : 'f.published = 1');
$sql = "SELECT 1
FROM cms_photo_files f
WHERE {$pub_where}
{$this->where}
{$this->group_by}n";
$result = $this->inDB->query($sql);
return $this->inDB->num_rows($result);
}
// ============================================================================ //
// ============================================================================ //
}
?>