'aidaxoru', 'limit' => 0, 'previewSize' => 'XS', 'articleSize' => 'L', 'sortOutput' => 'published', 'showTitle' => true, 'articleTemplate' => null, 'feedTemplate' => null, 'idPhoto' => null, 'idAlbum' => null ); /** * Имя пользователя на сайте Яндекс.Фотки * * @var string */ private $_idUser; /** * Путь к данным XML API пользователя на сайте Яндекс.Фотки * * @var string */ private $_userPath; /** * Количество выводимых изображений * 0 - без лимита * limit range 1-100 * * @var integer */ private $_limit; /** * Размер изображения для превью * XXXS = 50px * XXS = 75px * XS = 100px * S = 150px * M = 300px * L = 500px * XL = 800px * orig = Оригинальный размер изображения * * @var string */ private $_previewSize; /** * Размер изображения для полноразмерного отображения в статье * XXXS = 50px * XXS = 75px * XS = 100px * S = 150px * M = 300px * L = 500px * XL = 800px * orig = Оригинальный размер изображения * * @var string */ private $_articleSize; /** * Сортировка вывода * updated - по времени последнего изменения, от новых к старым; * rupdated - по времени последнего изменения, от старых к новым; * published - по времени загрузки (для фотографии) или создания (для альбома), от новых к старым; * rpublished - по времени загрузки (для фотографии) или создания (для альбома), от старых к новым; * created - по времени создания согласно EXIF-данным, от новых к старым (только для фотографий); * rcreated - по времени создания согласно EXIF-данным, от старых к новым (только для фотографий). * Точность времени относительно мала, поэтому в коллекции могут появляться элементы с одинаковым временем создания * * @var string */ private $_sortOutput; /** * Отображение подписей к изображениям * * @var boolean */ private $_showTitle; /** * Конструктор * * @param string $idUser * @param integer $limit * @param string $previewSize * @param string $articleSize * @param string $sortOutput * @param boolean $showTitle * @return void */ public function __construct ($idUser = null, $limit = null, $previewSize = null, $articleSize = null, $sortOutput = null, $showTitle = null) { $this->setIdUser ( $idUser ); $this->setLimit ( $limit ); $this->setPreviewSize ( $previewSize ); $this->setArticleSize ( $articleSize ); $this->setSortOutput ( $sortOutput ); $this->setShowTitle ( $showTitle ); } /** * Возвращает предустановленные значения опции * * @param string $optionName * @return mixed */ public static function getDefaultPluginOption ( $optionName ) { return ( !empty( self::$_defaultOptions[$optionName] ) )? ( self::$_defaultOptions[$optionName] ): ( null ); } /** * Возвращает значения опции, установленные пользователем в настройках плагина * * @param string $optionName * @return mixed */ public static function getPluginOption ( $optionName ) { $Option = get_option('Aidaxo_YFGallery_' . $optionName); return ( !empty( $Option ) )? ( $Option ): ( self::getDefaultPluginOption ( $optionName ) ); } /** * Устанавливает значение сортировки вывода * * @param string $sortOutput * @return void */ public function setSortOutput ( $sortOutput = null ) { $this->_sortOutput = ($sortOutput == null) ? self::getPluginOption('sortOutput') : $sortOutput; } /** * Возвращает значение сортировки вывода * * @return string */ public function getSortOutput () { return $this->_sortOutput; } /** * Устанавливает значение флага отображения подписей к изображениям * * @param boolean $showTitle * @return void */ public function setShowTitle ( $showTitle = null ) { $this->_showTitle = (bool)(($showTitle == null) ? self::getPluginOption('showTitle') : $showTitle ); } /** * Возвращает флаг отображения подписей к изображениям * * @return boolean */ public function getShowTitle () { return $this->_showTitle; } /** * Устанавливает значение размера для превью изображений * * @param string $previewSize * @return void */ public function setPreviewSize ( $previewSize = null ) { $this->_previewSize = ($previewSize == null) ? self::getPluginOption('previewSize') : $previewSize; } /** * Возвращает значение размера для превью изображений * * @return string */ public function getPreviewSize () { return $this->_previewSize; } /** * Устанавливает значение размера для изображений, выводимых в теле статьи * * @param string $articleSize * @return void */ public function setArticleSize ( $articleSize = null ) { $this->_articleSize = ($articleSize == null) ? self::getPluginOption('articleSize') : $articleSize; } /** * Возвращает значение размера для изображений, выводимых в теле статьи * * @return string */ public function getArticleSize () { return $this->_articleSize; } /** * Устанавливает имя пользователя * * @param string $idUser * @return void */ public function setIdUser( $idUser = null ) { /* использовать общие настройки, если не указаны местные*/ $this->_idUser = ( ($idUser == null)?(self::getPluginOption('idUser')):($idUser) ); $this->_userPath = 'http://api-fotki.yandex.ru/api/users/' . $this->_idUser . '/'; } /** * Возвращает имя пользователя * * @return string */ public function getIdUser () { return $this->_idUser; } /** * Устанавливает количество выводимых изображений * * @param string $limit * @return void */ public function setLimit ( $limit = null ) { $this->_limit = intval( ($limit == null) ? self::getPluginOption('limit') : $limit ); } /** * Возвращает количество выводимых изображений * * @return integer */ public function getLimit () { return intval( $this->_limit ); } /** * Обработчик массива фотографий по умолчанию. * Возвращает HTML список без открывающих и закрывающих тегов. * * @param array $photos * @return string */ public function getDefaultListPhotos ( $photos ) { $OutBuffer = ''; foreach ($photos as $Photo) { $OutBuffer .= '
  • '.$Photo['title'].''; /* Проверка на показ комментов*/ $OutBuffer .= (( $this->getShowTitle() )?('

    ' . $Photo['title'] . '

  • '):('')); } return ''; } /** * Обработчик массива фотографий на основе пользовательских шаблонов. * Принимает массив фотографий ($photos) и массив шаблона ($template) * Возвращает форматированный шаблон (HTML). * * @param array $photos * @param array $template * @return string */ public function getListPhotos ( $photos, $template = '') { if (empty ($template) OR $template == '') return $this->getDefaultListPhotos ( $photos ); $SearchParams = array( "%id%", "%title%", "%previewSizeLink%", "%articleSizeLink%", "%originalSizeLink%", "%linkYandexImagePage%" ); $OutBuffer = $template["templateHeader"]; foreach ($photos as $Photo) { $ReplaceParams = array ( $Photo["id"], ( ( $this->getShowTitle() )?( $Photo['title'] ):( null ) ), /* Проверка на показ комментов*/ $Photo["previewSizeLink"], $Photo["articleSizeLink"], $Photo["originalSizeLink"], $Photo["linkYandexImagePage"] ); $OutBuffer .= str_replace($SearchParams, $ReplaceParams, $template["templateBody"]); unset($ReplaceParams); } $OutBuffer .= $template["templateFooter"]; //не забываем убирать экранирующие слеши return stripslashes( $OutBuffer ); } /** * Возвращает массив альбомов пользователя * * @param integer $limit * @param string $sort * @return array */ public function getAlbums ( $limit = null, $sort = "published" ) { $albumsPath = $this->_userPath . 'albums/' . $sort . '/' . ( ($limit > 0)?('?limit=' . $limit):('') ); $Feed = simplexml_load_file($albumsPath); if ( empty($Feed) ) return array(); $entries = $Feed->children('http://www.w3.org/2005/Atom')->entry; $result = array(); foreach ($entries as $entry) { $details = $entry->children('http://www.w3.org/2005/Atom'); $content = $details->content->attributes(); $result[] = array( 'id' => preg_replace('/.*:(\d+)$/', '\1', $details->id), 'title' => $details->title ); } return $result; } /** * Возвращает одно изображение * * @param integer $idPhoto * @return array */ public function getPhoto ($idPhoto = null) { $Entry = array(); /* http://api-fotki.yandex.ru/api/users/aidaxoru/photo/231114/*/ $photoPath = $this->_userPath . 'photo/' . ( ($idPhoto == null)?( self::getDefaultPluginOption('idPhoto') ):( $idPhoto ) ) . '/'; $AtomFeedContent = ""; $cUrl = curl_init(); if ( ($AtomFeedContent = self::getContentFromURL($cUrl, $photoPath) ) === false) return false; curl_close($cUrl); $AtomFeedContent = ' urn:yandex:fotki:aidaxoru:photos aidaxoru aidaxoru на Яндекс.Фотках 2010-03-30T18:26:20Z ' . $AtomFeedContent .' '; $Feed = simplexml_load_string($AtomFeedContent); $Entry[] = $Feed->children('http://www.w3.org/2005/Atom')->entry; return $this->parsePhotoEntriesInAtomFeed ($Entry); } /** * Возвращает массив с результатом преобразования Atom Feed XML * * @param array $entriesArray * @return array */ private function parsePhotoEntriesInAtomFeed ($entriesArray) { $Result = array(); $Counter = 0; $Limit = $this->getLimit(); foreach ($entriesArray as $entries) { foreach ($entries as $Entry) { $Counter++; $Details = $Entry->children('http://www.w3.org/2005/Atom'); $ImageSrc = $Details->content->attributes()->src; $Result[] = array ( 'id' => $Details->id, 'title' => $Details->title, 'previewSizeLink' => preg_replace('/(.*)((_|-)+)(\w{1,4})$/', '$1$2' . $this->getPreviewSize(), $ImageSrc), 'articleSizeLink' => preg_replace('/(.*)((_|-)+)(\w{1,4})$/', '$1$2' . $this->getArticleSize(), $ImageSrc), 'originalSizeLink' => preg_replace('/(.*)((_|-)+)(\w{1,4})$/', '$1$2orig', $ImageSrc), 'linkYandexImagePage' => $Details->link[2]->attributes()->href ); //добавлено для исключения ошибки вывода полного альбома, вызванной игнором параметра limit на стороне Яндекса (обнаружено 16.06.2010) if ($Limit != 0 AND $Counter == $Limit) return $Result; } } return $Result; } /** * Получение контента с заданного URL * * @param $cUrl * @param $url * @param $port * @param $timeout * @param $errCount * @return array */ public static function getContentFromURL(& $cUrl, $url, $port = 80, $timeout = 5, $errCount = 1) { curl_setopt($cUrl, CURLOPT_URL, $url); curl_setopt($cUrl, CURLOPT_PORT, $port); curl_setopt($cUrl, CURLOPT_RETURNTRANSFER,1); curl_setopt($cUrl, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)"); curl_setopt($cUrl, CURLOPT_TIMEOUT, $timeout); $Content = curl_exec($cUrl); if (curl_getinfo($cUrl,CURLINFO_HTTP_CODE) != 200) return (($errCount < 2) ? self::getContentFromURL($cUrl, $url, $port, $timeout, ++$errCount) : false); else return $Content; } /** * Возвращает все изображения в указанном альбоме или все изображения изо всех альбомов, если $idAlbum опущен * * @param integer $idAlbum * @return array */ public function getPhotos ($idAlbum = null) { $Limit = $this->getLimit(); $PhotosPath = ($idAlbum == null)? /* возвращаем общую коллекцию фотографий*/ ( $this->_userPath . 'photos/' . ($this->getSortOutput()) . '/' . ( ($Limit > 0)?('?limit=' . $Limit):('') ) ): /* возвращаем коллекцию фотографий из указанного альбома*/ ( $this->_userPath . 'album/' . $idAlbum . '/photos/' . ($this->getSortOutput()) . '/' . ( ($Limit > 0)?('?limit=' . $Limit):('') ) ); $Entries = array(); if ($Limit == 0) { /* получаем информацию со всех страниц, если нет лимита*/ while ( !empty($PhotosPath) ) { $Feed = simplexml_load_file($PhotosPath); $Entries[] = $Feed->children('http://www.w3.org/2005/Atom')->entry; /* получение линка на следующую коллекцию*/ $Links = $Feed->link; foreach ($Links as $Link) { if ($Link->attributes()->rel == "next") $PhotosPath = $Link->attributes()->href; else $PhotosPath = null; } } } else { $Feed = simplexml_load_file($PhotosPath); $Entries[] = $Feed->children('http://www.w3.org/2005/Atom')->entry; } return $this->parsePhotoEntriesInAtomFeed ($Entries); } } ?>