* 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(); * } * * @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~' . tra('Plugin ') . $this->getName() . ' ' . tra('failed') . ' : ' . tra($message) . '~/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 .= '' . tra('Required parameters are in bold') . '
'; } // Header for info $sOutput .= '' . "\n\t" . '' . "\n\t\t" . ''; foreach ($aInfo as $iInfo => $sHeader) { if ($sHeader == 'paraminfo') { $sHeader = tra('Parameter Info'); } else if ($sHeader == 'sourcecode') { $sHeader = tra('Source Code'); } $sOutput .= "\n\t\t" . ''; } $sOutput .= "\n\t" . ''; } $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" . '' . "\n\t\t" . ''; $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" . ''; $endrow = "\n\t" . ''; } else { $begrow = ''; if ($colcounter == $iNumCol && strpos($sInfokey, 'rowspan') === false) { $endrow = "\n\t" . ''; } else { $endrow = ''; } } //Ignore field added to hold rowspan if (strpos($sInfokey, 'rowspan') !== false) { $sOutput .= ''; } else { $sOutput .= $begrow . "\n\t\t" . ''; if (in_array('paraminfo', $aInfo) && $sInfo == 'parameters') { $sOutput .= "\n\t\t" . ''; } } $sOutput .= $endrow; $i--; } $colcounter++; } else { $sOutput .= "\n\t\t" . ''; if ($colcounter == $iNumCol) { $sOutput .= "\n\t" . ''; } $colcounter++; } } } } $iCounter++; } if ($aInfo) { $sOutput .= '
' . tra($aPrincipalField['name']) . '' . ucfirst(tra($sHeader)) . '
' . $openlink . $fieldval . $closelink . '
'; if (strpos($sInfokey, 'onekey') !== false) { $sOutput .= $sInfoitem; } else { $sOutput .= $sInfokey; } $sOutput .= ''; if (count($aPage['parameters']) > 0) { $sOutput .= $sInfoitem; } $sOutput .= '' . $aPage[$sInfo] . '
'; } return $sOutput; } public static function createList($aData) { $aPrincipalField = ['field' => 'pageName', 'name' => 'Pages']; // Header for info $sOutput = '
' . tra($aPrincipalField['name']) . '
'; $iCounter = 0; // create a comma-separated list of entries foreach ($aData as $aPage) { if ($iCounter > 0) { $sOutput .= ', '; } $sOutput .= '((' . $aPage[$aPrincipalField['field']] . '))'; $iCounter++; } $sOutput .= '
'; 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(); } }