/** * @package Component Tag for Joomla! 1.5 * @version $Id: com_tag.php 599 2010-06-06 23:26:33Z you $ * @author Joomlatags.org * @copyright (C) 2010- http://www.joomlatags.org * @license GNU/GPL http://www.gnu.org/copyleft/gpl.html **/ defined('_JEXEC') or die( 'Restricted access' ); class JoomlaTagsHelper{ function param($name,$default=''){ static $params; if (!isset( $params )){ $params = JComponentHelper::getParams('com_tag'); } return $params->get($name,$default); } function tag_alphasort($tag1, $tag2) { if($tag1->name == $tag2->name) { return 0; } return ($tag1->name < $tag2->name) ? -1 : 1; } function tag_popularasort($tag1, $tag2) { if($tag1->ct == $tag2->ct) { return 0; } return ($tag1->ct < $tag2->ct) ? -1 : 1; } function tag_latestasort($tag1, $tag2) { if($tag1->created == $tag2->created) { return 0; } return ($tag1->created < $tag2->created) ? -1 : 1; } function hitsasort($tag1, $tag2) { if($tag1->hits == $tag2->hits) { return 0; } return ($tag1->hits < $tag2->hits) ? -1 : 1; } function getComponentVersion() { static $version; if( !isset($version) ) { $xml = JFactory::getXMLParser('Simple'); $xmlFile = JPATH_ADMINISTRATOR.DS.'components'.DS.'com_tag'.DS.'manifest.xml'; if( file_exists($xmlFile) ) { if( $xml->loadFile($xmlFile) ) { $root =& $xml->document; $element =& $root->getElementByPath('version'); $version = $element ? $element->data() : ''; } } } return $version; } function preHandle($tag){ $tag=JoomlaTagsHelper::tripChars($tag); $tag=JString::trim($tag); $tag=JoomlaTagsHelper::unUrlTagname($tag); $toLowcase=JoomlaTagsHelper::param('lowcase',1); if($toLowcase){ $tag=JString::strtolower($tag); } return $tag; } function ucwords($word){ if(JoomlaTagsHelper::param('capitalize')){ return JString::ucwords($word); }else{ return $word; } } function urlTagname($tagname) { return preg_replace( array('/-/', '/\+/'), array('%3A', '-'), urlencode($tagname) ); //return urlencode($tagname); } function unUrlTagname($tagname) { return preg_replace( '/[:-]/', ' ', urldecode($tagname) ); //return urldecode($tagname); } function truncate($blurb) { $blurb = strip_tags($blurb); $blurb = str_replace('"', '\"', $blurb); $words = explode(' ', trim($blurb)); if (count($words) > 15) { $blurb = implode(' ', array_splice($words, 0, 15)) . '...'; } return $blurb; } function tripChars($name){ $stripChars=JoomlaTagsHelper::param('StripCharacters'); $stripCharList = array(); $stripCharList = explode('|', $stripChars); $mustTripChars=array('|',"'","\""); $stripCharList=array_merge($stripCharList,$mustTripChars); $stripCharList=array_unique($stripCharList); $finalRemoveChaList=array(); foreach($stripCharList as $c){ if($c!='-'){ $finalRemoveChaList[]=$c; } } $name=str_replace($finalRemoveChaList,'',$name); $name=str_replace('-',' ',$name); return $name; } function isValidName($name) { $valid = true; $name=JoomlaTagsHelper::preHandle($name); if(empty($name)) $valid = false; if ($valid) { return $name; } else { return false; } } } ?>/** * @package Joomla * @subpackage mavikThumbnails * @copyright 2008 Vitaliy Marenkov * @author Vitaliy Marenkov * Плагин заменяет изображения иконками со ссылкой на полную версию. */ defined( '_JEXEC' ) or die(); jimport( 'joomla.event.plugin' ); jimport('joomla.filesystem.folder'); jimport('joomla.filesystem.file'); require_once 'mavikthumbnails/imgtag.class.php'; /** * Плагин заменяет изображения иконками со ссылкой на полную версию. */ class plgContentMavikThumbnails extends JPlugin { /** * Объект - тег изображения * @var plgContentMavikThumbnailsImgTag */ var $img; /** * Имя оригинального изображения * @var string */ var $origImgName; /** * Оригинальный адрес изобажения * @var string */ var $originalSrc; /** * Размеры оригинального изображения * @var array */ var $origImgSize; /** * Каталог с иконками * @var string */ var $thumbPath; /** * Каталог с копиями изображений с других серверов * @var string */ var $remotePath; /** * Тип всплывающего окна * @var string */ var $popupType; /** * Подключать ли ява-скрипты * * @var boolean */ var $linkScripts; /** * Отображать изображение увеличительного стекла на картинке * @var boolean */ var $zoominImg; /** * Менять ли курсор при наведении на картинку на увеличительное стекло * @var boolean */ var $zoominCur; /** * В блогах изображение является ссылкой на полный текст * @var boolean */ var $blogLink; /** * Объект для работы с блогом * @var object */ var $blogHelper; /** * Ссылка на статью * @var object */ var $article; /** * Ссылка на параметры статьи * @var object */ var $articleParams; /** * Декоратор тега изображения (зависит от popupType) * @var plgContentMavikThumbnailsDecorator */ var $decorator; /** * Добевлены уже декларации в head * @var boolean */ var $has_header; /** * Размеры по умолчанию применять для * @var string */ var $defaultSize; /** * Ширина по-умолчанию * @var int */ var $defaultWidth; /** * Высота по-умолчанию * @var int */ var $defaultHeight; /** * Размеры по умолчанию применять в блоках для * @var string */ var $blogDefaultSize; /** * Ширина по-умолчанию в блоках * @var int */ var $blogDefaultWidth; /** * Высота по-умолчанию в блогах * @var int */ var $blogDefaultHeight; /** * Качество jpg-файлов * @var int */ var $quality; /** * Создавать иконки для ... * @var int */ var $thumbnailsFor; /** * Название класса для которого (не)надо создавать иконки * @var string */ var $class; /** * Путь к плагину * @var string */ var $path; /** * URL путь к плагину * @var string */ var $url; /** * Линейка Joomla * @var string */ var $jVersion; /** * Содержит функции зависящие от метода ресайзинга: * сохранение пропорций, обрезка, искажение и т.д. * @var object */ var $proportionsStrategy; /** * Конструктор * @param object $subject Обрабатываемый объект * @param object $params Объект содержащий параметры плагина */ function plgContentMavikThumbnails( &$subject, $params ) { parent::__construct( $subject, $params ); $app =& JFactory::getApplication(); // Подстроиться под версию Joomla $this->jVersion = substr(JVERSION, 0, 3); if($this->jVersion == '1.5') { // 1.5 $this->path = JPATH_PLUGINS.DS.'content'; $this->url = JURI::base(true).'/plugins/content'; } else { // 1.6 $this->path = JPATH_PLUGINS.DS.'content'.DS.'mavikthumbnails'; $this->url = JURI::base(true).'/plugins/content/mavikthumbnails'; } // Заплатка для компонентов использующих старый механизм работы с плагинами if ($this->jVersion == '1.5' && !is_object($params)) { $this->plugin = &JPluginHelper::getPlugin('content', 'mavikthumbnails'); $this->params = new JParameter($this->plugin->params); } // Подключить, если возможно, вспомогательный класс для текущего компонента $this->component = JRequest::getVar('option'); $blogFile = $this->path.DS.'mavikthumbnails'.DS.'blogs'.DS.$this->component.'.php'; if (JFile::exists($blogFile)) { require_once($blogFile); $classBlogHelper = 'plgContentMavikThumbnails'.$this->component; $this->blogHelper = new $classBlogHelper($this); } // Определить параметры плагина $this->thumbPath = $this->params->def('thumbputh', 'images/stories/thumbnails'); $this->remotePath = $this->params->def('remoteputh', 'images/stories/thumbnails/remote'); $this->popupType = $this->params->def('popuptype', 'slimbox'); $this->linkScripts = $this->params->def('link_scripts', 1); $this->blogLink = $this->params->def('blog_link', 0); $this->zoominImg = $this->params->def('zoomin_img', 0); $this->zoominCur = $this->params->def('zoomin_cur', 0); $this->quality = $this->params->def('quality', 80); $this->defaultSize = $this->params->def('default_size', ''); $this->defaultWidth = $this->params->def('width', 0); $this->defaultHeight = $this->params->def('height', 0); $this->blogDefaultSize = $this->params->def('blog_default_size', ''); $this->blogDefaultWidth = $this->params->def('blog_width', 0); $this->blogDefaultHeight = $this->params->def('blog_height', 0); $this->thumbnailsFor = $this->params->def('thumbnails_for', 0); $this->class = $this->params->def('class', ''); // Проверить версию PHP if ((version_compare(PHP_VERSION, '5.0.0', '<'))) { $app->enqueueMessage(JText::_('Plugin mavikThumbnails needs PHP 5. You use PHP').' '.PHP_VERSION, 'error'); } // Проверить наличие библиотеки GD2 if (!function_exists('imagecreatetruecolor')) { $app->enqueueMessage(JText::_('Plugin mavikThumbnails needs library GD2'), 'error'); } // Проверить наличие и при необходимости создать папки для изображений $indexFile = ''; if (!JFolder::exists(JPATH_SITE.DS.$this->thumbPath)) { if (!JFolder::create(JPATH_SITE.DS.$this->thumbPath, 0777)) { $app->enqueueMessage(JText::_('Can\'t create directory').': '.$this->thumbPath, 'error'); $app->enqueueMessage(JText::_('Change the permissions for all the folders to 777'), 'notice'); } JFile::write(JPATH_SITE.DS.$this->thumbPath.DS.'index.html', $indexFile); } if (!JFolder::exists(JPATH_SITE.DS.$this->remotePath)) { if (!JFolder::create(JPATH_SITE.DS.$this->remotePath, 0777)) { $app->enqueueMessage(JText::_('Can\'t create directory').': '.$this->remotePath, 'error'); $app->enqueueMessage(JText::_('Change the permission for all the folders to 777'), 'notice'); } JFile::write(JPATH_SITE.DS.$this->remotePath.DS.'index.html', $indexFile); } // Подключить необходимый класс декоратора if ( $this->blogLink && $this->blogHelper && $this->blogHelper->isBlog() ) { $this->popupType = 'bloglink'; } elseif ($this->popupType == 'none') { $this->popupType = ''; } if($this->popupType) { $file = $this->path.DS.'mavikthumbnails'.DS. $this->popupType.'.php'; require_once( $file ); } $type = 'plgContentMavikThumbnailsDecorator' . $this->popupType; $this->decorator = new $type($this); $this->img = new plgContentMavikThumbnailsImgTag(); // Подключить необходиму стратегию ресайзинга if ($this->blogHelper && $this->blogHelper->isBlog()) { $proportions = $this->params->def('blog_proportions', 'keep'); } else { $proportions = $this->params->def('proportions', 'keep'); } $proportinsClass = 'plgContentMavikThumbnailsProportions'.$proportions; require_once($this->path.DS.'mavikthumbnails'.DS.'proportions'.DS.$proportions.'.php'); $this->proportionsStrategy = new $proportinsClass($this); } /** * Метод вывызываемый при просмотре в версии 1.5 * @param object Объект статьи * @param object Параметры статьи * @param int Номер страницы */ function onPrepareContent( &$article, &$params, $limitstart ) { $this->article = &$article; $this->articleParams =& $params; $this->decorator->item(); // Найти в тексте изображения и заменить на иконки $regex = '##'; $article->text = preg_replace_callback($regex, array($this, "imageReplacer"), $article->text); return ''; } /** * Подготовка содержимого к отображению в версии 1.6 * * @param string The context for the content passed to the plugin. * @param object The content object. Note $article->text is also available * @param object The content params * @param int The 'page' number * @return string */ public function onContentPrepare($context, &$article, &$params, $limitstart=0) { if ($this->popupType != 'bloglink') { $this->onPrepareContent( $article, $params, $limitstart ); } } /** * Метод вывызываемый непососредственно перед отображением контента в версии 1.6 * В отличии от onContentPrepare сдесь доступны все свойства контента * что необходимо для обработки блогов * * @param string The context for the content passed to the plugin. * @param object The content object. Note $article->text is also available * @param object The content params * @param int The 'page' number * @return string */ public function onContentBeforeDisplay($context, &$article, &$params, $limitstart) { if ($this->popupType == 'bloglink') { if (empty($article->text) && !empty($article->introtext)) { $myArticle = $article; $myArticle->text = $article->introtext; $this->onPrepareContent( $myArticle, $params, limitstart ); $article->introtext = $myArticle->text; } else { $this->onPrepareContent( $article, $params, limitstart ); } } return ''; } /** * Преобразует img-тег в html-код иконки * @param array $matches * @return string */ function imageReplacer(&$matches) { // Создать объект тега изображения $newImgStr = $imgStr = $matches[0]; $this->img->parse($imgStr); // Если указан класс для которого (не)надо создавать иконки, проверить класс изображения. // И если для данного не надо создавать - выйти из функции. if ($this->thumbnailsFor && $this->class) { $classes = explode(' ', $this->img->getAttribute('class')); $classFind = false; foreach ($classes as $class) { $class = trim($class); if($class == $this->class ) { $classFind = true; break; } } if (($this->thumbnailsFor == 1 && !$classFind) || ($this->thumbnailsFor == 2 && $classFind)) return $imgStr; } // Если изображение удаленное - проверить наличие локальной копии, при отсутствии создать $juri =& JFactory::getURI(); $src = $this->img->getAttribute('src'); if (!$juri->isInternal($src)) { // Перед "защитой" имени заменить слеши на "-" для сохрания читабельности $fileName = JFile::makeSafe(str_replace(array('/','\\'), '-', $src)); $localFile = $this->remotePath . DS . $fileName; if (!file_exists($localFile)) { //JFile::copy($src, $localFile); // Родная функция не работает с url copy(html_entity_decode($src), $localFile); } $this->img->setAttribute('src', $this->remotePath . '/' . $fileName); } // Проверить необходимость замены - нужна ли иконка? // Прежде чем обращатья к функциям GD, проверяются атрибуты тега. if ( $this->img->getHeight() || $this->img->getWidth() || $this->defaultWidth || $this->defaultHeight ) { $this->origImgName = $this->img->getAttribute('src'); $this->origImgName = $this->urlToFile($this->origImgName); $this->origImgSize = @getimagesize($this->origImgName); $origImgW = $this->origImgSize[0]; $this->origImgSize[1] = $this->origImgSize[1]; /* Размеры по-умолчанию */ // Если это блог или главная, взять настройки для блогов if ($this->blogHelper && $this->blogHelper->isBlog()) { $this->defaultSize = $this->blogDefaultSize; $this->defaultWidth = $this->blogDefaultWidth; $this->defaultHeight = $this->blogDefaultHeight; } $this->proportionsStrategy->setDefaultSize(); if (( $this->img->getWidth() && $this->img->getWidth() < $this->origImgSize[0] ) || ( $this->img->getHeight() && $this->img->getHeight() < $this->origImgSize[1] )) { // Заменить изображение на иконку $newImgStr = $this->createThumb(); $this->img->isThumb = true; } } if ($this->img->isThumb || $this->popupType == 'bloglink') { if (!$this->has_header) $this->decorator->addHeader(); $this->has_header = true; $result = $this->decorator->decorate(); } else { $result = $this->img->toString(); } return $result; } /** * Создает иконку, если она еще не существует. */ function createThumb() { // Доопределить размеры, если необходимо if ($this->img->getWidth()==0) $this->img->setWidth(intval($this->img->getHeight() * $this->origImgSize[0] / $this->origImgSize[1])); if ($this->img->getHeight()==0) $this->img->setHeight(intval($this->img->getWidth() * $this->origImgSize[1] / $this->origImgSize[0])); // Сформировать путь к иконке // Перед "защитой" имени заменить слеши на "-" для сохрания читабельности $thumbName = JFile::makeSafe(str_replace(array('/','\\'), '-', $this->origImgName)); $thumbName = JFile::stripExt($thumbName) . '-'.$this->img->getWidth() . 'x' . $this->img->getHeight().'.'.JFile::getExt($thumbName); $thumbPath = JPATH_BASE . DS . $this->thumbPath . DS . $thumbName; // Если иконки не существует - создать if (!file_exists($thumbPath)) { // Проверить хватит ли памяти $allocatedMemory = ini_get('memory_limit')*1048576 - memory_get_usage(true); $neededMemory = $this->origImgSize[0] * $this->origImgSize[1] * 4; $neededMemory *= 1.25; // Прибавляем 25% на накладные расходы if ($neededMemory >= $allocatedMemory) { $this->originalSrc = $this->img->getAttribute('src'); $this->img->setAttribute('src', ''); $app = &JFactory::getApplication(); $app->enqueueMessage(JText::_('You use too big image'), 'error'); return; } // Определить тип оригинального изображения $mime = $this->origImgSize['mime']; // В зависимости от этого создать объект изобразения switch ($mime) { case 'image/jpeg': $orig = imagecreatefromjpeg($this->origImgName); break; case 'image/png': $orig = imagecreatefrompng($this->origImgName); break; case 'image/gif': $orig = imagecreatefromgif($this->origImgName); break; default: // Если тип не поддерживается - вернуть тег без изменений $this->originalSrc = $this->img->getAttribute('src'); return; } // Создать объект иконки $thumb = imagecreatetruecolor($this->img->getWidth(), $this->img->getHeight()); // Обработать прозрачность if ($mime == 'image/png' || $mime == 'image/gif') { $transparent_index = imagecolortransparent($orig); if ($transparent_index >= 0 && $transparent_index < imagecolorstotal($orig)) { // без альфа-канала $t_c = imagecolorsforindex($orig, $transparent_index); $transparent_index = imagecolorallocate($orig, $t_c['red'], $t_c['green'], $t_c['blue']); imagefilledrectangle( $thumb, 0, 0, $this->img->getWidth(), $this->img->getHeight(), $transparent_index ); imagecolortransparent($thumb, $transparent_index); } if ($mime == 'image/png') { // с альфа-каналом imagealphablending ( $thumb, false ); imagesavealpha ( $thumb, true ); $transparent = imagecolorallocatealpha ( $thumb, 255, 255, 255, 127 ); imagefilledrectangle( $thumb, 0, 0, $this->img->getWidth(), $this->img->getHeight(), $transparent ); } } // Создать превью list($x, $y, $widht, $height) = $this->proportionsStrategy->getArea(); imagecopyresampled($thumb, $orig, 0, 0, $x, $y, $this->img->getWidth(), $this->img->getHeight(), $widht, $height); // Записать иконку в файл switch ($mime) { case 'image/jpeg': if (!imagejpeg($thumb, $thumbPath, $this->quality)) { $this->errorCreateFile($thumbPath); } break; case 'image/png': if (!imagepng($thumb, $thumbPath)) { $this->errorCreateFile($thumbPath); } break; case 'image/gif': if (!imagegif($thumb, $thumbPath)) { $this->errorCreateFile($thumbPath); } } imagedestroy($orig); imagedestroy($thumb); } $this->originalSrc = $this->img->getAttribute('src'); $this->img->setAttribute('src', $this->thumbPath . '/' . $thumbName); } /** * Преобразует url-путь в путь к файлу * если хост в url совпадает с url сайта, * иначе оставляет без изменений * * @param string $url */ function urlToFile($url) { $siteUri = JFactory::getURI(); $imgUri = JURI::getInstance($url); $siteHost = $siteUri->getHost(); $imgHost = $imgUri->getHost(); // игнорировать www при сверке хостов $siteHost = preg_replace('/^www\./', '', $siteHost); $imgHost = preg_replace('/^www\./', '', $imgHost); if (empty($imgHost) || $imgHost == $siteHost) { $imgPath = $imgUri->getPath(); // если путь к изображению абсолютный от корня домена (начинается со слеша), // преобразовать его в относительный от базового адреса сайта if ($imgPath[0] == '/') { $siteBase = $siteUri->base(); $dirSite = substr($siteBase, strpos($siteBase, $siteHost) + strlen($siteHost)); $url = substr($imgPath, strlen($dirSite)); } $url = urldecode(str_replace('/', DS, $url)); } return $url; } /** * Сообщение о невозможности создать файл * @param string $file */ function errorCreateFile($file) { $app =& JFactory::getApplication(); $msg = sprintf(JText::_('Can\'t create file %s. Change the permissions for folder %s to 777.'), $file, dirname($file)); $app->enqueueMessage($msg, 'error'); } } /** * Декорирование тега изображения: всплывающие окна и т.п. * Родительский клас */ class plgContentMavikThumbnailsDecorator { /** * Ссылка на объект плагина * @var plgContentMavikThumbnails */ var $plugin; /** * Конструктор * @param $plugin */ function plgContentMavikThumbnailsDecorator(&$plugin) { $this->plugin = $plugin; } /** * Добавление кода в заголовок страницы */ function addHeader() {} /** * Действия выполняемые для каждой статьи */ function item() {} /** * Декорирование тега изображения * @return string Декорированый тег изображения */ function decorate() { $img =& $this->plugin->img; return $img->toString(); } } /** * Стратегия поведения зависящая от метода ресайзинга * Родительский клас */ class plgContentMavikThumbnailsProportions { /** * Ссылка на объект плагина * @var plgContentMavikThumbnails */ var $plugin; /** * Конструктор * @param $plugin */ function __construct(&$pligin) { $this->plugin =& $pligin; } /** * Установка для превьюшки размера заданого по умолчанию. * В большинстве случает не требует переопределения. * Изменение поведения лучше изменять замещая метод getDefaultDimension */ function setDefaultSize() { $plugin = &$this->plugin; if ( ( $plugin->defaultSize == 'all' && ($plugin->defaultHeight || $plugin->defaultWidth)) || ( $plugin->defaultSize == 'not_resized' && ((!$plugin->img->getWidth() || $plugin->img->getWidth() == $plugin->origImgSize[0]) && (!$plugin->img->getHeight() || $plugin->img->getHeight() == $plugin->origImgSize[1]))) ) { // Определить какой дефолтный размер использовать, высоту или ширину $defoultSize = ''; if (!$plugin->defaultHeight && $plugin->defaultWidth && $plugin->defaultWidth < $plugin->origImgSize[0]) { // Умолчание задано только для ширины $defoultSize = 'w'; } elseif (!$plugin->defaultWidth && $plugin->defaultHeight && $plugin->defaultHeight < $plugin->origImgSize[1]) { // Умолчание задано только для высоты $defoultSize = 'h'; } elseif ($plugin->defaultWidth && $plugin->defaultHeight && ($plugin->defaultWidth < $plugin->origImgSize[0] || $plugin->defaultHeight < $plugin->origImgSize[1])) { // Заданы оба размера, определить какой использовать, чтобы вписать в размеры $defoultSize = $this->getDefaultDimension(); } // Применить размеры if ($defoultSize == 'w') { $plugin->img->setWidth(intval($plugin->defaultWidth)); $plugin->img->setHeight($plugin->origImgSize[1] * $plugin->defaultWidth/$plugin->origImgSize[0]); } elseif ($defoultSize == 'h') { $plugin->img->setHeight(intval($plugin->defaultHeight)); $plugin->img->setWidth($plugin->origImgSize[0] * $plugin->defaultHeight/$plugin->origImgSize[1]); } elseif ($defoultSize == 'wh') { $plugin->img->setHeight(intval($plugin->defaultHeight)); $plugin->img->setWidth(intval($plugin->defaultWidth)); } } } /** * Выбор вертикально (h), горизонтального (w) либо обоих (wh) дефолтных размеров * @return string */ function getDefaultDimension() { return 'wh'; } /** * Возвращате координаты и размер используемой в оригинальном ибображении области * @return array */ function getArea() { return array(0, 0, $this->plugin->origImgSize[0], $this->plugin->origImgSize[1]); } }
Fatal error: Class 'JoomlaTagsHelper' not found in /home/scentr/balsan.com.ua/www/plugins/content/tags.php on line 38