| 1 | <?php | 
|---|
| 2 | # -- BEGIN LICENSE BLOCK --------------------------------------- | 
|---|
| 3 | # | 
|---|
| 4 | # This file is part of Dotclear 2. | 
|---|
| 5 | # | 
|---|
| 6 | # Copyright (c) 2003-2011 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 ----------------------------------------- | 
|---|
| 12 | if (!defined('DC_RC_PATH')) { return; } | 
|---|
| 13 |  | 
|---|
| 14 | class 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 |  | 
|---|
| 133 | class 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 |                $wfid = "wf-".$i; | 
|---|
| 235 |                $iname = $pr ? $pr.'['.$id.']' : $id; | 
|---|
| 236 |                switch ($s['type']) | 
|---|
| 237 |                { | 
|---|
| 238 |                     case 'text': | 
|---|
| 239 |                          $res .= | 
|---|
| 240 |                          '<p><label for="'.$wfid.'">'.$s['title'].' '. | 
|---|
| 241 |                          form::field(array($iname,$wfid),20,255,html::escapeHTML($s['value']),'maximal'). | 
|---|
| 242 |                          '</label></p>'; | 
|---|
| 243 |                          break; | 
|---|
| 244 |                     case 'textarea': | 
|---|
| 245 |                          $res .= | 
|---|
| 246 |                          '<p><label for="'.$wfid.'">'.$s['title'].' '. | 
|---|
| 247 |                          form::textarea(array($iname,$wfid),30,5,html::escapeHTML($s['value']),'maximal'). | 
|---|
| 248 |                          '</label></p>'; | 
|---|
| 249 |                          break; | 
|---|
| 250 |                     case 'check': | 
|---|
| 251 |                          $res .= | 
|---|
| 252 |                          '<p>'.form::hidden(array($iname),'0'). | 
|---|
| 253 |                          '<label class="classic" for="'.$wfid.'">'. | 
|---|
| 254 |                          form::checkbox(array($iname,$wfid),'1',$s['value']).' '.$s['title']. | 
|---|
| 255 |                          '</label></p>'; | 
|---|
| 256 |                          break; | 
|---|
| 257 |                     case 'combo': | 
|---|
| 258 |                          $res .= | 
|---|
| 259 |                          '<p><label for="'.$wfid.'">'.$s['title'].' '. | 
|---|
| 260 |                          form::combo(array($iname,$wfid),$s['options'],$s['value']). | 
|---|
| 261 |                          '</label></p>'; | 
|---|
| 262 |                          break; | 
|---|
| 263 |                } | 
|---|
| 264 |                $i++; | 
|---|
| 265 |           } | 
|---|
| 266 |            | 
|---|
| 267 |           return $res; | 
|---|
| 268 |      } | 
|---|
| 269 | } | 
|---|
| 270 | ?> | 
|---|