r4092 new API for dispaying messages (showError, showWarning, showSuccess)
authorAlexey Andriyanov <alan@al-an.info>
Tue, 11 Jan 2011 07:50:30 +0000 (07:50 +0000)
committerAlexey Andriyanov <alan@al-an.info>
Tue, 11 Jan 2011 07:50:30 +0000 (07:50 +0000)
index.php:
 merged together all HTML layout
 added output buffering to collect all the messages before the HTML layout rendering

process.php:
 used new functions instead of oneLiner.
 added logic to redirect to the submit form page when ophandler returns NULL

render_image.php:
 changed old showError calls to the calls of new one

inc/interface.php:
 showTabs: removed surrounding <td>'s from the output
 renderObject8021QSync: changed old showError calls to the calls of new one
 renderDiscoveredNeighbors: idem

inc/auth.php:
 authenticated_via_ldap: changed old showError calls to the calls of new one

inc/init.php:
 -showError: the old version of the func removed, the new one is implemented in functions.php
 -showWarning: idem

inc/functions.php:
 getCellFilter: changed old showWarning calls to the calls of new one
 buildLVSConfig: idem
 eval_expression: idem
+setMessage: function for rendering or queueing all kinds of messages
+showError, showWarning, showSuccess, showNotice: wrappers around setMessage

upgrade.php:
-showFailure
 changed calls to showFailure to calls to showError
 added dependency on functions.php

inc/ophandlers.php:
 buildWideRedirectURL: now $_SESSION['log'] is merged with $log, not substituted

ChangeLog
inc/auth.php
inc/functions.php
inc/init.php
inc/interface.php
inc/ophandlers.php
index.php
process.php
render_image.php
upgrade.php

index 7e2c7f0..1e9519b 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -21,6 +21,7 @@
        update: selective including of JS and CSS files. No more unneeded js code loaded.
        update: 802.1Q template editor now supports single-submit edit and concerns concurrent submits
        bugfix: the 'Refcnt' counter on Configuration: Dictionary page was sometimes broken (closes mantis:0000381)
+       update: new API for dispaying messages (showError, showWarning, showSuccess)
 0.18.7
        bugfix: adjust 802.1Q command generation
        bugfix: fixed telnet session hanging in NX-OS4 connector
index 02b5c7f..b192795 100644 (file)
@@ -231,7 +231,7 @@ function authenticated_via_ldap ($username, $password, &$ldap_displayname)
                $LDAP_options['cache_refresh'] > $LDAP_options['cache_expiry']
        )
        {
-               showError ('Fatal LDAP configuration error, check secret.php options.', __FUNCTION__);
+               showError ('Fatal LDAP configuration error, check secret.php options.', 'inline');
                die;
        }
        if ($LDAP_options['cache_expiry'] == 0) // immediate expiry set means disabled cache
index ac0a955..5625835 100644 (file)
@@ -1446,7 +1446,7 @@ function getCellFilter ()
                $ret['andor'] = $andor2 = $_REQUEST['andor'];
                break;
        default:
-               showWarning ('Invalid and/or switch value in submitted form', __FUNCTION__);
+               showWarning ('Invalid and/or switch value in submitted form');
                return NULL;
        }
        $andor1 = '';
@@ -1650,7 +1650,7 @@ function buildLVSConfig ($object_id)
        $lbconfig = getSLBConfig ($object_id);
        if ($lbconfig === NULL)
        {
-               showWarning ('getSLBConfig() failed', __FUNCTION__);
+               showWarning ('getSLBConfig() failed');
                return;
        }
        $newconfig = "#\n#\n# This configuration has been generated automatically by RackTables\n";
@@ -2382,7 +2382,7 @@ function eval_expression ($expr, $tagchain, $ptable, $silent = FALSE)
                        if (!isset ($ptable[$pname]))
                        {
                                if (!$silent)
-                                       showWarning ("Predicate '${pname}' is referenced before declaration", __FUNCTION__);
+                                       showWarning ("Predicate '${pname}' is referenced before declaration");
                                return NULL;
                        }
                        return $self ($ptable[$pname], $tagchain, $ptable);
@@ -2408,7 +2408,7 @@ function eval_expression ($expr, $tagchain, $ptable, $silent = FALSE)
                        return $self ($expr['right'], $tagchain, $ptable);
                default:
                        if (!$silent)
-                               showWarning ("Evaluation error, cannot process expression type '${expr['type']}'", __FUNCTION__);
+                               showWarning ("Evaluation error, cannot process expression type '${expr['type']}'");
                        return NULL;
                        break;
        }
@@ -4342,6 +4342,38 @@ function addCSS ($data, $inline = FALSE)
        }
 }
 
+// Messages in the top of the page should be shown using these functions.
+// You can call them multiple times to show multiple messages.
+// $option can be 'inline' to echo message div, instead of putting it into $_SESSION and draw on next index page show
+// These functions always return NULL
+function showError   ($message, $option = '') { setMessage ($message, 'error',   $option == 'inline'); }
+function showWarning ($message, $option = '') { setMessage ($message, 'warning', $option == 'inline'); }
+function showSuccess ($message, $option = '') { setMessage ($message, 'success', $option == 'inline'); }
+function showNotice  ($message, $option = '') { setMessage ($message, 'neutral', $option == 'inline'); }
+
+// do not call this directly, use showError and its siblings instead
+// $type could be 'error', 'warning', 'success' or 'neutral'
+function setMessage ($message, $type, $direct_rendering)
+{
+       if ($direct_rendering)
+               echo '<div class="msg_' . $type . '">' . $message . '</div>';
+       else
+       {
+               if (! isset ($_SESSION['log']['v']))
+                       $_SESSION['log'] = array('v' => 1);
+               switch ($_SESSION['log']['v'])
+               {
+                       case 1:
+                               $_SESSION['log'][] = array ('code' => $type, 'message' => $message);
+                               break;
+                       case 2:
+                               $code = ($type == 'error' ? 100 : $type == 'warning' ? 200 : $type == 'success' ? 0 : NULL);
+                               $_SESSION['log']['m'][] = array ('c' => $code, 'a' => array ($message));
+                               break;
+               }
+       }
+}
+
 function isEthernetPort($port)
 {
        return ($port['iif_id'] != 1 or preg_match('/Base|LACP/i', $port['oif_name']));
index aeb2588..942d79c 100644 (file)
@@ -21,38 +21,6 @@ require_once 'inc/database.php';
 $user_auth_src = 'database';
 $require_local_account = TRUE;
 
-function showError ($info = '', $location = 'N/A')
-{
-       if (preg_match ('/\.php$/', $location))
-               $location = basename ($location);
-       elseif ($location != 'N/A')
-               $location = $location . '()';
-       echo "<div class=msg_error>An error has occured in [${location}]. ";
-       if (!strlen ($info))
-               echo 'No additional information is available.';
-       else
-               echo "Additional information:<br><p>\n<pre>\n${info}\n</pre></p>";
-       echo "Go back or try starting from <a href='".makeHref()."'>index page</a>.<br></div>\n";
-}
-
-/*
- * This is almost a clone of showError(). This is added to get rid of 
- * cases when script dies after showError() is shown.
- */
-
-function showWarning ($info = '', $location = 'N/A')
-{
-       if (preg_match ('/\.php$/', $location))
-               $location = basename ($location);
-       elseif ($location != 'N/A')
-               $location = $location . '()';
-       echo "<div class=msg_error>Warning event at [${location}]. ";
-       if (!strlen ($info))
-               echo 'No additional information is available.';
-       else
-               echo "Additional information:<br><p>\n<pre>\n${info}\n</pre></p>";
-}
-
 // (re)connects to DB, stores PDO object in $dbxlink global var
 function connectDB()
 {
index e8275ec..f0aa9c1 100644 (file)
@@ -1667,6 +1667,9 @@ function renderIPv6ForObject ($object_id)
 
 }
 
+// This function is deprecated. Do not rely on its internals,
+// it will probably be removed in the next major relese.
+// Use new showError, showWarning, showSuccess functions.
 // Log structure versions:
 // 1: the whole structure is a list of code-message pairs
 // 2 and later: there's a "v" field set, which indicates the version
@@ -7174,7 +7177,7 @@ function showTabs ($pageno, $tabno)
        global $tab, $page, $trigger;
        if (!isset ($tab[$pageno]['default']))
                return;
-       echo "<td><div class=greynavbar><ul id=foldertab style='margin-bottom: 0px; padding-top: 10px;'>";
+       echo "<div class=greynavbar><ul id=foldertab style='margin-bottom: 0px; padding-top: 10px;'>";
        foreach ($tab[$pageno] as $tabidx => $tabtitle)
        {
                // Hide forbidden tabs.
@@ -7202,7 +7205,7 @@ function showTabs ($pageno, $tabno)
                
                echo "'>${tabtitle}</a></li>\n";
        }
-       echo "</ul></div></td>\n";
+       echo "</ul></div>";
 }
 
 // Arg is path page number, which can be different from the primary page number,
@@ -8463,7 +8466,7 @@ function renderObject8021QSync ($object_id)
        }
        catch (Exception $re)
        {
-               showWarning ('Device configuration unavailable:<br>' . $re->getMessage(), __FUNCTION__);
+               showWarning ('Device configuration unavailable:<br>' . $re->getMessage());
                return;
        }
        $D = getStored8021QConfig ($vswitch['object_id'], 'desired');
@@ -8964,7 +8967,7 @@ function renderDiscoveredNeighbors ($object_id)
        }
        catch (RTGatewayError $e)
        {
-               showWarning ($e->getMessage(), __FUNCTION__);
+               showWarning ($e->getMessage());
                return;
        }
        $mydevice = spotEntity ('object', $object_id);
index bc5b933..aa5fbb3 100644 (file)
@@ -5,9 +5,13 @@
 *
 */
 
+// This array is deprecated. Please do not add new message constants to it.
+// use the new showError, showWarning, showSuccess functions instead
 $msgcode = array();
 
-function buildWideRedirectURL ($log, $nextpage = NULL, $nexttab = NULL, $moreArgs = array())
+// This function is DEPRECATED. Show messages through showError and showSuccess,
+// you dont need to return anything from an ophandler to redirect user back to the page containing submit form
+function buildWideRedirectURL ($log = NULL, $nextpage = NULL, $nexttab = NULL, $moreArgs = array())
 {
        global $page, $pageno, $tabno;
        if ($nextpage === NULL)
@@ -34,10 +38,48 @@ function buildWideRedirectURL ($log, $nextpage = NULL, $nexttab = NULL, $moreArg
                }
        }
 
-       $_SESSION['log'] = $log;
+       if (! empty ($log))
+       {
+               if (empty ($_SESSION['log']))
+                       $_SESSION['log'] = $log;
+               elseif ($_SESSION['log']['v'] == $log['v'])
+                       $_SESSION['log'] = array_merge_recursive($log, $_SESSION['log']);
+               elseif ($log['v'] == 1 and $_SESSION['log']['v'] == 2)
+                       foreach ($log['m'] as $msg)
+                               setMessage($msg['message'], $msg['code'], FALSE);
+               elseif ($log['v'] == 2 and $_SESSION['log']['v'] == 1)
+               {
+                       foreach ($_SESSION['log'] as $msg)
+                       {
+                               if (! is_array ($msg))
+                                       continue;
+                               var_dump ($msg);
+                               $new_v2_item = array('c' => '', 'a' => array());
+                               switch ($msg['code'])
+                               {
+                                       case 'error':
+                                               $new_v2_item['c'] = 100;
+                                               break;
+                                       case 'success':
+                                               $new_v2_item['c'] = 0;
+                                               break;
+                                       case 'warning':
+                                               $new_v2_item['c'] = 200;
+                                               break;
+                                       default:
+                                               $new_v2_item['c'] = 300;
+                               }
+                               $new_v2_item['a'][] = $msg['message'];
+                               $log['m'][] = $new_v2_item;
+                       }
+                       $_SESSION['log'] = $log; // substitute v1 log structure with merged v2
+               }
+       }
        return $url;
 }
 
+// This function is DEPRECATED. Show messages through showError and showSuccess,
+// you dont need to return anything from an ophandler to redirect user back to the page containing submit form
 function buildRedirectURL ($callfunc, $status, $log_args = array(), $nextpage = NULL, $nexttab = NULL, $url_args = array())
 {
        global $pageno, $tabno, $msgcode;
index 5af20c7..651fd02 100644 (file)
--- a/index.php
+++ b/index.php
@@ -14,70 +14,45 @@ header ('Content-Type: text/html; charset=UTF-8');
 if (isset ($_REQUEST['tab']) and ! isset ($_SESSION['RTLT'][$pageno]['dont_remember']))
        $_SESSION['RTLT'][$pageno] = array ('tabname' => $tabno, 'time' => time());
 
-?>
- <table border=0 cellpadding=0 cellspacing=0 width='100%' height='100%' class=maintable>
- <tr class=mainheader>
-  <td colspan=2>
-   <table width='100%' cellspacing=0 cellpadding=2 border=0>
-   <tr>
-    <td valign=top><a href='http://racktables.org/'><?php printImageHREF ('logo'); ?></a></td>
-    <td valign=top><div class=greeting><?php printGreeting(); ?></div></td>
-   </tr>
-   </table>
-  </td>
- </tr>
-
- <tr>
-  <td class="menubar" colspan=2>
-   <table border="0" width="100%" cellpadding="3" cellspacing="0">
-   <tr>
-<?php showPathAndSearch ($pageno); ?>
-   </tr>
-   </table>
-  </td>
- </tr>
-
-       <tr>
-<?php
-       showTabs ($pageno, $tabno);
-?>
-       </tr>
-
- <tr>
-  <td colspan=2>
-<?php
 if (isset ($tabhandler[$pageno][$tabno]))
-{
-       showMessageOrError();
-       if (NULL !== ($bypass = getBypassValue()))
-               call_user_func ($tabhandler[$pageno][$tabno], $bypass);
-       else
-               call_user_func ($tabhandler[$pageno][$tabno]);
-}
+       call_user_func ($tabhandler[$pageno][$tabno], getBypassValue());
 elseif (isset ($page[$pageno]['handler']))
-{
-       showMessageOrError();
        $page[$pageno]['handler'] ($tabno);
-}
 else
        throw new RackTablesError ("Failed to find handler for page '${pageno}', tab '${tabno}'", RackTablesError::INTERNAL);
+
+$content = ob_get_clean();
+ob_start();
 ?>
-       </td>
-       </tr>
-       </table>
-<?php
-       $body = ob_get_clean();
-       ob_start();
-       echo '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">'."\n";
-       echo '<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">'."\n";
-       echo '<head><title>' . getTitle ($pageno) . "</title>\n";
-       printPageHeaders();
-       echo "</head>\n";
-       echo "<body>\n$body</body>\n";
-       echo '</html>';
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head><title><?php echo getTitle ($pageno); ?></title>
+<?php printPageHeaders(); ?>
+</head>
+<body>
+<table border=0 cellpadding=0 cellspacing=0 width="100%" height="100%" class="maintable">
+ <tr class="mainheader"><td>
+   <table width="100%" cellspacing="0" cellpadding="2" border="0">
+   <tr>
+    <td valign=top><a href="http://racktables.org/"><?php printImageHREF ('logo'); ?></a></td>
+    <td valign=top><div class=greeting><?php printGreeting(); ?></div></td>
+   </tr>
+   </table>
+ </td></tr>
+ <tr><td class="menubar">
+  <table border="0" width="100%" cellpadding="3" cellspacing="0">
+  <tr><?php showPathAndSearch ($pageno); ?></tr>
+  </table>
+ </td></tr>
+ <tr><td><?php showTabs ($pageno, $tabno); ?></td></tr>
+ <tr><td><?php $output_is_buffered = FALSE; showMessageOrError(); ?></td></tr>
+ <tr><td><?php echo $content; ?></td></tr>
+</table>
+</body>
+</html>
+<?
        ob_flush();
 } catch (Exception $e) {
        ob_end_clean();
        printException($e);
 }
-
index 3834a93..c476f51 100644 (file)
@@ -10,6 +10,8 @@ require 'inc/init.php';
 assertStringArg ('op');
 $op = $_REQUEST['op'];
 prepareNavigation();
+$location = buildWideRedirectURL();
+
 // FIXME: find a better way to handle this error
 if ($op == 'addFile' && !isset($_FILES['file']['error']))
        throw new RackTablesError ('File upload error, check upload_max_filesize in php.ini', RackTablesError::MISCONFIGURED);
@@ -24,7 +26,7 @@ if
 
 // We have a chance to handle an error before starting HTTP header.
 if (!isset ($delayauth[$pageno][$tabno][$op]) and !permitted())
-       $location = buildWideRedirectURL (oneLiner (157)); // operation not permitted
+       showError ('Operation not permitted');
 else
 {
        // Call below does the job of bypass argument assertion, if such is required,
@@ -33,11 +35,11 @@ else
        // so it is not necessary to remember the name of bypass in it.
        getBypassValue();
        if (!is_array ($ophandler[$pageno][$tabno][$op]))
-               $location = call_user_func ($ophandler[$pageno][$tabno][$op]);
+               $redirect_to = call_user_func ($ophandler[$pageno][$tabno][$op]);
        else
-               $location = tableHandler ($ophandler[$pageno][$tabno][$op]);
-       if (!strlen ($location))
-               throw new RackTablesError ('Operation handler failed to return its status', RackTablesError::INTERNAL);
+               $redirect_to = tableHandler ($ophandler[$pageno][$tabno][$op]);
+       if (strlen ($redirect_to))
+               $location = $redirect_to;
 }
 header ("Location: " . $location);
 ob_end_flush();
@@ -46,12 +48,14 @@ ob_end_flush();
 catch (InvalidRequestArgException $e)
 {
        ob_end_clean();
-       header ('Location: ' . buildWideRedirectURL (oneLiner (107, array ($e->getMessage()))));
+       showError ('Assertion failed: ' . $e->getMessage());
+       header ('Location: ' . $location);
 }
 catch (RTDatabaseError $e)
 {
        ob_end_clean();
-       header ('Location: ' . buildWideRedirectURL (oneLiner (108, array ($e->getMessage()))));
+       showError ('Database error: ' . $e->getMessage());
+       header ('Location: ' . $location);
 }
 // the rest ends up in a dedicated page
 catch (Exception $e)
index 5e4272c..c1735e6 100644 (file)
@@ -212,7 +212,7 @@ function renderFilePreview ($file_id = 0, $mode = 'view')
                $file = getFile ($file_id);
                if (!in_array ($file['type'], array ('image/jpeg', 'image/png', 'image/gif')))
                {
-                       showError ('Invalid MIME type on file', __FUNCTION__);
+                       showError ('Invalid MIME type on file', 'inline');
                        break;
                }
                header("Content-type: ${file['type']}");
@@ -252,7 +252,7 @@ function renderFilePreview ($file_id = 0, $mode = 'view')
                }
                break;
        default:
-               showError ('Invalid argument', __FUNCTION__);
+               showError ('Invalid argument', 'inline');
                break;
        }
 }
index 90bd788..4124476 100644 (file)
@@ -113,7 +113,7 @@ function executeUpgradeBatch ($batchid)
                        // create tables for storing files (requires InnoDB support)
                        if (!isInnoDBSupported ())
                        {
-                               showFailure ("Cannot upgrade because InnoDB tables are not supported by your MySQL server. See the README for details.", __FILE__);
+                               showError ("Cannot upgrade because InnoDB tables are not supported by your MySQL server. See the README for details.", 'inline');
                                die;
                        }
 
@@ -822,7 +822,7 @@ CREATE TABLE `ObjectLog` (
                        $query[] = "UPDATE Config SET varvalue = '0.19.0' WHERE varname = 'DB_VERSION'";
                        break;
                default:
-                       showFailure ("executeUpgradeBatch () failed, because batch '${batchid}' isn't defined", __FILE__);
+                       showError ("executeUpgradeBatch () failed, because batch '${batchid}' isn't defined", 'inline');
                        die;
                        break;
        }
@@ -858,22 +858,8 @@ CREATE TABLE `ObjectLog` (
 //
 // ******************************************************************
 
-// a clone of showError() to drop dependency on interface.php
-function showFailure ($info = '', $location = 'N/A')
-{
-       if (preg_match ('/\.php$/', $location))
-               $location = basename ($location);
-       elseif ($location != 'N/A')
-               $location = $location . '()';
-       echo "<div class=msg_error>An error has occured in [${location}]. ";
-       if (empty ($info))
-               echo 'No additional information is available.';
-       else
-               echo "Additional information:<br><p>\n<pre>\n${info}\n</pre></p>";
-       echo "This failure is most probably fatal.<br></div>\n";
-}
-
 require_once 'inc/config.php'; // for CODE_VERSION
+require_once 'inc/functions.php'; // for showError()
 require_once 'inc/database.php'; // for getDatabaseVersion()
 require_once 'inc/dictionary.php';
 // Enforce default value for now, releases prior to 0.17.0 didn't support 'httpd' auth source.
@@ -921,7 +907,7 @@ switch ($user_auth_src)
                {
                        header ('WWW-Authenticate: Basic realm="RackTables upgrade"');
                        header ('HTTP/1.0 401 Unauthorized');
-                       showFailure ('You must be authenticated as an administrator to complete the upgrade.', __FILE__);
+                       showError ('You must be authenticated as an administrator to complete the upgrade.', 'inline');
                        die;
                }
                break; // cleared
@@ -932,12 +918,12 @@ switch ($user_auth_src)
                        !strlen ($_SERVER['REMOTE_USER'])
                )
                {
-                       showFailure ('System misconfiguration. The web-server didn\'t authenticate the user, although ought to do.');
+                       showError ('System misconfiguration. The web-server didn\'t authenticate the user, although ought to do.', 'inline');
                        die;
                }
                break; // cleared
        default:
-               showFailure ('authentication source misconfiguration', __FILE__);
+               showError ('authentication source misconfiguration', 'inline');
                die;
 }