Dotclear

source: admin/index.php @ 2166:6f409aa25386

Revision 2166:6f409aa25386, 13.9 KB checked in by Dsls, 12 years ago (diff)

revamped dcPage::breadcrumb, closes #1559

RevLine 
[0]1<?php
2# -- BEGIN LICENSE BLOCK ---------------------------------------
3#
4# This file is part of Dotclear 2.
5#
[1179]6# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
[0]7# Licensed under the GPL version 2.0 license.
8# See LICENSE file or
9# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
10#
11# -- END LICENSE BLOCK -----------------------------------------
12
13if (!empty($_GET['pf'])) {
14     require dirname(__FILE__).'/../inc/load_plugin_file.php';
15     exit;
16}
17
18require dirname(__FILE__).'/../inc/admin/prepend.php';
19
20if (!empty($_GET['default_blog'])) {
21     try {
22          $core->setUserDefaultBlog($core->auth->userID(),$core->blog->id);
23          http::redirect('index.php');
24     } catch (Exception $e) {
25          $core->error->add($e->getMessage());
26     }
27}
28
29dcPage::check('usage,contentadmin');
30
31# Logout
32if (!empty($_GET['logout'])) {
33     $core->session->destroy();
34     if (isset($_COOKIE['dc_admin'])) {
35          unset($_COOKIE['dc_admin']);
36          setcookie('dc_admin',false,-600,'','',DC_ADMIN_SSL);
37     }
38     http::redirect('auth.php');
39     exit;
40}
41
42# Plugin install
43$plugins_install = $core->plugins->installModules();
44
[13]45# Check dashboard module prefs
[157]46$ws = $core->auth->user_prefs->addWorkspace('dashboard');
[13]47if (!$core->auth->user_prefs->dashboard->prefExists('doclinks')) {
48     if (!$core->auth->user_prefs->dashboard->prefExists('doclinks',true)) {
49          $core->auth->user_prefs->dashboard->put('doclinks',true,'boolean','',null,true);
50     }
51     $core->auth->user_prefs->dashboard->put('doclinks',true,'boolean');
52}
53if (!$core->auth->user_prefs->dashboard->prefExists('dcnews')) {
54     if (!$core->auth->user_prefs->dashboard->prefExists('dcnews',true)) {
55          $core->auth->user_prefs->dashboard->put('dcnews',true,'boolean','',null,true);
56     }
57     $core->auth->user_prefs->dashboard->put('dcnews',true,'boolean');
58}
59if (!$core->auth->user_prefs->dashboard->prefExists('quickentry')) {
60     if (!$core->auth->user_prefs->dashboard->prefExists('quickentry',true)) {
[1247]61          $core->auth->user_prefs->dashboard->put('quickentry',false,'boolean','',null,true);
[13]62     }
[1247]63     $core->auth->user_prefs->dashboard->put('quickentry',false,'boolean');
[13]64}
65
[1699]66// Handle folded/unfolded sections in admin from user preferences
67$ws = $core->auth->user_prefs->addWorkspace('toggles');
68if (!$core->auth->user_prefs->toggles->prefExists('unfolded_sections')) {
69     $core->auth->user_prefs->toggles->put('unfolded_sections','','string','Folded sections in admin',null,true);
70}
71
72
[0]73# Dashboard icons
74$__dashboard_icons = new ArrayObject();
75
[3]76# Dashboard favorites
[0]77$post_count = $core->blog->getPosts(array(),true)->f(0);
78$str_entries = ($post_count > 1) ? __('%d entries') : __('%d entry');
79
80$comment_count = $core->blog->getComments(array(),true)->f(0);
81$str_comments = ($comment_count > 1) ? __('%d comments') : __('%d comment');
82
[3]83$ws = $core->auth->user_prefs->addWorkspace('favorites');
84$count = 0;
85foreach ($ws->dumpPrefs() as $k => $v) {
86     // User favorites only
87     if (!$v['global']) {
88          $fav = unserialize($v['value']);
89          if (($fav['permissions'] == '*') || $core->auth->check($fav['permissions'],$core->blog->id)) {
[896]90               if (dc_valid_fav($fav['url'])) {
91                    $count++;
92                    $title = ($fav['name'] == 'posts' ? sprintf($str_entries,$post_count) : 
93                         ($fav['name'] == 'comments' ? sprintf($str_comments,$comment_count) : $fav['title']));
94                    $__dashboard_icons[$fav['name']] = new ArrayObject(array(__($title),$fav['url'],$fav['large-icon']));
[130]95
[896]96                    # Let plugins set their own title for favorite on dashboard
97                    $core->callBehavior('adminDashboardFavsIcon',$core,$fav['name'],$__dashboard_icons[$fav['name']]);
98               }
[3]99          }
100     }
101}   
102if (!$count) {
103     // Global favorites if any
104     foreach ($ws->dumpPrefs() as $k => $v) {
105          $fav = unserialize($v['value']);
106          if (($fav['permissions'] == '*') || $core->auth->check($fav['permissions'],$core->blog->id)) {
[896]107               if (dc_valid_fav($fav['url'])) {
108                    $count++;
109                    $title = ($fav['name'] == 'posts' ? sprintf($str_entries,$post_count) : 
110                         ($fav['name'] == 'comments' ? sprintf($str_comments,$comment_count) : $fav['title']));
111                    $__dashboard_icons[$fav['name']] = new ArrayObject(array(__($title),$fav['url'],$fav['large-icon']));
[130]112
[896]113                    # Let plugins set their own title for favorite on dashboard
114                    $core->callBehavior('adminDashboardFavsIcon',$core,$fav['name'],$__dashboard_icons[$fav['name']]);
115               }
[3]116          }
117     }
[0]118}
[3]119if (!$count) {
120     // No user or global favorites, add "user pref" and "new entry" fav
121     if ($core->auth->check('usage,contentadmin',$core->blog->id)) {
122          $__dashboard_icons['new_post'] = new ArrayObject(array(__('New entry'),'post.php','images/menu/edit-b.png'));
123     }
124     $__dashboard_icons['prefs'] = new ArrayObject(array(__('My preferences'),'preferences.php','images/menu/user-pref-b.png'));
125}
[0]126
127# Latest news for dashboard
128$__dashboard_items = new ArrayObject(array(new ArrayObject,new ArrayObject));
129
[13]130$dashboardItem = 0;
[0]131
[13]132if ($core->auth->user_prefs->dashboard->dcnews) {
133     try
134     {
135          if (empty($__resources['rss_news'])) {
136               throw new Exception();
137          }
138     
139          $feed_reader = new feedReader;
140          $feed_reader->setCacheDir(DC_TPL_CACHE);
141          $feed_reader->setTimeout(2);
142          $feed_reader->setUserAgent('Dotclear - http://www.dotclear.org/');
143          $feed = $feed_reader->parse($__resources['rss_news']);
144          if ($feed)
145          {
[2085]146               $latest_news = '<div class="box medium dc-box"><h3>'.__('Dotclear news').'</h3><dl id="news">';
[13]147               $i = 1;
148               foreach ($feed->items as $item)
149               {
[1728]150                    $dt = isset($item->link) ? '<a href="'.$item->link.'" title="'.$item->title.' ('.__('new window').')">'.
151                         $item->title.' <img src="images/outgoing-blue.png" alt="" /></a>' : $item->title;
[13]152               
153                    if ($i < 3) {
154                         $latest_news .=
155                         '<dt>'.$dt.'</dt>'.
[1000]156                         '<dd><p><strong>'.dt::dt2str(__('%d %B %Y:'),$item->pubdate,'Europe/Paris').'</strong> '.
[13]157                         '<em>'.text::cutString(html::clean($item->content),120).'...</em></p></dd>';
158                    } else {
159                         $latest_news .=
160                         '<dt>'.$dt.'</dt>'.
[1000]161                         '<dd>'.dt::dt2str(__('%d %B %Y:'),$item->pubdate,'Europe/Paris').'</dd>';
[13]162                    }
163                    $i++;
[1788]164                    if ($i > 2) { break; }
[13]165               }
[2085]166               $latest_news .= '</dl></div>';
[13]167               $__dashboard_items[$dashboardItem][] = $latest_news;
168               $dashboardItem++;
169          }
[0]170     }
[13]171     catch (Exception $e) {}
[0]172}
173
[1378]174# Documentation links
175if ($core->auth->user_prefs->dashboard->doclinks) {
176     if (!empty($__resources['doc']))
177     {
[2085]178          $doc_links = '<div class="box small dc-box"><h3>'.__('Documentation and support').'</h3><ul>';
[1378]179     
180          foreach ($__resources['doc'] as $k => $v) {
[1728]181               $doc_links .= '<li><a href="'.$v.'" title="'.$k.' ('.__('new window').')">'.$k.
182               ' <img src="images/outgoing-blue.png" alt="" /></a></li>';
[1378]183          }
184     
[2085]185          $doc_links .= '</ul></div>';
[1378]186          $__dashboard_items[$dashboardItem][] = $doc_links;
187          $dashboardItem++;
188     }
189}
190
[0]191$core->callBehavior('adminDashboardItems', $core, $__dashboard_items);
192
[480]193# Dashboard content
194$dashboardContents = '';
195$__dashboard_contents = new ArrayObject(array(new ArrayObject,new ArrayObject));
196$core->callBehavior('adminDashboardContents', $core, $__dashboard_contents);
197
[0]198/* DISPLAY
199-------------------------------------------------------- */
200dcPage::open(__('Dashboard'),
201     dcPage::jsToolBar().
202     dcPage::jsLoad('js/_index.js').
203     # --BEHAVIOR-- adminDashboardHeaders
[1358]204     $core->callBehavior('adminDashboardHeaders'),
205     dcPage::breadcrumb(
206          array(
[2166]207          __('Dashboard').' : '.html::escapeHTML($core->blog->name) => ''
[1358]208          ),
[2166]209          array('home_link' =>false)
210     )
[0]211);
212
[1422]213# Dotclear updates notifications
214if ($core->auth->isSuperAdmin() && is_readable(DC_DIGESTS))
215{
216     $updater = new dcUpdate(DC_UPDATE_URL,'dotclear',DC_UPDATE_VERSION,DC_TPL_CACHE.'/versions');
217     $new_v = $updater->check(DC_VERSION);
218     $version_info = $new_v ? $updater->getInfoURL() : '';
219
220     if ($updater->getNotify() && $new_v) {
[1697]221          echo
[1698]222          '<div class="dc-update"><h3>'.sprintf(__('Dotclear %s is available!'),$new_v).'</h3> '.
[1697]223          '<p><a class="button submit" href="update.php">'.sprintf(__('Upgrade now'),$new_v).'</a> '.
[1811]224          '<a class="button" href="update.php?hide_msg=1">'.__('Remind me later').'</a>'.
[1697]225          ($version_info ? ' </p>'.
[1811]226          '<p class="updt-info"><a href="'.$version_info.'">'.__('Information about this version').'</a>' : '').'</p>'.
[1697]227          '</div>';
[1422]228     }
229}
[0]230
[2159]231if ($core->auth->getInfo('user_default_blog') != $core->blog->id && $core->auth->getBlogCount() > 1) {
[0]232     echo
[510]233     '<p><a href="index.php?default_blog=1" class="button">'.__('Make this blog my default blog').'</a></p>';
[0]234}
235
236if ($core->blog->status == 0) {
[1558]237     echo '<p class="static-msg">'.__('This blog is offline').'.</p>';
[0]238} elseif ($core->blog->status == -1) {
[1558]239     echo '<p class="static-msg">'.__('This blog is removed').'.</p>';
[0]240}
241
[374]242if (!defined('DC_ADMIN_URL') || !DC_ADMIN_URL) {
[0]243     echo
244     '<p class="static-msg">'.
[1077]245     sprintf(__('%s is not defined, you should edit your configuration file.'),'DC_ADMIN_URL').
246     ' '.__('See <a href="http://dotclear.org/documentation/2.0/admin/config">documentation</a> for more information.').
[373]247     '</p>';
248}
249
[374]250if (!defined('DC_ADMIN_MAILFROM') || !DC_ADMIN_MAILFROM) {
[373]251     echo
252     '<p class="static-msg">'.
[1077]253     sprintf(__('%s is not defined, you should edit your configuration file.'),'DC_ADMIN_MAILFROM').
254     ' '.__('See <a href="http://dotclear.org/documentation/2.0/admin/config">documentation</a> for more information.').
[0]255     '</p>';
256}
257
[1535]258$err = array();
259
260# Check cache directory
[1705]261if ( $core->auth->isSuperAdmin() ) {
262     if (!is_dir(DC_TPL_CACHE) || !is_writable(DC_TPL_CACHE)) {
[1708]263          $err[] = '<p>'.__("The cache directory does not exist or is not writable. You must create this directory with sufficient rights and affect this location to \"DC_TPL_CACHE\" in inc/config.php file.").'</p>';
[1705]264     }
265} else {
266     if (!is_dir(DC_TPL_CACHE) || !is_writable(DC_TPL_CACHE)) {
[1708]267          $err[] = '<p>'.__("The cache directory does not exist or is not writable. You should contact your administrator.").'</p>';
[1705]268     }
[1535]269}
270
271# Check public directory
[1705]272if ( $core->auth->isSuperAdmin() ) {
273     if (!is_dir($core->blog->public_path) || !is_writable($core->blog->public_path)) {
[1708]274          $err[] = '<p>'.__("There is no writable directory /public/ at the location set in about:config \"public_path\". You must create this directory with sufficient rights (or change this setting).").'</p>';
[1705]275     }
276} else {
277     if (!is_dir($core->blog->public_path) || !is_writable($core->blog->public_path)) {
[1708]278          $err[] = '<p>'.__("There is no writable root directory for the media manager. You should contact your administrator.").'</p>';
[1705]279     }
[1535]280}
281
282# Error list
283if (count($err) > 0) {
284     echo '<div class="error"><p><strong>Erreur&nbsp;:</strong></p>'.
285     '<ul><li>'.implode("</li><li>",$err).'</li></ul></div>';
286}
287
[0]288# Plugins install messages
289if (!empty($plugins_install['success']))
290{
[2116]291     echo '<div class="success">'.__('Following plugins have been installed:').'<ul>';
[0]292     foreach ($plugins_install['success'] as $k => $v) {
293          echo '<li>'.$k.'</li>';
294     }
295     echo '</ul></div>';
296}
297if (!empty($plugins_install['failure']))
298{
299     echo '<div class="error">'.__('Following plugins have not been installed:').'<ul>';
300     foreach ($plugins_install['failure'] as $k => $v) {
301          echo '<li>'.$k.' ('.$v.')</li>';
302     }
303     echo '</ul></div>';
304}
[112]305# Errors modules notifications
306if ($core->auth->isSuperAdmin())
307{
308     $list = array();
309     foreach ($core->plugins->getErrors() as $k => $error) {
310          $list[] = '<li>'.$error.'</li>';
311     }
312     
313     if (count($list) > 0) {
[1729]314          echo 
315          '<div class="error" id="module-errors" class="error"><p>'.__('Some plugins are installed twice:').'</p> '.
[112]316          '<ul>'.implode("\n",$list).'</ul></div>';
317     }
318}
319
[1729]320# Dashboard columns (processed first, as we need to know the result before displaying the icons.)
321$dashboardItems = '';
322
[112]323foreach ($__dashboard_items as $i)
324{   
325     if ($i->count() > 0)
326     {
[2085]327          $dashboardItems .= '';
[112]328          foreach ($i as $v) {
329               $dashboardItems .= $v;
330          }
[2085]331          $dashboardItems .= '';
[112]332     }
333}
334
[2116]335# Dashboard elements
336echo '<div id="dashboard-main">';
337
[0]338# Dashboard icons
[2116]339echo '<div id="icons">';
[0]340foreach ($__dashboard_icons as $i)
341{
342     echo
[691]343     '<p><a href="'.$i[1].'"><img src="'.dc_admin_icon_url($i[2]).'" alt="" />'.
[471]344     '<br /><span>'.$i[0].'</span></a></p>';
[0]345}
346echo '</div>';
347
[13]348if ($core->auth->user_prefs->dashboard->quickentry) {
349     if ($core->auth->check('usage,contentadmin',$core->blog->id))
350     {
[1391]351          # Getting categories
[1719]352          $categories_combo = dcAdminCombos::getCategoriesCombo(
353               $core->blog->getCategories(array('post_type'=>'post'))
354          );
[1247]355     
[13]356          echo
357          '<div id="quick">'.
358          '<h3>'.__('Quick entry').'</h3>'.
[1499]359          '<form id="quick-entry" action="post.php" method="post" class="fieldset">'.
360          '<h4>'.__('New entry').'</h4>'.
[1399]361          '<p class="col"><label for="post_title" class="required"><abbr title="'.__('Required field').'">*</abbr> '.__('Title:').'</label>'.
[454]362          form::field('post_title',20,255,'','maximal').
[1399]363          '</p>'.
[45]364          '<p class="area"><label class="required" '.
365          'for="post_content"><abbr title="'.__('Required field').'">*</abbr> '.__('Content:').'</label> '.
[454]366          form::textarea('post_content',50,7).
[13]367          '</p>'.
[1521]368          '<p><label for="cat_id" class="classic">'.__('Category:').'</label> '.
369          form::combo('cat_id',$categories_combo).'</p>'.
[1418]370          ($core->auth->check('categories', $core->blog->id)
371               ? '<div>'.
[1521]372               '<p id="new_cat" class="q-cat">'.__('Add a new category').'</p>'.
373               '<p class="q-cat"><label for="new_cat_title">'.__('Title:').'</label> '.
374               form::field('new_cat_title',30,255,'','').'</p>'.
375               '<p class="q-cat"><label for="new_cat_parent">'.__('Parent:').'</label> '.
376               form::combo('new_cat_parent',$categories_combo,'','').
377               '</p>'.
[1488]378               '<p class="form-note info clear">'.__('This category will be created when you will save your post.').'</p>'.
[1418]379               '</div>'
380               : '').
[454]381          '<p><input type="submit" value="'.__('Save').'" name="save" /> '.
[13]382          ($core->auth->check('publish',$core->blog->id)
[536]383               ? '<input type="hidden" value="'.__('Save and publish').'" name="save-publish" />'
[13]384               : '').
385          $core->formNonce().
386          form::hidden('post_status',-2).
387          form::hidden('post_format',$core->auth->getOption('post_format')).
388          form::hidden('post_excerpt','').
389          form::hidden('post_lang',$core->auth->getInfo('user_lang')).
390          form::hidden('post_notes','').
391          '</p>'.
392          '</form>'.
393          '</div>';
394     }
[0]395}
396
[480]397foreach ($__dashboard_contents as $i)
398{   
399     if ($i->count() > 0)
400     {
[2085]401          $dashboardContents .= '';
[480]402          foreach ($i as $v) {
403               $dashboardContents .= $v;
404          }
[2085]405          $dashboardContents .= '';
[480]406     }
407}
[1728]408
409if ($dashboardContents != '' || $dashboardItems != '') {
410     echo 
[2116]411     '<div id="dashboard-boxes">'.
412     '<div class="db-items">'.$dashboardItems.$dashboardContents.'</div>'.
[1728]413     '</div>';     
414}
[480]415
[2116]416echo '</div>'; #end dashboard-main
[0]417
418dcPage::close();
[2116]419?>
Note: See TracBrowser for help on using the repository browser.

Sites map