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->helper = plugin_load('helper', 'struct_config'); $this->max = $this->result[0]['count']; $this->min = end($this->result)['count']; } /** * Create the table on the renderer */ public function render() { $this->startScope(); $this->renderer->doc .= ''; $this->finishScope(); return; } /** * Adds additional info to document and renderer in XHTML mode * * @see finishScope() */ protected function startScope() { // unique identifier for this aggregation $this->renderer->info['struct_cloud_hash'] = md5(var_export($this->data, true)); // wrapping div if($this->mode != 'xhtml') return; $this->renderer->doc .= "
"; } /** * Closes the table and anything opened in startScope() * * @see startScope() */ protected function finishScope() { // remove identifier from renderer again if(isset($this->renderer->info['struct_cloud_hash'])) { unset($this->renderer->info['struct_cloud_hash']); } // 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']; $weight = $this->getWeight($count, $this->min, $this->max); $type = strtolower($value->getColumn()->getType()->getClass()); if ($value->isEmpty()) { return; } $tagValue = $value->getDisplayValue(); if (empty($tagValue)) { $tagValue = $value->getRawValue(); } if (is_array($tagValue)) { $tagValue = $tagValue[0]; } $schema = $this->data['schemas'][0][0]; $col = $value->getColumn()->getLabel(); $this->renderer->doc .= '
  • '; $this->renderer->doc .= "
    "; $this->renderer->internallink("?flt[$schema.$col*~]=" . urlencode($tagValue),$tagValue); if ($column < $this->resultCount) { $this->renderer->doc .= ' '; } $this->renderer->doc .= '
    '; $this->renderer->doc .= '
  • '; } /** * This interpolates the weight between 70 and 150 based on $min, $max and $current * * @param int $current * @param int $min * @param int $max * @return float|int */ protected function getWeight($current, $min, $max) { if ($min == $max) { return 100; } return ($current - $min)/($max - $min) * 80 + 70; } }