Assets ====== Un asset en Yii es un archivo al que se puede hacer referencia en una página Web. Puede ser un archivo CSS, un archivo JavaScript, una imagen o un archivo de video, etc. Los assets se encuentran en los directorios públicos de la web y se sirven directamente por los servidores Web. A menudo es preferible gestionar los assets mediante programación. Por ejemplo, cuando se usa el widget [[yii\jui\DatePicker]] en una página, éste incluirá automáticamente los archivos CSS y JavaScript requeridos, en vez de tener que buscar los archivos e incluirlos manualmente. Y cuando se actualice el widget a una nueva versión, ésta usará de forma automática la nueva versión de los archivos asset. En este tutorial, se describirá la poderosa capacidad que proporciona la gestión de assets en Yii. ## Asset Bundles Yii gestiona los assets en unidades de *asset bundle*. Un asset bundle es simplemente un conjunto de assets localizados en un directorio. Cuando se registra un asset bundle en una [vista](structure-views.md), éste incluirá los archivos CSS y JavaScript del bundle en la página Web renderizada. ## Definición de Asset Bundles Los asset bundles son descritos como clases PHP que extienden a [[yii\web\AssetBundle]]. El nombre del bundle es simplemente su correspondiente nombre de la classe PHP que debe ser [autocargable](concept-autoloading.md). En una clase asset bundle, lo más habitual es especificar donde se encuentran los archivos asset, que archivos CSS y JavaScript contiene el bundle, y como depende este bundle de otros bundles. El siguiente código define el asset bundle principal que se usa en [la plantilla de aplicación básica](start-installation.md): ```php Según la localización de los assets, se pueden clasificar como: * assets fuente (source assets): los assets se encuentran junto con el código fuente PHP, al que no se puede acceder directamente a través de la Web. Para usar los assets fuente en una página, deben ser copiados en un directorio público y transformados en los llamados assets publicados. El proceso se llama *publicación de assets* que será descrito a continuación. * assets publicados (published assets): los archivos assets se encuentran en el directorio Web y son accesibles vía Web. * assets externos (external assets): los archivos assets se encuentran en un servidor Web diferente al de la aplicación. Cuando se define una clase asset bundle, si se especifica la propiedad [[yii\web\AssetBundle::sourcePath|sourcePath]], significa que cualquier asset listado que use rutas relativas será considerado como un asset fuente. Si no se especifica la propiedad, significa que los assets son assets publicados (se deben especificar [[yii\web\AssetBundle::basePath|basePath]] y [[yii\web\AssetBundle::baseUrl|baseUrl]] para hacerle saber a Yii dónde se encuentran.) Se recomienda ubicar los assets que correspondan a la aplicación en un directorio Web para evitar publicaciones de assets innecesarias. Por esto en el anterior ejemplo `AppAsset` especifica [[yii\web\AssetBundle::basePath|basePath]] en vez de [[yii\web\AssetBundle::sourcePath|sourcePath]]. Para las [extensiones](structure-extensions.md), por el hecho de que sus assets se encuentran junto con el código fuente, en directorios que no son accesibles para la Web, se tiene que especificar la propiedad [[yii\web\AssetBundle::sourcePath|sourcePath]] cuando se definan clases asset bundle para ellas. > Note: No se debe usar `@webroot/assets` como [[yii\web\AssetBundle::sourcePath|source path]]. Este directorio se usa por defecto por el [[yii\web\AssetManager|asset manager]] para guardar los archivos asset publicados temporalmente y pueden ser eliminados. ### Dependencias de los Asset Cuando se incluyen múltiples archivos CSS o JavaScript en una página Web, tienen que cumplir ciertas órdenes para evitar problemas de sobrescritura. Por ejemplo, si se usa un widget jQuery UI en una página Web, tenemos que asegurarnos de que el archivo JavaScript jQuery se incluya antes que el archivo JavaScript jQuery UI. A esto se le llama ordenar las dependencias entre archivos. Las dependencias de los assets se especifican principalmente a través de la propiedad [[yii\AssetBundle::depends]]. En el ejemplo `AppAsset`, el asset bundle depende de otros dos asset bundles [[yii\web\YiiAsset]] y [[yii\bootstrap\BootstrapAsset]], que significa que los archivos CSS y JavaScript en `AppAsset` se incluirán *después* que los archivos de los dos bundles dependientes. Las dependencias son transitivas. Esto significa, que si un bundle A depende de un bundle B que depende de C, A dependerá de C, también. ### Opciones de los Assets Se pueden especificar las propiedades [[yii\web\AssetBundle::cssOptions|cssOptions]] y [[yii\web\AssetBundle::jsOptions|jsOptions]] para personalizar la forma en que los archivos CSS y JavaScript serán incluidos en una página. Los valores de estas propiedades serán enviadas a los métodos [[yii\web\View::registerCssFile()]] y [[yii\web\View::registerJsFile()]], respectivamente cuando las [vistas](structure-views.md) los llamen para incluir los archivos CSS y JavaScript. > Note: Las opciones que se especifican en una clase bundle se aplican a *todos* los archivos CSS/JavaScript de un bundle. Si se quiere usar diferentes opciones para diferentes archivos, se deben crear assets bundles separados y usar un conjunto de opciones para cada bundle. Por ejemplo, para incluir una archivo CSS condicionalmente para navegadores que como IE9 o anteriores, se puede usar la siguiente opción: ```php public $cssOptions = ['condition' => 'lte IE9']; ``` Esto provoca que un archivo CSS dentro de un bundle sea incluido usando los siguientes tags HTML: ```html ``` Para envolver el tag del enlace con `