Dotclear

source: plugins/widgets/class.widgets.php @ 3725:b47f38c701ee

Revision 3725:b47f38c701ee, 9.5 KB checked in by franck <carnet.franck.paul@…>, 8 years ago (diff)

Use specialized input fields (color, email, url, number, …) where is relevant

RevLine 
[0]1<?php
2# -- BEGIN LICENSE BLOCK ---------------------------------------
3#
4# This file is part of Dotclear 2.
5#
[1179]6# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
[0]7# Licensed under the GPL version 2.0 license.
8# See LICENSE file or
9# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
10#
11# -- END LICENSE BLOCK -----------------------------------------
[3725]12if (!defined('DC_RC_PATH')) {return;}
[0]13
14class dcWidgets
15{
[3725]16    private $__widgets = array();
[2566]17
[3725]18    public static function load($s)
19    {
20        $o = @unserialize(base64_decode($s));
[2566]21
[3725]22        if ($o instanceof self) {
23            return $o;
24        } else {
25            return self::loadArray($o, $GLOBALS['__widgets']);
26        }
27    }
[2566]28
[3725]29    public function store()
30    {
31        $serialized = array();
32        foreach ($this->__widgets as $pos => $w) {
33            $serialized[] = ($w->serialize($pos));
34        }
35        return base64_encode(serialize($serialized));
36    }
[2566]37
[3725]38    public function create($id, $name, $callback, $append_callback = null, $desc = '')
39    {
40        $this->__widgets[$id]                  = new dcWidget($id, $name, $callback, $desc);
41        $this->__widgets[$id]->append_callback = $append_callback;
42    }
[2566]43
[3725]44    public function append($widget)
45    {
46        if ($widget instanceof dcWidget) {
47            if (is_callable($widget->append_callback)) {
48                call_user_func($widget->append_callback, $widget);
49            }
50            $this->__widgets[] = $widget;
51        }
52    }
[2566]53
[3725]54    public function isEmpty()
55    {
56        return count($this->__widgets) == 0;
57    }
[2566]58
[3725]59    public function elements($sorted = false)
60    {
61        if ($sorted) {
62            uasort($this->__widgets, array('self', 'sort'));
63        }
64        return $this->__widgets;
65    }
[2566]66
[3725]67    public function __get($id)
68    {
69        if (!isset($this->__widgets[$id])) {
70            return;
71        }
72        return $this->__widgets[$id];
73    }
[2566]74
[3725]75    public function __wakeup()
76    {
77        foreach ($this->__widgets as $i => $w) {
78            if (!($w instanceof dcWidget)) {
79                unset($this->__widgets[$i]);
80            }
81        }
82    }
[2566]83
[3725]84    public static function loadArray($A, $widgets)
85    {
86        if (!($widgets instanceof self)) {
87            return false;
88        }
[2566]89
[3725]90        uasort($A, array('self', 'arraySort'));
[2566]91
[3725]92        $result = new self;
93        foreach ($A as $v) {
94            if ($widgets->{$v['id']} != null) {
95                $w = clone $widgets->{$v['id']};
[2566]96
[3725]97                # Settings
98                unset($v['id']);
99                unset($v['order']);
100                foreach ($v as $sid => $s) {
101                    $w->{$sid} = $s;
102                }
[2566]103
[3725]104                $result->append($w);
105            }
106        }
[2566]107
[3725]108        return $result;
109    }
[2566]110
[3725]111    private static function arraySort($a, $b)
112    {
113        if ($a['order'] == $b['order']) {
114            return 0;
115        }
116        return $a['order'] > $b['order'] ? 1 : -1;
117    }
[2566]118
[3725]119    private static function sort($a, $b)
120    {
121        $c = dcUtils::removeDiacritics(mb_strtolower($a->name()));
122        $d = dcUtils::removeDiacritics(mb_strtolower($b->name()));
123        if ($c == $d) {
124            return 0;
125        }
126        return ($c < $d) ? -1 : 1;
127    }
[0]128}
129
130class dcWidget
131{
[3725]132    private $id;
133    private $name;
134    private $desc;
135    private $public_callback = null;
136    public $append_callback  = null;
137    private $settings        = array();
[2566]138
[3725]139    public function serialize($order)
140    {
141        $values = array();
142        foreach ($this->settings as $k => $v) {
143            $values[$k] = $v['value'];
144        }
[2566]145
[3725]146        $values['id']    = $this->id;
147        $values['order'] = $order;
148        return $values;
149    }
[2566]150
[3725]151    public function __construct($id, $name, $callback, $desc = '')
152    {
153        $this->public_callback = $callback;
154        $this->id              = $id;
155        $this->name            = $name;
156        $this->desc            = $desc;
157    }
[2566]158
[3725]159    public function id()
160    {
161        return $this->id;
162    }
[954]163
[3725]164    public function name()
165    {
166        return $this->name;
167    }
[2566]168
[3725]169    public function desc()
170    {
171        return $this->desc;
172    }
[2566]173
[3725]174    public function getCallback()
175    {
176        return $this->public_callback;
177    }
[2566]178
[3725]179    public function call($i = 0)
180    {
181        if (is_callable($this->public_callback)) {
182            return call_user_func($this->public_callback, $this, $i);
183        }
184        return '<p>Callback not found for widget ' . $this->id . '</p>';
185    }
[2667]186
[3725]187    /* Widget rendering tool
188    --------------------------------------------------- */
189    public function renderDiv($content_only, $class, $attr, $content)
190    {
191        if ($content_only) {
192            return $content;
193        }
194        $ret = '<div class="widget' . ($class ? ' ' . html::escapeHTML($class) : '') . '"' . ($attr ? ' ' . $attr : '') . '>' . "\n";
195        $ret .= $content . "\n";
196        $ret .= '</div>' . "\n";
[2667]197
[3725]198        return $ret;
199    }
[2662]200
[3725]201    public function renderTitle($title)
202    {
203        global $core;
[2662]204
[3725]205        if (!$title) {
206            return '';
207        }
[2662]208
[3725]209        $wtscheme = $core->themes->moduleInfo($core->blog->settings->system->theme, 'widgettitleformat');
210        if (empty($wtscheme)) {
211            $tplset = $core->themes->moduleInfo($core->blog->settings->system->theme, 'tplset');
212            if (empty($tplset) || $tplset == DC_DEFAULT_TPLSET) {
213                // Use H2 for mustek based themes
214                $wtscheme = '<h2>%s</h2>';
215            } else {
216                // Use H3 for currywurst based themes
217                $wtscheme = '<h3>%s</h3>';
218            }
219        }
220        $ret = sprintf($wtscheme, $title);
[2662]221
[3725]222        return $ret;
223    }
[2667]224
[3725]225    public function renderSubtitle($title, $render = true)
226    {
227        global $core;
[2667]228
[3725]229        if (!$title && $render) {
230            return '';
231        }
[2667]232
[3725]233        $wtscheme = $core->themes->moduleInfo($core->blog->settings->system->theme, 'widgetsubtitleformat');
234        if (empty($wtscheme)) {
235            $tplset = $core->themes->moduleInfo($core->blog->settings->system->theme, 'tplset');
236            if (empty($tplset) || $tplset == DC_DEFAULT_TPLSET) {
237                // Use H2 for mustek based themes
238                $wtscheme = '<h3>%s</h3>';
239            } else {
240                // Use H3 for currywurst based themes
241                $wtscheme = '<h4>%s</h4>';
242            }
243        }
244        if (!$render) {
245            return $wtscheme;
246        }
[2667]247
[3725]248        $ret = sprintf($wtscheme, $title);
249        return $ret;
250    }
[2566]251
[3725]252    /* Widget settings
253    --------------------------------------------------- */
254    public function __get($n)
255    {
256        if (isset($this->settings[$n])) {
257            return $this->settings[$n]['value'];
258        }
259        return;
260    }
[2566]261
[3725]262    public function __set($n, $v)
263    {
264        if (isset($this->settings[$n])) {
265            $this->settings[$n]['value'] = $v;
266        }
267    }
[2566]268
[3725]269    public function setting($name, $title, $value, $type = 'text')
270    {
271        if ($type == 'combo' || $type == 'radio') {
272            $options = @func_get_arg(4);
273            if (!is_array($options)) {
274                return false;
275            }
276        }
[2566]277
[3725]278        $this->settings[$name] = array(
279            'title' => $title,
280            'type'  => $type,
281            'value' => $value
282        );
[2566]283
[3725]284        if (isset($options)) {
285            $this->settings[$name]['options'] = $options;
286        }
287    }
[2566]288
[3725]289    public function settings()
290    {
291        return $this->settings;
292    }
[2566]293
[3725]294    public function formSettings($pr = '', &$i = 0)
295    {
296        $res = '';
297        foreach ($this->settings as $id => $s) {
298            $res .= $this->formSetting($id, $s, $pr, $i);
299            $i++;
300        }
[2566]301
[3725]302        return $res;
303    }
304
305    public function formSetting($id, $s, $pr = '', &$i = 0)
306    {
307        $res   = '';
308        $wfid  = "wf-" . $i;
309        $iname = $pr ? $pr . '[' . $id . ']' : $id;
310        switch ($s['type']) {
311            case 'text':
312                $res .=
313                '<p><label for="' . $wfid . '">' . $s['title'] . '</label> ' .
314                form::field(array($iname, $wfid), 20, 255, html::escapeHTML($s['value']), 'maximal') .
315                    '</p>';
316                break;
317            case 'textarea':
318                $res .=
319                '<p><label for="' . $wfid . '">' . $s['title'] . '</label> ' .
320                form::textarea(array($iname, $wfid), 30, 8, html::escapeHTML($s['value']), 'maximal') .
321                    '</p>';
322                break;
323            case 'check':
324                $res .=
325                '<p>' . form::hidden(array($iname), '0') .
326                '<label class="classic" for="' . $wfid . '">' .
327                form::checkbox(array($iname, $wfid), '1', $s['value']) . ' ' . $s['title'] .
328                    '</label></p>';
329                break;
330            case 'radio':
331                $res .= '<p>' . ($s['title'] ? '<label class="classic">' . $s['title'] . '</label><br/>' : '');
332                if (!empty($s['options'])) {
333                    foreach ($s['options'] as $k => $v) {
334                        $res .= $k > 0 ? '<br/>' : '';
335                        $res .=
336                        '<label class="classic" for="' . $wfid . '-' . $k . '">' .
337                        form::radio(array($iname, $wfid . '-' . $k), $v[1], $s['value'] == $v[1]) . ' ' . $v[0] .
338                            '</label>';
339                    }
340                }
341                $res .= '</p>';
342                break;
343            case 'combo':
344                $res .=
345                '<p><label for="' . $wfid . '">' . $s['title'] . '</label> ' .
346                form::combo(array($iname, $wfid), $s['options'], $s['value']) .
347                    '</p>';
348                break;
349        }
350        return $res;
351    }
[0]352}
Note: See TracBrowser for help on using the repository browser.

Sites map