1ae697e1fSAndreas Gohr<?php 2ae697e1fSAndreas Gohr 3ba766201SAndreas Gohrnamespace dokuwiki\plugin\struct\meta; 4ae697e1fSAndreas Gohr 5ae697e1fSAndreas Gohruse dokuwiki\Form\Form; 6ba766201SAndreas Gohruse dokuwiki\plugin\struct\types\Text; 7ae697e1fSAndreas Gohr 845560cc7SAndreas Gohrif(!defined('JSON_PRETTY_PRINT')) define('JSON_PRETTY_PRINT', 0); // PHP 5.3 compatibility 945560cc7SAndreas Gohr 10ae697e1fSAndreas Gohr/** 11ae697e1fSAndreas Gohr * Class SchemaEditor 12ae697e1fSAndreas Gohr * 13ae697e1fSAndreas Gohr * Provides the editing interface for a given Schema as used in the admin backend. The actual modifying of the 14ae697e1fSAndreas Gohr * schema happens in the SchemaBuilder class. 15ae697e1fSAndreas Gohr * 16ba766201SAndreas Gohr * @package dokuwiki\plugin\struct\meta 17ae697e1fSAndreas Gohr */ 18ae697e1fSAndreas Gohrclass SchemaEditor { 19ae697e1fSAndreas Gohr /** @var Schema the schema that is edited */ 20ae697e1fSAndreas Gohr protected $schema; 21ae697e1fSAndreas Gohr 226af24d3eSAndreas Gohr /** @var \DokuWiki_Plugin */ 236af24d3eSAndreas Gohr protected $hlp; 246af24d3eSAndreas Gohr 25ae697e1fSAndreas Gohr /** 26ae697e1fSAndreas Gohr * SchemaEditor constructor. 27ae697e1fSAndreas Gohr * @param Schema $schema 28ae697e1fSAndreas Gohr */ 29ae697e1fSAndreas Gohr public function __construct(Schema $schema) { 30ae697e1fSAndreas Gohr $this->schema = $schema; 316af24d3eSAndreas Gohr $this->hlp = plugin_load('helper', 'struct_config'); 32ae697e1fSAndreas Gohr } 33ae697e1fSAndreas Gohr 34ae697e1fSAndreas Gohr /** 35ae697e1fSAndreas Gohr * Returns the Admin Form to edit the schema 36ae697e1fSAndreas Gohr * 37ae697e1fSAndreas Gohr * This data is processed by the SchemaBuilder class 38ae697e1fSAndreas Gohr * 39ae697e1fSAndreas Gohr * @return string the HTML for the editor form 40ae697e1fSAndreas Gohr * @see SchemaBuilder 41ae697e1fSAndreas Gohr */ 42ae697e1fSAndreas Gohr public function getEditor() { 435a1eab78SAndreas Gohr $form = new Form(array('method' => 'POST', 'id'=>'plugin__struct_editor')); 44ae697e1fSAndreas Gohr $form->setHiddenField('do', 'admin'); 45dbffe06eSAndreas Gohr $form->setHiddenField('page', 'struct_schemas'); 46ae697e1fSAndreas Gohr $form->setHiddenField('table', $this->schema->getTable()); 47ae697e1fSAndreas Gohr $form->setHiddenField('schema[id]', $this->schema->getId()); 487c080d69SAndreas Gohr $form->setHiddenField('schema[islookup]', $this->schema->isLookup()); 49ae697e1fSAndreas Gohr 50ae697e1fSAndreas Gohr $form->addHTML('<table class="inline">'); 516af24d3eSAndreas Gohr $form->addHTML("<tr> 526af24d3eSAndreas Gohr <th>{$this->hlp->getLang('editor_sort')}</th> 536af24d3eSAndreas Gohr <th>{$this->hlp->getLang('editor_label')}</th> 546af24d3eSAndreas Gohr <th>{$this->hlp->getLang('editor_multi')}</th> 556af24d3eSAndreas Gohr <th>{$this->hlp->getLang('editor_conf')}</th> 566af24d3eSAndreas Gohr <th>{$this->hlp->getLang('editor_type')}</th> 5726147f8cSAndreas Gohr <th>{$this->hlp->getLang('editor_enabled')}</th> 586af24d3eSAndreas Gohr </tr>"); 596af24d3eSAndreas Gohr 60ae697e1fSAndreas Gohr 617fb68f9eSAndreas Gohr foreach($this->schema->getColumns() as $key => $col) { 627fb68f9eSAndreas Gohr $form->addHTML($this->adminColumn($col->getColref(), $col)); 63ae697e1fSAndreas Gohr } 64ae697e1fSAndreas Gohr 65ae697e1fSAndreas Gohr // FIXME new one needs to be added dynamically, this is just for testing 66ae697e1fSAndreas Gohr $form->addHTML($this->adminColumn('new1', new Column($this->schema->getMaxsort()+10, new Text()), 'new')); 67ae697e1fSAndreas Gohr 68ae697e1fSAndreas Gohr $form->addHTML('</table>'); 69*e2c90eebSAndreas Gohr 70*e2c90eebSAndreas Gohr $form->addFieldsetOpen(); 71*e2c90eebSAndreas Gohr $form->addTextInput('schema[editors]', $this->hlp->getLang('editor_editors'))->val($this->schema->getEditors()); 72*e2c90eebSAndreas Gohr $form->addFieldsetClose(); 73*e2c90eebSAndreas Gohr 74*e2c90eebSAndreas Gohr 75ae697e1fSAndreas Gohr $form->addButton('save', 'Save')->attr('type','submit'); 76a57a64a5SAndreas Gohr return $form->toHTML() . $this->initJSONEditor(); 77a57a64a5SAndreas Gohr } 78a57a64a5SAndreas Gohr 79a57a64a5SAndreas Gohr /** 80a57a64a5SAndreas Gohr * Gives the code to attach the JSON editor to the config field 81a57a64a5SAndreas Gohr * 82a57a64a5SAndreas Gohr * We do not use the "normal" way, because this is rarely used code and there's no need to always load it. 83a57a64a5SAndreas Gohr * @return string 84a57a64a5SAndreas Gohr */ 85a57a64a5SAndreas Gohr protected function initJSONEditor() { 86a57a64a5SAndreas Gohr $html = ''; 87a57a64a5SAndreas Gohr $html .= '<link href="'.DOKU_BASE.'lib/plugins/struct/jsoneditor/jsoneditor.min.css" rel="stylesheet" type="text/css">'; 88a57a64a5SAndreas Gohr $html .= '<link href="'.DOKU_BASE.'lib/plugins/struct/jsoneditor/setup.css" rel="stylesheet" type="text/css">'; 89a57a64a5SAndreas Gohr $html .= '<script src="'.DOKU_BASE.'lib/plugins/struct/jsoneditor/jsoneditor-minimalist.min.js"></script>'; 90a57a64a5SAndreas Gohr $html .= '<script src="'.DOKU_BASE.'lib/plugins/struct/jsoneditor/setup.js"></script>'; 91a57a64a5SAndreas Gohr return $html; 92ae697e1fSAndreas Gohr } 93ae697e1fSAndreas Gohr 94ae697e1fSAndreas Gohr /** 95ae697e1fSAndreas Gohr * Returns the HTML to edit a single column definition of the schema 96ae697e1fSAndreas Gohr * 97ae697e1fSAndreas Gohr * @param string $column_id 98ae697e1fSAndreas Gohr * @param Column $col 99ae697e1fSAndreas Gohr * @param string $key The key to use in the form 100ae697e1fSAndreas Gohr * @return string 101ae697e1fSAndreas Gohr * @todo this should probably be reused for adding new columns via AJAX later? 102ae697e1fSAndreas Gohr */ 103ae697e1fSAndreas Gohr protected function adminColumn($column_id, Column $col, $key='cols') { 104ae697e1fSAndreas Gohr $base = 'schema['.$key.'][' . $column_id . ']'; // base name for all fields 105ae697e1fSAndreas Gohr 106fd81b928SAndreas Gohr $class = $col->isEnabled() ? '' : 'disabled'; 107ae697e1fSAndreas Gohr 108fd81b928SAndreas Gohr $html = "<tr class=\"$class\">"; 109fd81b928SAndreas Gohr 110fd81b928SAndreas Gohr $html .= '<td class="sort">'; 111ae697e1fSAndreas Gohr $html .= '<input type="text" name="' . $base . '[sort]" value="' . hsc($col->getSort()) . '" size="3">'; 112ae697e1fSAndreas Gohr $html .= '</td>'; 113ae697e1fSAndreas Gohr 114fd81b928SAndreas Gohr $html .= '<td class="label">'; 115ae697e1fSAndreas Gohr $html .= '<input type="text" name="' . $base . '[label]" value="' . hsc($col->getType()->getLabel()) . '">'; 116ae697e1fSAndreas Gohr $html .= '</td>'; 117ae697e1fSAndreas Gohr 118fd81b928SAndreas Gohr $html .= '<td class="ismulti">'; 119ae697e1fSAndreas Gohr $checked = $col->getType()->isMulti() ? 'checked="checked"' : ''; 120ae697e1fSAndreas Gohr $html .= '<input type="checkbox" name="' . $base . '[ismulti]" value="1" ' . $checked . '>'; 121ae697e1fSAndreas Gohr $html .= '</td>'; 122ae697e1fSAndreas Gohr 123fd81b928SAndreas Gohr $html .= '<td class="config">'; 124ae697e1fSAndreas Gohr $config = json_encode($col->getType()->getConfig(), JSON_PRETTY_PRINT); 125a57a64a5SAndreas Gohr $html .= '<textarea name="' . $base . '[config]" cols="45" rows="10" class="config">' . hsc($config) . '</textarea>'; 126ae697e1fSAndreas Gohr $html .= '</td>'; 127ae697e1fSAndreas Gohr 128ae697e1fSAndreas Gohr $types = Column::allTypes(); 129fd81b928SAndreas Gohr $html .= '<td class="class">'; 130ae697e1fSAndreas Gohr $html .= '<select name="' . $base . '[class]">'; 131ae697e1fSAndreas Gohr foreach($types as $type) { 132ae697e1fSAndreas Gohr $selected = ($col->getType()->getClass() == $type) ? 'selected="selected"' : ''; 133ae697e1fSAndreas Gohr $html .= '<option value="' . hsc($type) . '" ' . $selected . '>' . hsc($type) . '</option>'; 134ae697e1fSAndreas Gohr } 135ae697e1fSAndreas Gohr $html .= '</select>'; 136ae697e1fSAndreas Gohr $html .= '</td>'; 137ae697e1fSAndreas Gohr 13826147f8cSAndreas Gohr 139fd81b928SAndreas Gohr $html .= '<td class="isenabled">'; 14026147f8cSAndreas Gohr $checked = $col->isEnabled() ? 'checked="checked"' : ''; 14126147f8cSAndreas Gohr $html .= '<input type="checkbox" name="' . $base . '[isenabled]" value="1" ' . $checked . '>'; 14226147f8cSAndreas Gohr $html .= '</td>'; 14326147f8cSAndreas Gohr 144ae697e1fSAndreas Gohr $html .= '</tr>'; 145ae697e1fSAndreas Gohr 146ae697e1fSAndreas Gohr return $html; 147ae697e1fSAndreas Gohr } 148ae697e1fSAndreas Gohr 149ae697e1fSAndreas Gohr} 150