/** * Adds the structured data to the page body to be snippeted * * @param Doku_Event $event event object by reference * @param mixed $param [the parameters passed as fifth argument to register_hook() when this * handler was registered] * @return bool */ public function handle_snippets(Doku_Event $event, $param) { $id = $event->data['id']; $assignments = new Assignments(); $tables = $assignments->getPageAssignments($id); if (!$tables) { return; } foreach ($tables as $table) { $schemadata = AccessTable::byTableName($table, $id, 0); $event->data['text'] .= $schemadata->getDataPseudoSyntax(); } }
/** * Get the structured data of a given page * * @param string $page The page to get data for * @param string|null $schema The schema to use null for all * @param int $time A timestamp if you want historic data (0 for now) * @return array ('schema' => ( 'fieldlabel' => 'value', ...)) * @throws StructException */ public function getData($page, $schema = null, $time = 0) { $page = cleanID($page); if (is_null($schema)) { $assignments = new Assignments(); $schemas = $assignments->getPageAssignments($page, false); } else { $schemas = array($schema); } $result = array(); foreach ($schemas as $schema) { $schemaData = AccessTable::byTableName($schema, $page, $time); $result[$schema] = $schemaData->getDataArray(); } return $result; }
/** * Enhance the editing form with structural data editing * * @param Doku_Event $event event object by reference * @param mixed $param [the parameters passed as fifth argument to register_hook() when this * handler was registered] * @return bool */ public function handle_editform(Doku_Event $event, $param) { global $ID; $assignments = new Assignments(); $tables = $assignments->getPageAssignments($ID); $html = ''; foreach ($tables as $table) { $html .= $this->createForm($table); } /** @var Doku_Form $form */ $form = $event->data; $html = "<div class=\"struct_entry_form\">{$html}</div>"; $pos = $form->findElementById('wiki__editbar'); // insert the form before the main buttons $form->insertElement($pos, $html); return true; }
/** * Save the data, by loading it from the old revision and storing it as a new revision * * @param Doku_Event $event event object by reference * @param mixed $param [the parameters passed as fifth argument to register_hook() when this * handler was registered] * @return bool */ public function handle_pagesave_after(Doku_Event $event, $param) { global $ACT; global $REV; if ($ACT != 'revert' || !$REV) { return false; } $assignments = new Assignments(); // we load the data to restore from DB: $tosave = $assignments->getPageAssignments($event->data['id']); foreach ($tosave as $table) { $accessOld = AccessTable::byTableName($table, $event->data['id'], $REV); $accessNew = AccessTable::byTableName($table, $event->data['id'], $event->data['newRevision']); $accessNew->saveData($accessOld->getDataArray()); // make sure this schema is assigned $assignments->assignPageSchema($event->data['id'], $table); } return true; }
/** * Add structured data to the diff * * This is done by adding pseudo syntax to the page source when it is loaded in diff context * * @param Doku_Event $event event object by reference * @param mixed $param [the parameters passed as fifth argument to register_hook() when this * handler was registered] * @return bool */ public function handle_diffload(Doku_Event $event, $param) { global $ACT; global $INFO; if ($ACT != 'diff') { return; } $id = $event->data[2]; $rev = $event->data[3]; if ($INFO['id'] != $id) { return; } $assignments = new Assignments(); $tables = $assignments->getPageAssignments($id); if (!$tables) { return; } $event->result .= "\n---- struct data ----\n"; foreach ($tables as $table) { $schemadata = AccessTable::byTableName($table, $id, $rev); $event->result .= $schemadata->getDataPseudoSyntax(); } $event->result .= "----\n"; }
/** * Save the struct data * * @param Doku_Event $event event object by reference * @param mixed $param [the parameters passed as fifth argument to register_hook() when this * handler was registered] * @return bool */ public function handle_save(Doku_Event $event, $param) { // get all struct values and their associated schemas $tosave = array(); foreach ($event->data['fields'] as $field) { if (!is_a($field, 'helper_plugin_struct_field')) { continue; } /** @var helper_plugin_struct_field $field */ $tbl = $field->column->getTable(); $lbl = $field->column->getLabel(); if (!isset($tosave[$tbl])) { $tosave[$tbl] = array(); } $tosave[$tbl][$lbl] = $field->getParam('value'); } // save all the struct data of assigned schemas $id = $event->data['id']; $time = filemtime(wikiFN($id)); $assignments = new Assignments(); $assigned = $assignments->getPageAssignments($id); foreach ($tosave as $table => $data) { if (!in_array($table, $assigned)) { continue; } $access = AccessTable::byTableName($table, $id, $time); $validator = $access->getValidator($data); if ($validator->validate()) { $validator->saveData($time); } } return true; }
/** * 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; }
/** * Save the data * * When this is called, INPUT data has been validated already. * * @param Doku_Event $event event object by reference * @param mixed $param [the parameters passed as fifth argument to register_hook() when this * handler was registered] * @return bool */ public function handle_pagesave_after(Doku_Event $event, $param) { global $ACT; if ($ACT == 'revert') { return false; } // handled in revert $assignments = new Assignments(); if ($event->data['changeType'] == DOKU_CHANGE_TYPE_DELETE && empty($GLOBALS['PLUGIN_MOVE_WORKING'])) { // clear all data on delete unless it's a move operation $tables = $assignments->getPageAssignments($event->data['id']); foreach ($tables as $table) { $schemaData = AccessTable::byTableName($table, $event->data['id'], time()); if ($schemaData->getSchema()->isEditable()) { $schemaData->clearData(); } } } else { // save the provided data if ($this->tosave) { foreach ($this->tosave as $validation) { if ($validation->getAccessTable()->getSchema()->isEditable()) { $validation->saveData($event->data['newRevision']); // make sure this schema is assigned $assignments->assignPageSchema($event->data['id'], $validation->getAccessTable()->getSchema()->getTable()); } } } } return true; }