%PDF- %PDF-
| Direktori : /home/vacivi36/intranet.vacivitta.com.br/protected/humhub/components/assets/ |
| Current File : /home/vacivi36/intranet.vacivitta.com.br/protected/humhub/components/assets/AssetBundle.php |
<?php
namespace humhub\components\assets;
use Yii;
use yii\helpers\ArrayHelper;
use yii\web\Application;
use yii\web\AssetBundle as BaseAssetBundle;
use humhub\assets\CoreBundleAsset;
use humhub\modules\ui\view\components\View;
/**
* This base asset bundle class adds some additional properties as well ass default loading behavior for HumHub assets.
*
* Some of the properties will affect settings as `jsOptions` or `publishOptions`. Note that settings defined
* directly within those option arrays will have priority over the settings defined as property.
*
* For example:
*
* ```
* public $position = View::POS_HEAD;
* ```
*
* will be overwritten by
*
* ```
* public $jsOptions = [
* 'position' => VIEW::POS_END;
* ]
* ```
*
* ### Production vs Debug
*
* The additional `$jsProd` property allows the definition of production assets which will be used in production and
* acceptance test environments e.g. for minified scripts and stylesheets. This serves to facilitate development without the need
* to rebuild assets while development and also allows a preview of all un-minified/combined assets.
*
* - `jsProd` can be used to define script assets used in production, if not set `$js` settings will be used instead
* - `cssProd` can be used to define stylesheet assets used in production, if not set `$css` settings will be used instead
* - `forceProductionAssets` property can be used while development in order to force production asset usage also in debug mode
*
* The `forceCopy` property can be used to set the forceCopy publishOption.
*
* > Note: This asset bundle prevents `forceCopy` on production environments due to performance issues,
* but only if not directly set in publishOptions array
*
* ### Default script loading behavior
*
* The default script settings are described in the following:
*
* - `defer` script loading is active by default and can be activated by the `$defer` property
* - `async` script loading is not active by default and can be activated by the `$async` property
* - `position` if no jsOption position is set and either `async` or `defer` is set (default) `View::POS_HEAD` is used
*
* @package humhub\components
*/
class AssetBundle extends BaseAssetBundle
{
/**
* @var bool can be used to force production asset usage while testing
*/
protected static $forceProductionAssets = false;
/**
* @var [] can be defined to use a different set of js assets in production mode e.g. for minified/combined scripts.
*/
public $jsProd;
/**
* @var [] can be defined to use a different set of css assets in production mode e.g. for minified/combined stylesheets.
*/
public $cssProd;
/**
* @var bool if true (default) the `$jsOptions['defer']` will be activated only if this jsOption is not explicitly set.
*/
public $defer = true;
/**
* @var bool if true the `$jsOptions['async']` will be activated only if this jsOption is not explicitly set.
*/
public $async = false;
/**
* @var int can be used to set `$publishOptions['position']`. This property will only have an affect if the publishOption
* is not already set explicitly.
*/
public $jsPosition;
/**
* @var bool can be used to set `$publishOptions['forceCopy']`. This property will be ignored in production environment
*/
public $forceCopy = false;
/**
* @var array may contain scripts or stylesheets which should be pre-loaded by a `<link rel="preload">` tag
*/
public $preload = [];
/**
* @var array|false default dependencies not required to be mentioned in $depends. Normally only deactivated in some
* core assets.
*/
public $defaultDepends = [
CoreBundleAsset::class
];
/**
* @inheritDoc
*/
public function init()
{
parent::init();
$useProdAssets = static::useProductionAssets();
if($this->isAsync()) {
$this->defer = false;
}
if($this->jsProd !== null && $useProdAssets) {
$this->js = $this->jsProd;
}
if($this->cssProd !== null && $useProdAssets) {
$this->css = $this->cssProd;
}
if(!$this->isAsync() && $this->isDefer()) {
$this->jsOptions['defer'] = 'defer';
} else if($this->isAsync()) {
$this->jsOptions['async'] = 'async';
}
$this->jsOptions['position'] = $this->getJsPosition();
if(!$useProdAssets && $this->forceCopy && !isset($this->publishOptions['forceCopy'])) {
$this->publishOptions['forceCopy'] = true;
} else if(!isset($this->publishOptions['forceCopy'])) {
$this->publishOptions['forceCopy'] = false;
}
if((!(Yii::$app instanceof Application) || !Yii::$app->request->isAjax) && !empty($this->dependsDefault)) {
$this->depends[] = ArrayHelper::merge($this->depends, $this->defaultDepends);
}
}
/**
* @return int determines the $jsOptions['position'] value. By default the position will be `View::POS_HEAD` if
* the `defer` or `async` is set. Otherwise `View::POS_END` is returned as default if no `$this->publishOptions['position']`,
* `$jsPosition` given.
*/
protected function getJsPosition()
{
if(isset($this->publishOptions['position'])) {
return $this->publishOptions['position'];
}
if($this->jsPosition !== null) {
return $this->jsPosition;
}
if($this->isAsync() || $this->isDefer()) {
return View::POS_HEAD;
}
return View::POS_END;
}
/**
* @return bool whether or not the `async` script option is set
*/
protected function isAsync()
{
return $this->async || isset($this->jsOptions['async']);
}
/**
* @return bool whether or not the `defer` script option is set
*/
protected function isDefer()
{
return $this->defer || isset($this->jsOptions['defer']);
}
/**
* @return bool whether or not to use the production assets
*/
protected static function useProductionAssets()
{
return static::$forceProductionAssets || YII_ENV_PROD || YII_ENV_TEST;
}
}