|
|
|
@ -8,6 +8,7 @@
|
|
|
|
|
namespace yii\base; |
|
|
|
|
|
|
|
|
|
use Yii; |
|
|
|
|
use yii\helpers\Html; |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* @author Qiang Xue <qiang.xue@gmail.com> |
|
|
|
@ -19,6 +20,10 @@ class ViewContent extends Component
|
|
|
|
|
const POS_BEGIN = 2; |
|
|
|
|
const POS_END = 3; |
|
|
|
|
|
|
|
|
|
const TOKEN_HEAD = '<![CDATA[YII-BLOCK-HEAD]]>'; |
|
|
|
|
const TOKEN_BODY_BEGIN = '<![CDATA[YII-BLOCK-BODY-BEGIN]]>'; |
|
|
|
|
const TOKEN_BODY_END = '<![CDATA[YII-BLOCK-BODY-END]]>'; |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* @var array |
|
|
|
|
* |
|
|
|
@ -44,7 +49,7 @@ class ViewContent extends Component
|
|
|
|
|
* ) |
|
|
|
|
* ~~~ |
|
|
|
|
*/ |
|
|
|
|
public $bundles; |
|
|
|
|
public $assetBundles; |
|
|
|
|
public $title; |
|
|
|
|
public $metaTags; |
|
|
|
|
public $linkTags; |
|
|
|
@ -57,11 +62,6 @@ class ViewContent extends Component
|
|
|
|
|
public $jsInBody; |
|
|
|
|
public $jsFilesInBody; |
|
|
|
|
|
|
|
|
|
public function populate($content) |
|
|
|
|
{ |
|
|
|
|
return $content; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public function reset() |
|
|
|
|
{ |
|
|
|
|
$this->title = null; |
|
|
|
@ -77,7 +77,169 @@ class ViewContent extends Component
|
|
|
|
|
$this->jsFilesInBody = null; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public function renderScripts($pos) |
|
|
|
|
public function begin() |
|
|
|
|
{ |
|
|
|
|
ob_start(); |
|
|
|
|
ob_implicit_flush(false); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public function end() |
|
|
|
|
{ |
|
|
|
|
$content = ob_get_clean(); |
|
|
|
|
echo $this->populate($content); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public function beginBody() |
|
|
|
|
{ |
|
|
|
|
echo self::TOKEN_BODY_BEGIN; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public function endBody() |
|
|
|
|
{ |
|
|
|
|
echo self::TOKEN_BODY_END; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public function head() |
|
|
|
|
{ |
|
|
|
|
echo self::TOKEN_HEAD; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public function requireAssetBundle($name) |
|
|
|
|
{ |
|
|
|
|
if (!isset($this->assetBundles[$name])) { |
|
|
|
|
$bundle = Yii::$app->assets->getBundle($name); |
|
|
|
|
if ($bundle !== null) { |
|
|
|
|
$this->assetBundles[$name] = $bundle; |
|
|
|
|
} else { |
|
|
|
|
throw new InvalidConfigException("Unknown asset bundle: $name"); |
|
|
|
|
} |
|
|
|
|
foreach ($bundle->depends as $d) { |
|
|
|
|
$this->requireAssetBundle($d); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public function registerMetaTag($options, $key = null) |
|
|
|
|
{ |
|
|
|
|
if ($key === null) { |
|
|
|
|
$this->metaTags[] = Html::tag('meta', '', $options); |
|
|
|
|
} else { |
|
|
|
|
$this->metaTags[$key] = Html::tag('meta', '', $options); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public function registerLinkTag($options, $key = null) |
|
|
|
|
{ |
|
|
|
|
if ($key === null) { |
|
|
|
|
$this->linkTags[] = Html::tag('link', '', $options); |
|
|
|
|
} else { |
|
|
|
|
$this->linkTags[$key] = Html::tag('link', '', $options); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public function registerCss($css, $options = array(), $key = null) |
|
|
|
|
{ |
|
|
|
|
$key = $key ?: $css; |
|
|
|
|
$this->css[$key] = Html::style($css, $options); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public function registerCssFile($url, $options = array(), $key = null) |
|
|
|
|
{ |
|
|
|
|
$key = $key ?: $url; |
|
|
|
|
$this->cssFiles[$key] = Html::cssFile($url, $options); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public function registerJs($js, $position = self::POS_END, $options = array(), $key = null) |
|
|
|
|
{ |
|
|
|
|
$key = $key ?: $js; |
|
|
|
|
$html = Html::script($js, $options); |
|
|
|
|
if ($position == self::POS_END) { |
|
|
|
|
$this->js[$key] = $html; |
|
|
|
|
} elseif ($position == self::POS_HEAD) { |
|
|
|
|
$this->jsInHead[$key] = $html; |
|
|
|
|
} elseif ($position == self::POS_BEGIN) { |
|
|
|
|
$this->jsInBody[$key] = $html; |
|
|
|
|
} else { |
|
|
|
|
throw new InvalidParamException("Unknown position: $position"); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public function registerJsFile($url, $position = self::POS_END, $options = array(), $key = null) |
|
|
|
|
{ |
|
|
|
|
$key = $key ?: $url; |
|
|
|
|
$html = Html::jsFile($url, $options); |
|
|
|
|
if ($position == self::POS_END) { |
|
|
|
|
$this->jsFiles[$key] = $html; |
|
|
|
|
} elseif ($position == self::POS_HEAD) { |
|
|
|
|
$this->jsFilesInHead[$key] = $html; |
|
|
|
|
} elseif ($position == self::POS_BEGIN) { |
|
|
|
|
$this->jsFilesInBody[$key] = $html; |
|
|
|
|
} else { |
|
|
|
|
throw new InvalidParamException("Unknown position: $position"); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
protected function populate($content) |
|
|
|
|
{ |
|
|
|
|
$this->expandAssetBundles(); |
|
|
|
|
return strtr($content, array( |
|
|
|
|
self::TOKEN_HEAD => $this->getHeadHtml(), |
|
|
|
|
self::TOKEN_BODY_BEGIN => $this->getBodyBeginHtml(), |
|
|
|
|
self::TOKEN_BODY_END => $this->getBodyEndHtml(), |
|
|
|
|
)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
protected function expandAssetBundles() |
|
|
|
|
{ |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
protected function getHeadHtml() |
|
|
|
|
{ |
|
|
|
|
$lines = array(); |
|
|
|
|
if (!empty($this->metaTags)) { |
|
|
|
|
$lines[] = implode("\n", $this->cssFiles); |
|
|
|
|
} |
|
|
|
|
if (!empty($this->linkTags)) { |
|
|
|
|
$lines[] = implode("\n", $this->cssFiles); |
|
|
|
|
} |
|
|
|
|
if (!empty($this->cssFiles)) { |
|
|
|
|
$lines[] = implode("\n", $this->cssFiles); |
|
|
|
|
} |
|
|
|
|
if (!empty($this->css)) { |
|
|
|
|
$lines[] = implode("\n", $this->css); |
|
|
|
|
} |
|
|
|
|
if (!empty($this->jsFilesInHead)) { |
|
|
|
|
$lines[] = implode("\n", $this->jsFilesInHead); |
|
|
|
|
} |
|
|
|
|
if (!empty($this->jsInHead)) { |
|
|
|
|
$lines[] = implode("\n", $this->jsInHead); |
|
|
|
|
} |
|
|
|
|
return implode("\n", $lines); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
protected function getBodyBeginHtml() |
|
|
|
|
{ |
|
|
|
|
$lines = array(); |
|
|
|
|
if (!empty($this->jsFilesInBody)) { |
|
|
|
|
$lines[] = implode("\n", $this->jsFilesInBody); |
|
|
|
|
} |
|
|
|
|
if (!empty($this->jsInHead)) { |
|
|
|
|
$lines[] = implode("\n", $this->jsInBody); |
|
|
|
|
} |
|
|
|
|
return implode("\n", $lines); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
protected function getBodyEndHtml() |
|
|
|
|
{ |
|
|
|
|
$lines = array(); |
|
|
|
|
if (!empty($this->jsFiles)) { |
|
|
|
|
$lines[] = implode("\n", $this->jsFiles); |
|
|
|
|
} |
|
|
|
|
if (!empty($this->js)) { |
|
|
|
|
$lines[] = implode("\n", $this->js); |
|
|
|
|
} |
|
|
|
|
return implode("\n", $lines); |
|
|
|
|
} |
|
|
|
|
} |