Dotclear

source: plugins/simpleMenu/index.php @ 2701:f9ee5d4e8aef

Revision 2701:f9ee5d4e8aef, 16.9 KB checked in by franck <carnet.franck.paul@…>, 11 years ago (diff)

Cope with empty mandatory fields, Fixes #1966

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 = 'plugin.php?p=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');
108$menu = @unserialize($menu);
109if (!is_array($menu)) {
110     $menu = array();
111}
112
113# Récupération paramètres postés
114$item_type = isset($_POST['item_type']) ? $_POST['item_type'] : '';
115$item_select = isset($_POST['item_select']) ? $_POST['item_select'] : '';
116$item_label = isset($_POST['item_label']) ? $_POST['item_label'] : '';
117$item_descr = isset($_POST['item_descr']) ? $_POST['item_descr'] : '';
118$item_url = isset($_POST['item_url']) ? $_POST['item_url'] : '';
119
120# Traitement
121$step = (!empty($_GET['add']) ? (integer) $_GET['add'] : 0);
122if (($step > 4) || ($step < 0)) $step = 0;
123if ($step) {
124
125     # Récupération libellés des choix
126     $item_type_label = isset($items[$item_type]) ? $items[$item_type][0] : '';
127
128     switch ($step) {
129          case 1:
130               // First step, menu item type to be selected
131               $item_type = $item_select = '';
132               break;
133          case 2:
134               if ($items[$item_type][1]) {
135                    // Second step (optional), menu item sub-type to be selected
136                    $item_select = '';
137                    break;
138               }
139          case 3:
140               // Third step, menu item attributes to be changed or completed if necessary
141               $item_select_label = '';
142               $item_label = __('Label');
143               $item_descr = __('Description');
144               $item_url = $blog_url;
145               switch ($item_type) {
146                    case 'home':
147                         $item_label = __('Home');
148                         $item_descr = __('Recent posts');
149                         break;
150                    case 'lang':
151                         $item_select_label = array_search($item_select,$langs_combo);
152                         $item_label = $item_select_label;
153                         $item_descr = sprintf(__('Switch to %s language'),$item_select_label);
154                         $item_url .= $core->url->getURLFor('lang',$item_select);
155                         break;
156                    case 'category':
157                         $item_select_label = $categories_label[$item_select];
158                         $item_label = $item_select_label;
159                         $item_descr = __('Recent Posts from this category');
160                         $item_url .= $core->url->getURLFor('category',$item_select);
161                         break;
162                    case 'archive':
163                         $item_select_label = array_search($item_select,$months_combo);
164                         if ($item_select == '-') {
165                              $item_label = __('Archives');
166                              $item_descr = $first_year.($first_year != $last_year ? ' - '.$last_year : '');
167                              $item_url .= $core->url->getURLFor('archive');
168                         } else {
169                              $item_label = $item_select_label;
170                              $item_descr = sprintf(__('Posts from %s'),$item_select_label);
171                              $item_url .= $core->url->getURLFor('archive',substr($item_select,0,4).'/'.substr($item_select,-2));
172                         }
173                         break;
174                    case 'pages':
175                         $item_select_label = array_search($item_select,$pages_combo);
176                         $item_label = $item_select_label;
177                         $item_descr = '';
178                         $item_url = html::stripHostURL($item_select);
179                         break;
180                    case 'tags':
181                         $item_select_label = array_search($item_select,$tags_combo);
182                         if ($item_select == '-') {
183                              $item_label = __('All tags');
184                              $item_descr = '';
185                              $item_url .= $core->url->getURLFor('tags');
186                         } else {
187                              $item_label = $item_select_label;
188                              $item_descr = sprintf(__('Recent posts for %s tag'),$item_select_label);
189                              $item_url .= $core->url->getURLFor('tag',$item_select);
190                         }
191                         break;
192                    case 'special':
193                         break;
194                    default:
195                         # --BEHAVIOR-- adminSimpleMenuBeforeEdit
196                         # Should modify if necessary $item_label, $item_descr and $item_url
197                         # Should set if necessary $item_select_label (displayed on further admin step only)
198                         $core->callBehavior('adminSimpleMenuBeforeEdit',$item_type,$item_select,
199                              array(&$item_label,&$item_descr,&$item_url,&$item_select_label));
200                         break;
201               }
202               break;
203          case 4:
204               // Fourth step, menu item to be added
205               try {
206                    if (($item_label != '') && ($item_url != ''))
207                    {
208                         // Add new item menu in menu array
209                         $menu[] = array(
210                              'label' => $item_label,
211                              'descr' => $item_descr,
212                              'url' => $item_url
213                         );
214                         // Save menu in blog settings
215                         $core->blog->settings->system->put('simpleMenu',serialize($menu));
216                         $core->blog->triggerBlog();
217
218                         // All done successfully, return to menu items list
219                         dcPage::addSuccessNotice(__('Menu item has been successfully added.'));
220                         http::redirect($p_url);
221                    } else {
222                         $step = 3;
223                         $item_select_label = $item_label;
224                         dcPage::addErrorNotice(__('Label and URL of menu item are mandatory.'));
225                    }
226               }
227               catch (Exception $e) {
228                    $core->error->add($e->getMessage());
229               }
230               break;
231     }
232} else {
233
234     # Remove selected menu items
235     if (!empty($_POST['removeaction']))
236     {
237          try {
238               if (!empty($_POST['items_selected'])) {
239                    foreach ($_POST['items_selected'] as $k => $v) {
240                         $menu[$v]['label'] = '';
241                    }
242                    $newmenu = array();
243                    foreach ($menu as $k => $v) {
244                         if ($v['label']) {
245                              $newmenu[] = array(
246                                   'label' => $v['label'],
247                                   'descr' => $v['descr'],
248                                   'url' => $v['url']);
249                         }
250                    }
251                    $menu = $newmenu;
252                    // Save menu in blog settings
253                    $core->blog->settings->system->put('simpleMenu',serialize($menu));
254                    $core->blog->triggerBlog();
255
256                    // All done successfully, return to menu items list
257                    dcPage::addSuccessNotice(__('Menu items have been successfully removed.'));
258                    http::redirect($p_url);
259               } else {
260                    throw new Exception(__('No menu items selected.'));
261               }
262          }
263          catch (Exception $e) {
264               $core->error->add($e->getMessage());
265          }
266     }
267
268     # Update menu items
269     if (!empty($_POST['updateaction']))
270     {
271          try {
272               foreach ($_POST['items_label'] as $k => $v) {
273                    if (!$v) throw new Exception(__('Label is mandatory.'));
274               }
275               foreach ($_POST['items_url'] as $k => $v) {
276                    if (!$v) throw new Exception(__('URL is mandatory.'));
277               }
278               $newmenu = array();
279               for ($i = 0; $i < count($_POST['items_label']); $i++)
280               {
281                    $newmenu[] = array(
282                         'label' => $_POST['items_label'][$i],
283                         'descr' => $_POST['items_descr'][$i],
284                         'url' => $_POST['items_url'][$i]);
285               }
286               $menu = $newmenu;
287               // Save menu in blog settings
288               $core->blog->settings->system->put('simpleMenu',serialize($menu));
289               $core->blog->triggerBlog();
290
291               // All done successfully, return to menu items list
292               dcPage::addSuccessNotice(__('Menu items have been successfully updated.'));
293               http::redirect($p_url);
294          }
295          catch (Exception $e) {
296               $core->error->add($e->getMessage());
297          }
298     }
299
300     # Order menu items
301     $order = array();
302     if (empty($_POST['im_order']) && !empty($_POST['order'])) {
303          $order = $_POST['order'];
304          asort($order);
305          $order = array_keys($order);
306     } elseif (!empty($_POST['im_order'])) {
307          $order = $_POST['im_order'];
308          if (substr($order,-1) == ',') {
309               $order = substr($order,0,strlen($order)-1);
310          }
311          $order = explode(',',$order);
312     }
313
314     if (!empty($_POST['updateaction']) && !empty($order))
315     {
316          try {
317               $newmenu = array();
318               foreach ($order as $i => $k) {
319                    $newmenu[] = array(
320                         'label' => $menu[$k]['label'],
321                         'descr' => $menu[$k]['descr'],
322                         'url' => $menu[$k]['url']);
323               }
324               $menu = $newmenu;
325               // Save menu in blog settings
326               $core->blog->settings->system->put('simpleMenu',serialize($menu));
327               $core->blog->triggerBlog();
328
329               // All done successfully, return to menu items list
330               dcPage::addSuccessNotice(__('Menu items have been successfully updated.'));
331               http::redirect($p_url);
332          }
333          catch (Exception $e) {
334               $core->error->add($e->getMessage());
335          }
336     }
337
338}
339
340# Display
341?>
342
343<html>
344<head>
345     <title><?php echo $page_title; ?></title>
346     <?php
347          $core->auth->user_prefs->addWorkspace('accessibility');
348          if (!$core->auth->user_prefs->accessibility->nodragdrop) {
349               echo
350                    dcPage::jsLoad('js/jquery/jquery-ui.custom.js').
351                    dcPage::jsLoad('js/jquery/jquery.ui.touch-punch.js').
352                    dcPage::jsLoad('index.php?pf=simpleMenu/simplemenu.js');
353          }
354          echo dcPage::jsConfirmClose('additem','menuitems');
355     ?>
356</head>
357
358<body>
359
360<?php
361
362if ($step) {
363     switch ($step) {
364          case 1:
365               $step_label = __('Step #1');
366               break;
367          case 2:
368               if ($items[$item_type][1]) {
369                    $step_label = __('Step #2');
370                    break;
371               }
372          case 3:
373               if ($items[$item_type][1]) {
374                    $step_label = __('Step #3');
375               } else {
376                    $step_label = __('Step #2');
377               }
378               break;
379     }
380     echo dcPage::breadcrumb(
381          array(
382               html::escapeHTML($core->blog->name) => '',
383               $page_title => $p_url,
384               __('Add item') => '',
385               $step_label => ''
386          ),
387          array(
388               'hl_pos' => -2)
389     ).
390     dcPage::notices();
391} else {
392     echo dcPage::breadcrumb(
393          array(
394               html::escapeHTML($core->blog->name) => '',
395               $page_title => ''
396          )).
397          dcPage::notices();
398}
399if ($step)
400{
401     // Formulaire d'ajout d'un item
402     switch ($step) {
403          case 1:
404               // Selection du type d'item
405               echo '<form id="additem" action="'.$p_url.'&amp;add=2" method="post">';
406               echo '<fieldset><legend>'.__('Select type').'</legend>';
407               echo '<p class="field"><label for="item_type" class="classic">'.__('Type of item menu:').'</label>'.form::combo('item_type',$items_combo,'').'</p>';
408               echo '<p>'.$core->formNonce().'<input type="submit" name="appendaction" value="'.__('Continue...').'" />'.'</p>';
409               echo '</fieldset>';
410               echo '</form>';
411               break;
412          case 2:
413               if ($items[$item_type][1]) {
414                    // Choix à faire
415                    echo '<form id="additem" action="'.$p_url.'&amp;add=3" method="post">';
416                    echo '<fieldset><legend>'.$item_type_label.'</legend>';
417                    switch ($item_type) {
418                         case 'lang':
419                              echo '<p class="field"><label for="item_select" class="classic">'.__('Select language:').'</label>'.
420                                   form::combo('item_select',$langs_combo,'');
421                              break;
422                         case 'category':
423                              echo '<p class="field"><label for="item_select" class="classic">'.__('Select category:').'</label>'.
424                                   form::combo('item_select',$categories_combo,'');
425                              break;
426                         case 'archive':
427                              echo '<p class="field"><label for="item_select" class="classic">'.__('Select month (if necessary):').'</label>'.
428                                   form::combo('item_select',$months_combo,'');
429                              break;
430                         case 'pages':
431                              echo '<p class="field"><label for="item_select" class="classic">'.__('Select page:').'</label>'.
432                                   form::combo('item_select',$pages_combo,'');
433                              break;
434                         case 'tags':
435                              echo '<p class="field"><label for="item_select" class="classic">'.__('Select tag (if necessary):').'</label>'.
436                                   form::combo('item_select',$tags_combo,'');
437                              break;
438                         default:
439                              echo
440                                   # --BEHAVIOR-- adminSimpleMenuSelect
441                                   # Optional step once $item_type known : should provide a field using 'item_select' as id
442                                   $core->callBehavior('adminSimpleMenuSelect',$item_type,'item_select');
443                    }
444                    echo form::hidden('item_type',$item_type);
445                    echo '<p>'.$core->formNonce().'<input type="submit" name="appendaction" value="'.__('Continue...').'" /></p>';
446                    echo '</fieldset>';
447                    echo '</form>';
448                    break;
449               }
450          case 3:
451               // Libellé et description
452               echo '<form id="additem" action="'.$p_url.'&amp;add=4" method="post">';
453               echo '<fieldset><legend>'.$item_type_label.($item_select_label != '' ? ' ('.$item_select_label.')' : '').'</legend>';
454               echo '<p class="field"><label for="item_label" class="classic required"><abbr title="'.__('Required field').'">*</abbr> '.
455                    __('Label of item menu:').'</label>'.form::field('item_label',20,255,$item_label).'</p>';
456               echo '<p class="field"><label for="item_descr" class="classic">'.
457                    __('Description of item menu:').'</label>'.form::field('item_descr',30,255,$item_descr).'</p>';
458               echo '<p class="field"><label for="item_url" class="classic required"><abbr title="'.__('Required field').'">*</abbr> '.
459                    __('URL of item menu:').'</label>'.form::field('item_url',40,255,$item_url).'</p>';
460               echo form::hidden('item_type',$item_type).form::hidden('item_select',$item_select);
461               echo '<p>'.$core->formNonce().'<input type="submit" name="appendaction" value="'.__('Add this item').'" /></p>';
462               echo '</fieldset>';
463               echo '</form>';
464               break;
465     }
466}
467
468// Liste des items
469if (!$step) {
470     echo '<form id="menuitemsappend" action="'.$p_url.'&amp;add=1" method="post">';
471     echo '<p class="top-add">'.$core->formNonce().'<input class="button add" type="submit" name="appendaction" value="'.__('Add an item').'" /></p>';
472     echo '</form>';
473}
474
475if (count($menu)) {
476     if (!$step) {
477          echo '<form id="menuitems" action="'.$p_url.'" method="post">';
478     }
479     // Entête table
480     echo
481          '<div class="table-outer">'.
482          '<table class="dragable">'.
483          '<caption>'.__('Menu items list').'</caption>'.
484          '<thead>'.
485          '<tr>';
486     if (!$step) {
487          echo '<th scope="col"></th>';
488          echo '<th scope="col"></th>';
489     }
490     echo
491          '<th scope="col">'.__('Label').'</th>'.
492          '<th scope="col">'.__('Description').'</th>'.
493          '<th scope="col">'.__('URL').'</th>'.
494          '</tr>'.
495          '</thead>'.
496          '<tbody'.(!$step ? ' id="menuitemslist"' : '').'>';
497     $count = 0;
498     foreach ($menu as $i => $m) {
499          echo '<tr class="line" id="l_'.$i.'">';
500          if (!$step) {
501               $count++;
502               echo '<td class="handle minimal">'.
503                    form::field(array('order['.$i.']'),2,3,$count,'position','',false,'title="'.sprintf(__('position of %s'),html::escapeHTML(__($m['label']))).'"').
504                    form::hidden(array('dynorder[]','dynorder-'.$i),$i).'</td>';
505               echo '<td class="minimal">'.form::checkbox(array('items_selected[]','ims-'.$i),$i).'</td>';
506               echo '<td class="nowrap" scope="row">'.form::field(array('items_label[]','iml-'.$i),'',255,html::escapeHTML(__($m['label']))).'</td>';
507               echo '<td class="nowrap">'.form::field(array('items_descr[]','imd-'.$i),'30',255,html::escapeHTML(__($m['descr']))).'</td>';
508               echo '<td class="nowrap">'.form::field(array('items_url[]','imu-'.$i),'30',255,html::escapeHTML($m['url'])).'</td>';
509          } else {
510               echo '<td class="nowrap" scope="row">'.html::escapeHTML(__($m['label'])).'</td>';
511               echo '<td class="nowrap">'.html::escapeHTML(__($m['descr'])).'</td>';
512               echo '<td class="nowrap">'.html::escapeHTML($m['url']).'</td>';
513          }
514          echo '</tr>';
515     }
516     echo '</tbody>'.
517          '</table></div>';
518     if (!$step) {
519          echo '<div class="two-cols">';
520          echo '<p class="col">'.form::hidden('im_order','').$core->formNonce();
521          echo '<input type="submit" name="updateaction" value="'.__('Update menu').'" />'.'</p>';
522          echo '<p class="col right">'.'<input type="submit" class="delete" name="removeaction" '.
523                    'value="'.__('Delete selected menu items').'" '.
524                    'onclick="return window.confirm(\''.html::escapeJS(__('Are you sure you want to remove selected menu items?')).'\');" />'.
525               '</p>';
526          echo '</div>';
527          echo '</form>';
528     }
529} else {
530     echo
531          '<p>'.__('No menu items so far.').'</p>';
532}
533
534dcPage::helpBlock('simpleMenu');
535?>
536
537</body>
538</html>
Note: See TracBrowser for help on using the repository browser.

Sites map