summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Marien Fressinaud <dev@marienfressinaud.fr> 2013-06-15 16:42:50 +0200
committerGravatar Marien Fressinaud <dev@marienfressinaud.fr> 2013-06-15 16:42:50 +0200
commitfafddf2a20748cdbda1f974338528c8e488f4b11 (patch)
treea81d7ff4049a8d2a54f9d125e0e91d7ab26ac507
parent1863153b966af00078869b6634df1daa22cdcbfe (diff)
Fix issue #73 : ajout d'une page pour visualiser les logs
-rw-r--r--app/App_FrontController.php1
-rwxr-xr-xapp/controllers/indexController.php26
-rw-r--r--app/i18n/en.php3
-rw-r--r--app/i18n/fr.php3
-rw-r--r--app/layout/header.phtml1
-rw-r--r--app/models/Log.php47
-rwxr-xr-xapp/views/helpers/logs_pagination.phtml47
-rw-r--r--app/views/index/logs.phtml21
-rwxr-xr-xlib/minz/View.php2
-rwxr-xr-xlib/minz/dao/Model_txt.php2
-rw-r--r--public/theme/freshrss.css44
11 files changed, 194 insertions, 3 deletions
diff --git a/app/App_FrontController.php b/app/App_FrontController.php
index 5729a115d..637d61206 100644
--- a/app/App_FrontController.php
+++ b/app/App_FrontController.php
@@ -36,6 +36,7 @@ class App_FrontController extends FrontController {
include (APP_PATH . '/models/Entry.php');
include (APP_PATH . '/models/EntriesGetter.php');
include (APP_PATH . '/models/RSSPaginator.php');
+ include (APP_PATH . '/models/Log.php');
}
private function loadParamsView () {
diff --git a/app/controllers/indexController.php b/app/controllers/indexController.php
index 5403b82ed..3f10720c2 100755
--- a/app/controllers/indexController.php
+++ b/app/controllers/indexController.php
@@ -139,6 +139,32 @@ class indexController extends ActionController {
View::prependTitle (Translate::t ('about') . ' - ');
}
+ public function logsAction () {
+ if (login_is_conf ($this->view->conf) && !is_logged ()) {
+ Error::error (
+ 403,
+ array ('error' => array (Translate::t ('access_denied')))
+ );
+ }
+
+ View::prependTitle (Translate::t ('see_logs') . ' - ');
+
+ $logs = array();
+ try {
+ $logDAO = new LogDAO ();
+ $logs = $logDAO->lister ();
+ $logs = array_reverse ($logs);
+ } catch(FileNotExistException $e) {
+
+ }
+
+ //gestion pagination
+ $page = Request::param ('page', 1);
+ $this->view->logsPaginator = new Paginator ($logs);
+ $this->view->logsPaginator->_nbItemsPerPage (50);
+ $this->view->logsPaginator->_currentPage ($page);
+ }
+
public function loginAction () {
$this->view->_useLayout (false);
diff --git a/app/i18n/en.php b/app/i18n/en.php
index 0d0ab5269..dbb6b1bfe 100644
--- a/app/i18n/en.php
+++ b/app/i18n/en.php
@@ -186,6 +186,9 @@ return array (
'credits' => 'Credits',
'credits_content' => 'Some design elements come from <a href="http://twitter.github.io/bootstrap/">Bootstrap</a> although FreshRSS doesn\'t use this framework. <a href="https://git.gnome.org/browse/gnome-icon-theme-symbolic">Icons</a> come from <a href="https://www.gnome.org/">GNOME project</a>. <em>Open Sans</em> font police used has been created by <a href="https://www.google.com/webfonts/specimen/Open+Sans">Steve Matteson</a>. Favicons are collected with <a href="https://getfavicon.appspot.com/">getFavicon API</a>. FreshRSS is based on <a href="https://github.com/marienfressinaud/MINZ">Minz</a>, a PHP framework.',
+ 'logs' => 'Logs',
+ 'logs_empty' => 'Log file is empty',
+
// DATE
'january' => 'january',
'february' => 'february',
diff --git a/app/i18n/fr.php b/app/i18n/fr.php
index 97e36f923..75a76cc7a 100644
--- a/app/i18n/fr.php
+++ b/app/i18n/fr.php
@@ -186,6 +186,9 @@ return array (
'credits' => 'Crédits',
'credits_content' => 'Des éléments de design sont issus du <a href="http://twitter.github.io/bootstrap/">projet Bootstrap</a> bien que FreshRSS n\'utilise pas ce framework. Les <a href="https://git.gnome.org/browse/gnome-icon-theme-symbolic">icônes</a> sont issues du <a href="https://www.gnome.org/">projet GNOME</a>. La police <em>Open Sans</em> utilisée a été créée par <a href="https://www.google.com/webfonts/specimen/Open+Sans">Steve Matteson</a>. Les favicons sont récupérés grâce au site <a href="https://getfavicon.appspot.com/">getFavicon</a>. FreshRSS repose sur <a href="https://github.com/marienfressinaud/MINZ">Minz</a>, un framework PHP.',
+ 'logs' => 'Logs',
+ 'logs_empty' => 'Les logs sont vides',
+
// DATE
'january' => 'janvier',
'february' => 'février',
diff --git a/app/layout/header.phtml b/app/layout/header.phtml
index 2e84f7f4d..4131f8687 100644
--- a/app/layout/header.phtml
+++ b/app/layout/header.phtml
@@ -54,6 +54,7 @@
<li class="item"><a href="<?php echo _url ('configure', 'shortcut'); ?>"><?php echo Translate::t ('shortcuts'); ?></a></li>
<li class="separator"></li>
<li class="item"><a href="<?php echo _url ('index', 'about'); ?>"><?php echo Translate::t ('about'); ?></a></li>
+ <li class="item"><a href="<?php echo _url ('index', 'logs'); ?>"><?php echo Translate::t ('logs'); ?></a></li>
</ul>
</div>
</div>
diff --git a/app/models/Log.php b/app/models/Log.php
new file mode 100644
index 000000000..5c280fa7a
--- /dev/null
+++ b/app/models/Log.php
@@ -0,0 +1,47 @@
+<?php
+
+class Log_Model extends Model {
+ private $date;
+ private $level;
+ private $information;
+
+ public function date () {
+ return $this->date;
+ }
+ public function level () {
+ return $this->level;
+ }
+ public function info () {
+ return $this->information;
+ }
+ public function _date ($date) {
+ $this->date = $date;
+ }
+ public function _level ($level) {
+ $this->level = $level;
+ }
+ public function _info ($information) {
+ $this->information = $information;
+ }
+}
+
+class LogDAO extends Model_txt {
+ public function __construct () {
+ parent::__construct (LOG_PATH . '/application.log', 'r+');
+ }
+
+ public function lister () {
+ $logs = array ();
+
+ $i = 0;
+ while (($line = $this->readLine ()) !== false) {
+ $logs[$i] = new Log_Model ();
+ $logs[$i]->_date (preg_replace ("'\[(.*?)\] \[(.*?)\] --- (.*?)'U", "\\1", $line));
+ $logs[$i]->_level (preg_replace ("'\[(.*?)\] \[(.*?)\] --- (.*?)'U", "\\2", $line));
+ $logs[$i]->_info (preg_replace ("'\[(.*?)\] \[(.*?)\] --- (.*?)'U", "\\3", $line));
+ $i++;
+ }
+
+ return $logs;
+ }
+} \ No newline at end of file
diff --git a/app/views/helpers/logs_pagination.phtml b/app/views/helpers/logs_pagination.phtml
new file mode 100755
index 000000000..0088dabc6
--- /dev/null
+++ b/app/views/helpers/logs_pagination.phtml
@@ -0,0 +1,47 @@
+<?php
+ $c = Request::controllerName ();
+ $a = Request::actionName ();
+ $params = Request::params ();
+?>
+
+<?php if ($this->nbPage > 1) { ?>
+<ul class="pagination">
+ <?php $params[$getteur] = 1; ?>
+ <li class="item pager-first">
+ <?php if ($this->currentPage > 1) { ?>
+ <a href="<?php echo Url::display (array ('c' => $c, 'a' => $a, 'params' => $params)); ?>">« Début</a>
+ <?php } ?>
+ </li>
+
+ <?php $params[$getteur] = $this->currentPage - 1; ?>
+ <li class="item pager-previous">
+ <?php if ($this->currentPage > 1) { ?>
+ <a href="<?php echo Url::display (array ('c' => $c, 'a' => $a, 'params' => $params)); ?>">‹ Précédent</a>
+ <?php } ?>
+ </li>
+
+ <?php for ($i = $this->currentPage - 2; $i <= $this->currentPage + 2; $i++) { ?>
+ <?php if($i > 0 && $i <= $this->nbPage) { ?>
+ <?php if ($i != $this->currentPage) { ?>
+ <?php $params[$getteur] = $i; ?>
+ <li class="item pager-item"><a href="<?php echo Url::display (array ('c' => $c, 'a' => $a, 'params' => $params)); ?>"><?php echo $i; ?></a></li>
+ <?php } else { ?>
+ <li class="item pager-current"><?php echo $i; ?></li>
+ <?php } ?>
+ <?php } ?>
+ <?php } ?>
+
+ <?php $params[$getteur] = $this->currentPage + 1; ?>
+ <li class="item pager-next">
+ <?php if ($this->currentPage < $this->nbPage) { ?>
+ <a href="<?php echo Url::display (array ('c' => $c, 'a' => $a, 'params' => $params)); ?>">Suivant ›</a>
+ <?php } ?>
+ </li>
+ <?php $params[$getteur] = $this->nbPage; ?>
+ <li class="item pager-last">
+ <?php if ($this->currentPage < $this->nbPage) { ?>
+ <a href="<?php echo Url::display (array ('c' => $c, 'a' => $a, 'params' => $params)); ?>">Fin »</a>
+ <?php } ?>
+ </li>
+</ul>
+<?php } ?>
diff --git a/app/views/index/logs.phtml b/app/views/index/logs.phtml
new file mode 100644
index 000000000..c72a84c86
--- /dev/null
+++ b/app/views/index/logs.phtml
@@ -0,0 +1,21 @@
+<div class="post content">
+ <a href="<?php echo _url ('index', 'index'); ?>"><?php echo Translate::t ('back_to_rss_feeds'); ?></a>
+
+ <h1><?php echo Translate::t ('logs'); ?></h1>
+
+ <?php $items = $this->logsPaginator->items (); ?>
+
+ <?php if (!empty ($items)) { ?>
+ <div class="logs">
+ <?php $this->logsPaginator->render ('logs_pagination.phtml', 'page'); ?>
+
+ <?php foreach ($items as $log) { ?>
+ <div class="log <?php echo $log->level (); ?>"><span class="date"><?php echo date ('d/m/Y - H:i:s', strtotime ($log->date ())); ?></span><?php echo $log->info (); ?></div>
+ <?php } ?>
+
+ <?php $this->logsPaginator->render ('logs_pagination.phtml','page'); ?>
+ </div>
+ <?php } else { ?>
+ <p class="alert alert-warn"><?php echo Translate::t ('logs_empty'); ?></p>
+ <?php } ?>
+</div> \ No newline at end of file
diff --git a/lib/minz/View.php b/lib/minz/View.php
index 5c329c159..2bb747aa9 100755
--- a/lib/minz/View.php
+++ b/lib/minz/View.php
@@ -71,7 +71,7 @@ class View {
} else {
Log::record ('File doesn\'t exist : `'
. $this->view_filename . '`',
- Log::WARNING);
+ Log::NOTICE);
}
}
diff --git a/lib/minz/dao/Model_txt.php b/lib/minz/dao/Model_txt.php
index ad15c8b36..c9d5cfe77 100755
--- a/lib/minz/dao/Model_txt.php
+++ b/lib/minz/dao/Model_txt.php
@@ -27,7 +27,7 @@ class Model_txt {
*/
public function __construct ($nameFile, $mode = 'a+') {
$this->filename = $nameFile;
- $this->file = fopen ($this->filename, $mode);
+ $this->file = @fopen ($this->filename, $mode);
if (!$this->file) {
throw new FileNotExistException (
diff --git a/public/theme/freshrss.css b/public/theme/freshrss.css
index f5d4f6a83..4919639af 100644
--- a/public/theme/freshrss.css
+++ b/public/theme/freshrss.css
@@ -349,14 +349,29 @@
}
.pagination .item {
display: table-cell;
- border-top: 1px solid #aaa;
line-height: 40px;
}
+ .pagination .item.pager-current {
+ font-weight: bold;
+ font-size: 140%;
+ }
+ .pagination .item.pager-first,
+ .pagination .item.pager-previous,
+ .pagination .item.pager-next,
+ .pagination .item.pager-last {
+ width: 100px;
+ }
.pagination .item a {
display: block;
color: #333;
font-style: italic;
}
+ .pagination:first-child .item {
+ border-bottom: 1px solid #aaa;
+ }
+ .pagination:last-child .item {
+ border-top: 1px solid #aaa;
+ }
.loading {
background: url("loader.gif") center center no-repeat;
font-size: 0;
@@ -421,6 +436,33 @@
vertical-align: middle;
}
+.logs {
+ border: 1px solid #aaa;
+}
+ .logs .log {
+ padding: 5px 2%;
+ overflow: auto;
+ background: #fafafa;
+ border-bottom: 1px solid #999;
+ color: #333;
+ font-size: 90%;
+ }
+ .logs .log .date {
+ display: block;
+ }
+ .logs .log.error {
+ background: #fdd;
+ color: #844;
+ }
+ .logs .log.warning {
+ background: #ffe;
+ color: #c95;
+ }
+ .logs .log.notice {
+ background: #f4f4f4;
+ color: #aaa;
+ }
+
@media(max-width: 840px) {
.header,
.aside .btn-important,