1<?php
2
3use dokuwiki\plugin\struct\meta\AccessTable;
4use dokuwiki\plugin\struct\meta\AccessTableGlobal;
5
6/**
7 * Allows adding a lookup schema as a bureaucracy action
8 *
9 */
10class helper_plugin_struct_lookup extends helper_plugin_bureaucracy_action
11{
12    /**
13     * Performs struct_lookup action
14     *
15     * @param helper_plugin_bureaucracy_field[] $fields array with form fields
16     * @param string $thanks thanks message
17     * @param array $argv array with entries: template, pagename, separator
18     * @return array|mixed
19     *
20     * @throws Exception
21     */
22    public function run($fields, $thanks, $argv)
23    {
24        global $ID;
25
26        // get all struct values and their associated schemas
27        $tosave = [];
28        foreach ($fields as $field) {
29            if (!is_a($field, 'helper_plugin_struct_field')) continue;
30            /** @var helper_plugin_struct_field $field */
31            $tbl = $field->column->getTable();
32            $lbl = $field->column->getLabel();
33            if (!isset($tosave[$tbl])) $tosave[$tbl] = [];
34            $tosave[$tbl][$lbl] = $field->getParam('value');
35        }
36
37        foreach ($tosave as $table => $data) {
38            $access = AccessTable::getGlobalAccess($table);
39            if (!$access instanceof AccessTableGlobal) continue;
40
41            if (!$access->getSchema()->isEditable()) {
42                msg('lookup save error: no permission for schema', -1);
43                return false;
44            }
45            $validator = $access->getValidator($data);
46            if ($validator->validate()) {
47                $validator->saveData();
48            }
49        }
50
51        // set thank you message
52        if (!$thanks) {
53            $thanks = sprintf($this->getLang('bureaucracy_action_struct_lookup_thanks'), wl($ID));
54        } else {
55            $thanks = hsc($thanks);
56        }
57
58        return $thanks;
59    }
60}
61