Dotclear

source: inc/admin/class.dc.adminpage.php @ 992:bbe8a306df16

Revision 992:bbe8a306df16, 17.0 KB checked in by Dsls <dsls@…>, 13 years ago (diff)

Added very early drafts for form management & twig admin templates.
Still crappy code, needs to be better documented.

post.php is broken there, many things need to be done to be fully functional !
(nb: for the moment, DC_TPL_CACHE.'/admtpl' needs to be created manually.

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

Sites map