/** * Список слайд шоу */ class CShow { var /* //Описание слайд шоу $showlist = array( 0 => array( 'maxitem' => 25, 'title' => 'Электронный экономический каталог муниципального образования Северский район' ), Объеденено с 0 1 => array( 'maxitem' => 7, 'title' => 'Добыча полезных ископаемых' ), 2 => array( 'maxitem' => 11, 'title' => 'Население и социальное развитие' ) ), */ //Конец описаний слайд шоу $allow_mime = array('image/jpeg','image/pjpeg'), $config_folder = '/slideshow/config/', $small_path = '/slideshow/img/%N%/small/', $big_path = '/slideshow/img/%N%/', $orig_path = '/slideshow/img/%N%/original/', $frame_tpl = 'slideshow/default_frame.tpl', $framelist = array(), $cur, //Номер текущего слайд шоу $error = array(), $version = 2; //Массив с последними ошибками function CShow($currentshow, $frame_tpl = null) { if (isset($frame_tpl)) $this->frame_tpl = $frame_tpl; $this->cur = $currentshow; $this->config_path = $_SERVER['DOCUMENT_ROOT'].$this->config_folder.'slideshow'.$this->cur.'.cfg'; //Первичная обработка списка шоу $config = $this->loadConfig(); if ($config) { $this->framelist = $config['items']; foreach($this->framelist as $n => $data) { $this->framelist[$n]['n'] = $n; if (!empty($data['img'])) { $this->framelist[$n]['url'] = str_replace('%N%',$this->cur,$this->small_path).$data['img'].'.jpg?v='.$this->version; $this->framelist[$n]['bigurl'] = str_replace('%N%',$this->cur,$this->big_path).$data['img'].'.jpg?v='.$this->version; } if (!empty($data['areas'])) { foreach($data['areas'] as $area) { $this->framelist[$n]['areas_parsed'][] = explode(',', $area); } } } } } function getFramesCount() { return count($this->framelist); } function setCurrentShow($n) { $this->cur = $n; } function getCurrentShow() { return $this->cur; } function showExists($n) { $config = $_SERVER['DOCUMENT_ROOT'].$this->config_folder.'slideshow'.$n.'.cfg'; return file_exists($config); } function getPosList() { $list = array(0 => 'В начало'); foreach($this->framelist as $n=>$frame) { if ($frame == end($this->framelist)) { $list[$n] = 'В конец'; } else { $list[$n] = 'После кадра №'.$n; } } return $list; } function insertFrameAfter($pos) { $config = $this->loadConfig(); $list = $config['items']; if (count($list)>0) for($i=count($list)+1; $i>=$pos+2; $i--) { $list[$i] = $list[$i-1]; } return $list; } /** * Возвращает расширенные данные о кадре */ function getFrame($frame_num, $one_frame = null) { if (!isset($one_frame) && isset($this->framelist[$frame_num])) $one_frame = $this->framelist[$frame_num]; if (isset($one_frame)) { $smarty = new Smarty(); $smarty->template_dir = $_SERVER['DOCUMENT_ROOT'].'/'.$smarty->template_dir; $smarty ->compile_dir = $_SERVER['DOCUMENT_ROOT'].'/'.$smarty->compile_dir; $smarty->assign('frame_num', $frame_num); $smarty->assign('frame', $one_frame); $tpl = isset($one_frame['tpl']) ? $one_frame['tpl'] : $this->frame_tpl; $frame_data = array_merge($one_frame, array( 'textview' => $smarty->fetch($tpl) )); unset($smarty); return $frame_data; } return false; } /** * Возвращает расширенные данные о всех кадрах */ function getFrames() { $list = array(); foreach ($this->framelist as $key=>$frame) { $list[$key] = $this->getFrame($key); } return $list; } function getOptions($key, $default = '') { return isset($this->showlist[$this->cur][$key]) ? $this->showlist[$this->cur][$key] : $default; } /** * Возвращает первичные сведения о шоу */ function getSmallImages() { return $this->framelist; } /** * Возвращает следующий номер кадра. начиная с 1 */ function getNextIndex($n) { return ($n >= $this->getFramesCount()) ? $this->getFramesCount() : $n+1; } /** * Возвращает предыдущий номер кадра. начиная с 1 */ function getPrevIndex($n) { return ($n > 0) ? $n-1 : 0; } function makeConfig() { $max = 25; $list = array(); $list['title'] = 'Электронный экономический каталог муниципального образования Северский район'; for ($i=1; $i<=$max; $i++) { $list['items'][$i] = array( 'areas' => array(), 'img' => $i ); } $this->saveConfig($list); } function loadConfig() { if (file_exists($this->config_path)) { $data = file_get_contents($this->config_path); return unserialize($data); } return false; } function saveConfig($list) { $fp = fopen($this->config_path, 'w'); fputs($fp, serialize($list)); fclose($fp); } /** * Создает типовой конфиг */ function makeNewConfig() { $template = array( 'title' => 'Новая презентация', 'items' => array() ); return $template; } function getErrors() { return $this->error; } function upload($files, $n) { if ($files['error'] == UPLOAD_ERR_OK) { $filename = md5(uniqid(rand(), true)); $dst = $_SERVER['DOCUMENT_ROOT'].str_replace('%N%', $this->cur, $this->orig_path).$filename.'.jpg'; if (!in_array($files['type'], $this->allow_mime)) { $this->error[] = 'Недопустимый тип файла (разрешен только JPG)'; } else { $this->makePath($dst, true); if (move_uploaded_file($files['tmp_name'], $dst)) { $small = $_SERVER['DOCUMENT_ROOT'].str_replace('%N%', $this->cur, $this->small_path).$filename.'.jpg'; $big = $_SERVER['DOCUMENT_ROOT'].str_replace('%N%', $this->cur, $this->big_path).$filename.'.jpg'; $this->makePath($small, true); $src = new CImg_file($dst); $this->resizeImage($src, $small, 155, 117); $this->resizeImage($src, $big, 770, 578); } else { $this->error[] = 'Не удалось переместить загруженный файл из временной папки'; } } } return (!empty($filename) && empty($this->error)) ? $filename : false; } function resizeImage($srcImage, $dstImageFileName, $width, $height, $quality = 90) { //$im = $this->makeImage($imgFileName); //Исходные размеры $w_image = $srcImage->width; $h_image = $srcImage->height; if ($h_image == 0) return false; $k_image = $w_image / $h_image; if($w_image>$w_image) { //Если фотка горизонтальная $w_real = $w_image < $width ? $w_image : $width; $h_real = round($w_real / $k_image); if($h_real > $height ) { $h_real = $height; $w_real = round($h_real * $k_image); } } else { //Если вертикальная $h_real = $h_image < $height ? $h_image : $height; $w_real = round($h_real * $k_image); if($w_real > $width ) { $w_real = $width; $h_real = round($w_real / $k_image); } } $dst_im_end = imagecreatetruecolor ($w_real, $h_real); imagecopyresampled ($dst_im_end, $srcImage->image_handler, 0, 0, 0, 0, $w_real, $h_real, $w_image, $h_image); imagejpeg($dst_im_end, $dstImageFileName, $quality); imagedestroy($dst_im_end); return true; } function resizeImageAXY($srcImage, $dstImageFileName, $width, $height, $quality = 90) { //Исходные размеры $w_image = $srcImage->width; $h_image = $srcImage->height; $insert_top = 0; $insert_left = 0; //Исходные размеры $k_image = $w_image / $h_image; if($w_image>$h_image) { //Если фотка горизонтальная $w_real = $w_image < $width ? $w_image : $width; $h_real = round($w_real / $k_image); if($h_real > $height ) { $h_real = $height; $w_real = round($h_real * $k_image); } } else { //Если вертикальная $h_real = $h_image < $height ? $h_image : $height; $w_real = round($h_real * $k_image); if($w_real > $width ) { $w_real = $width; $h_real = round($w_real / $k_image); } } if ($w_real<$width) $insert_left = round( ($width/2) - ($w_real/2) ); if ($h_real<$height) $insert_top = round( ($height/2) - ($h_real/2) ); if ($insert_left<0) $insert_left = 0; if ($insert_top<0) $insert_top = 0; $dst_im_end = imagecreatetruecolor ($width, $height); $fillcolor = imagecolorallocate($dst_im_end, 255, 255, 255); imagefill($dst_im_end, 0, 0, $fillcolor); imagecopyresampled ($dst_im_end, $srcImage->image_handler, $insert_left, $insert_top, 0, 0, $w_real, $h_real, $w_image, $h_image); imagejpeg($dst_im_end, $dstImageFileName, $quality); imagedestroy($dst_im_end); return true; } function delFrame($frame) { $config = $this->loadConfig(); $list = $config['items']; //Удаляем файлы с кадрами if (!empty($list[$frame]['img'])) { $small = $_SERVER['DOCUMENT_ROOT'].str_replace('%N%', $this->cur, $this->small_path).$list[$frame]['img'].'.jpg'; $big = $_SERVER['DOCUMENT_ROOT'].str_replace('%N%', $this->cur, $this->big_path).$list[$frame]['img'].'.jpg'; $orig = $_SERVER['DOCUMENT_ROOT'].str_replace('%N%', $this->cur, $this->orig_path).$list[$frame]['img'].'.jpg'; @unlink($small); @unlink($big); @unlink($orig); } for($i=$frame; $isaveConfig($config); } /** * Создает недостающие папки для указанного пути */ function makePath($dstFilename, $parseDir = false) { if ($parseDir) $dstFilename = dirname($dstFilename); $root = strtok($dstFilename,'/'); if (!preg_match('/^\S\:/', $root)) $root = '/'.$root; $path = ''; $part = strtok('/'); while ($part !== false) { $path .= '/'.$part; if (!is_dir($root.$path)) mkdir($root.$path); $part = strtok('/'); } return is_dir($dstFilename); } } ?>