0byt3m1n1
Path:
/
data
/
applications
/
aps
/
gallery
/
2.2-08
/
standard
/
htdocs
/
modules
/
rss
/
classes
/
[
Home
]
File: RssHelper.class
<?php /* * Gallery - a web based photo album viewer and editor * Copyright (C) 2000-2007 Bharat Mediratta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ /* * Check if the comments module exists and load GalleryCommentHelper in that case, which is used to * retrieve comments from the database for comments rss feeds. * @todo Don't access GalleryCommentHelper directly */ if (GalleryPlatform::file_exists(dirname(__FILE__) . '/../../comment/classes/GalleryCommentHelper.class')) { GalleryCoreApi::requireOnce('modules/comment/classes/GalleryCommentHelper.class'); } /** * Helper class for the RSS module * @package Rss * @subpackage Classes * @author Jonatan Heyman <http://heyman.info> * @author Pierre-Luc Paour * @author Daniel Grund <http://www.photogrund.nl> * @version $Revision: 15513 $ * @static */ class RssHelper { /** * This function takes an RssGenerator as a pass-by-reference variable and adds gallery item * data to it, so that an rss feed can be generated. * * @param object RssGenerator $generator object that will get the data. * @param int $id Id of the album from where the photoitems shall be retrieved. * @param array $params Additional parameters. * @return object GalleryStatus */ function getFeed(&$generator, $id, $param) { global $gallery; /* get gallery entity by id */ list ($ret, $entity) = GalleryCoreApi::loadEntitiesById($id); if ($ret) { return $ret; } /* get member data for the <channel> properties */ $memberData = (array) $entity; /* generate url to the album and rss feed */ $urlGenerator =& $gallery->getUrlGenerator(); $albumUrl = $urlGenerator->generateUrl( array( 'view' => 'core.ShowItem', 'itemId' => $memberData['id']), array( 'forceSessionId' => false, 'forceFullUrl' => true)); $generator->addProperty('title', $memberData['title']); $generator->addProperty('description', $memberData['description']); $generator->addProperty('link', $albumUrl); if ($param['useImage']) { /* retrieve gallery thumbnail */ list ($ret, $thumbArrayl) = GalleryCoreApi::fetchThumbnailsByItemIds(array($id)); if ($ret) { return $ret; } /* check if image tag should be used */ if (!empty($thumbArrayl)) { $thumb = $thumbArrayl[$id]; $imageUrl = $urlGenerator->generateUrl( array( 'view' => 'core.DownloadItem', 'itemId' => $thumb->getId()), array( 'forceSessionId' => false, 'forceFullUrl' => true)); $generator->addProperty('image', array('title' => $memberData['title'], 'url' => $imageUrl, 'link' => $albumUrl)); } } /* check if the cloud tag should be used */ if ($param['useCloud']) { $cloud = array('domain' => $param['cloudDomain'], 'port' => $param['cloudPort'], 'path' => $param['cloudPath'], 'registerProcedure' => $param['cloudRegisterProcedure'], 'protocol' => $param['cloudProtocol']); $generator->addProperty('cloud', $cloud); } /* add copyright, category and generator */ if (isset($param['copyright'])) { $generator->addProperty('copyright', $param['copyright']); } if (isset($param['category'])) { $generator->addProperty('category', $param['category']); } list ($ret, $version) = GalleryCoreApi::getPluginParameter('module', 'rss', '_version'); $generator->addProperty('generator', 'Gallery 2 RSS Module, version ' . $version); $generator->addProperty('ttl', $param['ttl']); $vm = $gallery->getPhpVm(); $generator->addProperty('lastBuildDate', date('r', $vm->time())); /* language tag */ $generator->addProperty('language', $param['language']); $items = array(); $newOnly = ($param['feedDate'] == 'new'); switch ($param['feedType']) { case 'album': case 'photosRecurse': /* get sub-albums or items, ordered by date */ list ($ret, $items) = RssHelper::fetchAlbumTree( $entity->getId(), $param['count'], $newOnly, $param['feedType'] != 'album', $param['feedType'] == 'photosRecurse'?$param['photosRecurseLimit']:0); if ($ret) { return $ret; } if (!empty($items)) { list ($ret, $items) = GalleryCoreApi::loadEntitiesById($items); if ($ret) { return $ret; } if ($param['feedType'] == 'photosRecurse') { /* load parents also, so we can display the name of the parent albums */ $parentIds = array(); foreach ($items as $item) { if (!in_array($item->getParentId(), $parentIds)) { $parentIds[] = $item->getParentId(); } } list ($ret, $parents) = GalleryCoreApi::loadEntitiesById($parentIds); if ($ret) { return $ret; } $parentsA = array(); foreach ($parents as $parent) { $parentsA[$parent->getId()] = $parent; } $param['parents'] = $parentsA; } } break; case 'photos': list ($ret, $items) = RssHelper::getPhotoFeed($entity, $newOnly); if ($ret) { return $ret; } break; case 'commentsAlbum': case 'commentsPhoto': list ($ret, $items) = GalleryCommentHelper::fetchComments($id, $param['count'], ORDER_DESCENDING); if ($ret) { return $ret; } break; case 'commentsRecursive': list ($ret, $items) = GalleryCommentHelper::fetchAllComments($id, $param['count'], null, ORDER_DESCENDING); if ($ret) { return $ret; } break; } /* go through subitems array and pass data to generator */ if (!empty($items)) { foreach ($items as $item) { $ret = RssHelper::addItem($generator, $item, $param); if ($ret) { return $ret; } } } return null; } /** * This function retrieves photos and put them in an array. * * @param object GalleryAlbumItem $entity Album that we shall retrieve photos/comments from. * @return array object GalleryStatus * array creationTimeStamp => GalleryItem */ function getPhotoFeed($entity, $newOnly) { /* retrieve subitems' ids */ list ($ret, $subIds) = GalleryCoreApi::fetchChildItemIds($entity); if ($ret) { return array($ret, null); } $itemsAcc = array(); $sortParam = $newOnly ? 'creationTimestamp' : 'modificationTimestamp'; /* go through subitems array and pass data to generator */ if (!empty($subIds)) { /* retrieve array of subitems */ list ($ret, $subItems) = GalleryCoreApi::loadEntitiesById($subIds); if ($ret) { return array($ret, null); } foreach ($subItems as $key => $subItem) { /* check if the subitem is a photo */ if (GalleryUtilities::isA($subItem, 'GalleryDataItem')) { $itemData = (array) $subItem; $key = $itemData[$sortParam] . '_' . $itemData['id']; $itemsAcc[$key] = $subItem; } } } krsort($itemsAcc); return array(null, $itemsAcc); } /** * This function adds an item to the feed generator * * @param object RssGenerator $generator reference to the generator * @param object GalleryEntity $item item to add * @param array $param feed parameters * @return object GalleryStatus */ function addItem(&$generator, $item, $param) { if (GalleryUtilities::isA($item, 'GalleryDataItem') || GalleryUtilities::isA($item, 'GalleryAlbumItem')) { return RssHelper::addPhotoOrAlbum($generator, $item, $param); } else if (GalleryUtilities::isA($item, 'GalleryComment')) { return RssHelper::addComment($generator, $item, $param); } else { return GalleryCoreApi::error(ERROR_INVALID_OBJECT); } } /** * This function adds a photo or an album item to the feed generator * * @param object RssGenerator $generator reference to the generator * @param object GalleryItem $item item to add * @param array $param feed parameters * @return object GalleryStatus */ function addPhotoOrAlbum(&$generator, $item, $param) { global $gallery; /* generate url to the images */ $urlGenerator =& $gallery->getUrlGenerator(); $url = $urlGenerator->generateUrl( array('view' => 'core.ShowItem', 'itemId' => $item->getId()), array('forceSessionId' => false, 'forceFullUrl' => true)); /* generate description */ $description = $item->getDescription(); if (!isset($description)) { $description = ''; } list ($ret, $thumbnails) = GalleryCoreApi::fetchThumbnailsByItemIds(array($item->getId())); if ($ret) { return $ret; } if (!empty($thumbnails) && !empty($thumbnails[$item->getId()])) { $thumbnail = $thumbnails[$item->getId()]; $imageUrl = $urlGenerator->generateUrl( array( 'view' => 'core.DownloadItem', 'itemId' => $thumbnail->getId()), array( 'forceSessionId' => false, 'forceFullUrl' => true)); $description = '<a href="' . $url .'"><img border="0" src="' . $imageUrl . '" width="' . $thumbnail->getWidth() . '" height="' . $thumbnail->getHeight() . '"/></a>' . (!empty($description) ? '<br/>' . $description : $description); } if ($param['feedType'] == 'photosRecurse') { /* add a link to the parent album */ list ($ret, $module) = GalleryCoreApi::loadPlugin('module', 'rss'); if ($ret) { return $ret; } $url1 = $urlGenerator->generateUrl( array('view' => 'core.ShowItem', 'itemId' => $item->getParentId()), array('forceSessionId' => false, 'forceFullUrl' => true)); $description .= '<br/>' . $module->translate( array('text' => 'In album <a href="%s">%s</a>', 'arg1' => $url1, 'arg2' => $param['parents'][$item->getParentId()]->getTitle())); } $title = $item->getTitle(); if (!isset($title)) { $title = $item->getPathComponent(); } $itemSettings = array('title' => $title, 'link' => $url, 'description' => $description); if (GalleryUtilities::isA($item, 'GalleryAlbumItem')) { $itemSettings['category'] = 'album'; } else { $itemSettings['category'] = 'photo'; } $itemSettings['pubDate'] = date('r', $item->getModificationTimestamp()); /* check if the enclosure tag should be used */ if (GalleryUtilities::isA($item, 'GalleryDataItem') && isset($param['useEnclosure']) && $param['useEnclosure'] == '1') { $imageUrl = $urlGenerator->generateUrl( array( 'view' => 'core.DownloadItem', 'itemId' => $item->getId()), array( 'forceSessionId' => false, 'forceFullUrl' => true)); $itemSettings['enclosure'] = array( 'url' => $imageUrl, 'length' => $item->getSize(), 'type' => $item->getMimeType()); } $generator->addItem($itemSettings, $item->getId()); return null; } /** * This function adds a comment item to the feed generator * * @param object RssGenerator $generator reference to the generator * @param object GalleryComment $item item to add * @param array $param feed parameters * @return object GalleryStatus */ function addComment(&$generator, $item, $param) { global $gallery; /* generate url to the images */ $urlGenerator =& $gallery->getUrlGenerator(); $url = $urlGenerator->generateUrl( array('view' => 'comment.ShowAllComments', 'itemId' => $item->getParentId()), array('forceSessionId' => false, 'forceFullUrl' => true)); $itemSettings = array( 'title' => $item->getSubject(), 'link' => $url, 'description' => $item->getComment()); /* check if we should use the category tag */ if (isset($param['useItemCategory']) && $param['useItemCategory'] == '1') { $itemSettings['category'] = 'comment'; } /* check if pubDate tag should be used */ if (isset($param['usePubDate']) && $param['usePubDate']) { $itemSettings['pubDate'] = date('r', $item->getDate()); } $generator->addItem($itemSettings, $item->getId()); return null; } /** * This function fetches albums or items inside a root album * * @param int $itemId the root album Id * @param int $limit the maximum number of items to fetch from the DB * @param boolean $newOnly if true, only select new items (not changed) * @param boolean $allowPhotos if true, returns photos; if false, albums * @param int $perAlbumLimit the maximum number of pictures to return from a single album * @return array object GalleryStatus * array of item Ids * * copied and modified from GalleryItemHelper_simple */ function fetchAlbumTree($itemId, $limit, $newOnly, $allowPhotos, $perAlbumLimit = 0) { global $gallery; $storage =& $gallery->getStorage(); $userId = $gallery->getActiveUserId(); list ($ret, $aclIds) = GalleryCoreApi::fetchAccessListIds('core.view', $userId); if (empty($aclIds)) { return array(null, array()); } $aclMarkers = GalleryUtilities::makeMarkers(count($aclIds)); list ($ret, $parentSequence) = GalleryCoreApi::fetchParentSequence($itemId); if ($ret) { return array($ret, null); } $ret = GalleryCoreApi::assertHasItemPermission($itemId, 'core.view'); if ($ret) { return array($ret, null); } $parentSequence[] = $itemId; $parentSequence = implode('/', $parentSequence); $timestamp = $newOnly ? 'creationTimestamp' : 'modificationTimestamp'; $table = $allowPhotos ? 'GalleryDataItem' : 'GalleryAlbumItem'; list ($ret, $newDays) = GalleryCoreApi::getPluginParameter('module', 'newitems', 'days.new'); if ($ret || !$newDays) { $newDays = 1; /* Use default on error or zero setting */ } $timeCutOff = time() - 3600 * 24 * $newDays; $query = " SELECT [$table::id]"; if ($perAlbumLimit != 0) { $query .= ', [GalleryItemAttributesMap::parentSequence]'; } $query .= " FROM [$table], [GalleryItemAttributesMap], [GalleryAccessSubscriberMap], [GalleryEntity] WHERE [GalleryEntity::$timestamp] >= $timeCutOff AND [$table::id] = [GalleryItemAttributesMap::itemId] AND [$table::id] = [GalleryEntity::id]"; if (!empty($parentSequence)) { $query .= " AND [GalleryItemAttributesMap::parentSequence] LIKE '$parentSequence/%'"; } $query .= " AND [$table::id] = [GalleryAccessSubscriberMap::itemId] AND [GalleryAccessSubscriberMap::accessListId] IN ($aclMarkers) ORDER BY [GalleryEntity::$timestamp] DESC "; $data = $aclIds; $params = array(); if (isset($limit)) { $params['limit'] = array('count' => $limit); } list ($ret, $searchResults) = $gallery->search($query, $data, $params); if ($ret) { return array($ret, null); } $list = array(); $perAlbum = array(); while ($result = $searchResults->nextResult()) { if ($perAlbumLimit != 0) { /* * check number of items already accepted for this album * is lower than the limit */ if (isset($perAlbum[$result[1]])) { $n = $perAlbum[$result[1]]; if ($n < $perAlbumLimit) { /* under the limit */ $perAlbum[$result[1]] = $n + 1; $list[] = $result[0]; } } else { /* first item for this album: accept */ $perAlbum[$result[1]] = 1; $list[] = $result[0]; } } else { /* include all results */ $list[] = $result[0]; } } return array(null, $list); } /** * This provides a translation of the feed type codes * * @return array object GalleryStatus * array of feedType => translation */ function getFeedTypeTranslation() { list ($ret, $module) = GalleryCoreApi::loadPlugin('module', 'rss'); if ($ret) { return array($ret, null); } return array(null, array( 'photos' => $module->translate('Items in an album'), 'album' => $module->translate('Sub-albums of an album'), 'photosRecurse' => $module->translate('Items in an album and its sub-albums'), 'commentsAlbum' => $module->translate('Comments for an album'), 'commentsPhoto' => $module->translate('Comments for an item'), 'commentsRecursive' => $module->translate('Comments for an album and its subalbums'), )); } } ?>