| <?php |
|
|
| |
| |
| |
| |
| |
| |
|
|
| namespace Piwik\Plugins\CoreVisualizations\Visualizations; |
|
|
| use Piwik\Common; |
| use Piwik\Plugin\Visualization; |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| class Cloud extends Visualization |
| { |
| public const ID = 'cloud'; |
| public const TEMPLATE_FILE = "@CoreVisualizations/_dataTableViz_tagCloud.twig"; |
| public const FOOTER_ICON = 'icon-tag-cloud'; |
| public const FOOTER_ICON_TITLE = 'General_TagCloud'; |
|
|
| |
| public static $debugDisableShuffle = false; |
| public $truncatingLimit = 50; |
|
|
| protected $wordsArray = []; |
| private $rawValues = []; |
| private $formattedValues = []; |
|
|
| public static function getDefaultConfig() |
| { |
| return new Cloud\Config(); |
| } |
|
|
| public function beforeLoadDataTable() |
| { |
| |
| $this->requestConfig->request_parameters_to_modify['format_metrics'] = 0; |
| $this->checkRequestIsNotForMultiplePeriods(); |
| } |
|
|
| |
| |
| |
| public function afterAllFiltersAreApplied() |
| { |
| if ($this->dataTable->getRowsCount() == 0) { |
| return; |
| } |
|
|
| $columnToDisplay = isset($this->config->columns_to_display[1]) ? $this->config->columns_to_display[1] : 'nb_visits'; |
| foreach ($this->dataTable->getRows() as $row) { |
| $label = $row->getColumn('label'); |
| $this->rawValues[$label] = $row->getColumn($columnToDisplay); |
| } |
| } |
|
|
| public function beforeRender() |
| { |
| $this->config->show_exclude_low_population = false; |
| $this->config->show_offset_information = false; |
| $this->config->show_limit_control = false; |
|
|
| |
| $this->applyMetricsFormatting(true); |
| $this->generateCloudData(); |
| } |
|
|
| private function generateCloudData() |
| { |
| if ($this->dataTable->getRowsCount() == 0) { |
| return; |
| } |
|
|
| $columnToDisplay = isset($this->config->columns_to_display[1]) ? $this->config->columns_to_display[1] : 'nb_visits'; |
| $labelMetadata = []; |
|
|
| foreach ($this->dataTable->getRows() as $row) { |
| $logo = false; |
| if ($this->config->display_logo_instead_of_label) { |
| $logo = $row->getMetadata('logo'); |
| } |
|
|
| $label = $row->getColumn('label'); |
|
|
| $labelMetadata[$label] = [ |
| 'logo' => $logo, |
| 'url' => $row->getMetadata('url'), |
| ]; |
|
|
| $this->addWord($label, $this->rawValues[$label]); |
|
|
| $this->formattedValues[$label] = $row->getColumn($columnToDisplay); |
| } |
|
|
| $cloudValues = $this->getCloudValues(); |
| foreach ($cloudValues as &$value) { |
| $value['logoWidth'] = round(max(16, $value['percent'])); |
| } |
|
|
| $this->assignTemplateVar('labelMetadata', $labelMetadata); |
| $this->assignTemplateVar('cloudColumn', $columnToDisplay); |
| $this->assignTemplateVar('cloudValues', $cloudValues); |
| } |
|
|
| |
| |
| |
| |
| |
| public function addWord($word, $value = 1) |
| { |
| if (isset($this->wordsArray[$word])) { |
| $this->wordsArray[$word] += $value; |
| } else { |
| $this->wordsArray[$word] = $value; |
| } |
| } |
|
|
| private function getCloudValues() |
| { |
| $this->shuffleCloud(); |
|
|
| if (empty($this->wordsArray)) { |
| return []; |
| } |
|
|
| $maxValue = max($this->wordsArray); |
|
|
| $return = []; |
| foreach ($this->wordsArray as $word => $popularity) { |
| $wordTruncated = $this->truncateWordIfNeeded($word); |
| $percent = $this->getPercentage($popularity, $maxValue); |
| $sizeRange = $this->getClassFromPercent($percent); |
|
|
| $return[$word] = [ |
| 'word' => $word, |
| 'wordTruncated' => $wordTruncated, |
| 'size' => $sizeRange, |
| 'value' => $this->formattedValues[$word], |
| 'percent' => $percent, |
| ]; |
| } |
|
|
| return $return; |
| } |
|
|
| |
| |
| |
| protected function shuffleCloud() |
| { |
| if (self::$debugDisableShuffle) { |
| return; |
| } |
|
|
| $keys = array_keys($this->wordsArray); |
|
|
| shuffle($keys); |
|
|
| if (count($keys) && is_array($keys)) { |
| $tmpArray = $this->wordsArray; |
|
|
| $this->wordsArray = []; |
| foreach ($keys as $value) { |
| $this->wordsArray[$value] = $tmpArray[$value]; |
| } |
| } |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| protected function getClassFromPercent($percent) |
| { |
| $mapping = [95, 70, 50, 30, 15, 5, 0]; |
| foreach ($mapping as $key => $value) { |
| if ($percent >= $value) { |
| return $key; |
| } |
| } |
| return 0; |
| } |
|
|
| |
| |
| |
| |
| private function truncateWordIfNeeded($word) |
| { |
| $word = Common::unsanitizeInputValue($word); |
|
|
| if (mb_strlen($word) > $this->truncatingLimit) { |
| return mb_substr($word, 0, $this->truncatingLimit - 3) . '...'; |
| } |
|
|
| return $word; |
| } |
|
|
| private function getPercentage($popularity, $maxValue) |
| { |
| |
| if ($maxValue == 0) { |
| return 0; |
| } |
|
|
| $percent = ($popularity / $maxValue) * 100; |
|
|
| return $percent; |
| } |
| } |
|
|