/**
  * 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;
 }
Esempio n. 3
0
 /**
  * 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;
 }
Esempio n. 5
0
 /**
  * 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;
 }
Esempio n. 8
0
 /**
  * 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;
 }