/** * Print a simple listing table * * @param array $data * @param float $max * @param string $title * @param bool $istraffic * @return void */ private function listtable(&$data, $max, $title, $istraffic = false) { if (!$data) { $data = array(); } arsort($data); $row = 1; $this->R->table_open(); $this->R->tablerow_open(); $this->head($title, 4); $this->R->tablerow_close(); $this->R->tablerow_open(); $this->head('#'); $this->head($this->getLang('name')); if ($istraffic) { $this->head($this->getLang('traffic'), 2); } else { $this->head($this->getLang('hits'), 2); } $this->R->tablerow_close(); foreach ($data as $key => $count) { if ($istraffic) { $val = filesize_h($count); } else { $val = $count; } $this->R->tablerow_open(); $this->cell($row); $this->hcell($key); $this->cell($val); $this->cell($this->pct($count, $max)); $this->R->tablerow_close(); $row++; if ($row > $this->log->top_limit) { break; } } $this->R->table_close(); }
/** * Renders activity report to the page * @param string $mode Name of the format mode * @param Doku_Renderer $renderer ref to the Doku_Renderer * @param array $params Parameter object returned by handle() */ function renderActivityByNamespaceReport($mode, Doku_Renderer $renderer, $params) { global $CHUNKPROGRESS_STATUS_TAGS; $renderer->table_open(); $renderer->tablerow_open(); $renderer->tablecell_open(); $renderer->strong_open(); $renderer->unformatted("Namespace"); $renderer->strong_close(); $renderer->tablecell_close(); foreach ($CHUNKPROGRESS_STATUS_TAGS as $status) { $renderer->tablecell_open(); $renderer->strong_open(); $renderer->unformatted($status); $renderer->strong_close(); $renderer->tablecell_close(); } $renderer->tablerow_close(); $count_by_sub_namespace_then_status = $params["count_by_sub_namespace_then_status"]; foreach ($count_by_sub_namespace_then_status as $sub_namespace => $statuses) { $renderer->tablerow_open(); $renderer->tablecell_open(); $renderer->unformatted($sub_namespace); $renderer->tablecell_close(); foreach ($CHUNKPROGRESS_STATUS_TAGS as $status) { $renderer->tablecell_open(); if (array_key_exists($status, $statuses)) { $renderer->unformatted($statuses[$status]); } $renderer->tablecell_close(); } $renderer->tablerow_close(); } $renderer->table_close(); }
/** * Render schema data * * Currently completely renderer agnostic * * @todo we currently have no schema headlines * * @param string $mode Renderer mode * @param Doku_Renderer $R The renderer * @param array $data The data from the handler() function * @return bool If rendering was successful. */ public function render($mode, Doku_Renderer $R, $data) { global $ID; global $INFO; global $REV; if ($ID != $INFO['id']) { return true; } if (!$INFO['exists']) { return true; } if ($this->hasBeenRendered) { return true; } // do not render the output twice on the same page, e.g. when another page has been included $this->hasBeenRendered = true; $assignments = new Assignments(); $tables = $assignments->getPageAssignments($ID); if (!$tables) { return true; } if ($mode == 'xhtml') { $R->doc .= '<div id="plugin__struct_output">'; } foreach ($tables as $table) { $schemadata = AccessTable::byTableName($table, $ID, $REV); $schemadata->optionSkipEmpty(true); $data = $schemadata->getData(); if (!count($data)) { continue; } $R->table_open(); $R->tablethead_open(); $R->tablerow_open(); $R->tableheader_open(2); $R->cdata($table); $R->tableheader_close(); $R->tablerow_close(); $R->tablethead_open(); $R->tabletbody_open(); foreach ($data as $field) { $R->tablerow_open(); $R->tableheader_open(); $R->cdata($field->getColumn()->getTranslatedLabel()); $R->tableheader_close(); $R->tablecell_open(); $field->render($R, $mode); $R->tablecell_close(); $R->tablerow_close(); } $R->tabletbody_close(); $R->table_close(); } if ($mode == 'xhtml') { $R->doc .= '</div>'; } return true; }
/** * Create output */ function render($mode, Doku_Renderer &$renderer, $opt) { if ($mode == 'metadata') { return false; } // load file data if ($opt['file']) { if (preg_match('/^https?:\\/\\//i', $opt['file'])) { require_once DOKU_INC . 'inc/HTTPClient.php'; $http = new DokuHTTPClient(); $opt['content'] = $http->get($opt['file']); if ($opt['content'] === false) { $renderer->cdata('Failed to fetch remote CSV data'); return true; } } else { $renderer->info['cache'] = false; if (auth_quickaclcheck(getNS($opt['file']) . ':*') < AUTH_READ) { $renderer->cdata('Access denied to CSV data'); return true; } else { $file = mediaFN($opt['file']); $opt['content'] = io_readFile($file); } } // if not valid UTF-8 is given we assume ISO-8859-1 if (!utf8_check($opt['content'])) { $opt['content'] = utf8_encode($opt['content']); } } // check if there is content $content =& $opt['content']; $content = trim($content); if ($content === '') { $renderer->cdata('No csv data found'); return true; } // Export the csv file $targetfile = ''; $export = $opt['export']; if ($export != '') { $targetfile = htmlspecialchars(trim($export)); if (auth_quickaclcheck(getNS($targetfile . ':*')) < AUTH_EDIT) { $renderer->cdata('Access denied: Could not create download link.'); $targetfile = ''; return true; } else { $file = mediaFN($targetfile); if (file_put_contents($file, $content, LOCK_EX) > 0) { $linkname = $opt['linkname']; if ($linkname == '') { $linkname = 'Download CSV file'; } } else { $targetfile = ''; $renderer->cdata('Failed to write ' . $file . ': Could not create download link.'); return true; } } } // get the first row - it will define the structure $row = $this->csv_explode_row($content, $opt['delim'], $opt['enclosure'], $opt['escape']); $maxcol = count($row); $line = 0; // create the table and start rendering $renderer->table_open($maxcol); while ($row !== false) { // make sure we have enough columns $row = array_pad($row, $maxcol, ''); // render $renderer->tablerow_open(); for ($i = 0; $i < $maxcol;) { $span = 1; // lookahead to find spanning cells if ($opt['span_empty_cols']) { for ($j = $i + 1; $j < $maxcol; $j++) { if ($row[$j] === '') { $span++; } else { break; } } } // open cell if ($line < $opt['hdr_rows'] || $i < $opt['hdr_cols']) { $renderer->tableheader_open($span); } else { $renderer->tablecell_open($span); } // print cell content, call linebreak() for newlines $lines = explode("\n", $row[$i]); $cnt = count($lines); for ($k = 0; $k < $cnt; $k++) { $renderer->cdata($lines[$k]); if ($k < $cnt - 1) { $renderer->linebreak(); } } // close cell if ($line < $opt['hdr_rows'] || $i < $opt['hdr_cols']) { $renderer->tableheader_close(); } else { $renderer->tablecell_close(); } $i += $span; } $renderer->tablerow_close(); // get next row $row = $this->csv_explode_row($content, $opt['delim'], $opt['enclosure'], $opt['escape']); $line++; } $renderer->table_close(); if ($targetfile != '') { $renderer->internalmedia($targetfile, $linkname); } return true; }
/** * @param string $mode Name of the format mode * @param Doku_Renderer $renderer ref to the Doku_Renderer * @param array $params Parameter object returned by handle() */ function renderActivityByUserReport($mode, Doku_Renderer $renderer, $params) { global $CHUNKPROGRESS_STATUS_TAGS; $renderer->table_open(); $renderer->tablerow_open(); $renderer->tablecell_open(); $renderer->strong_open(); $renderer->unformatted("User"); $renderer->strong_close(); $renderer->tablecell_close(); foreach ($CHUNKPROGRESS_STATUS_TAGS as $status) { $renderer->tablecell_open(); $renderer->strong_open(); $renderer->unformatted($status); $renderer->strong_close(); $renderer->tablecell_close(); } $renderer->tablerow_close(); $user_status_count = $params["user_status_count"]; foreach ($user_status_count as $user => $statuses) { $renderer->tablerow_open(); $renderer->tablecell_open(); $renderer->unformatted($user); $renderer->tablecell_close(); foreach ($CHUNKPROGRESS_STATUS_TAGS as $status) { $renderer->tablecell_open(); if (array_key_exists($status, $statuses)) { $renderer->unformatted($statuses[$status]); } $renderer->tablecell_close(); } $renderer->tablerow_close(); } $renderer->table_close(); }
/** * Create table header * * @param array $clist keys of the columns * @param array $data instruction by handler * @param Doku_Renderer $R the current DokuWiki renderer */ function preList($clist, $data, Doku_Renderer $R) { global $ID; global $conf; // Save current request params to not loose them $cur_params = $this->dthlp->_get_current_param(); //show active filters $text = '<div class="table dataaggregation">'; if (isset($_REQUEST['dataflt'])) { $filters = $this->dthlp->_get_filters(); $fltrs = array(); foreach ($filters as $filter) { if (strpos($filter['compare'], 'LIKE') !== false) { if (strpos($filter['compare'], 'NOT') !== false) { $comparator_value = '!~' . str_replace('%', '*', $filter['value']); } else { $comparator_value = '*~' . str_replace('%', '', $filter['value']); } $fltrs[] = $filter['key'] . $comparator_value; } else { $fltrs[] = $filter['key'] . $filter['compare'] . $filter['value']; } } $text .= '<div class="filter">'; $text .= '<h4>' . sprintf($this->getLang('tablefilteredby'), hsc(implode(' & ', $fltrs))) . '</h4>'; $text .= '<div class="resetfilter">' . '<a href="' . wl($ID) . '">' . $this->getLang('tableresetfilter') . '</a>' . '</div>'; $text .= '</div>'; } // build table $text .= '<table class="inline dataplugin_table ' . $data['classes'] . '">'; // build column headers $text .= '<tr>'; if ($data['rownumbers']) { $text .= '<th>#</th>'; } foreach ($data['headers'] as $num => $head) { $ckey = $clist[$num]; $width = ''; if (isset($data['widths'][$num]) and $data['widths'][$num] != '-') { $width = ' style="width: ' . $data['widths'][$num] . ';"'; } $text .= '<th' . $width . '>'; // add sort arrow if (isset($data['sort']) && $ckey == $data['sort'][0]) { if ($data['sort'][1] == 'ASC') { $text .= '<span>↓</span> '; $ckey = '^' . $ckey; } else { $text .= '<span>↑</span> '; } } // Clickable header for dynamic sorting $text .= '<a href="' . wl($ID, array('datasrt' => $ckey) + $cur_params) . '" title="' . $this->getLang('sort') . '">' . hsc($head) . '</a>'; $text .= '</th>'; } $text .= '</tr>'; // Dynamic filters if ($data['dynfilters']) { $text .= '<tr class="dataflt">'; if ($data['rownumbers']) { $text .= '<th></th>'; } foreach ($data['headers'] as $num => $head) { $text .= '<th>'; $form = new Doku_Form(array('method' => 'GET')); $form->_hidden = array(); if (!$conf['userewrite']) { $form->addHidden('id', $ID); } $key = 'dataflt[' . $data['cols'][$clist[$num]]['colname'] . '*~' . ']'; $val = isset($cur_params[$key]) ? $cur_params[$key] : ''; // Add current request params foreach ($cur_params as $c_key => $c_val) { if ($c_val !== '' && $c_key !== $key) { $form->addHidden($c_key, $c_val); } } $form->addElement(form_makeField('text', $key, $val, '')); $text .= $form->getForm(); $text .= '</th>'; } $text .= '</tr>'; } switch ($R->getFormat()) { case 'xhtml': $R->doc .= $text; break; case 'odt': $R->p_close(); $ncols = count($data['headers']); if ($data['rownumbers']) { $ncols += 1; } $R->table_open($ncols); $R->tablerow_open(); if ($data['rownumbers']) { $R->tableheader_open(); $R->tableheader_close(); } foreach ($data['headers'] as $num => $head) { $R->tableheader_open(); $R->doc .= $head; $R->tableheader_close(); } $R->tablerow_close(); break; } }