silverstripe-blog/code/TagCloudWidget.php

142 lines
3.5 KiB
PHP
Raw Normal View History

2007-09-07 00:33:58 +02:00
<?php
class TagCloudWidget extends Widget {
static $db = array(
2008-04-22 03:20:59 +02:00
"Title" => "Varchar",
"Limit" => "Int",
"Sortby" => "Varchar"
);
2007-09-07 00:33:58 +02:00
2009-01-20 05:01:45 +01:00
static $has_one = array();
static $has_many = array();
static $many_many = array();
static $belongs_many_many = array();
2007-09-07 00:33:58 +02:00
static $defaults = array(
"Title" => "Tag Cloud",
2007-09-07 00:33:58 +02:00
"Limit" => "0",
"Sortby" => "alphabet"
);
static $cmsTitle = "Tag Cloud";
static $description = "Shows a tag cloud of tags on your blog.";
static $popularities = array( 'not-popular', 'not-very-popular', 'somewhat-popular', 'popular', 'very-popular', 'ultra-popular' );
2007-09-07 00:33:58 +02:00
function getCMSFields() {
return new FieldSet(
new TextField("Title", _t("TagCloudWidget.TILE", "Title")),
new TextField("Limit", _t("TagCloudWidget.LIMIT", "Limit number of tags")),
new OptionsetField("Sortby",_t("TagCloudWidget.SORTBY","Sort by"),array("alphabet"=>_t("TagCloudWidget.SBAL", "alphabet"),"frequency"=>_t("TagCloudWidget.SBFREQ", "frequency")))
2007-09-07 00:33:58 +02:00
);
}
function Title() {
return $this->Title ? $this->Title : 'Tag Cloud';
}
function TagsCollection() {
2007-09-07 00:33:58 +02:00
Requirements::css("blog/css/tagcloud.css");
$allTags = array();
$max = 0;
$container = BlogTree::current();
2007-09-07 00:33:58 +02:00
$entries = $container->Entries();
2007-09-07 00:33:58 +02:00
if($entries) {
foreach($entries as $entry) {
2008-12-04 22:34:49 +01:00
$theseTags = split(" *, *", strtolower(trim($entry->Tags)));
2007-09-07 00:33:58 +02:00
foreach($theseTags as $tag) {
2008-12-04 22:34:49 +01:00
if($tag != "") {
$allTags[$tag] = isset($allTags[$tag]) ? $allTags[$tag] + 1 : 1; //getting the count into key => value map
$max = ($allTags[$tag] > $max) ? $allTags[$tag] : $max;
}
2007-09-07 00:33:58 +02:00
}
}
2008-04-22 02:30:40 +02:00
2007-09-07 00:33:58 +02:00
if($allTags) {
//TODO: move some or all of the sorts to the database for more efficiency
if($this->Limit > 0){
uasort($allTags, array($this, "column_sort_by_popularity")); //sort by popularity
2007-09-07 00:33:58 +02:00
$allTags = array_slice($allTags, 0, $this->Limit);
}
if($this->Sortby == "alphabet"){
$this->natksort($allTags);
2007-09-07 00:33:58 +02:00
}
$sizes = array();
foreach ($allTags as $tag => $count) $sizes[$count] = true;
$offset = 0;
2007-09-07 00:33:58 +02:00
$numsizes = count($sizes)-1; //Work out the number of different sizes
$buckets = count(self::$popularities)-1;
2008-04-22 02:30:40 +02:00
// If there are more frequencies then buckets, divide frequencies into buckets
if ($numsizes > $buckets) {
$numsizes = $buckets;
}
// Otherwise center use central buckets
else {
$offset = round(($buckets-$numsizes)/2);
}
foreach($allTags as $tag => $count) {
$popularity = round($count / $max * $numsizes) + $offset; $popularity=min($buckets,$popularity);
$class = self::$popularities[$popularity];
2007-09-07 00:33:58 +02:00
$allTags[$tag] = array(
"Tag" => $tag,
"Count" => $count,
"Class" => $class,
"Link" => $container->Link() . 'tag/' . urlencode($tag)
2007-09-07 00:33:58 +02:00
);
}
}
$output = new DataObjectSet();
foreach($allTags as $tag => $fields) {
$output->push(new ArrayData($fields));
}
return $output;
}
return;
}
/**
* Helper method to compare 2 Vars to work out the results.
* @param mixed
* @param mixed
* @return int
*/
private function column_sort_by_popularity($a, $b){
if($a == $b) {
$result = 0;
}
else {
$result = $b - $a;
}
return $result;
}
private function natksort(&$aToBeSorted) {
$aResult = array();
$aKeys = array_keys($aToBeSorted);
natcasesort($aKeys);
foreach ($aKeys as $sKey) {
$aResult[$sKey] = $aToBeSorted[$sKey];
}
$aToBeSorted = $aResult;
2007-09-07 00:33:58 +02:00
return true;
2007-09-07 00:33:58 +02:00
}
}
2007-12-18 03:10:44 +01:00
?>