--- nfo/php/libs/com.newsblob.phphtmllib/widgets/PageWidget.inc 2003/01/30 03:29:44 1.1
+++ nfo/php/libs/com.newsblob.phphtmllib/widgets/PageWidget.inc 2004/05/06 16:27:42 1.4
@@ -2,7 +2,7 @@
/**
* This file contains the PageWidget class
*
- * $Id: PageWidget.inc,v 1.1 2003/01/30 03:29:44 jonen Exp $
+ * $Id: PageWidget.inc,v 1.4 2004/05/06 16:27:42 jonen Exp $
*
* @author Walter A. Boring IV
* @package phpHtmlLib
@@ -14,6 +14,15 @@
require_once($phphtmllib."/widgets/HTMLPageClass.inc");
/**
+ * We need to make sure we have the MessageBoxWidget loaded
+ * for the permissions checking.
+ *
+ * NOTE: The InfoTable css classes must be included in any
+ * page that uses the permissions checking.
+ */
+require_once($phphtmllib."/widgets/MessageBoxWidget.inc");
+
+/**
* This class is used to build content
* for an entire page. It uses the
* HTMLPageClass widget from phphtmllib
@@ -24,15 +33,15 @@
*/
class PageWidget extends HTMLPageClass {
- /** CLASS VARS **/
+ /** CLASS VARS **/
- /**
- * This enables the ability to view the
- * source of a page bu setting debug=1
- * in the query string.
- *
- */
- var $_enable_debug = FALSE;
+ /**
+ * This enables the ability to view the
+ * source of a page bu setting debug=1
+ * in the query string.
+ *
+ */
+ var $_enable_debug = FALSE;
/**
@@ -42,10 +51,38 @@
*/
var $_title_text = NULL;
+ /**
+ * Does the user have permission
+ * to build and view the content?
+ */
+ var $_perm_options = array("allowed" => TRUE,
+ "message" => "You are not allowed to view this page.",
+ "url" => NULL);
+
+ /**
+ * the message box for displaying
+ * permissions errors
+ */
+ var $_permission_box = NULL;
- /**
- * Constructor:
- *
+ /**
+ * This is to enable/disable the
+ * permissions checking.
+ * By default it is off.
+ */
+ var $_allow_permissions_checks = FALSE;
+
+
+ /**
+ * The width of the permissions dialog
+ * table.
+ */
+ var $_permissions_error_width = "50%";
+
+
+ /**
+ * Constructor:
+ *
* @param mixed - $title Title string or TITLEtag object for the page.
* @param string - one of 3 types of html to render. Setting this will
* make the object declare the gobal define which tells
@@ -59,27 +96,39 @@
* - doctype is XHTML transitional.
* "xhtml_strict" - render xhtml instead of html 4.0.
* - doctype is XHTML strict.
- * @param int - one of 2 types. INDENT_NICE or INDENT_LEFT_JUSTIFY
- * This tells the page how to render the indenting of the
- * output. By default it is set to INDENT_NICE, which nicely
- * indents each nested tag. You can have all tags rendered
- * left justified (smaller size in output) by using
- * INDENT_LEFT_JUSTIFY
- *
- */
- function PageWidget( $title, $render_type = HTML, $indent_style=INDENT_NICE ) {
+ * @param int - one of 2 types. INDENT_NICE or INDENT_LEFT_JUSTIFY
+ * This tells the page how to render the indenting of the
+ * output. By default it is set to INDENT_NICE, which nicely
+ * indents each nested tag. You can have all tags rendered
+ * left justified (smaller size in output) by using
+ * INDENT_LEFT_JUSTIFY
+ *
+ */
+ function PageWidget( $title, $render_type = HTML, $indent_style=INDENT_NICE ) {
- if ( defined("DEBUG") &&
+ if ( defined("DEBUG") &&
(isset($_GET["debug"]) ||
isset($_POST["debug"]) ) ) {
- $this->enable_debug( TRUE );
- }
+ $this->enable_debug( TRUE );
+ }
//save the title for later.
$this->_title_text = $title;
- //call the parent's constructor
- $this->HTMLPageClass( $title, $render_type, $indent_style );
- }
+ //call the parent's constructor
+ $this->HTMLPageClass( $title, $render_type, $indent_style );
+
+ //see if we are allowed to check permissions
+ //You need to have the CSS definitions for the
+ //InfoTable defined in order to see the error
+ //table correctly. Or you can override the
+ //_build_permission_box() method to provide
+ //a different object for displaying the
+ //permission errors.
+ if ($this->_allow_permissions_checks) {
+ //check the permissions on this page
+ $this->_check_permissions();
+ }
+ }
/**
* gets the current title of the page.
@@ -90,132 +139,245 @@
return $this->_title_text;
}
- /**
- * This function is used to build
- * addition head content that isn't
- * built by the HTMLPageClass parent
- * class by default.
- * NOTE: you can add addition content
- * to the head in 1 of 2 ways.
- * 1) inside the call return the
- * addition content in the
- * return $foo;
- * 2) or use the HTMLPageClass'
- * $this->add_head_content()
- * from within the head_content()
- * call.
- *
- * @return mixed.
- */
- function head_content() {
- return NULL;
- }
-
-
- /**
- * This function is meant to be overridden
- * by the child class.
- * This provides all of the content
- * for the page.
- * NOTE: You add the content to the
- * body in 1 of 2 ways.
- * 1) return the content from this
- * call.
- * 2) inside the call, you can
- * just call $this->add();
- * and then return NULL;
- *
- * @return mixed.
- */
- function body_content() {
- return NULL;
- }
-
-
- /**
- * This function is used to save
- * a frameset to the page. This will
- * automatically output a properly
- * formatted
- */
- function frameset() {
- return NULL;
- }
-
- /**
- * This function is called to build
- * any JavaScript that is needed in the
- * portion of a document.
- *
- * @return string - the raw JS code to be
- * put inside the
- */
- function head_javascript() {
- return NULL;
- }
-
-
- /**
- * This sets the debug option for
- * the HTMLPageClass
- *
- * @param boolean TRUE for on, FALSE for off
- */
- function enable_debug( $flag = TRUE ) {
- $this->_enable_debug = $flag;
- }
-
-
- /**
- * This is the function that renders the HTML
- * for this widget.
- *
- * @return string - the HTML
- */
- function render() {
-
- //test to see if they want debugging of
- //output enabled.
- if ( $this->_enable_debug ) {
- if ( isset($_GET["debug"]) ) {
- $this->set_text_debug( TRUE );
- }
- }
-
- //check to see if they want to render a frameset
- $frameset = $this->frameset();
- if ( $frameset != NULL ) {
- //add and set the page output
- //to be a frameset.
- $this->set_frameset( $frameset );
- } else {
-
- //Try and get some more head content
- $content = "";
- $content = $this->head_content();
- if ( $content != "" ) {
- $this->add_head_content( $content );
- }
-
- //try and get the body content.
- //the user could just have added
- //the data manually.
- $content = "";
- $content = $this->body_content();
- if ( $content != "" ) {
- $this->add( $content );
- }
- }
-
- //Lets see if they have any javascript
- //for the head
- $js = $this->head_javascript();
- if ( $js != NULL ) {
- $this->add_head_js( $js );
- }
+ /**
+ * This function is used to build
+ * addition head content that isn't
+ * built by the HTMLPageClass parent
+ * class by default.
+ * NOTE: you can add addition content
+ * to the head in 1 of 2 ways.
+ * 1) inside the call return the
+ * addition content in the
+ * return $foo;
+ * 2) or use the HTMLPageClass'
+ * $this->add_head_content()
+ * from within the head_content()
+ * call.
+ *
+ * @return mixed.
+ */
+ function head_content() {
+ return NULL;
+ }
+
+
+ /**
+ * This function is meant to be overridden
+ * by the child class.
+ * This provides all of the content
+ * for the page.
+ * NOTE: You add the content to the
+ * body in 1 of 2 ways.
+ * 1) return the content from this
+ * call.
+ * 2) inside the call, you can
+ * just call $this->add();
+ * and then return NULL;
+ *
+ * @return mixed.
+ */
+ function body_content() {
+ return NULL;
+ }
+
+
+ /**
+ * This function is used to save
+ * a frameset to the page. This will
+ * automatically output a properly
+ * formatted
+ */
+ function frameset() {
+ return NULL;
+ }
+
+ /**
+ * This function is called to build
+ * any JavaScript that is needed in the
+ * portion of a document.
+ *
+ * @return string - the raw JS code to be
+ * put inside the
+ */
+ function head_javascript() {
+ return NULL;
+ }
+
+
+ /**
+ * This sets the debug option for
+ * the HTMLPageClass
+ *
+ * @param boolean TRUE for on, FALSE for off
+ */
+ function enable_debug( $flag = TRUE ) {
+ $this->_enable_debug = $flag;
+ }
+
+
+ /**
+ * This is the function that renders the HTML
+ * for this widget.
+ *
+ * @return string - the HTML
+ */
+ function render() {
+
+ //test to see if they want debugging of
+ //output enabled.
+ if ( $this->_enable_debug ) {
+ if ( isset($_GET["debug"]) ) {
+ $this->set_text_debug( TRUE );
+ }
+ }
+
+ //see if we have permissions to build the
+ //content for this page. If permissions checks
+ //aren't allowed, this will pass.
+ if ($this->_has_permission()) {
+ //check to see if they want to render a frameset
+ $frameset = $this->frameset();
+ if ( $frameset != NULL ) {
+ //add and set the page output
+ //to be a frameset.
+ $this->set_frameset( $frameset );
+ } else {
+
+ //Try and get some more head content
+ $content = "";
+ $content = $this->head_content();
+ if ( $content != "" ) {
+ $this->add_head_content( $content );
+ }
+
+ //try and get the body content.
+ //the user could just have added
+ //the data manually.
+ $content = "";
+ $content = $this->body_content();
+ if ( $content != "" ) {
+ $this->add( $content );
+ }
+ }
+
+ //Lets see if they have any javascript
+ //for the head
+ $js = $this->head_javascript();
+ if ( $js != NULL ) {
+ $this->add_head_js( $js );
+ }
+ } else {
+ $this->add( html_br(), $this->_permission_box);
+ }
+
+ return HTMLPageClass::render();
+ }
- return HTMLPageClass::render();
- }
+ /**
+ * This method is used to enable or disable the
+ * built in permissions checking mechanism.
+ *
+ * @param boolean TRUE = enable permissions checks
+ */
+ function allow_permissions_checks($flag=true) {
+ $this->_allow_permissions_checks = $flag;
+ }
+
+
+ /**
+ * This method allows all PageWidget children to
+ * do any kind of permissions checking before
+ * any content methods are called.
+ * This allows for a very secure method of building
+ * and rendering the page content.
+ *
+ */
+ function _check_permissions() {
+ //call the child permission() method
+ if ( !$this->permission() ) {
+ //looks like the user doesn't have
+ //permissions to view this page
+ $this->_set_perms( FALSE );
+
+ $this->_build_permission_box();
+ }
+ }
+
+ /**
+ * This is meant to be extended by the child class
+ * to do any generic permissions checking for access
+ * to the content that the child builds
+ *
+ * @return boolean - TRUE = has permissions to build
+ * and view content.
+ */
+ function permission() {
+ //by default return true.
+ return true;
+ }
+
+ /**
+ * set the value of the permissions
+ *
+ * @param boolean - TRUE = has permission
+ */
+ function _set_perms( $flag ) {
+ $this->_perm_options["allowed"] = $flag;
+ }
+
+ /**
+ * do we have permissions to build/view the content?
+ *
+ * @return boolean
+ */
+ function _has_permission() {
+ if (!$this->_allow_permissions_checks) {
+ //permissions checks aren't allowed
+ //so just return true.
+ return TRUE;
+ } else {
+ return $this->_perm_options["allowed"];
+ }
+ }
+
+ /**
+ * This is used to set the various options for displaying
+ * the failed permissions box. This should be called
+ * prior to returning false in the permissions() method
+ *
+ * @param string - the permissions message
+ * NOTE: NULL message means use the default.
+ * @param string - the url where to go to.
+ * NOTE: if NULL, then there will be no
+ * button shown
+ */
+ function set_permissions_message($message=NULL, $url=NULL) {
+ if ( $message != NULL ) {
+ $this->_perm_options["message"] = $message;
+ }
+ $this->_perm_options["url"] = $url;
+ }
+
+ /**
+ * This is the method used to build the
+ * object to display the permissions error.
+ *
+ * By default it uses either the MessageBoxWidget
+ * or the MessageBoxOK widget which both rely on
+ * having the InfoTable object's css included in the page.
+ *
+ * @return none
+ */
+ function _build_permission_box() {
+ if ( $this->_perm_options["url"] == NULL ) {
+ $this->_permission_box = new MessageBoxWidget("Error", $this->_permissions_error_width,
+ $this->_perm_options["message"]);
+ } else {
+ $this->_permission_box = new MessageBoxOK("Error", $this->_permissions_error_width,
+ $this->_perm_options["message"],
+ $this->_perm_options["url"]);
+ }
+ }
}
?>