Dotclear

source: plugins/widgets/class.widgets.php @ 2662:87748fd865ef

Revision 2662:87748fd865ef, 6.3 KB checked in by franck <carnet.franck.paul@…>, 11 years ago (diff)

New rendering method (renderTitle) for widget title, fixes #1827

Line 
1<?php
2# -- BEGIN LICENSE BLOCK ---------------------------------------
3#
4# This file is part of Dotclear 2.
5#
6# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
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 -----------------------------------------
12if (!defined('DC_RC_PATH')) { return; }
13
14class dcWidgets
15{
16     private $__widgets = array();
17
18     public static function load($s)
19     {
20          $o = @unserialize(base64_decode($s));
21
22          if ($o instanceof self) {
23               return $o;
24          } else {
25               return self::loadArray($o,$GLOBALS['__widgets']);
26          }
27     }
28
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     }
37
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     }
43
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     }
53
54     public function isEmpty()
55     {
56          return count($this->__widgets) == 0;
57     }
58
59     public function elements($sorted=false)
60     {
61          if ($sorted) {
62               uasort($this->__widgets,array('self','sort'));
63          }
64          return $this->__widgets;
65     }
66
67     public function __get($id)
68     {
69          if (!isset($this->__widgets[$id])) {
70               return null;
71          }
72          return $this->__widgets[$id];
73     }
74
75     public function __wakeup()
76     {
77          foreach ($this->__widgets as $i => $w)
78          {
79               if (!($w instanceof dcWidget)) {
80                    unset($this->__widgets[$i]);
81               }
82          }
83     }
84
85     public static function loadArray($A,$widgets)
86     {
87          if (!($widgets instanceof self)) {
88               return false;
89          }
90
91          uasort($A,array('self','arraySort'));
92
93          $result = new self;
94          foreach ($A as $v)
95          {
96               if ($widgets->{$v['id']} != null)
97               {
98                    $w = clone $widgets->{$v['id']};
99
100                    # Settings
101                    unset($v['id']);
102                    unset($v['order']);
103                    foreach ($v as $sid => $s) {
104                         $w->{$sid} = $s;
105                    }
106
107                    $result->append($w);
108               }
109          }
110
111          return $result;
112     }
113
114     private static function arraySort($a, $b)
115     {
116          if ($a['order'] == $b['order']) {
117               return 0;
118          }
119          return $a['order'] > $b['order'] ? 1 : -1;
120     }
121
122     private static function sort($a,$b)
123     {
124          $c = $a->name();
125          $d = $b->name();
126          if ($c == $d) {
127               return 0;
128          }
129          return ($c < $d) ? -1 : 1;
130     }
131}
132
133class dcWidget
134{
135     private $id;
136     private $name;
137     private $desc;
138     private $public_callback = null;
139     public $append_callback = null;
140     private $settings = array();
141
142     public function serialize($order) {
143          $values = array();
144          foreach ($this->settings as $k=>$v)
145               $values[$k]=$v['value'];
146          $values['id']=$this->id;
147          $values['order']=$order;
148          return $values;
149     }
150
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     }
158
159     public function id()
160     {
161          return $this->id;
162     }
163
164     public function name()
165     {
166          return $this->name;
167     }
168
169     public function desc()
170     {
171          return $this->desc;
172     }
173
174     public function getCallback()
175     {
176          return $this->public_callback;
177     }
178
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     }
186
187     /* Widget rendering tool
188     --------------------------------------------------- */
189     public function renderTitle($title)
190     {
191          global $core;
192
193          if (!$title) {
194               return '';
195          }
196
197          $wtscheme = $core->themes->moduleInfo($core->blog->settings->system->theme,'widgettitleformat');
198          if (empty($wtscheme)) {
199               $tplset = $core->themes->moduleInfo($core->blog->settings->system->theme,'tplset');
200               if (empty($tplset) || $tplset == DC_DEFAULT_TPLSET) {
201                    // Use H2 for mustek based themes
202                    $wtscheme = '<h2>%s</h2>';
203               } else {
204                    // Use H3 for currywurst based themes
205                    $wtscheme = '<h3>%s</h3>';
206               }
207          }
208          $ret = sprintf($wtscheme,$title);
209
210          return $ret;
211     }
212
213     /* Widget settings
214     --------------------------------------------------- */
215     public function __get($n)
216     {
217          if (isset($this->settings[$n])) {
218               return $this->settings[$n]['value'];
219          }
220          return null;
221     }
222
223     public function __set($n,$v)
224     {
225          if (isset($this->settings[$n])) {
226               $this->settings[$n]['value'] = $v;
227          }
228     }
229
230     public function setting($name,$title,$value,$type='text')
231     {
232          if ($type == 'combo') {
233               $options = @func_get_arg(4);
234               if (!is_array($options)) {
235                    return false;
236               }
237          }
238
239          $this->settings[$name] = array(
240               'title' => $title,
241               'type' => $type,
242               'value' => $value
243          );
244
245          if (isset($options)) {
246               $this->settings[$name]['options'] = $options;
247          }
248     }
249
250     public function settings()
251     {
252          return $this->settings;
253     }
254
255     public function formSettings($pr='',&$i=0)
256     {
257          $res = '';
258          foreach ($this->settings as $id => $s)
259          {
260               $res .= $this->formSetting($id,$s,$pr,$i);
261               $i++;
262          }
263
264          return $res;
265     }
266
267     public function formSetting($id,$s,$pr='',&$i=0)
268     {
269          $res = '';
270          $wfid = "wf-".$i;
271          $iname = $pr ? $pr.'['.$id.']' : $id;
272          switch ($s['type'])
273          {
274               case 'text':
275                    $res .=
276                    '<p><label for="'.$wfid.'">'.$s['title'].'</label> '.
277                    form::field(array($iname,$wfid),20,255,html::escapeHTML($s['value']),'maximal').
278                    '</p>';
279                    break;
280               case 'textarea':
281                    $res .=
282                    '<p><label for="'.$wfid.'">'.$s['title'].'</label> '.
283                    form::textarea(array($iname,$wfid),30,5,html::escapeHTML($s['value']),'maximal').
284                    '</p>';
285                    break;
286               case 'check':
287                    $res .=
288                    '<p>'.form::hidden(array($iname),'0').
289                    '<label class="classic" for="'.$wfid.'">'.
290                    form::checkbox(array($iname,$wfid),'1',$s['value']).' '.$s['title'].
291                    '</label></p>';
292                    break;
293               case 'radio':
294                    $res .= '<p>'.($s['title'] ? '<label class="classic">'.$s['title'].'</label><br/>' : '');
295                    if(!empty($s['options'])) {
296                         foreach ($s['options'] as $k => $v) {
297                              $res .= $k > 0 ? '<br/>' : '';
298                              $res .=
299                              '<label class="classic" for="'.$wfid.'-'.$k.'">'.
300                              form::radio(array($iname,$wfid.'-'.$k),$v[1],$s['value'] == $v[1]).' '.$v[0].
301                              '</label>';
302                         }
303                    }
304                    $res .= '</p>';
305                    break;
306               case 'combo':
307                    $res .=
308                    '<p><label for="'.$wfid.'">'.$s['title'].'</label> '.
309                    form::combo(array($iname,$wfid),$s['options'],$s['value']).
310                    '</p>';
311                    break;
312          }
313          return $res;
314     }
315}
Note: See TracBrowser for help on using the repository browser.

Sites map