Gallery:如何为子相册列表使用缩略图
Gallery 2.1.1版本[ ]
修改classic外观主题以显示子相册缩略图[ ]
注2:可在外观主题选项页面启用此特点。 补丁针对gallery 2.1.1版本。 补丁文件可在此 找到。
注:这些指导内容仅适用于Gallery 2 beta 4或更新版本,因为自beta4开始外观主题系统就与以往不同了。
每个父族相册都可以显示一个其下子相册的列表,而子相册还可以有子相册,深度由你决定。但这些相册只是以文本方式显示的。如果你想看到这些子相册以缩略图样式显示出来,而不是一列相册标题的话,就需要对外观主题做修改了。
对theme.inc的修改[ ]
我针对classic外观主题的2.1.1版本做了一个补丁,以应用这里提及的修改。g2-theme-classic-theme.inc.diff Mastalee 2006年7月14日,12:46 (PDT)
Theme.inc可在外观主题文件夹根目录下找到。你需要添加一些代码,这样才能让那个缩略图在模板中可用。
在showAlbumPage函数下,做此2处修改:
if (!empty($treeIds)) {
list ($ret, $treeItems) = GalleryCoreApi::loadEntitiesById($treeIds);
if ($ret->isError()) {
return array($ret->wrap(__FILE__, __LINE__), null);
}
/*新增代码开始*/
list ($ret, $thumbs) = GalleryCoreApi::fetchThumbnailsByItemIds($treeIds);
if ($ret->isError()) {
return array($ret->wrap(__FILE__, __LINE__), null);
}
/*新增代码结束*/
}
$theme['tree'] = $treeList;
$theme['treeItems'] = array();
foreach ($treeItems as $treeItem) {
$theme['treeItems'][$treeItem->getId()] = $treeItem->getMemberData();
/*新增代码开始*/
if (isset($thumbs[$treeItem->getId()])) {
$theme['treeItems'][$treeItem->getId()]['thumbnail'] =
$thumbs[$treeItem->getId()]->getMemberData();
}
/*新增代码结束*/
对album.tpl的修改[ ]
album.tpl 2.1.1版的修改在此补丁文件中:g2-theme-classic-album.tpl.diff
--Mastalee 2006年7月14日,12:48 (PDT)
Album.tpl可在外观主题的模板目录下找到。
子相册的显示是在此部分完成的:
{if $theme.params.showSubalbums}
/*middle part snipped*/
{/if}
源代码的关键部分是列表项目。如果你想保留tree building部分,将:
<a href="{g->url arg1="view=core.ShowItem" arg2="itemId=`$node.id`"}">
{$theme.treeItems[$node.id].title|default:$theme.treeItems[$node.id].pathComponent|markup}
</a>
替换为:
{if !empty($theme.treeItems[$node.id].thumbnail)}
<a href="{g->url arg1="view=core:ShowItem" arg2="itemId=`$node.id`"}">
{g->image
item=$theme.treeItems[$node.id]
image=$theme.treeItems[$node.id].thumbnail
maxSize=60
title=$theme.treeItems[$node.id].title}
</a>
{/if}
这将进行检查以保证有缩略图(如果是空相册的情况),并在存在缩略图的情况下显示缩略图。如果你想显示空相册,就添加"else",这样就会显示源代码中的标题了。如果你希望缩略图尺寸能大点的话,修改maxSize设定即可。
如果你想联机显示所有缩略图的话,将整个部分替换为如下内容。如果只列出直接子相册(第一层子相册)的话,效果会最好。
{if $theme.params.showSubalbums}
{if !empty($theme.tree[$child.id])}
<p>
Subalbums:<br />
<ul style="display:inline">
{foreach from=$theme.tree[$child.id] item=node}
<li style="display:inline">
{if !empty($theme.treeItems[$node.id].thumbnail)}
<a href="{g->url arg1="view=core:ShowItem" arg2="itemId=`$node.id`"}">
{g->image
item=$theme.treeItems[$node.id]
image=$theme.treeItems[$node.id].thumbnail
maxSize=60
title=$theme.treeItems[$node.id].title}
</a>
{/if}
</li>
{/foreach}
</ul>
</p>
{/if}
Gallery 2.2.X版本[ ]
你可能已经读过了Mastalee给的内容,尤其是album.tpl,他/她对该文件所作的修改对我来说可以用。我不会在此进行多余的复制了。
这是来自classic外观主题2.2.3版theme.inc的整个函数,经修改以支持子相册列表的缩略图显示样式。我包括进整合函数,这样就能明白所作的修改与其他代码的关系了。但在下个版本中可能会完全变貌,所以你需要确切地懂得旧代码的处理方法,这样在新代码出来后就能知道如何添加缩略图了。
你应该可以剪切并将此整个区块粘贴到原始的_buildTree函数之上。
theme.inc[ ]
/**
* 为子相册树建立模板数据
* @return object GalleryStatus a status code
* @access private
*/
function _buildTree($childIds, &$treeList, &$treeItems, $maxDepth, $subalbumSort, $userId) {
list ($ret, $items) = GalleryCoreApi::loadEntitiesById($childIds);
if ($ret) {
return $ret;
}
$treeIds = array();
foreach ($items as $item) {
if (!GalleryUtilities::isA($item, 'GalleryAlbumItem')) {
continue;
}
if ($subalbumSort) {
/* Apply sort preference of each album */
$ret = $this->_doBuildTree($item, $item->getId(), $treeList, $treeItems,
$maxDepth, $userId, 1);
if ($ret) {
return $ret;
}
} else {
$id = $item->getId();
list ($ret, $tree) = GalleryCoreApi::fetchAlbumTree($id, $maxDepth, $userId);
if ($ret) {
return $ret;
}
$treeList[$id] = array();
$this->_parseTree($tree, $treeList[$id], $treeIds);
}
}
if (!empty($treeIds)) {
list ($ret, $items) = GalleryCoreApi::loadEntitiesById($treeIds);
if ($ret) {
return $ret;
}
/* 新代码 */
list ($ret, $thumbnail) = GalleryCoreApi::fetchThumbnailsByItemIds($treeIds);
if ($ret) {
return $ret;
}
/* 新代码结束*/
foreach ($items as $item) {
$treeItems[$item->getId()] = (array)$item;
/*新代码*/
if(isset($treeItems[$item->getId()])) {
$treeItems[$item->getId()]['thumbnail'] = (array)$thumbnail[$item->getId()];
}
/*新代码结束*/
}
}
return null;
}