|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581 |
- <?php
-
-
- namespace yii\web;
-
- use Yii;
- use yii\helpers\ArrayHelper;
- use yii\helpers\Html;
- use yii\base\InvalidConfigException;
-
-
- class View extends \yii\base\View
- {
-
-
- const EVENT_BEGIN_BODY = 'beginBody';
-
-
- const EVENT_END_BODY = 'endBody';
-
-
- const POS_HEAD = 1;
-
-
- const POS_BEGIN = 2;
-
-
- const POS_END = 3;
-
-
- const POS_READY = 4;
-
-
- const POS_LOAD = 5;
-
-
- const PH_HEAD = '<![CDATA[YII-BLOCK-HEAD]]>';
-
-
- const PH_BODY_BEGIN = '<![CDATA[YII-BLOCK-BODY-BEGIN]]>';
-
-
- const PH_BODY_END = '<![CDATA[YII-BLOCK-BODY-END]]>';
-
-
-
- public $assetBundles = [];
-
-
- public $title;
-
-
- public $metaTags;
-
-
- public $linkTags;
-
-
- public $css;
-
-
- public $cssFiles;
-
-
- public $js;
-
-
- public $jsFiles;
-
- private $_assetManager;
-
-
-
-
- public function head()
- {
- echo self::PH_HEAD;
- }
-
-
-
- public function beginBody()
- {
- echo self::PH_BODY_BEGIN;
- $this->trigger(self::EVENT_BEGIN_BODY);
- }
-
-
-
- public function endBody()
- {
- $this->trigger(self::EVENT_END_BODY);
- echo self::PH_BODY_END;
-
- foreach (array_keys($this->assetBundles) as $bundle) {
- $this->registerAssetFiles($bundle);
- }
- }
-
-
-
- public function endPage($ajaxMode = false)
- {
- $this->trigger(self::EVENT_END_PAGE);
-
- $content = ob_get_clean();
-
- echo strtr($content, [
- self::PH_HEAD => $this->renderHeadHtml(),
- self::PH_BODY_BEGIN => $this->renderBodyBeginHtml(),
- self::PH_BODY_END => $this->renderBodyEndHtml($ajaxMode),
- ]);
-
- $this->clear();
- }
-
-
-
- public function renderAjax($view, $params = [], $context = null)
- {
- $viewFile = $this->findViewFile($view, $context);
-
- ob_start();
- ob_implicit_flush(false);
-
- $this->beginPage();
- $this->head();
- $this->beginBody();
- echo $this->renderFile($viewFile, $params, $context);
- $this->endBody();
- $this->endPage(true);
-
- return ob_get_clean();
- }
-
-
-
- public function getAssetManager()
- {
- return $this->_assetManager ?: Yii::$app->getAssetManager();
- }
-
-
-
- public function setAssetManager($value)
- {
- $this->_assetManager = $value;
- }
-
-
-
- public function clear()
- {
- $this->metaTags = null;
- $this->linkTags = null;
- $this->css = null;
- $this->cssFiles = null;
- $this->js = null;
- $this->jsFiles = null;
- $this->assetBundles = [];
- }
-
-
-
- protected function registerAssetFiles($name)
- {
- if (!isset($this->assetBundles[$name])) {
- return;
- }
- $bundle = $this->assetBundles[$name];
- if ($bundle) {
- foreach ($bundle->depends as $dep) {
- $this->registerAssetFiles($dep);
- }
- $bundle->registerAssetFiles($this);
- }
- unset($this->assetBundles[$name]);
- }
-
-
-
- public function registerAssetBundle($name, $position = null)
- {
- if (!isset($this->assetBundles[$name])) {
- $am = $this->getAssetManager();
- $bundle = $am->getBundle($name);
- $this->assetBundles[$name] = false;
-
- $pos = isset($bundle->jsOptions['position']) ? $bundle->jsOptions['position'] : null;
- foreach ($bundle->depends as $dep) {
- $this->registerAssetBundle($dep, $pos);
- }
- $this->assetBundles[$name] = $bundle;
- } elseif ($this->assetBundles[$name] === false) {
- throw new InvalidConfigException("A circular dependency is detected for bundle '$name'.");
- } else {
- $bundle = $this->assetBundles[$name];
- }
-
- if ($position !== null) {
- $pos = isset($bundle->jsOptions['position']) ? $bundle->jsOptions['position'] : null;
- if ($pos === null) {
- $bundle->jsOptions['position'] = $pos = $position;
- } elseif ($pos > $position) {
- throw new InvalidConfigException("An asset bundle that depends on '$name' has a higher javascript file position configured than '$name'.");
- }
-
- foreach ($bundle->depends as $dep) {
- $this->registerAssetBundle($dep, $pos);
- }
- }
-
- return $bundle;
- }
-
-
-
- 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 = [], $key = null)
- {
- $key = $key ?: md5($css);
- $this->css[$key] = Html::style($css, $options);
- }
-
-
-
- public function registerCssFile($url, $options = [], $key = null)
- {
- $url = Yii::getAlias($url);
- $key = $key ?: $url;
-
- $depends = ArrayHelper::remove($options, 'depends', []);
-
- if (empty($depends)) {
- $this->cssFiles[$key] = Html::cssFile($url, $options);
- } else {
- $this->getAssetManager()->bundles[$key] = Yii::createObject([
- 'class' => AssetBundle::className(),
- 'baseUrl' => '',
- 'css' => [strncmp($url, '//', 2) === 0 ? $url : ltrim($url, '/')],
- 'cssOptions' => $options,
- 'depends' => (array)$depends,
- ]);
- $this->registerAssetBundle($key);
- }
- }
-
-
-
- public function registerJs($js, $position = self::POS_READY, $key = null)
- {
- $key = $key ?: md5($js);
- $this->js[$position][$key] = $js;
- if ($position === self::POS_READY || $position === self::POS_LOAD) {
- JqueryAsset::register($this);
- }
- }
-
-
-
- public function registerJsFile($url, $options = [], $key = null)
- {
- $url = Yii::getAlias($url);
- $key = $key ?: $url;
-
- $depends = ArrayHelper::remove($options, 'depends', []);
-
- if (empty($depends)) {
- $position = ArrayHelper::remove($options, 'position', self::POS_END);
- $this->jsFiles[$position][$key] = Html::jsFile($url, $options);
- } else {
- $this->getAssetManager()->bundles[$key] = Yii::createObject([
- 'class' => AssetBundle::className(),
- 'baseUrl' => '',
- 'js' => [strncmp($url, '//', 2) === 0 ? $url : ltrim($url, '/')],
- 'jsOptions' => $options,
- 'depends' => (array)$depends,
- ]);
- $this->registerAssetBundle($key);
- }
- }
-
-
-
- protected function renderHeadHtml()
- {
- $lines = [];
- if (!empty($this->metaTags)) {
- $lines[] = implode("\n", $this->metaTags);
- }
-
- if (!empty($this->linkTags)) {
- $lines[] = implode("\n", $this->linkTags);
- }
- if (!empty($this->cssFiles)) {
- $lines[] = implode("\n", $this->cssFiles);
- }
- if (!empty($this->css)) {
- $lines[] = implode("\n", $this->css);
- }
- if (!empty($this->jsFiles[self::POS_HEAD])) {
- $lines[] = implode("\n", $this->jsFiles[self::POS_HEAD]);
- }
- if (!empty($this->js[self::POS_HEAD])) {
- $lines[] = Html::script(implode("\n", $this->js[self::POS_HEAD]), ['type' => 'text/javascript']);
- }
-
- return empty($lines) ? '' : implode("\n", $lines);
- }
-
-
-
- protected function renderBodyBeginHtml()
- {
- $lines = [];
- if (!empty($this->jsFiles[self::POS_BEGIN])) {
- $lines[] = implode("\n", $this->jsFiles[self::POS_BEGIN]);
- }
- if (!empty($this->js[self::POS_BEGIN])) {
- $lines[] = Html::script(implode("\n", $this->js[self::POS_BEGIN]), ['type' => 'text/javascript']);
- }
-
- return empty($lines) ? '' : implode("\n", $lines);
- }
-
-
-
- protected function renderBodyEndHtml($ajaxMode)
- {
- $lines = [];
-
- if (!empty($this->jsFiles[self::POS_END])) {
- $lines[] = implode("\n", $this->jsFiles[self::POS_END]);
- }
-
- if ($ajaxMode) {
- $scripts = [];
- if (!empty($this->js[self::POS_END])) {
- $scripts[] = implode("\n", $this->js[self::POS_END]);
- }
- if (!empty($this->js[self::POS_READY])) {
- $scripts[] = implode("\n", $this->js[self::POS_READY]);
- }
- if (!empty($this->js[self::POS_LOAD])) {
- $scripts[] = implode("\n", $this->js[self::POS_LOAD]);
- }
- if (!empty($scripts)) {
- $lines[] = Html::script(implode("\n", $scripts), ['type' => 'text/javascript']);
- }
- } else {
- if (!empty($this->js[self::POS_END])) {
- $lines[] = Html::script(implode("\n", $this->js[self::POS_END]), ['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, ['type' => 'text/javascript']);
- }
- if (!empty($this->js[self::POS_LOAD])) {
- $js = "jQuery(window).on('load', function () {\n" . implode("\n", $this->js[self::POS_LOAD]) . "\n});";
- $lines[] = Html::script($js, ['type' => 'text/javascript']);
- }
- }
-
- return empty($lines) ? '' : implode("\n", $lines);
- }
- }
|