Tag Cloud and Categories of Records
2 posts by 2 authors in: Forums > CMS Builder
Last Post: February 10, 2022 (RSS)
By Mikey - February 5, 2022
Howdy folks,
Below is some code that loads a Tag Cloud that I use to query a site's search engine. In my news, photos, videos and events section editors I a pulldown called "categories" that I can assign a category to each record I create. I'd like to load up all the chosen categories in the tag cloud, but I can't figure out what needs to be done to load up the select for 'categories:label' in the code below. Any suggestions on how to get this to work?
$tagsToCount = array();
$sectionsToField = array(
'news' => 'categories:label',
'photos' => 'categories:label',
'videos' => 'categories:label',
'events' => 'categories:label',
);
//use additional if joining tags from multiple sections
foreach($sectionsToField as $sectionName => $fieldName) {
//get records
$records = mysql_select($sectionName);
foreach ($records as $record) {
//turn field into an array of values
$tags = explode("\t", @$record[$fieldName]); // Modified for multiple tags associated with record.
// add tags to the count array
foreach ($tags as $tag) {
$tag = trim($tag);
if (!$tag) { continue; } // skip empty array values
if (array_key_exists($tag, $tagsToCount)) {
$tagsToCount[$tag]++; }
else {
$tagsToCount[$tag] = 1;
}
}
}
}
//PHP doesn't have a shuffle function built in that maintains keys, but this version does.
function shuffle_assoc($list) {
if (!is_array($list)) return $list;
$keys = array_keys($list);
//shuffle($keys); // Disable to show largest quantity at the top and smallest at the bottom.
$random = array();
foreach ($keys as $key) {
$random[$key] = $list[$key];
}
return $random;
}
?>
<!-- DISPLAY TAGS -->
<?php $tagsToCount = shuffle_assoc($tagsToCount); ?>
<?php if ($tagsToCount): ?>
<?php $maximumResults = 32;
$resultCount = 0;
?>
<?php $totalTagCount = array_sum($tagsToCount); ?>
<?php
$min_size = 13; //smallest font size
$max_size = 22; //largest font size
$minimum_count = min(array_values($tagsToCount));
$maximum_count = max(array_values($tagsToCount));
$spread = $maximum_count - $minimum_count;
if($spread == 0) {
$spread = 1;
}
arsort($tagsToCount);
$tagsToCount = array_slice($tagsToCount, 0, 99);
$tagsToCount = shuffle_assoc($tagsToCount);
foreach ($tagsToCount as $key => $value): ?>
<?php $size = $min_size + ($value - $minimum_count) * ($max_size - $min_size) / $spread; ?>
<a href="search.php?q=<?php echo $key;?>" class="button small hollow" style="font-size: <?php echo floor($size)?>px;" title='<?php echo $key; ?>'><?php echo $key; ?></a>
<?php if (++$resultCount == $maximumResults) { break;}?>
<?php endforeach ?>
<?php endif ?>
<div class="clearfix"></div>
<!-- END TAG CLOUD -->
Thanks Zicky
By daniel - February 10, 2022
Hey Zicky,
It sounds like you need a way to convert the values saved the "categories" dropdown into their ":labels" counterpart, is that correct? The easiest way to do so would probably be to replace your mysql_select() with a getRecords() call, as that will by default load the ":labels" pseudofields. You could also look into theĀ _getListOptionLabelByValue() function, but that requires a few other steps to load the field schema, so getRecords() is likely the best options.
Let me know if that helps or if you have any other questions!
Thanks,
Technical Lead
interactivetools.com