Viewing file: monitor.php (13.39 KB) -rw-rw-rw- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
<?php
/**
* The HTML_Progress_Monitor class allow an easy way to display progress
* in a dialog. The user can cancel the task.
*
* PHP versions 4 and 5
*
* LICENSE: This source file is subject to version 3.0 of the PHP license
* that is available through the world-wide-web at the following URI:
* http://www.php.net/license/3_0.txt. If you did not receive a copy of
* the PHP License and are unable to obtain it through the web, please
* send a note to license@php.net so we can mail you a copy immediately.
*
* @category HTML
* @package HTML_Progress
* @subpackage Progress_Observer
* @author Laurent Laville <pear@laurent-laville.org>
* @copyright 1997-2005 The PHP Group
* @license http://www.php.net/license/3_0.txt PHP License 3.0
* @version CVS: $Id: monitor.php,v 1.7 2005/07/25 13:06:13 farell Exp $
* @link http://pear.php.net/package/HTML_Progress
*/
require_once 'HTML/Progress.php';
require_once 'HTML/QuickForm.php';
/**
* The HTML_Progress_Monitor class allow an easy way to display progress
* in a dialog. The user can cancel the task.
*
* PHP versions 4 and 5
*
* LICENSE: This source file is subject to version 3.0 of the PHP license
* that is available through the world-wide-web at the following URI:
* http://www.php.net/license/3_0.txt. If you did not receive a copy of
* the PHP License and are unable to obtain it through the web, please
* send a note to license@php.net so we can mail you a copy immediately.
*
* @category HTML
* @package HTML_Progress
* @subpackage Progress_Observer
* @author Laurent Laville <pear@laurent-laville.org>
* @copyright 1997-2005 The PHP Group
* @license http://www.php.net/license/3_0.txt PHP License 3.0
* @version Release: 1.2.5
* @link http://pear.php.net/package/HTML_Progress
*/
class HTML_Progress_Monitor
{
/**
* Instance-specific unique identification number.
*
* @var integer
* @since 1.0
* @access private
*/
var $_id;
/**#@+
* Attributes of monitor form.
*
* @var string
* @since 1.1
* @access public
*/
var $windowname;
var $buttonStart;
var $buttonCancel;
/**#@-*/
/**
* The progress object renders into this monitor.
*
* @var object
* @since 1.0
* @access private
*/
var $_progress;
/**
* The quickform object that allows the presentation.
*
* @var object
* @since 1.0
* @access private
*/
var $_form;
/**
* Constructor Summary
*
* o Creates a standard progress bar into a dialog box (QuickForm).
* Form name, buttons 'start', 'cancel' labels and style, and
* title of dialog box may also be changed.
* <code>
* $monitor = new HTML_Progress_Monitor();
* </code>
*
* o Creates a progress bar into a dialog box, with only a new
* form name.
* <code>
* $monitor = new HTML_Progress_Monitor($formName);
* </code>
*
* o Creates a progress bar into a dialog box, with a new form name,
* new buttons name and style, and also a different title box.
* <code>
* $monitor = new HTML_Progress_Monitor($formName, $attributes);
* </code>
*
* @param string $formName (optional) Name of monitor dialog box (QuickForm)
* @param array $attributes (optional) List of renderer options
* @param array $errorPrefs (optional) Hash of params to configure error handler
*
* @since 1.0
* @access public
* @throws HTML_PROGRESS_ERROR_INVALID_INPUT
*/
function HTML_Progress_Monitor($formName = 'ProgressMonitor', $attributes = array(), $errorPrefs = array())
{
$bar = new HTML_Progress($errorPrefs);
$this->_progress = $bar;
if (!is_string($formName)) {
return $this->_progress->raiseError(HTML_PROGRESS_ERROR_INVALID_INPUT, 'exception',
array('var' => '$formName',
'was' => gettype($formName),
'expected' => 'string',
'paramnum' => 1));
} elseif (!is_array($attributes)) {
return $this->_progress->raiseError(HTML_PROGRESS_ERROR_INVALID_INPUT, 'exception',
array('var' => '$attributes',
'was' => gettype($attributes),
'expected' => 'array',
'paramnum' => 2));
}
$this->_id = md5(microtime());
$this->_form = new HTML_QuickForm($formName);
$this->_form->removeAttribute('name'); // XHTML compliance
$this->windowname = isset($attributes['title']) ? $attributes['title'] : 'In progress ...';
$this->buttonStart = isset($attributes['start']) ? $attributes['start'] : 'Start';
$this->buttonCancel = isset($attributes['cancel']) ? $attributes['cancel'] : 'Cancel';
$buttonAttr = isset($attributes['button']) ? $attributes['button'] : '';
$this->_form->addElement('header', 'windowname', $this->windowname);
$this->_form->addElement('static', 'progressBar');
$this->_form->addElement('static', 'progressStatus');
$style = $this->isStarted() ? array('disabled'=>'true') : null;
$buttons[] =& $this->_form->createElement('submit', 'start', $this->buttonStart, $style);
$buttons[] =& $this->_form->createElement('submit', 'cancel', $this->buttonCancel);
$buttons[0]->updateAttributes($buttonAttr);
$buttons[1]->updateAttributes($buttonAttr);
$this->_form->addGroup($buttons, 'buttons', '', ' ', false);
// default embedded progress element with look-and-feel
$this->setProgressElement($bar);
$str =& $this->_form->getElement('progressStatus');
$str->setText('<div id="status" class="progressStatus"> </div>');
}
/**
* Listens all progress events from this monitor.
*
* @param mixed $event A hash describing the progress event.
*
* @return void
* @since 1.0
* @access public
* @throws HTML_PROGRESS_ERROR_INVALID_INPUT
* @see HTML_Progress::process()
* @deprecated
*/
function notify($event)
{
}
/**
* Sets a user-defined progress handler function.
*
* @param mixed $handler Name of function or a class-method.
*
* @return void
* @since 1.1
* @access public
* @throws HTML_PROGRESS_ERROR_INVALID_CALLBACK
* @see HTML_Progress::setProgressHandler()
*/
function setProgressHandler($handler)
{
if (!is_callable($handler)) {
return $this->raiseError(HTML_PROGRESS_ERROR_INVALID_CALLBACK, 'warning',
array('var' => '$handler',
'element' => 'valid Class-Method/Function',
'was' => 'element',
'paramnum' => 1));
}
$this->_progress->setProgressHandler($handler);
}
/**
* Calls a user-defined progress handler function.
*
* @param integer $arg Current value of the progress bar.
*
* @return void
* @since 1.1
* @access public
* @deprecated
*/
function callProgressHandler($arg)
{
$this->_progress->process();
}
/**
* Returns TRUE if progress was started by user, FALSE otherwise.
*
* @return bool
* @since 1.1
* @access public
*/
function isStarted()
{
$action = $this->_form->getSubmitValues();
return isset($action['start']);
}
/**
* Returns TRUE if progress was canceled by user, FALSE otherwise.
*
* @return bool
* @since 1.0
* @access public
*/
function isCanceled()
{
$action = $this->_form->getSubmitValues();
return isset($action['cancel']);
}
/**
* Display Monitor and catch user action (cancel button).
*
* @return void
* @since 1.0
* @access public
*/
function run()
{
if ($this->isStarted()) {
$this->_progress->run();
}
}
/**
* Attach a progress bar to this monitor.
*
* @param object $bar a html_progress instance
*
* @return void
* @since 1.1
* @access public
* @throws HTML_PROGRESS_ERROR_INVALID_INPUT
* @see getProgressElement()
*/
function setProgressElement($bar)
{
if (!is_a($bar, 'HTML_Progress')) {
return $this->_progress->raiseError(HTML_PROGRESS_ERROR_INVALID_INPUT, 'exception',
array('var' => '$bar',
'was' => gettype($bar),
'expected' => 'HTML_Progress object',
'paramnum' => 1));
}
$this->_progress = $bar;
$bar =& $this->_form->getElement('progressBar');
$bar->setText( $this->_progress->toHtml() );
}
/**
* Returns a reference to the progress bar object
* used with the monitor.
*
* @return object
* @since 1.1
* @access public
* @see setProgressElement()
*/
function &getProgressElement()
{
return $this->_progress;
}
/**
* Returns progress styles (StyleSheet).
*
* @return string
* @since 1.0
* @access public
*/
function getStyle()
{
return $this->_progress->getStyle();
}
/**
* Returns progress javascript.
*
* @return string
* @since 1.0
* @access public
*/
function getScript()
{
$js = "
function setStatus(pString)
{
if (isDom) {
prog = document.getElementById('status');
} else if (isIE) {
prog = document.all['status'];
} else if (isNS4) {
prog = document.layers['status'];
}
if (prog != null) {
prog.innerHTML = pString;
}
}
";
return $this->_progress->getScript() . $js;
}
/**
* Returns Monitor forms as a Html string.
*
* @return string
* @since 1.0
* @access public
*/
function toHtml()
{
return $this->_form->toHtml();
}
/**
* Accepts a renderer
*
* @param object $renderer An HTML_QuickForm_Renderer object
*
* @return void
* @since 1.1
* @access public
*/
function accept(&$renderer)
{
if (!is_a($renderer, 'HTML_QuickForm_Renderer')) {
return $this->_progress->raiseError(HTML_PROGRESS_ERROR_INVALID_INPUT, 'exception',
array('var' => '$renderer',
'was' => gettype($renderer),
'expected' => 'HTML_QuickForm_Renderer object',
'paramnum' => 1));
}
$this->_form->accept($renderer);
}
/**
* Display a caption on action in progress.
*
* The idea of a simple utility function for replacing variables
* with values in an message template, come from sprintfErrorMessage
* function of Error_Raise package by Greg Beaver.
*
* This simple str_replace-based function can be used to have an
* order-independent sprintf, so messages can be passed in
* with different grammar ordering, or other possibilities without
* changing the source code.
*
* Variables should simply be surrounded by % as in %varname%
*
* @param string $caption (optional) message template
* @param array $args (optional) associative array of
* template var -> message text
* @since 1.1
* @access public
*/
function setCaption($caption = ' ', $args = array() )
{
if (!is_string($caption)) {
return $this->_progress->raiseError(HTML_PROGRESS_ERROR_INVALID_INPUT, 'exception',
array('var' => '$caption',
'was' => gettype($caption),
'expected' => 'string',
'paramnum' => 1));
} elseif (!is_array($args)) {
return $this->_progress->raiseError(HTML_PROGRESS_ERROR_INVALID_INPUT, 'exception',
array('var' => '$args',
'was' => gettype($args),
'expected' => 'array',
'paramnum' => 2));
}
foreach($args as $name => $value) {
$caption = str_replace("%$name%", $value, $caption);
}
if (function_exists('ob_get_clean')) {
$status = ob_get_clean(); // use for PHP 4.3+
} else {
$status = ob_get_contents(); // use for PHP 4.2+
ob_end_clean();
}
$status = '<script type="text/javascript">self.setStatus(\''.$caption.'\'); </script>';
echo $status;
ob_start();
}
}
?>
|