1fa04b28cSMichael Grosse<?php 25282d027SMichael Grosse 3fa04b28cSMichael Grossenamespace dokuwiki\plugin\struct\meta; 45282d027SMichael Grosse 5d90aa848SAndreas Gohrclass AggregationCloud extends Aggregation 6d6d97f60SAnna Dabrowska{ 7d90aa848SAndreas Gohr /** @var int */ 8d90aa848SAndreas Gohr protected $max; 95282d027SMichael Grosse 10d90aa848SAndreas Gohr /** @var int */ 11d90aa848SAndreas Gohr protected $min; 125282d027SMichael Grosse 13d90aa848SAndreas Gohr /** @inheritdoc */ 14d90aa848SAndreas Gohr public function render($showNotFound = false) 15d6d97f60SAnna Dabrowska { 16*ba7f5789SAnna Dabrowska 17*ba7f5789SAnna Dabrowska if ($this->mode !== 'xhtml') return; 18*ba7f5789SAnna Dabrowska 19*ba7f5789SAnna Dabrowska $rows = $this->searchConfig->getRows(); 20*ba7f5789SAnna Dabrowska $this->max = $rows[0]['count']; 21*ba7f5789SAnna Dabrowska $this->min = end($rows)['count']; 22*ba7f5789SAnna Dabrowska 23*ba7f5789SAnna Dabrowska $this->sortResults($rows); 24c7dd6b6aSMichael Grosse $this->startList(); 25*ba7f5789SAnna Dabrowska foreach ($rows as $result) { 2633bd00e9SMichael Grosse $this->renderTag($result); 27fa04b28cSMichael Grosse } 28c7dd6b6aSMichael Grosse $this->finishList(); 29fa04b28cSMichael Grosse } 30aafac1c1SMichael Grosse 3133bd00e9SMichael Grosse /** 3233bd00e9SMichael Grosse * Render a tag of the cloud 3333bd00e9SMichael Grosse * 3433bd00e9SMichael Grosse * @param ['tag' => Value, 'count' => int] $result 3533bd00e9SMichael Grosse */ 36d6d97f60SAnna Dabrowska protected function renderTag($result) 37d6d97f60SAnna Dabrowska { 38fa04b28cSMichael Grosse /** 39fa04b28cSMichael Grosse * @var Value $value 40fa04b28cSMichael Grosse */ 41fa04b28cSMichael Grosse $value = $result['tag']; 42fa04b28cSMichael Grosse $count = $result['count']; 43fa04b28cSMichael Grosse if ($value->isEmpty()) { 44fa04b28cSMichael Grosse return; 45fa04b28cSMichael Grosse } 46fa04b28cSMichael Grosse 47c7dd6b6aSMichael Grosse $type = strtolower($value->getColumn()->getType()->getClass()); 48c7dd6b6aSMichael Grosse $weight = $this->getWeight($count, $this->min, $this->max); 498e54e6f4SMichael Grosse 5085edf4f2SMichael Grosse if (!empty($this->data['target'])) { 5185edf4f2SMichael Grosse $target = $this->data['target']; 5285edf4f2SMichael Grosse } else { 5385edf4f2SMichael Grosse global $INFO; 5485edf4f2SMichael Grosse $target = $INFO['id']; 5585edf4f2SMichael Grosse } 568e54e6f4SMichael Grosse 57ce8676aeSMichael Grosse $tagValue = $value->getDisplayValue(); 58ce8676aeSMichael Grosse if (is_array($tagValue)) { 59ce8676aeSMichael Grosse $tagValue = $tagValue[0]; 60fa04b28cSMichael Grosse } 6157775e30SSzymon Olewniczak $key = $value->getColumn()->getFullQualifiedLabel() . '='; 6243d76406SSzymon Olewniczak $filter = SearchConfigParameters::$PARAM_FILTER . '[' . urlencode($key) . ']=' . urlencode($tagValue); 63c7dd6b6aSMichael Grosse 64da11327aSMichael Grosse $this->renderer->listitem_open(1); 65da11327aSMichael Grosse $this->renderer->listcontent_open(); 66da11327aSMichael Grosse 67262c0fc6SMichael Grosse if ($this->mode == 'xhtml') { 6817a3a578SAndreas Gohr $this->renderer->doc .= 6917a3a578SAndreas Gohr "<div style='font-size:$weight%' data-count='$count' class='cloudtag struct_$type'>"; 708e54e6f4SMichael Grosse } 718e54e6f4SMichael Grosse 72bfb78ce3SAnna Dabrowska $showCount = $this->searchConfig->getConf()['summarize'] ? $count : 0; 73bfb78ce3SAnna Dabrowska $value->renderAsTagCloudLink($this->renderer, $this->mode, $target, $filter, $weight, $showCount); 74262c0fc6SMichael Grosse 75262c0fc6SMichael Grosse if ($this->mode == 'xhtml') { 76c7dd6b6aSMichael Grosse $this->renderer->doc .= '</div>'; 77fa04b28cSMichael Grosse } 78da11327aSMichael Grosse 79da11327aSMichael Grosse $this->renderer->listcontent_close(); 80da11327aSMichael Grosse $this->renderer->listitem_close(); 81262c0fc6SMichael Grosse } 82aafac1c1SMichael Grosse 83aafac1c1SMichael Grosse /** 84aafac1c1SMichael Grosse * This interpolates the weight between 70 and 150 based on $min, $max and $current 85aafac1c1SMichael Grosse * 86aafac1c1SMichael Grosse * @param int $current 87aafac1c1SMichael Grosse * @param int $min 88aafac1c1SMichael Grosse * @param int $max 898e54e6f4SMichael Grosse * @return int 90aafac1c1SMichael Grosse */ 91d6d97f60SAnna Dabrowska protected function getWeight($current, $min, $max) 92d6d97f60SAnna Dabrowska { 93aafac1c1SMichael Grosse if ($min == $max) { 94aafac1c1SMichael Grosse return 100; 95aafac1c1SMichael Grosse } 968e54e6f4SMichael Grosse return round(($current - $min) / ($max - $min) * 80 + 70); 97aafac1c1SMichael Grosse } 988b4531cfSMichael Grosse 998b4531cfSMichael Grosse /** 1008b4531cfSMichael Grosse * Sort the list of results 1018b4531cfSMichael Grosse */ 102*ba7f5789SAnna Dabrowska protected function sortResults(&$rows) 103d6d97f60SAnna Dabrowska { 104*ba7f5789SAnna Dabrowska usort($rows, function ($a, $b) { 105d560ea13SMichael Grosse $asort = $a['tag']->getColumn()->getType()->getSortString($a['tag']); 106d560ea13SMichael Grosse $bsort = $b['tag']->getColumn()->getType()->getSortString($b['tag']); 107d560ea13SMichael Grosse if ($asort < $bsort) { 1088b4531cfSMichael Grosse return -1; 1098b4531cfSMichael Grosse } 110d560ea13SMichael Grosse if ($asort > $bsort) { 1118b4531cfSMichael Grosse return 1; 1128b4531cfSMichael Grosse } 1138b4531cfSMichael Grosse return 0; 1148b4531cfSMichael Grosse }); 1158b4531cfSMichael Grosse } 1168b4531cfSMichael Grosse 117d6d97f60SAnna Dabrowska protected function startList() 118d6d97f60SAnna Dabrowska { 119c7dd6b6aSMichael Grosse $this->renderer->listu_open(); 120c7dd6b6aSMichael Grosse } 121c7dd6b6aSMichael Grosse 122d6d97f60SAnna Dabrowska protected function finishList() 123d6d97f60SAnna Dabrowska { 124c7dd6b6aSMichael Grosse $this->renderer->listu_close(); 125c7dd6b6aSMichael Grosse } 126fa04b28cSMichael Grosse} 127