Dotclear

source: plugins/widgets/class.widgets.php @ 2442:ba5e45265fff

Revision 2442:ba5e45265fff, 5.7 KB checked in by Anne Kozlika <kozlika@…>, 12 years ago (diff)

W3C validation. Fixes #1790
(except for data attributes)

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 settings
188     --------------------------------------------------- */
189     public function __get($n)
190     {
191          if (isset($this->settings[$n])) {
192               return $this->settings[$n]['value'];
193          }
194          return null;
195     }
196     
197     public function __set($n,$v)
198     {
199          if (isset($this->settings[$n])) {
200               $this->settings[$n]['value'] = $v;
201          }
202     }
203     
204     public function setting($name,$title,$value,$type='text')
205     {
206          if ($type == 'combo') {
207               $options = @func_get_arg(4);
208               if (!is_array($options)) {
209                    return false;
210               }
211          }
212         
213          $this->settings[$name] = array(
214               'title' => $title,
215               'type' => $type,
216               'value' => $value
217          );
218         
219          if (isset($options)) {
220               $this->settings[$name]['options'] = $options;
221          }
222     }
223     
224     public function settings()
225     {
226          return $this->settings;
227     }
228     
229     public function formSettings($pr='',&$i=0)
230     {
231          $res = '';
232          foreach ($this->settings as $id => $s)
233          {
234               $res .= $this->formSetting($id,$s,$pr,$i);
235               $i++;
236          }
237         
238          return $res;
239     }
240     
241     public function formSetting($id,$s,$pr='',&$i=0)
242     {
243          $res = '';
244          $wfid = "wf-".$i;
245          $iname = $pr ? $pr.'['.$id.']' : $id;
246          switch ($s['type'])
247          {
248               case 'text':
249                    $res .=
250                    '<p><label for="'.$wfid.'">'.$s['title'].'</label> '.
251                    form::field(array($iname,$wfid),20,255,html::escapeHTML($s['value']),'maximal').
252                    '</p>';
253                    break;
254               case 'textarea':
255                    $res .=
256                    '<p><label for="'.$wfid.'">'.$s['title'].'</label> '.
257                    form::textarea(array($iname,$wfid),30,5,html::escapeHTML($s['value']),'maximal').
258                    '</p>';
259                    break;
260               case 'check':
261                    $res .=
262                    '<p>'.form::hidden(array($iname),'0').
263                    '<label class="classic" for="'.$wfid.'">'.
264                    form::checkbox(array($iname,$wfid),'1',$s['value']).' '.$s['title'].
265                    '</label></p>';
266                    break;
267               case 'radio':
268                    $res .= '<p>'.($s['title'] ? '<label class="classic">'.$s['title'].'</label><br/>' : '');
269                    if(!empty($s['options'])) {
270                         foreach ($s['options'] as $k => $v) {
271                              $res .= $k > 0 ? '<br/>' : '';
272                              $res .=
273                              '<label class="classic" for="'.$wfid.'-'.$k.'">'.
274                              form::radio(array($iname,$wfid.'-'.$k),$v[1],$s['value'] == $v[1]).' '.$v[0].
275                              '</label>';
276                         }
277                    }
278                    $res .= '</p>';
279                    break;
280               case 'combo':
281                    $res .=
282                    '<p><label for="'.$wfid.'">'.$s['title'].'</label> '.
283                    form::combo(array($iname,$wfid),$s['options'],$s['value']).
284                    '</p>';
285                    break;
286          }
287          return $res;
288     }
289}
290?>
Note: See TracBrowser for help on using the repository browser.

Sites map