/lib/wiki/pluginslib.php
PHP | 380 lines | 250 code | 23 blank | 107 comment | 59 complexity | ff7756f23b582ebbbb2c506a2d9fb53a MD5 | raw file
- <?php
- // (c) Copyright by authors of the Tiki Wiki CMS Groupware Project
- //
- // All Rights Reserved. See copyright.txt for details and a complete list of authors.
- // Licensed under the GNU LESSER GENERAL PUBLIC LICENSE. See license.txt for details.
- // $Id$
- /**
- * Plugin Lib
- *
- * A port of PhpWiki WikiPlugin class
- * Principal use is port PhpWiki plugins, but can be used to make new ones.
- * Use:
- * - Extends PluginsLib with your class
- * - add the lines
- * <code>
- * include "pluginslib.php";
- *
- * function wikiplugin_backlinks($data, $params) {
- * $plugin = new BackLinks();
- * return $plugin->run($data, $params);
- * }
- * function wikiplugin_backlinks_help() {
- * $plugin = new BackLinks();
- * return $plugin->getDescription();
- * } * </code>
- * @package Tiki
- * @subpackage Plugins
- * @author Claudio Bustos
- * @version $Revision: 1.12 $
- */
- //this script may only be included - so its better to die if called directly.
- if (strpos($_SERVER['SCRIPT_NAME'], basename(__FILE__)) !== false) {
- header('location: index.php');
- exit;
- }
- class PluginsLib extends TikiLib
- {
- public $_errors;
- public $_data;
- public $_params;
- /**
- * Array of params to be expanded as arrays. Explode the string with {@link $separator}
- * @var array
- */
- public $expanded_params = [];
- /**
- * Separator used to explote params listed on {@link $expanded_params}
- * @var string
- */
- public $separator = "|";
- /**
- * List of fields retrieved from {@link TikiLib::list_pages()}
- * Keys are the name of the fields and values the names for tra();
- * @var array
- */
- public $aInfoPresetNames = [
- 'hits' => 'Hits', 'lastModif' => 'Last mod', 'user' => 'Last author', 'len' => 'Size', 'comment' => 'Com',
- 'creator' => 'Creator', 'version' => 'Last ver', 'flag' => 'Status', 'versions' => 'Vers', 'links' => 'Links',
- 'backlinks' => 'Backlinks'];
- /**
- * Process the params, in this order:
- * - default values, asigned on {@link PluginsLib::getDefaultArguments()}
- * - request values, sended by GET or POST method, if $request is put to true
- * - explicit values, asigned on the Wiki
- * @param array sended to wikiplugin_name($data, $params)
- * @param bool if set to true, accept values from $_REQUEST
- * @param bool if set to true, assign default values from {@link PluginsLib::getDefaultArguments()}
- * @return array list of params
- */
- public function getParams($params, $request = false, $defaults = false)
- {
- if ($defaults === false) {
- $defaults = $this->getDefaultArguments();
- }
- $args = [];
- foreach ($defaults as $arg => $default_val) {
- if (isset($params[$arg])) {
- $args[$arg] = $params[$arg];
- } elseif (isset($_REQUEST[$arg])) {
- $args[$arg] = $_REQUEST[$arg];
- } elseif (isset($_REQUEST['page'])) {
- // maybe this kind of transformation can be grouped on a external function
- if ($default_val === '[pagename]') {
- $default_val = $_REQUEST['page'];
- }
- $args[$arg] = $default_val;
- }
- if (in_array($arg, $this->expanded_params) && ! (isset($args[$arg]) && is_array($args[$arg]))) {
- if (isset($args[$arg]) && $args[$arg]) {
- $args[$arg] = explode($this->separator, $args[$arg]);
- foreach ($args[$arg] as $id => $value) {
- $args[$arg][$id] = trim($value);
- }
- } else {
- $args[$arg] = [];
- }
- }
- }
- return $args;
- }
- /**
- * Returns the name of the Plugin
- * By default, erase the first 'WikiPlugin'
- * Made for overload it.
- * @return string
- */
- public function getName()
- {
- return preg_replace('/^WikiPlugin/', '', get_class($this));
- }
- /**
- * Returns a description of the Plugin
- * Made for overload it.
- * @return string
- */
- public function getDescription()
- {
- return $this->getName();
- }
- /**
- * Returns the version of the version
- * Made for overload it.
- * @return string
- */
- public function getVersion()
- {
- return tra('No version indicated');
- //return preg_replace("/[Revision: $]/", '',
- // "\$Revision: 1.12 $");
- }
- /**
- * Returns the default arguments for the plugin
- * Use keys as the arguments and values as ... the default values
- * @return array
- */
- public function getDefaultArguments()
- {
- return ['description' => $this->getDescription()];
- }
- /**
- * Run the plugin
- * For sake of God, overload it!
- * @param string
- * @param array
- */
- public function run($data, $params)
- {
- /**
- * UGLY ERROR!.
- */
- return $this->error('PluginsLib::run: pure virtual function. Don\'t be so lazy!');
- }
- public function error($message)
- {
- return '~np~<span class="warn">' . tra('Plugin ') . $this->getName() . ' ' . tra('failed')
- . ' : ' . tra($message) . '</span>~/np~';
- }
- public function getErrorDetail()
- {
- return $this->_errors;
- }
- public function _error($message)
- {
- $this->_errors = $message;
- return false;
- }
- }
- /**
- * Class with utilities for Plugins
- */
- class PluginsLibUtil
- {
- /**
- * Create a table with information from pages
- * @param array key ["data"] from one of the functions that retrieve informaci�n about pages
- * @param array list of keys to show.
- * @param array definition of the principal field. By default:
- * array("field"=>"pageName","name"=>"Page")
- * @return string
- */
- public static function createTable($aData, $aInfo = false, $aPrincipalField = false)
- {
- // contract
- if (! $aPrincipalField or ! is_array($aPrincipalField)) {
- $aPrincipalField = ['field' => 'pageName', 'name' => 'Page'];
- }
- if (! is_array($aInfo)) {
- $aInfo = false;
- }
- // ~contract
- $sOutput = '';
- if ($aInfo) {
- $iNumCol = count($aInfo) + 1;
- $sStyle = '';
- if (in_array('parameters', $aInfo)) {
- $sOutput .= '<em>' . tra('Required parameters are in</em> <b>bold</b>') . '<br />';
- }
- // Header for info
- $sOutput .= '<table class="table table-striped table-hover">' . "\n\t" . '<tr>' . "\n\t\t"
- . '<td class="heading"' . $sStyle . '>' . tra($aPrincipalField['name']) . '</td>';
- foreach ($aInfo as $iInfo => $sHeader) {
- if ($sHeader == 'paraminfo') {
- $sHeader = tra('Parameter Info');
- } else if ($sHeader == 'sourcecode') {
- $sHeader = tra('Source Code');
- }
- $sOutput .= "\n\t\t" . '<th class="heading"' . $sStyle . '>' . ucfirst(tra($sHeader)) . '</th>';
- }
- $sOutput .= "\n\t" . '</tr>';
- }
- $iCounter = 1;
- //Primary row
- foreach ($aData as $aPage) {
- $rowspan = '';
- if ($aPrincipalField['field'] == 'plugin') {
- $openlink = '';
- $closelink = '';
- } else {
- $openlink = '((';
- $closelink = '))';
- }
- if (! $aInfo) {
- $sOutput .= '*' . $openlink . $aPage[$aPrincipalField['field']] . $closelink . "\n";
- //First column
- } elseif (isset($aPage[$aPrincipalField['field']])) {
- if (is_array($aPage[$aPrincipalField['field']])) {
- $fieldval = $aPage[$aPrincipalField['field']][$aPrincipalField['field']];
- if (isset($aPage[$aPrincipalField['field']]['rowspan']) && $aPage[$aPrincipalField['field']]['rowspan'] != 0) {
- $rowspan = ' rowspan="' . $aPage[$aPrincipalField['field']]['rowspan'] . '" ';
- } else {
- $rowspan = '';
- }
- } else {
- $fieldval = $aPage[$aPrincipalField['field']];
- $rowspan = '';
- }
- $sClass = ($iCounter % 2) ? 'odd' : 'even';
- $sOutput .= "\n\t" . '<tr>' . "\n\t\t" . '<td class="' . $sClass . '"' . $rowspan . '>'
- . $openlink . $fieldval . $closelink . '</td>';
- $colcounter = 2;
- //Subsequent columns
- foreach ($aInfo as $sInfo) {
- if (isset($aPage[$sInfo])) {
- if (is_array($aPage[$sInfo])) {
- $rowspan2 = '';
- if (isset($aPage[$sInfo]['rowspan']) && $aPage[$sInfo]['rowspan'] > 0) {
- $rowspan2 = ' rowspan="' . $aPage[$sInfo]['rowspan'] . '" ';
- $pcount = count($aPage[$sInfo]) - 1;
- } else {
- $pcount = count($aPage[$sInfo]);
- }
- $i = $pcount;
- foreach ($aPage[$sInfo] as $sInfokey => $sInfoitem) {
- //Potential sub-rows
- if ($i < $pcount && strpos($sInfokey, 'rowspan') === false) {
- $begrow = "\n\t" . '<tr>';
- $endrow = "\n\t" . '</tr>';
- } else {
- $begrow = '';
- if ($colcounter == $iNumCol && strpos($sInfokey, 'rowspan') === false) {
- $endrow = "\n\t" . '</tr>';
- } else {
- $endrow = '';
- }
- }
- //Ignore field added to hold rowspan
- if (strpos($sInfokey, 'rowspan') !== false) {
- $sOutput .= '';
- } else {
- $sOutput .= $begrow . "\n\t\t" . '<td class="' . $sClass . '"' . $rowspan2 . '>';
- if (strpos($sInfokey, 'onekey') !== false) {
- $sOutput .= $sInfoitem;
- } else {
- $sOutput .= $sInfokey;
- }
- $sOutput .= '</td>';
- if (in_array('paraminfo', $aInfo) && $sInfo == 'parameters') {
- $sOutput .= "\n\t\t" . '<td class="' . $sClass . '">';
- if (count($aPage['parameters']) > 0) {
- $sOutput .= $sInfoitem;
- }
- $sOutput .= '</td>';
- }
- }
- $sOutput .= $endrow;
- $i--;
- }
- $colcounter++;
- } else {
- $sOutput .= "\n\t\t" . '<td class="' . $sClass . '">' . $aPage[$sInfo] . '</td>';
- if ($colcounter == $iNumCol) {
- $sOutput .= "\n\t" . '</tr>';
- }
- $colcounter++;
- }
- }
- }
- }
- $iCounter++;
- }
- if ($aInfo) {
- $sOutput .= '</table>';
- }
- return $sOutput;
- }
- public static function createList($aData)
- {
- $aPrincipalField = ['field' => 'pageName', 'name' => 'Pages'];
- // Header for info
- $sOutput = '<table class="table table-striped table-hover"><tr><th class="heading">'
- . tra($aPrincipalField['name']) . '</th></tr><tr><td>';
- $iCounter = 0;
- // create a comma-separated list of entries
- foreach ($aData as $aPage) {
- if ($iCounter > 0) {
- $sOutput .= ', ';
- }
- $sOutput .= '((' . $aPage[$aPrincipalField['field']] . '))';
- $iCounter++;
- }
- $sOutput .= '</td></tr></table>';
- return $sOutput;
- }
- public static function handleDownload($query, $index, $matches, $request = null)
- {
- if (empty($request)) {
- $request = $_REQUEST;
- }
- if (empty($request['download'])) {
- return;
- }
- $builder = new Search_Formatter_Builder();
- $builder->setDownload(true);
- $builder->apply($matches);
- $filename = $builder->getDownloadName();
- if (! $filename) {
- $filename = 'report.csv';
- }
- $formatter = $builder->getFormatter();
- $offset = 0;
- $output = '';
- do {
- $query->setRange($offset, 100);
- $result = $query->search($index);
- $chunk = $formatter->format($result);
- if ($offset > 0) {
- $chunk = substr($chunk, strpos($chunk, "\n") + 1);
- }
- $output .= $chunk;
- $offset += 100;
- } while ($offset < $result->count());
- header('Content-Type: text/csv; charset=utf8');
- header("Content-Disposition: attachment; filename=$filename");
- echo $output;
- exit();
- }
- }