Dotclear

source: inc/admin/class.dc.admincontext.php @ 1053:96e69ef76fc9

Revision 1053:96e69ef76fc9, 16.4 KB checked in by Dsls <dsls@…>, 13 years ago (diff)
  • Added page errors & informations in context and default layout page.
  • Added submit actions and hidden fields.
  • cleaned up code in admin/post.php, all actions need to be recoded.
Line 
1<?php
2
3class dcAdminContext extends Twig_Extension {
4     protected $loaded_js;
5     protected $js;
6     protected $js_var;
7     protected $head;
8     protected $globals;
9     
10     protected $core;
11     public function __construct($core) {
12          $this->core = $core;
13          $this->js = array();
14          $this->js_var = array();
15          $this->loaded_js = array();
16          $this->head = array();
17          $this->jsCommon();
18          $this->blogs = array();
19          $this->globals = array();
20          if ($this->core->auth->blog_count > 1 && $this->core->auth->blog_count < 20) {
21               $rs_blogs = $core->getBlogs(array('order'=>'LOWER(blog_name)','limit'=>20));
22               while ($rs_blogs->fetch()) {
23                    $this->blogs[html::escapeHTML($rs_blogs->blog_name.' - '.$rs_blogs->blog_url)] = $rs_blogs->blog_id;
24               }
25          }
26          $this->blog = array();
27          if ($this->core->auth->blog_count) { // no blog on auth.php
28               $this->blog = array(
29                    'url' => $core->blog->url,
30                    'name' => $core->blog->name
31               );
32          }
33     }
34     
35     public function jsLoad($src)
36     {
37          $escaped_src = html::escapeHTML($src);
38          if (!isset($this->loaded_js[$escaped_src])) {
39               $this->loaded_js[$escaped_src]=true;
40               $this->js[]='<script type="text/javascript" src="'.$escaped_src.'"></script>';
41          }
42          return $this;
43     }
44
45     public function jsAdd($code)
46     {
47          $this->js[]=$code;
48          return $this;
49     }
50
51     public function head($code) {
52          $this->head[]=$code;
53          return $this;
54     }
55     public function jsVar($n,$v)
56     {
57          $this->js_vars[$n] = $v;
58     }
59
60     public function jsVars($arr)
61     {
62          foreach($arr as $n => $v) {
63               $this->js_vars[$n] = $v;
64          }
65          return $this;
66     }   
67
68     public function getJS(){
69          $jsvars = array();
70         
71          foreach ($this->js_vars as $n => $v) {
72               $jsvars[] = $n." = '".html::escapeJS($v)."';";
73          }
74          return join("\n",$this->head).
75               join("\n",$this->js).
76               '<script type="text/javascript">'."\n".
77               "//<![CDATA[\n".
78                    join("\n",$jsvars).
79               "\n//]]>\n".
80               "</script>\n";;
81     }
82
83     public function pageHead() {
84          global $core;
85          $this->jsLoadIE7();
86          echo '    <link rel="stylesheet" href="style/default.css" type="text/css" media="screen" />'."\n"; 
87          if (l10n::getTextDirection($GLOBALS['_lang']) == 'rtl') {
88               echo
89          '    <link rel="stylesheet" href="style/default-rtl.css" type="text/css" media="screen" />'."\n"; 
90          }
91          $core->auth->user_prefs->addWorkspace('interface');
92          $user_ui_hide_std_favicon = $core->auth->user_prefs->interface->hide_std_favicon;
93          if (!$user_ui_hide_std_favicon) {
94               echo '<link rel="icon" type="image/png" href="images/favicon.png" />';
95          }
96          echo $this->getJS();
97     }
98     
99     public function pageMenu() {
100          $menu =& $GLOBALS['_menu'];
101          foreach ($menu as $k => $v) {
102               echo $menu[$k]->draw();
103          }
104     }
105     public function getFunctions()
106     {
107          return array(
108               'page_head' => new Twig_Function_Method($this, 'pageHead', array('is_safe' => array('html'))),
109               'page_menu' => new Twig_Function_Method($this, 'pageMenu', array('is_safe' => array('html'))),
110               '__' => new Twig_Function_Function("__", array('is_safe' => array('html')))
111          );
112     }
113     public function getGlobals() {
114          return $this->globals;
115     }
116     public function getName() {
117          return 'AdminPage';
118     }
119
120     public function setMessage($message) {
121          $this->globals['page_message'] = $message;
122          return $this;
123     }
124     
125     public function addError($error) {
126          if (!isset($this->globals['page_errors']))
127               $this->globals['page_errors']=array();
128          $this->globals['page_errors'][] = $error;
129          return $this;
130     }
131
132     public function getFilters()
133     {
134          return array(
135               'trans' => new Twig_Filter_Function("__", array('is_safe' => array('html')))
136          );
137     }
138
139
140     public function jsCommon() {
141          return $this->jsVars (array(
142               'dotclear.nonce'              => $GLOBALS['core']->getNonce(),
143               'dotclear.img_plus_src'       => 'images/plus.png',
144               'dotclear.img_plus_alt'       => __('uncover'),
145               'dotclear.img_minus_src' => 'images/minus.png',
146               'dotclear.img_minus_alt' => __('hide'),
147               'dotclear.img_menu_on'        => 'images/menu_on.png',
148               'dotclear.img_menu_off'       => 'images/menu_off.png',
149               'dotclear.msg.help'           => __('help'),
150               'dotclear.msg.no_selection'   => __('no selection'),
151               'dotclear.msg.select_all'     => __('select all'),
152               'dotclear.msg.invert_sel'     => __('invert selection'),
153               'dotclear.msg.website'        => __('Web site:'),
154               'dotclear.msg.email'          => __('Email:'),
155               'dotclear.msg.ip_address'     => __('IP address:'),
156               'dotclear.msg.error'          => __('Error:'),
157               'dotclear.msg.entry_created'=> __('Entry has been successfully created.'),
158               'dotclear.msg.edit_entry'     => __('Edit entry'),
159               'dotclear.msg.view_entry'     => __('view entry'),
160               'dotclear.msg.confirm_delete_posts' =>
161                    __("Are you sure you want to delete selected entries (%s)?"),
162               'dotclear.msg.confirm_delete_post' =>
163                    __("Are you sure you want to delete this entry?"),
164               'dotclear.msg.confirm_delete_comments' =>
165                    __('Are you sure you want to delete selected comments (%s)?'),
166               'dotclear.msg.confirm_delete_comment' =>
167                    __('Are you sure you want to delete this comment?'),
168               'dotclear.msg.cannot_delete_users' =>
169                    __('Users with posts cannot be deleted.'),
170               'dotclear.msg.confirm_delete_user' =>
171                    __('Are you sure you want to delete selected users (%s)?'),
172               'dotclear.msg.confirm_delete_category' =>
173                    __('Are you sure you want to delete category "%s"?'),
174               'dotclear.msg.confirm_reorder_categories' =>
175                    __('Are you sure you want to reorder all categories?'),
176               'dotclear.msg.confirm_delete_media' =>
177                    __('Are you sure you want to remove media "%s"?'),
178               'dotclear.msg.confirm_extract_current' =>
179                    __('Are you sure you want to extract archive in current directory?'),
180               'dotclear.msg.confirm_remove_attachment' =>
181                    __('Are you sure you want to remove attachment "%s"?'),
182               'dotclear.msg.confirm_delete_lang' =>
183                    __('Are you sure you want to delete "%s" language?'),
184               'dotclear.msg.confirm_delete_plugin' =>
185                    __('Are you sure you want to delete "%s" plugin?'),
186               'dotclear.msg.use_this_theme' => __('Use this theme'),
187               'dotclear.msg.remove_this_theme' => __('Remove this theme'),
188               'dotclear.msg.confirm_delete_theme' =>
189                    __('Are you sure you want to delete "%s" theme?'),
190               'dotclear.msg.zip_file_content' => __('Zip file content'),
191               'dotclear.msg.xhtml_validator' => __('XHTML markup validator'),
192               'dotclear.msg.xhtml_valid' => __('XHTML content is valid.'),
193               'dotclear.msg.xhtml_not_valid' => __('There are XHTML markup errors.'),
194               'dotclear.msg.confirm_change_post_format' =>
195                    __('You have unsaved changes. Switch post format will loose these changes. Proceed anyway?'),
196               'dotclear.msg.load_enhanced_uploader' => __('Loading enhanced uploader =>please wait.')))
197               ->jsLoad('js/jquery/jquery.js')
198               ->jsLoad('js/jquery/jquery.biscuit.js')
199               ->jsLoad('js/jquery/jquery.bgFade.js')
200               ->jsLoad('js/jquery/jquery.constantfooter.js')
201               ->jsLoad('js/common.js')
202               ->jsLoad('js/prelude.js');
203     }
204
205     public function jsLoadIE7()
206     {
207          return $this->jsAdd(
208          '<!--[if lt IE 8]>'."\n".
209          '<script type="text/javascript" src="js/ie7/IE8.js"></script>'."\n".
210          '<link rel="stylesheet" type="text/css" href="style/iesucks.css" />'."\n".
211          '<![endif]-->');
212     }
213     
214     public function jsConfirmClose()
215     {
216          $args = func_get_args();
217          if (count($args) > 0) {
218               foreach ($args as $k => $v) {
219                    $args[$k] = "'".html::escapeJS($v)."'";
220               }
221               $args = implode(',',$args);
222          } else {
223               $args = '';
224          }
225         
226          $this->jsLoad('js/confirm-close.js');
227          $this->jsAdd(
228          '<script type="text/javascript">'."\n".
229          "//<![CDATA[\n".
230          "confirmClosePage = new confirmClose(".$args."); ".
231          "confirmClose.prototype.prompt = '".html::escapeJS(__('You have unsaved changes.'))."'; ".
232          "\n//]]>\n".
233          "</script>\n");
234          return $this;
235     }
236     
237     public function jsPageTabs($default=null)
238     {
239          if ($default) {
240               $default = "'".html::escapeJS($default)."'";
241          }
242         
243          return $this
244               ->jsLoad('js/jquery/jquery.pageTabs.js')
245               ->jsAdd('<script type="text/javascript">'."\n".
246          "//<![CDATA[\n".
247          "\$(function() {\n".
248          "    \$.pageTabs(".$default.");\n".
249          "});\n".
250          "\n//]]>\n".
251          "</script>\n");
252     }
253     
254     public function jsModal()
255     {
256          return $this
257               ->head(
258          '<link rel="stylesheet" type="text/css" href="style/modal/modal.css" />')
259               ->jsLoad('js/jquery/jquery.modal.js')
260               ->jsVars(array(
261                    '$.modal.prototype.params.loader_img' =>'style/modal/loader.gif',
262                    '$.modal.prototype.params.close_img' =>'style/modal/close.png'
263               ));
264     }
265     
266     public static function jsColorPicker()
267     {
268          return
269          '<link rel="stylesheet" type="text/css" href="style/farbtastic/farbtastic.css" />'."\n".
270          self::jsLoad('js/jquery/jquery.farbtastic.js').
271          self::jsLoad('js/color-picker.js');
272     }
273     
274     public function jsDatePicker()
275     {
276          $this
277               ->head(
278          '<link rel="stylesheet" type="text/css" href="style/date-picker.css" />')
279               ->jsLoad('js/date-picker.js')
280               ->jsVars(array(         
281                    "datePicker.prototype.months[0]" => __('January'),
282                    "datePicker.prototype.months[1]" => __('February'),
283                    "datePicker.prototype.months[2]" => __('March'),
284                    "datePicker.prototype.months[3]" => __('April'),
285                    "datePicker.prototype.months[4]" => __('May'),
286                    "datePicker.prototype.months[5]" => __('June'),
287                    "datePicker.prototype.months[6]" => __('July'),
288                    "datePicker.prototype.months[7]" => __('August'),
289                    "datePicker.prototype.months[8]" => __('September'),
290                    "datePicker.prototype.months[9]" => __('October'),
291                    "datePicker.prototype.months[10]" => __('November'),
292                    "datePicker.prototype.months[11]" => __('December'),
293                    "datePicker.prototype.days[0]" => __('Monday'),
294                    "datePicker.prototype.days[1]" => __('Tuesday'),
295                    "datePicker.prototype.days[2]" => __('Wednesday'),
296                    "datePicker.prototype.days[3]" => __('Thursday'),
297                    "datePicker.prototype.days[4]" => __('Friday'),
298                    "datePicker.prototype.days[5]" => __('Saturday'),
299                    "datePicker.prototype.days[6]" => __('Sunday'),
300                   
301                    "datePicker.prototype.img_src" => 'images/date-picker.png',
302                   
303                    "datePicker.prototype.close_msg" => __('close'),
304                    "datePicker.prototype.now_msg" => __('now')));
305          return $this;
306     }
307     
308     public function jsToolBar()
309     {
310          $this
311               ->head(
312          '<link rel="stylesheet" type="text/css" href="style/jsToolBar/jsToolBar.css" />')
313               ->jsLoad("js/jsToolBar/jsToolBar.js");
314         
315          if (isset($GLOBALS['core']->auth) && $GLOBALS['core']->auth->getOption('enable_wysiwyg')) {
316               $this->jsLoad("js/jsToolBar/jsToolBar.wysiwyg.js");
317          }
318         
319          $this->jsLoad("js/jsToolBar/jsToolBar.dotclear.js")
320          ->jsVars(array(
321         
322          "jsToolBar.prototype.dialog_url" => 'popup.php',
323          "jsToolBar.prototype.iframe_css" =>
324               'body{'.
325                    'font: 12px "DejaVu Sans","Lucida Grande","Lucida Sans Unicode",Arial,sans-serif;'.
326                    'color : #000;'.
327                    'background: #f9f9f9;'.
328                    'margin: 0;'.
329                    'padding : 2px;'.
330                    'border: none;'.
331                    (l10n::getTextDirection($GLOBALS['_lang']) == 'rtl' ? 'direction:rtl;' : '').
332               '}'.
333               'pre, code, kbd, samp {'.
334                    'font-family:"Courier New",Courier,monospace;'.
335                    'font-size : 1.1em;'.
336               '}'.
337               'code {'.
338                    'color : #666;'.
339                    'font-weight : bold;'.
340               '}'.
341               'body > p:first-child {'.
342                    'margin-top: 0;'.
343               '}',
344          "jsToolBar.prototype.base_url" => $GLOBALS['core']->blog->host,
345          "jsToolBar.prototype.switcher_visual_title" => __('visual'),
346          "jsToolBar.prototype.switcher_source_title" => __('source'),
347          "jsToolBar.prototype.legend_msg" =>
348               __('You can use the following shortcuts to format your text.'),
349          "jsToolBar.prototype.elements.blocks.options.none" => __('-- none --'),
350          "jsToolBar.prototype.elements.blocks.options.nonebis" => __('-- block format --'),
351          "jsToolBar.prototype.elements.blocks.options.p" => __('Paragraph'),
352          "jsToolBar.prototype.elements.blocks.options.h1" => __('Level 1 header'),
353          "jsToolBar.prototype.elements.blocks.options.h2" => __('Level 2 header'),
354          "jsToolBar.prototype.elements.blocks.options.h3" => __('Level 3 header'),
355          "jsToolBar.prototype.elements.blocks.options.h4" => __('Level 4 header'),
356          "jsToolBar.prototype.elements.blocks.options.h5" => __('Level 5 header'),
357          "jsToolBar.prototype.elements.blocks.options.h6" => __('Level 6 header'),
358          "jsToolBar.prototype.elements.strong.title" => __('Strong emphasis'),
359          "jsToolBar.prototype.elements.em.title" => __('Emphasis'),
360          "jsToolBar.prototype.elements.ins.title" => __('Inserted'),
361          "jsToolBar.prototype.elements.del.title" => __('Deleted'),
362          "jsToolBar.prototype.elements.quote.title" => __('Inline quote'),
363          "jsToolBar.prototype.elements.code.title" => __('Code'),
364          "jsToolBar.prototype.elements.br.title" => __('Line break'),
365          "jsToolBar.prototype.elements.blockquote.title" => __('Blockquote'),
366          "jsToolBar.prototype.elements.pre.title" => __('Preformated text'),
367          "jsToolBar.prototype.elements.ul.title" => __('Unordered list'),
368          "jsToolBar.prototype.elements.ol.title" => __('Ordered list'),
369         
370          "jsToolBar.prototype.elements.link.title" => __('Link'),
371          "jsToolBar.prototype.elements.link.href_prompt" => __('URL?'),
372          "jsToolBar.prototype.elements.link.hreflang_prompt" => __('Language?'),
373         
374          "jsToolBar.prototype.elements.img.title" => __('External image'),
375          "jsToolBar.prototype.elements.img.src_prompt" => __('URL?'),
376         
377          "jsToolBar.prototype.elements.img_select.title" => __('Media chooser'),
378          "jsToolBar.prototype.elements.post_link.title" => __('Link to an entry')));
379         
380          if (!$GLOBALS['core']->auth->check('media,media_admin',$GLOBALS['core']->blog->id)) {
381               $this->jsVar("jsToolBar.prototype.elements.img_select.disabled",true);
382          }
383                   
384          return $this;
385     }
386     
387     public function jsCandyUpload($params=array(),$base_url=null)
388     {
389          if (!$base_url) {
390               $base_url = path::clean(dirname(preg_replace('/(\?.*$)?/','',$_SERVER['REQUEST_URI']))).'/';
391          }
392         
393          $params = array_merge($params,array(
394               'sess_id='.session_id(),
395               'sess_uid='.$_SESSION['sess_browser_uid'],
396               'xd_check='.$GLOBALS['core']->getNonce()
397          ));
398         
399          return
400          '<link rel="stylesheet" type="text/css" href="style/candyUpload/style.css" />'."\n".
401          self::jsLoad('js/jquery/jquery.candyUpload.js').
402         
403          '<script type="text/javascript">'."\n".
404          "//<![CDATA[\n".
405          "dotclear.candyUpload = {};\n".
406          self::jsVar('dotclear.msg.activate_enhanced_uploader',__('Activate enhanced uploader')).
407          self::jsVar('dotclear.msg.disable_enhanced_uploader',__('Disable enhanced uploader')).
408          self::jsVar('$._candyUpload.prototype.locales.file_uploaded',__('File successfully uploaded.')).
409          self::jsVar('$._candyUpload.prototype.locales.max_file_size',__('Maximum file size allowed:')).
410          self::jsVar('$._candyUpload.prototype.locales.limit_exceeded',__('Limit exceeded.')).
411          self::jsVar('$._candyUpload.prototype.locales.size_limit_exceeded',__('File size exceeds allowed limit.')).
412          self::jsVar('$._candyUpload.prototype.locales.canceled',__('Canceled.')).
413          self::jsVar('$._candyUpload.prototype.locales.http_error',__('HTTP Error:')).
414          self::jsVar('$._candyUpload.prototype.locales.error',__('Error:')).
415          self::jsVar('$._candyUpload.prototype.locales.choose_file',__('Choose file')).
416          self::jsVar('$._candyUpload.prototype.locales.choose_files',__('Choose files')).
417          self::jsVar('$._candyUpload.prototype.locales.cancel',__('Cancel')).
418          self::jsVar('$._candyUpload.prototype.locales.clean',__('Clean')).
419          self::jsVar('$._candyUpload.prototype.locales.upload',__('Upload')).
420          self::jsVar('$._candyUpload.prototype.locales.no_file_in_queue',__('No file in queue.')).
421          self::jsVar('$._candyUpload.prototype.locales.file_in_queue',__('1 file in queue.')).
422          self::jsVar('$._candyUpload.prototype.locales.files_in_queue',__('%d files in queue.')).
423          self::jsVar('$._candyUpload.prototype.locales.queue_error',__('Queue error:')).
424          self::jsVar('dotclear.candyUpload.base_url',$base_url).
425          self::jsVar('dotclear.candyUpload.movie_url',$base_url.'index.php?pf=swfupload.swf').
426          self::jsVar('dotclear.candyUpload.params',implode('&',$params)).
427          "\n//]]>\n".
428          "</script>\n";
429     }
430     
431     public static function jsToolMan()
432     {
433          return
434          '<script type="text/javascript" src="js/tool-man/core.js"></script>'.
435          '<script type="text/javascript" src="js/tool-man/events.js"></script>'.
436          '<script type="text/javascript" src="js/tool-man/css.js"></script>'.
437          '<script type="text/javascript" src="js/tool-man/coordinates.js"></script>'.
438          '<script type="text/javascript" src="js/tool-man/drag.js"></script>'.
439          '<script type="text/javascript" src="js/tool-man/dragsort.js"></script>'.
440          '<script type="text/javascript" src="js/dragsort-tablerows.js"></script>';
441     }
442     
443     public function jsMetaEditor()
444     {
445          return $this->jsLoad("js/meta-editor.js");
446     }
447
448}
449?>
Note: See TracBrowser for help on using the repository browser.

Sites map