blocks should be written 'safely,' i.e. wrapped in CDATA blocks * * @var boolean * @access public */ var $safe = false; /** * HTML tags used by this helper. * * @var array * @access public */ var $tags = array( 'javascriptstart' => '', 'javascriptblock' => '', 'javascriptlink' => '' ); /** * Holds options passed to codeBlock(), saved for when block is dumped to output * * @var array * @access protected * @see JavascriptHelper::codeBlock() */ var $_blockOptions = array(); /** * Caches events written by event() for output at the end of page execution * * @var array * @access protected * @see JavascriptHelper::event() */ var $_cachedEvents = array(); /** * Indicates whether generated events should be cached for later output (can be written at the * end of the page, in the , or to an external file). * * @var boolean * @access protected * @see JavascriptHelper::event() * @see JavascriptHelper::writeEvents() */ var $_cacheEvents = false; /** * Indicates whether cached events should be written to an external file * * @var boolean * @access protected * @see JavascriptHelper::event() * @see JavascriptHelper::writeEvents() */ var $_cacheToFile = false; /** * Indicates whether *all* generated JavaScript should be cached for later output * * @var boolean * @access protected * @see JavascriptHelper::codeBlock() * @see JavascriptHelper::blockEnd() */ var $_cacheAll = false; /** * Contains event rules attached with CSS selectors. Used with the event:Selectors JavaScript * library. * * @var array * @access protected * @see JavascriptHelper::event() * @link http://alternateidea.com/event-selectors/ */ var $_rules = array(); /** * @var string * @access private */ var $__scriptBuffer = null; /** * Constructor. Checks for presence of native PHP JSON extension to use for object encoding * * @access public */ function __construct($options = array()) { if (!empty($options)) { foreach ($options as $key => $val) { if (is_numeric($key)) { $key = $val; $val = true; } switch ($key) { case 'cache': break; case 'safe': $this->safe = $val; break; } } } $this->useNative = function_exists('json_encode'); return parent::__construct($options); } /** * Returns a JavaScript script tag. * * Options: * * - allowCache: boolean, designates whether this block is cacheable using the * current cache settings. * - safe: boolean, whether this block should be wrapped in CDATA tags. Defaults * to helper's object configuration. * - inline: whether the block should be printed inline, or written * to cached for later output (i.e. $scripts_for_layout). * * @param string $script The JavaScript to be wrapped in SCRIPT tags. * @param array $options Set of options: * @return string The full SCRIPT element, with the JavaScript inside it, or null, * if 'inline' is set to false. */ function codeBlock($script = null, $options = array()) { if (!empty($options) && !is_array($options)) { $options = array('allowCache' => $options); } elseif (empty($options)) { $options = array(); } $defaultOptions = array('allowCache' => true, 'safe' => true, 'inline' => true); $options = array_merge($defaultOptions, $options); if (empty($script)) { $this->__scriptBuffer = @ob_get_contents(); $this->_blockOptions = $options; $this->inBlock = true; @ob_end_clean(); ob_start(); return null; } if ($this->_cacheEvents && $this->_cacheAll && $options['allowCache']) { $this->_cachedEvents[] = $script; return null; } if ($options['safe'] || $this->safe) { $script = "\n" . '//' . "\n"; } if ($options['inline']) { return sprintf($this->tags['javascriptblock'], $script); } else { $view =& ClassRegistry::getObject('view'); $view->addScript(sprintf($this->tags['javascriptblock'], $script)); } } /** * Ends a block of cached JavaScript code * * @return mixed */ function blockEnd() { if (!isset($this->inBlock) || !$this->inBlock) { return; } $script = @ob_get_contents(); @ob_end_clean(); ob_start(); echo $this->__scriptBuffer; $this->__scriptBuffer = null; $options = $this->_blockOptions; $this->_blockOptions = array(); $this->inBlock = false; if (empty($script)) { return null; } return $this->codeBlock($script, $options); } /** * Returns a JavaScript include tag (SCRIPT element). If the filename is prefixed with "/", * the path will be relative to the base path of your application. Otherwise, the path will * be relative to your JavaScript path, usually webroot/js. * * @param mixed $url String URL to JavaScript file, or an array of URLs. * @param boolean $inline If true, the