Dotclear

source: plugins/simpleMenu/index.php @ 3582:4d2db336ef65

Revision 3582:4d2db336ef65, 19.0 KB checked in by Gnieark<remi@…>, 8 years ago (diff)

ah c'était des tabulations, pas des espaces ;)

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_CONTEXT_ADMIN')) { return; }
13
14dcPage::check('admin');
15
16$page_title = __('Simple menu');
17
18# Url de base
19$p_url = $core->adminurl->get('admin.plugin.simpleMenu');
20
21# Url du blog
22$blog_url = html::stripHostURL($core->blog->url);
23
24# Liste des catégories
25$categories_label = array();
26$rs = $core->blog->getCategories(array('post_type'=>'post'));
27$categories_combo = dcAdminCombos::getCategoriesCombo($rs,false,true);
28$rs->moveStart();
29while ($rs->fetch()) {
30     $categories_label[$rs->cat_url] = html::escapeHTML($rs->cat_title);
31}
32
33# Liste des langues utilisées
34$langs_combo = dcAdminCombos::getLangscombo(
35     $core->blog->getLangs(array('order'=>'asc'))
36);
37
38# Liste des mois d'archive
39$rs = $core->blog->getDates(array('type'=>'month'));
40$months_combo = array_merge(
41     array(__('All months') => '-'),
42     dcAdmincombos::getDatesCombo($rs)
43);
44
45$first_year = $last_year = 0;
46while ($rs->fetch()) {
47     if (($first_year == 0) || ($rs->year() < $first_year)) $first_year = $rs->year();
48     if (($last_year == 0) || ($rs->year() > $last_year)) $last_year = $rs->year();
49}
50unset($rs);
51
52# Liste des pages -- Doit être pris en charge plus tard par le plugin ?
53$pages_combo = array();
54try {
55     $rs = $core->blog->getPosts(array('post_type'=>'page'));
56     while ($rs->fetch()) {
57          $pages_combo[$rs->post_title] = $rs->getURL();
58     }
59     unset($rs);
60} catch (Exception $e) { }
61
62# Liste des tags -- Doit être pris en charge plus tard par le plugin ?
63$tags_combo = array();
64try {
65     $rs = $core->meta->getMetadata(array('meta_type' => 'tag'));
66     $tags_combo[__('All tags')] = '-';
67     while ($rs->fetch()) {
68          $tags_combo[$rs->meta_id] = $rs->meta_id;
69     }
70     unset($rs);
71} catch (Exception $e) { }
72
73# Liste des types d'item de menu
74$items = new ArrayObject();
75$items['home'] = new ArrayObject(array(__('Home'),false));
76
77if (count($langs_combo) > 1) {
78     $items['lang'] = new ArrayObject(array(__('Language'),true));
79}
80if (count($categories_combo)) {
81     $items['category'] = new ArrayObject(array(__('Category'),true));
82}
83if (count($months_combo) > 1) {
84     $items['archive'] = new ArrayObject(array(__('Archive'),true));
85}
86if ($core->plugins->moduleExists('pages')) {
87     if(count($pages_combo))
88          $items['pages'] = new ArrayObject(array(__('Page'),true));
89}
90if ($core->plugins->moduleExists('tags')) {
91     if (count($tags_combo) > 1)
92          $items['tags'] = new ArrayObject(array(__('Tags'),true));
93}
94
95# --BEHAVIOR-- adminSimpleMenuAddType
96# Should add an item to $items[<id>] as an array(<label>,<optional step (true or false)>)
97$core->callBehavior('adminSimpleMenuAddType',$items);
98
99$items['special'] = new ArrayObject(array(__('User defined'),false));
100
101$items_combo = array();
102foreach ($items as $k => $v) {
103     $items_combo[$v[0]] = $k;
104}
105
106# Lecture menu existant
107$menu = $core->blog->settings->system->get('simpleMenu');
108if (!is_array($menu)) {
109     $menu = array();
110}
111
112# Récupération état d'activation du menu
113$menu_active = (boolean) $core->blog->settings->system->simpleMenu_active;
114
115// Saving new configuration
116if (!empty($_POST['saveconfig'])) {
117     try
118     {
119          $menu_active = (empty($_POST['active'])) ? false : true;
120          $core->blog->settings->system->put('simpleMenu_active',$menu_active,'boolean');
121          $core->blog->triggerBlog();
122
123          // All done successfully, return to menu items list
124          dcPage::addSuccessNotice(__('Configuration successfully updated.'));
125          http::redirect($p_url);
126     }
127     catch (Exception $e)
128     {
129          $core->error->add($e->getMessage());
130     }
131} else {
132     # Récupération paramètres postés
133     $item_type = isset($_POST['item_type']) ? $_POST['item_type'] : '';
134     $item_select = isset($_POST['item_select']) ? $_POST['item_select'] : '';
135     $item_label = isset($_POST['item_label']) ? $_POST['item_label'] : '';
136     $item_descr = isset($_POST['item_descr']) ? $_POST['item_descr'] : '';
137     $item_url = isset($_POST['item_url']) ? $_POST['item_url'] : '';
138     $item_targetBlank  = isset($_POST['item_targetBlank']) ?  (empty($_POST['item_targetBlank'])) ? false : true : false;
139     # Traitement
140     $step = (!empty($_GET['add']) ? (integer) $_GET['add'] : 0);
141     if (($step > 4) || ($step < 0)) $step = 0;
142     if ($step) {
143
144          # Récupération libellés des choix
145          $item_type_label = isset($items[$item_type]) ? $items[$item_type][0] : '';
146
147          switch ($step) {
148               case 1:
149                    // First step, menu item type to be selected
150                    $item_type = $item_select = '';
151                    break;
152               case 2:
153                    if ($items[$item_type][1]) {
154                         // Second step (optional), menu item sub-type to be selected
155                         $item_select = '';
156                         break;
157                    }
158               case 3:
159                    // Third step, menu item attributes to be changed or completed if necessary
160                    $item_select_label = '';
161                    $item_label = __('Label');
162                    $item_descr = __('Description');
163                    $item_url = $blog_url;
164                    switch ($item_type) {
165                         case 'home':
166                              $item_label = __('Home');
167                              $item_descr = __('Recent posts');
168                              break;
169                         case 'lang':
170                              $item_select_label = array_search($item_select,$langs_combo);
171                              $item_label = $item_select_label;
172                              $item_descr = sprintf(__('Switch to %s language'),$item_select_label);
173                              $item_url .= $core->url->getURLFor('lang',$item_select);
174                              break;
175                         case 'category':
176                              $item_select_label = $categories_label[$item_select];
177                              $item_label = $item_select_label;
178                              $item_descr = __('Recent Posts from this category');
179                              $item_url .= $core->url->getURLFor('category',$item_select);
180                              break;
181                         case 'archive':
182                              $item_select_label = array_search($item_select,$months_combo);
183                              if ($item_select == '-') {
184                                   $item_label = __('Archives');
185                                   $item_descr = $first_year.($first_year != $last_year ? ' - '.$last_year : '');
186                                   $item_url .= $core->url->getURLFor('archive');
187                              } else {
188                                   $item_label = $item_select_label;
189                                   $item_descr = sprintf(__('Posts from %s'),$item_select_label);
190                                   $item_url .= $core->url->getURLFor('archive',substr($item_select,0,4).'/'.substr($item_select,-2));
191                              }
192                              break;
193                         case 'pages':
194                              $item_select_label = array_search($item_select,$pages_combo);
195                              $item_label = $item_select_label;
196                              $item_descr = '';
197                              $item_url = html::stripHostURL($item_select);
198                              break;
199                         case 'tags':
200                              $item_select_label = array_search($item_select,$tags_combo);
201                              if ($item_select == '-') {
202                                   $item_label = __('All tags');
203                                   $item_descr = '';
204                                   $item_url .= $core->url->getURLFor('tags');
205                              } else {
206                                   $item_label = $item_select_label;
207                                   $item_descr = sprintf(__('Recent posts for %s tag'),$item_select_label);
208                                   $item_url .= $core->url->getURLFor('tag',$item_select);
209                              }
210                              break;
211                         case 'special':
212                              break;
213                         default:
214                              # --BEHAVIOR-- adminSimpleMenuBeforeEdit
215                              # Should modify if necessary $item_label, $item_descr and $item_url
216                              # Should set if necessary $item_select_label (displayed on further admin step only)
217                              $core->callBehavior('adminSimpleMenuBeforeEdit',$item_type,$item_select,
218                                   array(&$item_label,&$item_descr,&$item_url,&$item_select_label));
219                              break;
220                    }
221                    break;
222               case 4:
223                    // Fourth step, menu item to be added
224                    try {
225                         if (($item_label != '') && ($item_url != ''))
226                         {
227                              // Add new item menu in menu array
228                              $menu[] = array(
229                                   'label' => $item_label,
230                                   'descr' => $item_descr,
231                                   'url' => $item_url,
232                                   'targetBlank'  => $item_targetBlank 
233                              );
234                             
235                              // Save menu in blog settings
236                              $core->blog->settings->system->put('simpleMenu',$menu);
237                              $core->blog->triggerBlog();
238
239                              // All done successfully, return to menu items list
240                              dcPage::addSuccessNotice(__('Menu item has been successfully added.'));
241                              http::redirect($p_url);
242                         } else {
243                              $step = 3;
244                              $item_select_label = $item_label;
245                              dcPage::addErrorNotice(__('Label and URL of menu item are mandatory.'));
246                         }
247                    }
248                    catch (Exception $e) {
249                         $core->error->add($e->getMessage());
250                    }
251                    break;
252          }
253     } else {
254
255          # Remove selected menu items
256          if (!empty($_POST['removeaction']))
257          {
258               try {
259                    if (!empty($_POST['items_selected'])) {
260                         foreach ($_POST['items_selected'] as $k => $v) {
261                              $menu[$v]['label'] = '';
262                         }
263                         $newmenu = array();
264                         foreach ($menu as $k => $v) {
265                              if ($v['label']) {
266                                   $newmenu[] = array(
267                                        'label' => $v['label'],
268                                        'descr' => $v['descr'],
269                                        'url' => $v['url'],
270                                        'targetBlank'  => $v['targetBlank']
271                                        );
272                              }
273                         }
274                         $menu = $newmenu;
275                         // Save menu in blog settings
276                         $core->blog->settings->system->put('simpleMenu',$menu);
277                         $core->blog->triggerBlog();
278
279                         // All done successfully, return to menu items list
280                         dcPage::addSuccessNotice(__('Menu items have been successfully removed.'));
281                         http::redirect($p_url);
282                    } else {
283                         throw new Exception(__('No menu items selected.'));
284                    }
285               }
286               catch (Exception $e) {
287                    $core->error->add($e->getMessage());
288               }
289          }
290
291          # Update menu items
292          if (!empty($_POST['updateaction']))
293          {
294               try {
295                    foreach ($_POST['items_label'] as $k => $v) {
296                         if (!$v) throw new Exception(__('Label is mandatory.'));
297                    }
298                    foreach ($_POST['items_url'] as $k => $v) {
299                         if (!$v) throw new Exception(__('URL is mandatory.'));
300                    }
301                    $newmenu = array();
302                    for ($i = 0; $i < count($_POST['items_label']); $i++)
303                    {
304                         $newmenu[] = array(
305                              'label' => $_POST['items_label'][$i],
306                              'descr' => $_POST['items_descr'][$i],
307                              'url' => $_POST['items_url'][$i],
308                              'targetBlank'  => (empty($_POST['items_targetBlank'.$i])) ? false : true
309                              );
310                    }
311                    $menu = $newmenu;
312                    // Save menu in blog settings
313                    $core->blog->settings->system->put('simpleMenu',$menu);
314                    $core->blog->triggerBlog();
315
316                    // All done successfully, return to menu items list
317                    dcPage::addSuccessNotice(__('Menu items have been successfully updated.'));
318                    http::redirect($p_url);
319               }
320               catch (Exception $e) {
321                    $core->error->add($e->getMessage());
322               }
323          }
324
325          # Order menu items
326          $order = array();
327          if (empty($_POST['im_order']) && !empty($_POST['order'])) {
328               $order = $_POST['order'];
329               asort($order);
330               $order = array_keys($order);
331          } elseif (!empty($_POST['im_order'])) {
332               $order = $_POST['im_order'];
333               if (substr($order,-1) == ',') {
334                    $order = substr($order,0,strlen($order)-1);
335               }
336               $order = explode(',',$order);
337          }
338
339          if (!empty($_POST['updateaction']) && !empty($order))
340          {
341               try {
342                    $newmenu = array();
343                    foreach ($order as $i => $k) {
344                         $newmenu[] = array(
345                              'label' => $menu[$k]['label'],
346                              'descr' => $menu[$k]['descr'],
347                              'url' => $menu[$k]['url']);
348                    }
349                    $menu = $newmenu;
350                    // Save menu in blog settings
351                    $core->blog->settings->system->put('simpleMenu',$menu);
352                    $core->blog->triggerBlog();
353
354                    // All done successfully, return to menu items list
355                    dcPage::addSuccessNotice(__('Menu items have been successfully updated.'));
356                    http::redirect($p_url);
357               }
358               catch (Exception $e) {
359                    $core->error->add($e->getMessage());
360               }
361          }
362
363     }
364}
365
366# Display
367?>
368
369<html>
370<head>
371     <title><?php echo $page_title; ?></title>
372     <?php
373          $core->auth->user_prefs->addWorkspace('accessibility');
374          if (!$core->auth->user_prefs->accessibility->nodragdrop) {
375               echo
376                    dcPage::jsLoad('js/jquery/jquery-ui.custom.js').
377                    dcPage::jsLoad('js/jquery/jquery.ui.touch-punch.js').
378                    dcPage::jsLoad(dcPage::getPF('simpleMenu/simplemenu.js'));
379          }
380          echo dcPage::jsConfirmClose('settings','menuitemsappend','additem','menuitems');
381     ?>
382</head>
383
384<body>
385
386<?php
387
388if ($step) {
389     switch ($step) {
390          case 1:
391               $step_label = __('Step #1');
392               break;
393          case 2:
394               if ($items[$item_type][1]) {
395                    $step_label = __('Step #2');
396                    break;
397               }
398          case 3:
399               if ($items[$item_type][1]) {
400                    $step_label = __('Step #3');
401               } else {
402                    $step_label = __('Step #2');
403               }
404               break;
405     }
406     echo dcPage::breadcrumb(
407          array(
408               html::escapeHTML($core->blog->name) => '',
409               $page_title => $p_url,
410               __('Add item') => '',
411               $step_label => ''
412          ),
413          array(
414               'hl_pos' => -2)
415     ).
416     dcPage::notices();
417} else {
418     echo dcPage::breadcrumb(
419          array(
420               html::escapeHTML($core->blog->name) => '',
421               $page_title => ''
422          )).
423          dcPage::notices();
424}
425
426if ($step)
427{
428     // Formulaire d'ajout d'un item
429     switch ($step) {
430          case 1:
431               // Selection du type d'item
432               echo '<form id="additem" action="'.$p_url.'&amp;add=2" method="post">';
433               echo '<fieldset><legend>'.__('Select type').'</legend>';
434               echo '<p class="field"><label for="item_type" class="classic">'.__('Type of item menu:').'</label>'.form::combo('item_type',$items_combo,'').'</p>';
435               echo '<p>'.$core->formNonce().'<input type="submit" name="appendaction" value="'.__('Continue...').'" />'.'</p>';
436               echo '</fieldset>';
437               echo '</form>';
438               break;
439          case 2:
440               if ($items[$item_type][1]) {
441                    // Choix à faire
442                    echo '<form id="additem" action="'.$p_url.'&amp;add=3" method="post">';
443                    echo '<fieldset><legend>'.$item_type_label.'</legend>';
444                    switch ($item_type) {
445                         case 'lang':
446                              echo '<p class="field"><label for="item_select" class="classic">'.__('Select language:').'</label>'.
447                                   form::combo('item_select',$langs_combo,'');
448                              break;
449                         case 'category':
450                              echo '<p class="field"><label for="item_select" class="classic">'.__('Select category:').'</label>'.
451                                   form::combo('item_select',$categories_combo,'');
452                              break;
453                         case 'archive':
454                              echo '<p class="field"><label for="item_select" class="classic">'.__('Select month (if necessary):').'</label>'.
455                                   form::combo('item_select',$months_combo,'');
456                              break;
457                         case 'pages':
458                              echo '<p class="field"><label for="item_select" class="classic">'.__('Select page:').'</label>'.
459                                   form::combo('item_select',$pages_combo,'');
460                              break;
461                         case 'tags':
462                              echo '<p class="field"><label for="item_select" class="classic">'.__('Select tag (if necessary):').'</label>'.
463                                   form::combo('item_select',$tags_combo,'');
464                              break;
465                         default:
466                              echo
467                                   # --BEHAVIOR-- adminSimpleMenuSelect
468                                   # Optional step once $item_type known : should provide a field using 'item_select' as id
469                                   $core->callBehavior('adminSimpleMenuSelect',$item_type,'item_select');
470                    }
471                    echo form::hidden('item_type',$item_type);
472                    echo '<p>'.$core->formNonce().'<input type="submit" name="appendaction" value="'.__('Continue...').'" /></p>';
473                    echo '</fieldset>';
474                    echo '</form>';
475                    break;
476               }
477          case 3:
478               // Libellé et description
479               echo '<form id="additem" action="'.$p_url.'&amp;add=4" method="post">';
480               echo '<fieldset><legend>'.$item_type_label.($item_select_label != '' ? ' ('.$item_select_label.')' : '').'</legend>';
481               echo '<p class="field"><label for="item_label" class="classic required"><abbr title="'.__('Required field').'">*</abbr> '.
482                    __('Label of item menu:').'</label>'.form::field('item_label',20,255,$item_label).'</p>';
483               echo '<p class="field"><label for="item_descr" class="classic">'.
484                    __('Description of item menu:').'</label>'.form::field('item_descr',30,255,$item_descr).'</p>';
485               echo '<p class="field"><label for="item_url" class="classic required"><abbr title="'.__('Required field').'">*</abbr> '.
486                    __('URL of item menu:').'</label>'.form::field('item_url',40,255,$item_url).'</p>';
487               echo form::hidden('item_type',$item_type).form::hidden('item_select',$item_select);
488               echo '<p class="field"><label for="item_descr" class="classic">'.
489                    __('Open URL on a new tab').':</label>'.form::checkbox('item_targetBlank','blank').'</p>';
490               echo '<p>'.$core->formNonce().'<input type="submit" name="appendaction" value="'.__('Add this item').'" /></p>';
491               echo '</fieldset>';
492               echo '</form>';
493               break;
494     }
495}
496
497// Formulaire d'activation
498if (!$step) {
499     echo '<form id="settings" action="'.$p_url.'" method="post">'.
500          '<p>'.form::checkbox('active',1,$menu_active).
501          '<label class="classic" for="active">'.__('Enable simple menu for this blog').'</label>'.'</p>'.
502          '<p>'.$core->formNonce().'<input type="submit" name="saveconfig" value="'.__('Save configuration').'" />'.'</p>'.
503          '</form>';
504}
505
506// Liste des items
507if (!$step) {
508     echo '<form id="menuitemsappend" action="'.$p_url.'&amp;add=1" method="post">';
509     echo '<p class="top-add">'.$core->formNonce().'<input class="button add" type="submit" name="appendaction" value="'.__('Add an item').'" /></p>';
510     echo '</form>';
511}
512
513if (count($menu)) {
514     if (!$step) {
515          echo '<form id="menuitems" action="'.$p_url.'" method="post">';
516     }
517     // Entête table
518     echo
519          '<div class="table-outer">'.
520          '<table class="dragable">'.
521          '<caption>'.__('Menu items list').'</caption>'.
522          '<thead>'.
523          '<tr>';
524     if (!$step) {
525          echo '<th scope="col"></th>';
526          echo '<th scope="col"></th>';
527     }
528     echo
529          '<th scope="col">'.__('Label').'</th>'.
530          '<th scope="col">'.__('Description').'</th>'.
531          '<th scope="col">'.__('URL').'</th>'.
532          '<th scope="col">'.__('Open URL on a new tab').'</th>'.
533          '</tr>'.
534          '</thead>'.
535          '<tbody'.(!$step ? ' id="menuitemslist"' : '').'>';
536     $count = 0;
537     foreach ($menu as $i => $m) {
538          echo '<tr class="line" id="l_'.$i.'">';
539         
540          //because targetBlank can not exists. This value has been added after this plugin creation.
541          if((isset($m['targetBlank'])) && ($m['targetBlank'])) {
542               $targetBlank = true;
543               $targetBlankStr ='X';
544          }else{
545               $targetBlank = false;
546               $targetBlankStr ='';
547          }
548         
549          if (!$step) {
550               $count++;
551               echo '<td class="handle minimal">'.
552                    form::field(array('order['.$i.']'),2,3,$count,'position','',false,'title="'.sprintf(__('position of %s'),html::escapeHTML(__($m['label']))).'"').
553                    form::hidden(array('dynorder[]','dynorder-'.$i),$i).'</td>';
554               echo '<td class="minimal">'.form::checkbox(array('items_selected[]','ims-'.$i),$i).'</td>';
555               echo '<td class="nowrap" scope="row">'.form::field(array('items_label[]','iml-'.$i),'',255,html::escapeHTML(__($m['label']))).'</td>';
556               echo '<td class="nowrap">'.form::field(array('items_descr[]','imd-'.$i),'30',255,html::escapeHTML(__($m['descr']))).'</td>';
557               echo '<td class="nowrap">'.form::field(array('items_url[]','imu-'.$i),'30',255,html::escapeHTML($m['url'])).'</td>';
558               echo '<td class="nowrap">'.form::checkbox('items_targetBlank'.$i,'blank',$targetBlank).'</td>';
559          } else {
560               echo '<td class="nowrap" scope="row">'.html::escapeHTML(__($m['label'])).'</td>';
561               echo '<td class="nowrap">'.html::escapeHTML(__($m['descr'])).'</td>';
562               echo '<td class="nowrap">'.html::escapeHTML($m['url']).'</td>';
563               echo '<td class="nowrap">'.$targetBlankStr.'</td>';
564 
565          }
566          echo '</tr>';
567     }
568     echo '</tbody>'.
569          '</table></div>';
570     if (!$step) {
571          echo '<div class="two-cols">';
572          echo '<p class="col">'.form::hidden('im_order','').$core->formNonce();
573          echo '<input type="submit" name="updateaction" value="'.__('Update menu').'" />'.'</p>';
574          echo '<p class="col right">'.'<input id="remove-action" type="submit" class="delete" name="removeaction" '.
575                    'value="'.__('Delete selected menu items').'" '.
576                    'onclick="return window.confirm(\''.html::escapeJS(__('Are you sure you want to remove selected menu items?')).'\');" />'.
577               '</p>';
578          echo '</div>';
579          echo '</form>';
580     }
581} else {
582     echo
583          '<p>'.__('No menu items so far.').'</p>';
584}
585
586dcPage::helpBlock('simpleMenu');
587?>
588
589</body>
590</html>
Note: See TracBrowser for help on using the repository browser.

Sites map