Hi,
Is there any function to do the same as printAllTagsAs("cloud"), but limit the results to only tags present in the current album's pictures?
I checked the API (
http://www.zenphoto.org/documentation/functions/_template-functions.php.html) and plugins, but didn't see anything.
Here is the SQL to accomplish it. If there's not something that does this right now, I'll roll my own...
`
mysql> select t.tagid, tags.name, i.albumid, count(*)
from zp_obj_to_tag AS t
left join (zp_images as i, zp_tags as tags) ON (t.objectid = i.id AND tags.id= t.tagid)
where t.type = 'images' and i.albumid=67
group by t.tagid;
+-------+---------------+---------+----------+
| tagid | name | albumid | count(*) |
+-------+---------------+---------+----------+
| 6 | thailand | 67 | 359 |
| 7 | bangkok | 67 | 58 |
| 8 | temple | 67 | 33 |
| 9 | max | 67 | 36 |
| 10 | kristi | 67 | 45 |
| 11 | beer | 67 | 10 |
| 12 | market | 67 | 79 |
| 13 | chiang mai | 67 | 155 |
| 14 | hdr | 67 | 2 |
| 15 | cooking class | 67 | 36 |
| 16 | sammy's | 67 | 36 |
| 17 | fongshot | 67 | 9 |
| 18 | phuket | 67 | 8 |
| 19 | samui | 67 | 15 |
| 20 | gap | 67 | 102 |
| 21 | sailing | 67 | 102 |
| 22 | phi phi | 67 | 20 |
| 23 | ladyboi | 67 | 5 |
+-------+---------------+---------+----------+
18 rows in set (0.04 sec)
`
Thanks,
-m
Comments
Here's my first stab at it, any improvements or feedback welcome. Chunks of this are obviously lifted straight from zp-core/*.php.
TODO: Make the magic numbers options in the theme (or arguments to the function if you guys want to use this).
`
function FlickrishPrintAlbumTagCloud( ) {
$sql = "SELECT t.tagid, tags.name, COUNT(*) AS count FROM ".
prefix('obj_to_tag').
" AS t LEFT JOIN (".
prefix('images'). "AS i, ".
prefix('tags'). "AS tags)".
" ON (t.objectid = i.id AND tags.id= t.tagid)".
" WHERE t.type = 'images'".
" AND i.albumid=".getAlbumId().
" GROUP BY t.tagid";
#echo $sql;
$tags = query_full_array($sql);
if (!is_array($tags)) {
return;
}
$size_min = 0.8; // ALLTAGS_MINFONTSIZE TODO: make param of theme
$size_max = 3.0;
$count_min = 1;
$count_max = 200;
foreach ($tags as $row) {
$count = $row['count'];
$tid = $row['tagid'];
$tname = $row['name'];
// TODO: use distribution instead of linear fn
$size = min(max(round(($size_max*($count-$count_min))/($count_max-$count_min),
2), $size_min)
,$size_max);
$size = str_replace(',','.', $size);
# TODO: specifying the album doesn't work for some reason.
#htmlspecialchars(getSearchURL($tname, '', 'tags', 0, array(getAlbumId()))).
echo "".
"$tname\n";
}
}
`
Then in album.php :
`
<?php FlickrishPrintAlbumTagCloud()?>
`
And in theme.css :
`
div.albumTags A {
margin-left: 5px;
margin-right: 5px;
white-space: nowrap;
}
`