Commit 0d41a25e by Qiang Xue

Added support for View::POS_READY.

parent 75c54507
...@@ -58,6 +58,11 @@ class View extends Component ...@@ -58,6 +58,11 @@ class View extends Component
*/ */
const POS_END = 3; const POS_END = 3;
/** /**
* The location of registered JavaScript code block.
* This means the JavaScript code block will be enclosed within `jQuery(document).ready()`.
*/
const POS_READY = 4;
/**
* This is internally used as the placeholder for receiving the content registered for the head section. * This is internally used as the placeholder for receiving the content registered for the head section.
*/ */
const PL_HEAD = '<![CDATA[YII-BLOCK-HEAD]]>'; const PL_HEAD = '<![CDATA[YII-BLOCK-HEAD]]>';
...@@ -630,24 +635,26 @@ class View extends Component ...@@ -630,24 +635,26 @@ class View extends Component
/** /**
* Registers a JS code block. * Registers a JS code block.
* @param string $js the JS code block to be registered * @param string $js the JS code block to be registered
* @param array $options the HTML attributes for the script tag. A special option * @param integer $position the position at which the JS script tag should be inserted
* named "position" is supported which specifies where the JS script tag should be inserted * in a page. The possible values are:
* in a page. The possible values of "position" are:
* *
* - [[POS_HEAD]]: in the head section * - [[POS_HEAD]]: in the head section
* - [[POS_BEGIN]]: at the beginning of the body section * - [[POS_BEGIN]]: at the beginning of the body section
* - [[POS_END]]: at the end of the body section * - [[POS_END]]: at the end of the body section
* - [[POS_READY]]: enclosed within jQuery(document).ready(). This is the default value.
* Note that by using this position, the method will automatically register the jquery js file.
* *
* @param string $key the key that identifies the JS code block. If null, it will use * @param string $key the key that identifies the JS code block. If null, it will use
* $js as the key. If two JS code blocks are registered with the same key, the latter * $js as the key. If two JS code blocks are registered with the same key, the latter
* will overwrite the former. * will overwrite the former.
*/ */
public function registerJs($js, $options = array(), $key = null) public function registerJs($js, $position = self::POS_READY, $key = null)
{ {
$position = isset($options['position']) ? $options['position'] : self::POS_END;
unset($options['position']);
$key = $key ?: $js; $key = $key ?: $js;
$this->js[$position][$key] = Html::script($js, $options); $this->js[$position][$key] = $js;
if ($position === self::POS_READY) {
$this->registerAssetBundle('yii/jquery');
}
} }
/** /**
...@@ -659,7 +666,7 @@ class View extends Component ...@@ -659,7 +666,7 @@ class View extends Component
* *
* - [[POS_HEAD]]: in the head section * - [[POS_HEAD]]: in the head section
* - [[POS_BEGIN]]: at the beginning of the body section * - [[POS_BEGIN]]: at the beginning of the body section
* - [[POS_END]]: at the end of the body section * - [[POS_END]]: at the end of the body section. This is the default value.
* *
* @param string $key the key that identifies the JS script file. If null, it will use * @param string $key the key that identifies the JS script file. If null, it will use
* $url as the key. If two JS files are registered with the same key, the latter * $url as the key. If two JS files are registered with the same key, the latter
...@@ -697,7 +704,7 @@ class View extends Component ...@@ -697,7 +704,7 @@ class View extends Component
$lines[] = implode("\n", $this->jsFiles[self::POS_HEAD]); $lines[] = implode("\n", $this->jsFiles[self::POS_HEAD]);
} }
if (!empty($this->js[self::POS_HEAD])) { if (!empty($this->js[self::POS_HEAD])) {
$lines[] = implode("\n", $this->js[self::POS_HEAD]); $lines[] = Html::script(implode("\n", $this->js[self::POS_HEAD]), array('type' => 'text/javascript'));
} }
return empty($lines) ? '' : implode("\n", $lines) . "\n"; return empty($lines) ? '' : implode("\n", $lines) . "\n";
} }
...@@ -714,7 +721,7 @@ class View extends Component ...@@ -714,7 +721,7 @@ class View extends Component
$lines[] = implode("\n", $this->jsFiles[self::POS_BEGIN]); $lines[] = implode("\n", $this->jsFiles[self::POS_BEGIN]);
} }
if (!empty($this->js[self::POS_BEGIN])) { if (!empty($this->js[self::POS_BEGIN])) {
$lines[] = implode("\n", $this->js[self::POS_BEGIN]); $lines[] = Html::script(implode("\n", $this->js[self::POS_BEGIN]), array('type' => 'text/javascript'));
} }
return empty($lines) ? '' : implode("\n", $lines) . "\n"; return empty($lines) ? '' : implode("\n", $lines) . "\n";
} }
...@@ -731,7 +738,11 @@ class View extends Component ...@@ -731,7 +738,11 @@ class View extends Component
$lines[] = implode("\n", $this->jsFiles[self::POS_END]); $lines[] = implode("\n", $this->jsFiles[self::POS_END]);
} }
if (!empty($this->js[self::POS_END])) { if (!empty($this->js[self::POS_END])) {
$lines[] = implode("\n", $this->js[self::POS_END]); $lines[] = Html::script(implode("\n", $this->js[self::POS_END]), array('type' => 'text/javascript'));
}
if (!empty($this->js[self::POS_READY])) {
$js = "jQuery(document).ready(function(){\n{" . implode("\n", $this->js[self::POS_READY]) . "}\n});";
$lines[] = Html::script($js, array('type' => 'text/javascript'));
} }
return empty($lines) ? '' : implode("\n", $lines) . "\n"; return empty($lines) ? '' : implode("\n", $lines) . "\n";
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment