1b36f8833SAndreas Gohr<?php 2b36f8833SAndreas Gohr/** 3b36f8833SAndreas Gohr * DokuWiki Plugin struct (Helper Component) 4b36f8833SAndreas Gohr * 5b36f8833SAndreas Gohr * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html 6b36f8833SAndreas Gohr * @author Andreas Gohr, Michael Große <dokuwiki@cosmocode.de> 7b36f8833SAndreas Gohr */ 8b36f8833SAndreas Gohr 9b36f8833SAndreas Gohr// must be run within Dokuwiki 10935a9fa3SMichael Großeuse dokuwiki\plugin\struct\meta\ConfigParser; 11935a9fa3SMichael Großeuse dokuwiki\plugin\struct\meta\SearchConfig; 12ba766201SAndreas Gohruse dokuwiki\plugin\struct\meta\StructException; 13b36f8833SAndreas Gohr 14b36f8833SAndreas Gohrif(!defined('DOKU_INC')) die(); 15b36f8833SAndreas Gohr 16b36f8833SAndreas Gohr 17b36f8833SAndreas Gohrclass remote_plugin_struct extends DokuWiki_Remote_Plugin { 18b36f8833SAndreas Gohr /** @var helper_plugin_struct hlp */ 19b36f8833SAndreas Gohr protected $hlp; 20b36f8833SAndreas Gohr 21b36f8833SAndreas Gohr /** 22b36f8833SAndreas Gohr * remote_plugin_struct constructor. 23b36f8833SAndreas Gohr */ 24b36f8833SAndreas Gohr public function __construct() { 25b36f8833SAndreas Gohr parent::__construct(); 26b36f8833SAndreas Gohr 27b36f8833SAndreas Gohr /** @var helper_plugin_struct hlp */ 28b36f8833SAndreas Gohr $this->hlp = plugin_load('helper', 'struct'); 29b36f8833SAndreas Gohr } 30b36f8833SAndreas Gohr 31b36f8833SAndreas Gohr /** 32b36f8833SAndreas Gohr * Get the structured data of a given page 33b36f8833SAndreas Gohr * 34b36f8833SAndreas Gohr * @param string $page The page to get data for 35b36f8833SAndreas Gohr * @param string $schema The schema to use empty for all 36b36f8833SAndreas Gohr * @param int $time A timestamp if you want historic data (0 for now) 37b36f8833SAndreas Gohr * @return array ('schema' => ( 'fieldlabel' => 'value', ...)) 38b36f8833SAndreas Gohr * @throws RemoteAccessDeniedException 39b36f8833SAndreas Gohr * @throws RemoteException 40b36f8833SAndreas Gohr */ 41b36f8833SAndreas Gohr public function getData($page, $schema, $time) { 42b36f8833SAndreas Gohr $page = cleanID($page); 43b36f8833SAndreas Gohr 4499d15ae8SEnno Lohmeier if(auth_quickaclcheck($page) < AUTH_READ) { 45b36f8833SAndreas Gohr throw new RemoteAccessDeniedException('no permissions to access data of that page'); 46b36f8833SAndreas Gohr } 47b36f8833SAndreas Gohr 48b36f8833SAndreas Gohr if(!$schema) $schema = null; 49b36f8833SAndreas Gohr 50b36f8833SAndreas Gohr try { 51b36f8833SAndreas Gohr return $this->hlp->getData($page, $schema, $time); 52b36f8833SAndreas Gohr } catch (StructException $e) { 53b36f8833SAndreas Gohr throw new RemoteException($e->getMessage(), 0, $e); 54b36f8833SAndreas Gohr } 55b36f8833SAndreas Gohr } 56b36f8833SAndreas Gohr 57b36f8833SAndreas Gohr 58b36f8833SAndreas Gohr /** 59b36f8833SAndreas Gohr * Saves data for a given page (creates a new revision) 60b36f8833SAndreas Gohr * 61b36f8833SAndreas Gohr * If this call succeeds you can assume your data has either been saved or it was 62b36f8833SAndreas Gohr * not necessary to save it because the data already existed in the wanted form or 63b36f8833SAndreas Gohr * the given schemas are no longer assigned to that page. 64b36f8833SAndreas Gohr * 65b36f8833SAndreas Gohr * @param string $page 66b36f8833SAndreas Gohr * @param array $data ('schema' => ( 'fieldlabel' => 'value', ...)) 67b36f8833SAndreas Gohr * @param string $summary 68*178d3992SElan Ruusamäe * @param bool $minor 69b36f8833SAndreas Gohr * @return bool returns always true 70b36f8833SAndreas Gohr * @throws RemoteAccessDeniedException 71b36f8833SAndreas Gohr * @throws RemoteException 72b36f8833SAndreas Gohr */ 73*178d3992SElan Ruusamäe public function saveData($page, $data, $summary, $minor = false) { 74b36f8833SAndreas Gohr $page = cleanID($page); 75b36f8833SAndreas Gohr 7699d15ae8SEnno Lohmeier if(auth_quickaclcheck($page) < AUTH_EDIT) { 77b36f8833SAndreas Gohr throw new RemoteAccessDeniedException('no permissions to save data for that page'); 78b36f8833SAndreas Gohr } 79b36f8833SAndreas Gohr 80b36f8833SAndreas Gohr try { 81*178d3992SElan Ruusamäe $this->hlp->saveData($page, $data, $summary, $minor); 82b36f8833SAndreas Gohr return true; 83b36f8833SAndreas Gohr } catch (StructException $e) { 84b36f8833SAndreas Gohr throw new RemoteException($e->getMessage(), 0, $e); 85b36f8833SAndreas Gohr } 86b36f8833SAndreas Gohr } 87b36f8833SAndreas Gohr 88b36f8833SAndreas Gohr /** 89b36f8833SAndreas Gohr * Get info about existing schemas columns 90b36f8833SAndreas Gohr * 91b36f8833SAndreas Gohr * Returns only current, enabled columns 92b36f8833SAndreas Gohr * 93b36f8833SAndreas Gohr * @param string $schema the schema to query, empty for all 94b36f8833SAndreas Gohr * @return array 95b36f8833SAndreas Gohr * @throws RemoteAccessDeniedException 96b36f8833SAndreas Gohr * @throws RemoteException 97b36f8833SAndreas Gohr */ 98b36f8833SAndreas Gohr public function getSchema($schema) { 99b36f8833SAndreas Gohr if(!auth_ismanager()) { 100b36f8833SAndreas Gohr throw new RemoteAccessDeniedException('you need to be manager to access schema info'); 101b36f8833SAndreas Gohr } 102b36f8833SAndreas Gohr 103b36f8833SAndreas Gohr if(!$schema) $schema = null; 104b36f8833SAndreas Gohr try { 105b36f8833SAndreas Gohr $result = array(); 106b36f8833SAndreas Gohr $schemas = $this->hlp->getSchema($schema); 107b36f8833SAndreas Gohr foreach($schemas as $name => $schema) { 108b36f8833SAndreas Gohr $result[$name] = array(); 109b36f8833SAndreas Gohr foreach ($schema->getColumns(false) as $column) { 110b36f8833SAndreas Gohr $result[$name][] = array( 111b36f8833SAndreas Gohr 'name' => $column->getLabel(), 112b36f8833SAndreas Gohr 'type' => array_pop(explode('\\', get_class($column->getType()))), 113b36f8833SAndreas Gohr 'ismulti' => $column->isMulti() 114b36f8833SAndreas Gohr ); 115b36f8833SAndreas Gohr } 116b36f8833SAndreas Gohr } 117b36f8833SAndreas Gohr return $result; 118b36f8833SAndreas Gohr } catch (StructException $e) { 119b36f8833SAndreas Gohr throw new RemoteException($e->getMessage(), 0, $e); 120b36f8833SAndreas Gohr } 121b36f8833SAndreas Gohr } 122935a9fa3SMichael Große 123935a9fa3SMichael Große /** 124935a9fa3SMichael Große * Get the data that would be shown in an aggregation 125935a9fa3SMichael Große * 126935a9fa3SMichael Große * @param array $schemas array of strings with the schema-names 127935a9fa3SMichael Große * @param array $cols array of strings with the columns 128935a9fa3SMichael Große * @param array $filter array of arrays with ['logic'=> 'and'|'or', 'condition' => 'your condition'] 129935a9fa3SMichael Große * @param string $sort string indicating the column to sort by 130935a9fa3SMichael Große * 131935a9fa3SMichael Große * @return array array of rows, each row is an array of the column values 132935a9fa3SMichael Große * @throws RemoteException 133935a9fa3SMichael Große */ 134935a9fa3SMichael Große public function getAggregationData(array $schemas, array $cols, array $filter = [], $sort = '') { 135935a9fa3SMichael Große $schemaLine = 'schema: ' . implode(', ', $schemas); 136935a9fa3SMichael Große $columnLine = 'cols: ' . implode(', ', $cols); 137935a9fa3SMichael Große $filterLines = array_map(function ($filter) { 138935a9fa3SMichael Große return 'filter' . $filter['logic'] . ': ' . $filter['condition']; 139935a9fa3SMichael Große }, $filter); 140935a9fa3SMichael Große $sortLine = 'sort: ' . $sort; 141935a9fa3SMichael Große // schemas, cols, REV?, filter, order 142935a9fa3SMichael Große 143935a9fa3SMichael Große try { 144935a9fa3SMichael Große $parser = new ConfigParser(array_merge([$schemaLine, $columnLine, $sortLine], $filterLines)); 145935a9fa3SMichael Große $config = $parser->getConfig(); 146935a9fa3SMichael Große $search = new SearchConfig($config); 147935a9fa3SMichael Große $results = $search->execute(); 148935a9fa3SMichael Große $data = []; 149935a9fa3SMichael Große /** @var \dokuwiki\plugin\struct\meta\Value[] $rowValues */ 150935a9fa3SMichael Große foreach ($results as $rowValues) { 151935a9fa3SMichael Große $row = []; 152935a9fa3SMichael Große foreach ($rowValues as $value) { 153935a9fa3SMichael Große $row[$value->getColumn()->getFullQualifiedLabel()] = $value->getDisplayValue(); 154935a9fa3SMichael Große } 155935a9fa3SMichael Große $data[] = $row; 156935a9fa3SMichael Große } 157935a9fa3SMichael Große return $data; 158935a9fa3SMichael Große } catch (StructException $e) { 159935a9fa3SMichael Große throw new RemoteException($e->getMessage(), 0, $e); 160935a9fa3SMichael Große } 161935a9fa3SMichael Große } 162b36f8833SAndreas Gohr} 163