1<?php
2/**
3 * Class helper_plugin_bureaucracy_fieldnumber
4 *
5 * Creates a single line input field, where input is validated to be numeric
6 */
7class helper_plugin_bureaucracy_fieldnumber extends helper_plugin_bureaucracy_fieldtextbox {
8
9    private $autoinc = false;
10
11    /**
12     * Arguments:
13     *  - cmd
14     *  - label
15     *  - ++ (optional)
16     *  - 0000 (optional)
17     *  - ^ (optional)
18     *
19     * @param array $args The tokenized definition, only split at spaces
20     */
21    public function initialize($args) {
22        $pp = array_search('++', $args, true);
23        if ($pp !== false) {
24            unset($args[$pp]);
25            $this->autoinc = true;
26        }
27
28        parent::initialize($args);
29
30        if ($this->autoinc) {
31            global $ID;
32            $key = $this->get_key();
33            $c_val = p_get_metadata($ID, 'bureaucracy ' . $key);
34            if (is_null($c_val)) {
35                if (!isset($this->opt['value'])) {
36                    $this->opt['value'] = 0;
37                }
38                p_set_metadata($ID, array('bureaucracy' => array($key => $this->opt['value'])));
39            } else {
40                $this->opt['value'] = $c_val;
41            }
42        }
43        $this->opt['value'] = $this->addLeadingzeros($this->opt['value']);
44    }
45
46    /**
47     * Validate field value
48     *
49     * @throws Exception when not a number
50     */
51    protected function _validate() {
52        $value = $this->getParam('value');
53        if (!is_null($value) && !is_numeric($value)){
54            throw new Exception(sprintf($this->getLang('e_numeric'),hsc($this->getParam('display'))));
55        }
56
57        parent::_validate();
58    }
59
60    /**
61     * Handle a post to the field
62     *
63     * Accepts and validates a posted value.
64     *
65     * @param string $value The passed value or array or null if none given
66     * @param array  $fields (reference) form fields (POST handled upto $this field)
67     * @param int    $index  index number of field in form
68     * @param int    $formid unique identifier of the form which contains this field
69     * @return bool Whether the passed value is valid
70     */
71    public function handle_post($value, &$fields, $index, $formid) {
72        $value = $this->addLeadingzeros($value);
73
74        return parent::handle_post($value, $fields, $index, $formid);
75    }
76
77    /**
78     * Returns the cleaned key for this field required for metadata
79     *
80     * @return string key
81     */
82    private function get_key() {
83        return preg_replace('/\W/', '', $this->opt['label']) . '_autoinc';
84    }
85
86    /**
87     * Executed after performing the action hooks
88     *
89     * Increases counter and purge cache
90     */
91    public function after_action() {
92        if ($this->autoinc) {
93            global $ID;
94            p_set_metadata($ID, array('bureaucracy' => array($this->get_key() => $this->opt['value'] + 1)));
95            // Force rerendering by removing the instructions cache file
96            $cache_fn = getCacheName(wikiFN($ID).$_SERVER['HTTP_HOST'].$_SERVER['SERVER_PORT'],'.'.'i');
97            if (file_exists($cache_fn)) {
98                unlink($cache_fn);
99            }
100        }
101    }
102
103    /**
104     * Add leading zeros, depending on the corresponding field option
105     *
106     * @param int|string $value number
107     * @return string
108     */
109    protected function addLeadingzeros(&$value) {
110        if (isset($this->opt['leadingzeros'])) {
111            $length = strlen($value);
112            for($i = $length; $i < $this->opt['leadingzeros']; $i++) {
113                $value = '0' . $value;
114            }
115            return $value;
116        }
117        return $value;
118    }
119}
120