root/dev/common/includes/class.options.php @ 254

Revision 254, 8.6 KB (checked in by exi, 15 years ago)

Merging 242:253 branch into dev

Line 
1<?php
2
3/*
4* This is the class which should make it easier to add new options to the admin menu
5* It may only be invoked statically like: options::add(...);
6* more functions will be added as needed, if you want one, add it or contact exi
7*
8* Note to exi: this pass-via-function stuff suckz, i should rather submit arrays
9*/
10
11class options
12{
13    // i just want to make sure....
14    function options()
15    {
16        trigger_error('The class "options" may only be invoked statically.', E_USER_ERROR);
17    }
18
19    // field = generic, subfield = look and feel, name = banner, type = select
20    function add($field, $subfield, $set, $description, $name, $type, $buildcallback = '', $onchange = '', $hint = '')
21    {
22        $data = &options::_getData();
23        $data[$field][$subfield][$set][] = array('descr' => $description, 'name' => $name, 'type' => $type,
24                                                 'callback' => $buildcallback,
25                                                 'onchange' => $onchange, 'hint' => $hint);
26    }
27
28    // fast add uses the last used category by options::cat so you don't have to retype everything
29    function fadd($description, $name, $type, $buildcallback = '', $onchange = '', $hint = '')
30    {
31        global $options_faddcat;
32
33        $data = &options::_getData();
34        $data[$options_faddcat[0]][$options_faddcat[1]][$options_faddcat[2]][] = array('descr' => $description, 'name' => $name, 'type' => $type,
35                                                 'callback' => $buildcallback,
36                                                 'onchange' => $onchange, 'hint' => $hint);
37    }
38
39    // adds a new category of options, used by the menu
40    function cat($field, $subfield, $set)
41    {
42        global $options_faddcat;
43
44        $options_faddcat = array($field, $subfield, $set);
45    }
46
47    // this will emulate the old options menu
48    function oldMenu($field, $subfield, $link)
49    {
50        $data = &options::_getData();
51
52        $data[$field][$subfield] = $link;
53    }
54
55    // this handles the submit from the optionspage
56    function handlePost()
57    {
58        $data = &options::_getData();
59
60        $current = &$data[$_POST['field']][$_POST['sub']];
61        foreach ($current as $elements)
62        {
63            foreach ($elements as $element)
64            {
65                // for callbacks we check their callback function on postdata to deal with it
66                if ($element['onchange'])
67                {
68                    if (!is_callable($element['onchange']))
69                    {
70                        trigger_error('Unable to callback to '.$element['onchange'][0].'::'.$element['onchange'][1], E_USER_ERROR);
71                        return false;
72                    }
73                    call_user_func($element['onchange'], $element['name']);
74                    continue;
75                }
76
77                // for checkboxes we need to set the value to zero if the option is not there
78                if ($element['type'] == 'checkbox')
79                {
80                    if ($_POST['option'][$element['name']] == 'on')
81                    {
82                        config::set($element['name'], '1');
83                    }
84                    else
85                    {
86                        config::set($element['name'], '0');
87                    }
88                }
89                else
90                {
91                    // edits and options will be set directly
92                    config::set($element['name'], $_POST['option'][$element['name']]);
93                }
94            }
95        }
96    }
97
98    function genOptionsPage()
99    {
100        $data = &options::_getData();
101
102        $field = $_REQUEST['field'];
103        $sub = $_REQUEST['sub'];
104
105        global $smarty, $page;
106
107        if (is_object($page))
108        {
109            $page->setTitle('Administration - '.$sub);
110        }
111
112        // create the option field
113        $smarty->assign('field', $field);
114        $smarty->assign('sub', $sub);
115
116        // save smarty compile_check state because we will call many templates
117        // and leaving this enabled causes performance issues
118        $cstate = $smarty->compile_check;
119        $smarty->compile_check = false;
120        $html = $smarty->fetch(get_tpl('admin_options_field_head'));
121
122        // create all option sets
123        foreach ($data[$field][$sub] as $set => $options)
124        {
125            $smarty->assign('set', $set);
126            $html .= $smarty->fetch(get_tpl('admin_options_set_head'));
127
128            // create all options in the set
129            foreach ($options as $option)
130            {
131                $html .= options::assembleElement($option);
132            }
133            $html .= $smarty->fetch(get_tpl('admin_options_set_foot'));
134        }
135        $html .= $smarty->fetch(get_tpl('admin_options_field_foot'));
136
137        // restore compile state
138        $smarty->compile_check = $cstate;
139        return $html;
140    }
141
142    function assembleElement(&$element)
143    {
144        global $smarty;
145
146        // this will extract all options into an array
147        $options = array();
148        if (strpos($element['type'], ':'))
149        {
150            $array = explode(':', $element['type']);
151            $element['type'] = array_shift($array);
152
153            $max = count($array);
154            for ($i=0; $i<=$max; $i+=2)
155            {
156                // make sure we assign a value
157                if (isset($array[$i+1]))
158                {
159                    $options[$array[$i]] = $array[$i+1];
160                }
161            }
162        }
163
164        if ($element['type'] == 'select')
165        {
166            if (!is_callable($element['callback']))
167            {
168                trigger_error('Unable to callback to '.$element['callback'][0].'::'.$element['callback'][1], E_USER_ERROR);
169                return false;
170            }
171
172            $option = call_user_func($element['callback']);
173            $smarty->assign('options', $option);
174            $smarty->assign_by_ref('opt', $element);
175            return $smarty->fetch(get_tpl('admin_options_select'));
176        }
177
178        if ($element['type'] == 'checkbox')
179        {
180            $smarty->assign_by_ref('opt', $element);
181            return $smarty->fetch(get_tpl('admin_options_checkbox'));
182        }
183
184        if ($element['type'] == 'edit')
185        {
186            $smarty->assign_by_ref('opt', $element);
187
188            if (!$options['size'])
189            {
190                $options['size'] = 20;
191            }
192            if (!$options['maxlength'])
193            {
194                $options['maxlength'] = 80;
195            }
196            $smarty->assign_by_ref('options', $options);
197            return $smarty->fetch(get_tpl('admin_options_edit'));
198        }
199
200        // for a custom element we call the callback to get the html we want
201        if ($element['type'] == 'custom')
202        {
203            if (!is_callable($element['callback']))
204            {
205                trigger_error('Unable to callback to '.$element['callback'][0].'::'.$element['callback'][1], E_USER_ERROR);
206                return false;
207            }
208
209            $element['html'] = call_user_func($element['callback']);
210            $smarty->assign_by_ref('opt', $element);
211            return $smarty->fetch(get_tpl('admin_options_custom'));
212        }
213
214        // unknown/not implemented element type
215        return $element['name'];
216    }
217
218    function genAdminMenu()
219    {
220        $data = &options::_getData();
221
222        // sort the menu alphabetically
223        ksort($data);
224
225        // create a standardbox to print all links into
226        $menubox = new Box('Options');
227        $menubox->setIcon('menu-item.gif');
228        foreach ($data as $field => $subfields)
229        {
230            $menubox->addOption('caption', $field);
231
232            foreach ($subfields as $subfield => $array)
233            {
234                // if this subfield has no options then it is a category
235                if (!is_array($array))
236                {
237                    $menubox->addOption('link', $subfield, $array);
238                    continue;
239                }
240
241                // we're not a category, make it klickable
242                $menubox->addOption('link', $subfield, '?a=admin&amp;field='.$field.'&amp;sub='.$subfield);
243            }
244            $lastfield = $field;
245        }
246        return $menubox->generate();
247    }
248
249    // private data storage to store all options
250    function &_getData()
251    {
252        static $data;
253
254        if (!isset($data))
255        {
256            $data = array();
257        }
258        return $data;
259    }
260}
261?>
Note: See TracBrowser for help on using the browser.