Subversion-Projekte lars-tiefland.prado

Revision

Blame | Letzte Änderung | Log anzeigen | RSS feed

<?php
/**
 * TValidationSummary class file
 *
 * @author Qiang Xue <qiang.xue@gmail.com>
 * @link http://www.pradosoft.com/
 * @copyright Copyright &copy; 2005-2008 PradoSoft
 * @license http://www.pradosoft.com/license/
 * @version $Id: TValidationSummary.php 2541 2008-10-21 15:05:13Z qiang.xue $
 * @package System.Web.UI.WebControls
 */

/**
 * TValidationSummary class
 *
 * TValidationSummary displays a summary of validation errors inline on a Web page,
 * in a message box, or both. By default, a validation summary will collect
 * {@link TBaseValidator::getErrorMessage ErrorMessage} of all failed validators
 * on the page. If {@link getValidationGroup ValidationGroup} is not
 * empty, only those validators who belong to the group will show their error messages
 * in the summary.
 *
 * The summary can be displayed as a list, as a bulleted list, or as a single
 * paragraph based on the {@link setDisplayMode DisplayMode} property.
 * The messages shown can be prefixed with {@link setHeaderText HeaderText}.
 *
 * The summary can be displayed on the Web page and in a message box by setting
 * the {@link setShowSummary ShowSummary} and {@link setShowMessageBox ShowMessageBox}
 * properties, respectively. Note, the latter is only effective when
 * {@link setEnableClientScript EnableClientScript} is true.
 *
 * @author Qiang Xue <qiang.xue@gmail.com>
 * @version $Id: TValidationSummary.php 2541 2008-10-21 15:05:13Z qiang.xue $
 * @package System.Web.UI.WebControls
 * @since 3.0
 */
class TValidationSummary extends TWebControl
{
        /**
         * @var TClientSideValidationSummaryOptions validation client side options.
         */
        private $_clientSide;

        /**
         * Constructor.
         * This method sets the foreground color to red.
         */
        public function __construct()
        {
                parent::__construct();
                $this->setForeColor('red');
        }

        /**
         * @return TValidationSummaryDisplayStyle the style of displaying the error messages. Defaults to TValidationSummaryDisplayStyle::Fixed.
         */
        public function getDisplay()
        {
                return $this->getViewState('Display',TValidationSummaryDisplayStyle::Fixed);
        }

        /**
         * @param TValidationSummaryDisplayStyle the style of displaying the error messages
         */
        public function setDisplay($value)
        {
                $this->setViewState('Display',TPropertyValue::ensureEnum($value,'TValidationSummaryDisplayStyle'),TValidationSummaryDisplayStyle::Fixed);
        }

        /**
         * @return string the header text displayed at the top of the summary
         */
        public function getHeaderText()
        {
                return $this->getViewState('HeaderText','');
        }

        /**
         * Sets the header text to be displayed at the top of the summary
         * @param string the header text
         */
        public function setHeaderText($value)
        {
                $this->setViewState('HeaderText',$value,'');
        }

        /**
         * @return TValidationSummaryDisplayMode the mode of displaying error messages. Defaults to TValidationSummaryDisplayMode::BulletList.
         */
        public function getDisplayMode()
        {
                return $this->getViewState('DisplayMode',TValidationSummaryDisplayMode::BulletList);
        }

        /**
         * @param TValidationSummaryDisplayMode the mode of displaying error messages
         */
        public function setDisplayMode($value)
        {
                $this->setViewState('DisplayMode',TPropertyValue::ensureEnum($value,'TValidationSummaryDisplayMode'),TValidationSummaryDisplayMode::BulletList);
        }

        /**
         * @return boolean whether the TValidationSummary component updates itself using client-side script. Defaults to true.
         */
        public function getEnableClientScript()
        {
                return $this->getViewState('EnableClientScript',true);
        }

        /**
         * @param boolean whether the TValidationSummary component updates itself using client-side script.
         */
        public function setEnableClientScript($value)
        {
                $this->setViewState('EnableClientScript',TPropertyValue::ensureBoolean($value),true);
        }

        /**
         * @return boolean whether the validation summary is displayed in a message box. Defaults to false.
         */
        public function getShowMessageBox()
        {
                return $this->getViewState('ShowMessageBox',false);
        }

        /**
         * @param boolean whether the validation summary is displayed in a message box.
         */
        public function setShowMessageBox($value)
        {
                $this->setViewState('ShowMessageBox',TPropertyValue::ensureBoolean($value),false);
        }

        /**
         * @return boolean whether the validation summary is displayed inline. Defaults to true.
         */
        public function getShowSummary()
        {
                return $this->getViewState('ShowSummary',true);
        }

        /**
         * @param boolean whether the validation summary is displayed inline.
         */
        public function setShowSummary($value)
        {
                $this->setViewState('ShowSummary',TPropertyValue::ensureBoolean($value),true);
        }

        /**
         * @return boolean whether the validation summary should be anchored. Defaults to false.
         */
        public function getShowAnchor()
        {
                return $this->getViewState('ShowAnchor',false);
        }

        /**
         * @param boolean whether the validation summary should be anchored.
         */
        public function setShowAnchor($value)
        {
                $this->setViewState('ShowAnchor',TPropertyValue::ensureBoolean($value),false);
        }

        /**
         * Gets the auto-update for this summary.
         * @return boolean automatic client-side summary updates. Defaults to true.
         */
        public function getAutoUpdate()
        {
                return $this->getViewState('AutoUpdate', true);
        }

        /**
         * Sets the summary to auto-update on the client-side
         * @param boolean true for automatic summary updates.
         */
        public function setAutoUpdate($value)
        {
                $this->setViewState('AutoUpdate', TPropertyValue::ensureBoolean($value), true);
        }

        /**
         * @return string the group which this validator belongs to
         */
        public function getValidationGroup()
        {
                return $this->getViewState('ValidationGroup','');
        }

        /**
         * @param string the group which this validator belongs to
         */
        public function setValidationGroup($value)
        {
                $this->setViewState('ValidationGroup',$value,'');
        }

        protected function addAttributesToRender($writer)
        {
                $display=$this->getDisplay();
                $visible=$this->getEnabled(true) && count($this->getErrorMessages()) > 0;
                if(!$visible)
                {
                        if($display===TValidationSummaryDisplayStyle::None || $display===TValidationSummaryDisplayStyle::Dynamic)
                                $writer->addStyleAttribute('display','none');
                        else
                                $writer->addStyleAttribute('visibility','hidden');
                }
                $writer->addAttribute('id',$this->getClientID());
                parent::addAttributesToRender($writer);
        }

        /**
         * Render the javascript for validation summary.
         * @param array list of options for validation summary.
         */
        protected function renderJsSummary()
        {
                if(!$this->getEnabled(true) || !$this->getEnableClientScript())
                        return;
                $cs = $this->getPage()->getClientScript();
                $cs->registerPradoScript('validator');

                //need to register the validation manager is validation summary is alone.
                $formID=$this->getPage()->getForm()->getClientID();
                $scriptKey = "TBaseValidator:$formID";
                if($this->getEnableClientScript() && !$cs->isEndScriptRegistered($scriptKey))
                {
                        $manager['FormID'] = $formID;
                        $options = TJavaScript::encode($manager);
                        $cs->registerPradoScript('validator');
                        $cs->registerEndScript($scriptKey, "new Prado.ValidationManager({$options});");
                }


                $options=TJavaScript::encode($this->getClientScriptOptions());
                $script = "new Prado.WebUI.TValidationSummary({$options});";
                $cs->registerEndScript($this->getClientID(), $script);
        }

        /**
         * Get a list of options for the client-side javascript validation summary.
         * @return array list of options for the summary
         */
        protected function getClientScriptOptions()
        {
                $options['ID'] = $this->getClientID();
                $options['FormID'] = $this->getPage()->getForm()->getClientID();
                if($this->getShowMessageBox())
                        $options['ShowMessageBox']=true;
                if(!$this->getShowSummary())
                        $options['ShowSummary']=false;

                $options['HeaderText']=$this->getHeaderText();
                $options['DisplayMode']=$this->getDisplayMode();

                $options['Refresh'] = $this->getAutoUpdate();
                $options['ValidationGroup'] =  $this->getValidationGroup();
                $options['Display'] = $this->getDisplay();

                if(!is_null($this->_clientSide))
                        $options = array_merge($options,$this->_clientSide->getOptions()->toArray());

                return $options;
        }

        /**
         * @return TClientSideValidationSummaryOptions client-side validation summary
         * event options.
         */
        public function getClientSide()
        {
                if(is_null($this->_clientSide))
                        $this->_clientSide = $this->createClientScript();
                return $this->_clientSide;
        }

        /**
         * @return TClientSideValidationSummaryOptions javascript validation summary
         * event options.
         */
        protected function createClientScript()
        {
                return new TClientSideValidationSummaryOptions;
        }
        /**
         * Get the list of validation error messages.
         * @return array list of validator error messages.
         */
        protected function getErrorMessages()
        {
                $validators=$this->getPage()->getValidators($this->getValidationGroup());
                $messages = array();
                foreach($validators as $validator)
                {
                        if(!$validator->getIsValid() && ($msg=$validator->getErrorMessage())!=='')
                                //$messages[] = $validator->getAnchoredMessage($msg);
                                $messages[] = $msg;
                }
                return $messages;
        }

        /**
         * Overrides parent implementation by rendering TValidationSummary-specific presentation.
         * @return string the rendering result
         */
        public function renderContents($writer)
        {
                $this->renderJsSummary();
                if($this->getShowSummary())
                {
//                  $this->setStyle('display:block');
                        switch($this->getDisplayMode())
                        {
                                case TValidationSummaryDisplayMode::SimpleList:
                                        $this->renderList($writer);
                                        break;
                                case TValidationSummaryDisplayMode::SingleParagraph:
                                        $this->renderSingleParagraph($writer);
                                        break;
                                case TValidationSummaryDisplayMode::BulletList:
                                        $this->renderBulletList($writer);
                                        break;
                        }
                }
        }

        /**
         * Render the validation summary as a simple list.
         * @param array list of messages
         * @param string the header text
         * @return string summary list
         */
        protected function renderList($writer)
        {
                $header=$this->getHeaderText();
                $messages=$this->getErrorMessages();
                $content = '';
                if(strlen($header))
                        $content.= $header."<br/>\n";
                foreach($messages as $message)
                        $content.="$message<br/>\n";
                $writer->write($content);
        }

        /**
         * Render the validation summary as a paragraph.
         * @param array list of messages
         * @param string the header text
         * @return string summary paragraph
         */
        protected function renderSingleParagraph($writer)
        {
                $header=$this->getHeaderText();
                $messages=$this->getErrorMessages();
                $content = $header;
                foreach($messages as $message)
                        $content.= ' '.$message;
                $writer->write($content);
        }

        /**
         * Render the validation summary as a bullet list.
         * @param array list of messages
         * @param string the header text
         * @return string summary bullet list
         */
        protected function renderBulletList($writer)
        {
                $header=$this->getHeaderText();
                $messages=$this->getErrorMessages();
                $content = $header;
                if(count($messages)>0)
                {
                        $content .= "<ul>\n";
                        foreach($messages as $message)
                                $content.= '<li>'.$message."</li>\n";
                        $content .= "</ul>\n";
                }
                $writer->write($content);
        }
}

/**
 * TClientSideValidationSummaryOptions class.
 *
 * Client-side validation summary events such as {@link setOnHideSummary
 * OnHideSummary} and {@link setOnShowSummary OnShowSummary} can be modified
 * through the {@link TBaseValidator:: getClientSide ClientSide} property of a
 * validation summary.
 *
 * The <tt>OnHideSummary</tt> event is raise when the validation summary
 * requests to hide the messages.
 *
 * The <tt>OnShowSummary</tt> event is raised when the validation summary
 * requests to show the messages.
 *
 * See the quickstart documentation for further details.
 *
 * @author Wei Zhuo <weizhuo[at]gmail[dot]com>
 * @version $Id: TValidationSummary.php 2541 2008-10-21 15:05:13Z qiang.xue $
 * @package System.Web.UI.WebControls
 * @since 3.0
 */
class TClientSideValidationSummaryOptions extends TClientSideOptions
{
        /**
         * @return string javascript code for client-side OnHideSummary event.
         */
        public function getOnHideSummary()
        {
                return $this->getOption('OnHideSummary');
        }

        /**
         * Client-side OnHideSummary validation summary event is raise when all the
         * validators are valid. This will override the default client-side
         * validation summary behaviour.
         * @param string javascript code for client-side OnHideSummary event.
         */
        public function setOnHideSummary($javascript)
        {
                $this->setFunction('OnHideSummary', $javascript);
        }

        /**
         * Client-side OnShowSummary event is raise when one or more validators are
         * not valid. This will override the default client-side validation summary
         * behaviour.
         * @param string javascript code for client-side OnShowSummary event.
         */
        public function setOnShowSummary($javascript)
        {
                $this->setFunction('OnShowSummary', $javascript);
        }

        /**
         * @return string javascript code for client-side OnShowSummary event.
         */
        public function getOnShowSummary()
        {
                return $this->getOption('OnShowSummary');
        }

        /**
         * Ensure the string is a valid javascript function. If the string begins
         * with "javascript:" valid javascript function is assumed, otherwise the
         * code block is enclosed with "function(summary, validators){ }" block.
         * @param string javascript code.
         * @return string javascript function code.
         */
        protected function ensureFunction($javascript)
        {
                return "function(summary, validators){ {$javascript} }";
        }
}


/**
 * TValidationSummaryDisplayMode class.
 * TValidationSummaryDisplayMode defines the enumerable type for the possible modes
 * that a {@link TValidationSummary} can organize and display the collected error messages.
 *
 * The following enumerable values are defined:
 * - SimpleList: the error messages are displayed as a list without any decorations.
 * - SingleParagraph: the error messages are concatenated together into a paragraph.
 * - BulletList: the error messages are displayed as a bulleted list.
 *
 * @author Qiang Xue <qiang.xue@gmail.com>
 * @version $Id: TValidationSummary.php 2541 2008-10-21 15:05:13Z qiang.xue $
 * @package System.Web.UI.WebControls
 * @since 3.0.4
 */
class TValidationSummaryDisplayMode extends TEnumerable
{
        const SimpleList='SimpleList';
        const SingleParagraph='SingleParagraph';
        const BulletList='BulletList';
}


/**
 * TValidationSummaryDisplay class.
 * TValidationSummaryDisplay defines the enumerable type for the possible styles
 * that a {@link TValidationSummary} can display the collected error messages.
 *
 * The following enumerable values are defined:
 * - None: the error messages are not displayed
 * - Dynamic: the error messages are dynamically added to display as the corresponding validators fail
 * - Fixed: Similar to Dynamic except that the error messages physically occupy the page layout (even though they may not be visible)
 *
 * @author Qiang Xue <qiang.xue@gmail.com>
 * @version $Id: TValidationSummary.php 2541 2008-10-21 15:05:13Z qiang.xue $
 * @package System.Web.UI.WebControls
 * @since 3.0.4
 */
class TValidationSummaryDisplayStyle extends TEnumerable
{
        const None='None';
        const Dynamic='Dynamic';
        const Fixed='Fixed';
}