标签云助手 Cakephp 2

可调整助手以构建词语/标签云。

<?php

/*
 *  @author: [email protected] & Suhail Doshi
 */

class TagcloudHelper extends Helper {
    /* font sizes */

    var $minSize = 10;
    var $maxSize = 50;

    /* colors */
    var $red = 110;
    var $green = 105;
    var $blue = 255;

    /* div sizes */
    var $div_size = 400;

    /* show frequencies */
    var $show_frequencies = false;

    /*  @author: syl-via
     *  @param array $tags Tags to build the cloud on. Ex array('name'=>20,'tag2'=>32)
     *  @param (optional) int  $div_size The size of the div for the words
     *  @param (optional) int  $minSize  Minimum size of the font
     *  @param (optional) int  $maxSize  Maximum size of the font
     *  @param (optional) int  $red
     *  @param (optional) int  $green
     *  @param (optional) int  $blue
     *
     *  returns string div with span of tags.
     */

    public function word_cloud($tags, $div_size = null, $show_frequencies = null, $minSize = null, $maxSize = null, $red = null, $green = null, $blue = null) {
        if ($show_frequencies != null)
            $this->show_frequencies = $show_frequencies;
        if ($div_size != null)
            $this->div_size = $div_size;
        if ($minSize != null)
            $this->minSize = $minSize;
        if ($maxSize != null)
            $this->maxSize = $maxSize;
        if ($red != null)
            $this->red = $red;
        if ($green != null)
            $this->green = $green;
        if ($blue != null)
            $this->blue = $blue;

        $data = $this->formulateTagCloud($tags);
        $data = $this->shuffleTags($data);

        /* Build cloud */
        $cloud = "<div style=\"width: {$this->div_size}px\">";
        foreach ($data as $word => $options) {
            $cloud .= "<span style=\"font-size: {$options['size']}px; color: {$options['color']};\">";
            $cloud .= str_replace(" ", " ", $word);
            if ($this->show_frequencies) {
                $cloud .= " <small>({$options['score']})</samll> ";
            }
            $cloud .= "</span> ";
        }
        $cloud .= "</div>";
        return $cloud;
    }

    /*
     *  @author: Suhail Doshi
     */

    public function formulateTagCloud($dataSet) {
        asort($dataSet); // Sort array accordingly.
        // Retrieve extreme score values for normalization
        $minimumScore = intval(current($dataSet));
        $maximumScore = intval(end($dataSet));

        // Populate new data array, with score value and size.
        foreach ($dataSet as $tagName => $score) {
            $size = $this->getPercentSize($maximumScore, $minimumScore, $score);
            $color = $this->getColor($maximumScore, $score);
            $data[$tagName] = array('score' => $score, 'size' => $size, 'color' => $color);
        }

        return $data;
    }

    /*  @author: syl-via
     *  @param int $maximumScore Maximum score value in array.
     *  @param int $currentValue Current score value for given item.
     *
     *  returns string Hex(ex: #000012) value of RGB.
     */

    public function getColor($maximumScore, $currentValue) {
        $b = floor($this->blue * ($currentValue / $maximumScore));
        return '#' . sprintf('%02s', dechex($this->red)) . sprintf('%02s', dechex($this->green)) . sprintf('%02s', dechex($b));
    }

    /*  @author: Suhail Doshi
     *  @param int $maxValue Maximum score value in array.
     *  @param int $minValue Minimum score value in array.
     *  @param int $currentValue Current score value for given item.
     *  @param int [$minSize] Minimum font-size.
     *  @param int [$maxSize] Maximum font-size.
     *
     *  returns int percentage for current tag.
     */

    private function getPercentSize($maximumScore, $minimumScore, $currentValue) {
        if ($minimumScore < 1)
            $minimumScore = 1;
        $spread = $maximumScore - $minimumScore;
        if ($spread == 0)
            $spread = 1;
        // determine the font-size increment, this is the increase per tag quantity (times used)
        $step = ($this->maxSize - $this->minSize) / $spread;
        // Determine size based on current value and step-size.
        $size = $this->minSize + (($currentValue - $minimumScore) * $step);
        return $size;
    }

    /*  @author: Suhail Doshi
     *  @param array $tags An array of tags (takes an associative array)
     *
     *  returns shuffled array of tags for randomness.
     */

    public function shuffleTags($tags) {
        while (count($tags) > 0) {
            $val = array_rand($tags);
            $new_arr[$val] = $tags[$val];
            unset($tags[$val]);
        }
        if (isset($new_arr))
            return $new_arr;
    }

}
?>