id = $id; $this->mode = $mode; $this->renderer = $renderer; $this->searchConfig = $searchConfig; $this->data = $searchConfig->getConf(); $this->columns = $searchConfig->getColumns(); $this->result = $this->searchConfig->execute(); $this->resultCount = $this->searchConfig->getCount(); $this->max = $this->result[0]['count']; $this->min = end($this->result)['count']; } /** * Create the cloud on the renderer */ public function render() { $this->sortResults(); $this->startScope(); $this->startList(); foreach ($this->result as $result) { $this->renderTag($result); } $this->finishList(); $this->finishScope(); return; } /** * Adds additional info to document and renderer in XHTML mode * * @see finishScope() */ protected function startScope() { // wrapping div if($this->mode != 'xhtml') return; $this->renderer->doc .= "
"; } /** * Closes the table and anything opened in startScope() * * @see startScope() */ protected function finishScope() { // wrapping div if($this->mode != 'xhtml') return; $this->renderer->doc .= '
'; } /** * Render a tag of the cloud * * @param ['tag' => Value, 'count' => int] $result */ protected function renderTag($result) { /** * @var Value $value */ $value = $result['tag']; $count = $result['count']; if ($value->isEmpty()) { return; } $type = strtolower($value->getColumn()->getType()->getClass()); $weight = $this->getWeight($count, $this->min, $this->max); if (!empty($this->data['target'])) { $target = $this->data['target']; } else { global $INFO; $target = $INFO['id']; } $tagValue = $value->getDisplayValue(); if (is_array($tagValue)) { $tagValue = $tagValue[0]; } $key = $value->getColumn()->getFullQualifiedLabel() . '*~'; $filter = SearchConfigParameters::$PARAM_FILTER . "[$key]=" . urlencode($tagValue); $this->renderer->listitem_open(1); $this->renderer->listcontent_open(); if($this->mode == 'xhtml') { $this->renderer->doc .= "
"; } $value->renderAsTagCloudLink($this->renderer, $this->mode, $target, $filter, $weight); if($this->mode == 'xhtml') { $this->renderer->doc .= '
'; } $this->renderer->listcontent_close(); $this->renderer->listitem_close(); } /** * This interpolates the weight between 70 and 150 based on $min, $max and $current * * @param int $current * @param int $min * @param int $max * @return int */ protected function getWeight($current, $min, $max) { if ($min == $max) { return 100; } return round(($current - $min)/($max - $min) * 80 + 70); } /** * Sort the list of results */ protected function sortResults() { usort($this->result, function ($a, $b) { $asort = $a['tag']->getColumn()->getType()->getSortString($a['tag']); $bsort = $b['tag']->getColumn()->getType()->getSortString($b['tag']); if ($asort < $bsort) { return -1; } if ($asort > $bsort) { return 1; } return 0; }); } protected function startList() { $this->renderer->listu_open(); } protected function finishList() { $this->renderer->listu_close(); } }