xref: /plugin/struct/action/edit.php (revision 93ca6f4f4326051070b84b0a5019072b884cd2c5)
1<?php
2/**
3 * DokuWiki Plugin struct (Action Component)
4 *
5 * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html
6 * @author  Andreas Gohr, Michael Große <dokuwiki@cosmocode.de>
7 */
8
9// must be run within Dokuwiki
10if(!defined('DOKU_INC')) die();
11
12use dokuwiki\plugin\struct\meta\AccessTable;
13use dokuwiki\plugin\struct\meta\Assignments;
14use dokuwiki\plugin\struct\meta\Value;
15
16/**
17 * Class action_plugin_struct_entry
18 *
19 * Handles adding struct forms to the default editor
20 */
21class action_plugin_struct_edit extends DokuWiki_Action_Plugin {
22
23    /**
24     * @var string The form name we use to transfer schema data
25     */
26    protected static $VAR = 'struct_schema_data';
27
28    /**
29     * Registers a callback function for a given event
30     *
31     * @param Doku_Event_Handler $controller DokuWiki's event controller object
32     * @return void
33     */
34    public function register(Doku_Event_Handler $controller) {
35        // add the struct editor to the edit form;
36        $controller->register_hook('HTML_EDITFORM_OUTPUT', 'BEFORE', $this, 'handle_editform');
37    }
38
39    /**
40     * Enhance the editing form with structural data editing
41     *
42     * @param Doku_Event $event event object by reference
43     * @param mixed $param [the parameters passed as fifth argument to register_hook() when this
44     *                           handler was registered]
45     * @return bool
46     */
47    public function handle_editform(Doku_Event $event, $param) {
48        global $ID;
49
50        $assignments = new Assignments();
51        $tables = $assignments->getPageAssignments($ID);
52
53        $html = '';
54        foreach($tables as $table) {
55            $html .= $this->createForm($table);
56        }
57
58        /** @var Doku_Form $form */
59        $form = $event->data;
60        $html = "<div class=\"struct_entry_form\">$html</div>";
61        $pos = $form->findElementById('wiki__editbar'); // insert the form before the main buttons
62        $form->insertElement($pos, $html);
63
64        return true;
65    }
66
67    /**
68     * Create the form to edit schemadata
69     *
70     * @param string $tablename
71     * @return string The HTML for this schema's form
72     */
73    protected function createForm($tablename) {
74        global $ID;
75        global $REV;
76        global $INPUT;
77        if(auth_quickaclcheck($ID) == AUTH_READ) return '';
78        if(checklock($ID)) return '';
79        $schema = AccessTable::byTableName($tablename, $ID, $REV);
80        $schemadata = $schema->getData();
81
82        $structdata = $INPUT->arr(self::$VAR);
83        if(isset($structdata[$tablename])) {
84            $postdata = $structdata[$tablename];
85        } else {
86            $postdata = array();
87        }
88
89        // we need a short, unique identifier to use in the cookie. this should be good enough
90        $schemaid = 'SRCT' . substr(str_replace(array('+', '/'), '', base64_encode(sha1($tablename, true))), 0, 5);
91        $html = '<fieldset data-schema="' . $schemaid . '">';
92        $html .= '<legend>' . hsc($tablename) . '</legend>';
93        foreach($schemadata as $field) {
94            $label = $field->getColumn()->getLabel();
95            if(isset($postdata[$label])) {
96                // posted data trumps stored data
97                $field->setValue($postdata[$label]);
98            }
99            $html .= $this->makeField($field, self::$VAR . "[$tablename][$label]");
100        }
101        $html .= '</fieldset>';
102
103        return $html;
104    }
105
106    /**
107     * Create the input field
108     *
109     * @param Value $field
110     * @param String $name field's name
111     * @return string
112     */
113    public function makeField(Value $field, $name) {
114        $trans = hsc($field->getColumn()->getTranslatedLabel());
115        $hint = hsc($field->getColumn()->getTranslatedHint());
116        $class = $hint ? 'hashint' : '';
117        $colname = $field->getColumn()->getFullQualifiedLabel();
118
119        $input = $field->getValueEditor($name);
120
121        // we keep all the custom form stuff the field might produce, but hide it
122        if(!$field->getColumn()->isVisibleInEditor()) {
123            $hide = 'style="display:none"';
124        } else {
125            $hide = '';
126        }
127
128        $html = '';
129        $html .= "<label $hide data-column=\"$colname\">";
130        $html .= "<span class=\"label $class\" title=\"$hint\">$trans</span>";
131        $html .= "<span class=\"input\">$input</span>";
132        $html .= '</label>';
133
134        return $html;
135    }
136}
137
138// vim:ts=4:sw=4:et:
139