Skip to content

Commit

Permalink
Applying patch from 'Dremora' fixes JavascriptHelper::codeBlock() and…
Browse files Browse the repository at this point in the history
… blockEnd() bugs where content vanished due to incorrectly structured buffers. Minor behavior change in that codeBlock(null) no longer returns an opening script tag. The entire script tag is returned when blockEnd() is called.

Test cases updated and refactored.
Fixes #6504


git-svn-id: https://svn.cakephp.org/repo/branches/1.2.x.x@8231 3807eeeb-6ff5-0310-8944-8be069107fe0
  • Loading branch information
markstory committed Jul 14, 2009
1 parent 02ed77a commit baea319
Show file tree
Hide file tree
Showing 2 changed files with 217 additions and 143 deletions.
75 changes: 29 additions & 46 deletions cake/libs/view/helpers/javascript.php
Expand Up @@ -60,10 +60,10 @@ class JavascriptHelper extends AppHelper {
* @access public
*/
var $tags = array(
'javascriptblock' => '<script type="text/javascript">%s</script>',
'javascriptstart' => '<script type="text/javascript">',
'javascriptlink' => '<script type="text/javascript" src="%s"></script>',
'javascriptend' => '</script>'
'javascriptend' => '</script>',
'javascriptblock' => '<script type="text/javascript">%s</script>',
'javascriptlink' => '<script type="text/javascript" src="%s"></script>'
);
/**
* Holds options passed to codeBlock(), saved for when block is dumped to output
Expand Down Expand Up @@ -173,42 +173,28 @@ function codeBlock($script = null, $options = array()) {
$options = array();
}
$defaultOptions = array('allowCache' => true, 'safe' => true, 'inline' => true);
$options = array_merge($defaultOptions, compact('safe'), $options);
$options = array_merge($defaultOptions, $options);

if ($this->_cacheEvents && $this->_cacheAll && $options['allowCache'] && $script !== null) {
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" . '//<![CDATA[' . "\n" . $script . "\n" . '//]]>' . "\n";
}
if ($options['inline']) {
return sprintf($this->tags['javascriptblock'], $script);
} else {
$block = ($script !== null);
$safe = ($options['safe'] || $this->safe);
if ($safe && !($this->_cacheAll && $options['allowCache'])) {
$script = "\n" . '//<![CDATA[' . "\n" . $script;
if ($block) {
$script .= "\n" . '//]]>' . "\n";
}
}

if ($script === null) {
$this->__scriptBuffer = @ob_get_contents();
$this->_blockOptions = $options;
$this->inBlock = true;
@ob_end_clean();
ob_start();
return null;
} else if (!$block) {
$this->_blockOptions = $options;
}

if ($options['inline']) {
if ($block) {
return sprintf($this->tags['javascriptblock'], $script);
} else {
$safe = ($safe ? "\n" . '//<![CDATA[' . "\n" : '');
return $this->tags['javascriptstart'] . $safe;
}
} elseif ($block) {
$view =& ClassRegistry::getObject('view');
$view->addScript(sprintf($this->tags['javascriptblock'], $script));
}
$view =& ClassRegistry::getObject('view');
$view->addScript(sprintf($this->tags['javascriptblock'], $script));
}
}
/**
Expand All @@ -217,26 +203,23 @@ function codeBlock($script = null, $options = array()) {
* @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;
$safe = ((isset($options['safe']) && $options['safe']) || $this->safe);
$this->_blockOptions = array();
$this->inBlock = false;

if (isset($options['inline']) && !$options['inline']) {
$view =& ClassRegistry::getObject('view');
$view->addScript(sprintf($this->tags['javascriptblock'], $script));
}

if (!empty($script) && $this->_cacheAll && $options['allowCache']) {
$this->_cachedEvents[] = $script;

if (empty($script)) {
return null;
}
return ife($safe, "\n" . '//]]>' . "\n", '').$this->tags['javascriptend'];

return $this->codeBlock($script, $options);
}
/**
* Returns a JavaScript include tag (SCRIPT element). If the filename is prefixed with "/",
Expand Down

0 comments on commit baea319

Please sign in to comment.