| 
<?php
 /**
 * JsCall.php - A javascript function call, with its parameters.
 *
 * @package jaxon-core
 * @author Jared White
 * @author J. Max Wilson
 * @author Joseph Woolley
 * @author Steffen Konerow
 * @author Thierry Feuzeu
 * @copyright Copyright (c) 2005-2007 by Jared White & J. Max Wilson
 * @copyright Copyright (c) 2008-2010 by Joseph Woolley, Steffen Konerow, Jared White  & J. Max Wilson
 * @copyright 2016 Thierry Feuzeu <[email protected]>
 * @license https://opensource.org/licenses/BSD-3-Clause BSD 3-Clause License
 * @link https://github.com/jaxon-php/jaxon-core
 */
 
 namespace Jaxon\Request\Factory;
 
 use JsonSerializable;
 use Jaxon\Jaxon;
 
 class JsCall implements JsonSerializable
 {
 /**
 * The name of the javascript function
 *
 * @var string
 */
 private $sFunction;
 
 /**
 * A string containing either a single or a double quote character that will be used
 * during the generation of the javascript for this function.
 * This can be set prior to calling <Request->getScript>
 *
 * @var string
 */
 public $sQuoteCharacter;
 
 /**
 * An array of parameters that will be used to populate the argument list for this function
 * when the javascript is output in <Request->getScript>
 *
 * @var array
 */
 protected $aParameters;
 
 /**
 * The constructor.
 *
 * @param string        $sFunction            The javascript function
 */
 public function __construct($sFunction)
 {
 $this->aParameters = [];
 $this->sQuoteCharacter = '"';
 $this->sFunction = $sFunction;
 }
 
 /**
 * Instruct the request to use single quotes when generating the javascript
 *
 * @return JsCall
 */
 public function useSingleQuote()
 {
 $this->sQuoteCharacter = "'";
 return $this;
 }
 
 /**
 * Instruct the request to use single quotes when generating the javascript
 *
 * @return JsCall
 */
 public function useSingleQuotes()
 {
 $this->sQuoteCharacter = "'";
 return $this;
 }
 
 /**
 * Instruct the request to use double quotes while generating the javascript
 *
 * @return JsCall
 */
 public function useDoubleQuote()
 {
 $this->sQuoteCharacter = '"';
 return $this;
 }
 
 /**
 * Instruct the request to use double quotes while generating the javascript
 *
 * @return JsCall
 */
 public function useDoubleQuotes()
 {
 $this->sQuoteCharacter = '"';
 return $this;
 }
 
 /**
 * Clear the parameter list associated with this request
 *
 * @return JsCall
 */
 public function clearParameters()
 {
 $this->aParameters = [];
 return $this;
 }
 
 /**
 * Set the value of the parameter at the given position
 *
 * @param Contracts\Parameter      $xParameter             The value to be used
 *
 * @return JsCall
 */
 public function pushParameter(Contracts\Parameter $xParameter)
 {
 $this->aParameters[] = $xParameter;
 return $this;
 }
 
 /**
 * Add a parameter value to the parameter list for this request
 *
 * @param string            $sType              The type of the value to be used
 * @param string            $sValue             The value to be used
 *
 * Types should be one of the following <Parameter::FORM_VALUES>, <Parameter::QUOTED_VALUE>, <Parameter::NUMERIC_VALUE>,
 * <Parameter::JS_VALUE>, <Parameter::INPUT_VALUE>, <Parameter::CHECKED_VALUE>, <Parameter::PAGE_NUMBER>.
 * The value should be as follows:
 * - <Parameter::FORM_VALUES> - Use the ID of the form you want to process.
 * - <Parameter::QUOTED_VALUE> - The string data to be passed.
 * - <Parameter::JS_VALUE> - A string containing valid javascript
 *   (either a javascript variable name that will be in scope at the time of the call or
 *   a javascript function call whose return value will become the parameter).
 *
 * @return JsCall
 */
 public function addParameter($sType, $sValue)
 {
 $this->pushParameter(new Parameter($sType, $sValue));
 return $this;
 }
 
 /**
 * Add a set of parameters to this request
 *
 * @param array             $aParameters             The parameters
 *
 * @return JsCall
 */
 public function addParameters(array $aParameters)
 {
 foreach($aParameters as $xParameter)
 {
 if($xParameter instanceof JsCall)
 {
 $this->addParameter(Parameter::JS_VALUE, 'function(){' . $xParameter->getScript() . ';}');
 }
 else
 {
 $this->pushParameter(Parameter::make($xParameter));
 }
 }
 return $this;
 }
 
 /**
 * Returns a string representation of the script output (javascript) from this request object
 *
 * @return string
 */
 public function getScript()
 {
 return $this->sFunction . '(' . implode(', ', $this->aParameters) . ')';
 }
 
 /**
 * Convert this request object to string
 *
 * @return string
 */
 public function __toString()
 {
 return $this->getScript();
 }
 
 /**
 * Convert this request object to string, when converting the response into json.
 *
 * This is a method of the JsonSerializable interface.
 *
 * @return string
 */
 public function jsonSerialize()
 {
 return $this->getScript();
 }
 }
 
 |