* @link http://www.pradosoft.com/ * @copyright Copyright © 2005-2014 PradoSoft * @license http://www.pradosoft.com/license/ * @package Prado\Web\UI\ActiveControls */ namespace Prado\Web\UI\ActiveControls; use Prado\Exceptions\TConfigurationException; use Prado\TPropertyValue; use Prado\Web\Javascripts\TJavaScript; /** * TBaseActiveCallbackControl is a common set of options and functionality for * active controls that can perform callback requests. * * The properties of TBaseActiveCallbackControl can be accessed and changed from * each individual active controls' {@link getActiveControl ActiveControl} * property. * * The following example sets the validation group property of a TCallback component. * * * * * Additional client-side options and events can be set using the * {@link getClientSide ClientSide} property. The following example shows * an alert box when a TCallback component response returns successfully. * * * * * @author Wei Zhuo * @package Prado\Web\UI\ActiveControls * @since 3.1 */ class TBaseActiveCallbackControl extends TBaseActiveControl { /** * Callback client-side options can be set by setting the properties of * the ClientSide property. E.g. * See {@link TCallbackClientSide} for details on the properties of ClientSide. * @return TCallbackClientSide client-side callback options. */ public function getClientSide() { if(($client = $this->getOption('ClientSide'))===null) { $client = $this->createClientSide(); $this->setOption('ClientSide', $client); } return $client; } /** * Sets the client side options. Can only be set when client side is null. * @param TCallbackClientSide client side options. */ public function setClientSide($client) { if( $this->getOption('ClientSide')===null) $this->setOption('ClientSide', $client); else throw new TConfigurationException( 'active_controls_client_side_exists', $this->getControl()->getID()); } /** * @return TCallbackClientSide callback client-side options. */ protected function createClientSide() { return new TCallbackClientSide; } /** * Sets default callback options. Takes the ID of a TCallbackOptions * component to duplicate the client-side * options for this control. The {@link getClientSide ClientSide} * subproperties takes precedence over the CallbackOptions property. * @param string ID of a TCallbackOptions control from which ClientSide * options are cloned. */ public function setCallbackOptions($value) { $this->setOption('CallbackOptions', $value, ''); } /** * @return string ID of a TCallbackOptions control from which ClientSide * options are duplicated. */ public function getCallbackOptions() { return $this->getOption('CallbackOptions', ''); } /** * Returns an array of default callback client-side options. The default options * are obtained from the client-side options of a TCallbackOptions control with * ID specified by {@link setCallbackOptions CallbackOptions}. * @return array list of default callback client-side options. */ protected function getDefaultClientSideOptions() { if(($id=$this->getCallbackOptions())!=='') { if(($pos=strrpos($id,'.'))!==false) { $control=$this->getControl()->getSubProperty(substr($id,0,$pos)); $newid=substr($id,$pos+1); if ($control!==null) $control=$control->$newid; } else { // TCheckBoxList overrides findControl() with a fake implementation // but accepts a second parameter to use the standard one $control=$this->getControl()->findControl($id, true); } if($control instanceof TCallbackOptions) return $control->getClientSide()->getOptions()->toArray(); else throw new TConfigurationException('callback_invalid_callback_options', $this->getControl()->getID(), $id); } return array(); } /** * @return boolean whether callback event trigger by this button will cause * input validation, default is true */ public function getCausesValidation() { return $this->getOption('CausesValidation',true); } /** * @param boolean whether callback event trigger by this button will cause * input validation */ public function setCausesValidation($value) { $this->setOption('CausesValidation',TPropertyValue::ensureBoolean($value),true); } /** * @return string the group of validators which the button causes validation * upon callback */ public function getValidationGroup() { return $this->getOption('ValidationGroup',''); } /** * @param string the group of validators which the button causes validation * upon callback */ public function setValidationGroup($value) { $this->setOption('ValidationGroup',$value,''); } /** * @return boolean whether to perform validation if the callback is * requested. */ public function canCauseValidation() { if($this->getCausesValidation()) { $group=$this->getValidationGroup(); return $this->getPage()->getValidators($group)->getCount()>0; } else return false; } /** * @param mixed callback parameter value. */ public function setCallbackParameter($value) { $this->setOption('CallbackParameter', $value, ''); } /** * @return mixed callback parameter value. */ public function getCallbackParameter() { return $this->getOption('CallbackParameter', ''); } /** * @return array list of callback javascript options. */ protected function getClientSideOptions() { $default = $this->getDefaultClientSideOptions(); $options = array_merge($default,$this->getClientSide()->getOptions()->toArray()); $validate = $this->getCausesValidation(); $options['CausesValidation']= $validate ? '' : false; $options['ValidationGroup']=$this->getValidationGroup(); $options['CallbackParameter'] = $this->getCallbackParameter(); // needed for TCallback if(!isset($options['EventTarget'])) $options['EventTarget'] = $this->getControl()->getUniqueID(); return $options; } /** * Registers the callback control javascript code. Client-side options are * merged and passed to the javascript code. This method should be called by * Active component developers wanting to register the javascript to initialize * the active component with additional options offered by the * {@link getClientSide ClientSide} property. * @param string client side javascript class name. * @param array additional callback options. */ public function registerCallbackClientScript($class,$options=null) { $cs = $this->getPage()->getClientScript(); if(is_array($options)) $options = array_merge($this->getClientSideOptions(),$options); else $options = $this->getClientSideOptions(); //remove true as default to save bytes if($options['CausesValidation']===true) $options['CausesValidation']=''; $cs->registerCallbackControl($class, $options); } /** * Returns the javascript callback request instance. To invoke a callback * request for this control call the dispatch() method on the * request instance. Example code in javascript * * var request = <%= $this->mycallback->ActiveControl->Javascript %>; * request.setParameter('hello'); * request.dispatch(); //make the callback request. * * * Alternatively, * * //dispatches immediately * Prado.Callback("<%= $this->mycallback->UniqueID %>", * $this->mycallback->ActiveControl->JsCallbackOptions); * * @return string javascript client-side callback request object (javascript * code) */ public function getJavascript() { $client = $this->getPage()->getClientScript(); return $client->getCallbackReference($this->getControl(),$this->getClientSideOptions()); } /** * @param string callback requestion options as javascript code. */ public function getJsCallbackOptions() { return TJavaScript::encode($this->getClientSideOptions()); } }