Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Yii2 add google font to head

Tags:

yii2

I was wondering how do you add link tag/google font to head in yii2.

I want to add the following

<link href='http://fonts.googleapis.com/css?family=Open+Sans:400,300,600,700' rel='stylesheet' type='text/css'>

I have found this documentation but doesn't mention anything about link/adding google font etc

like image 491
con322 Avatar asked Feb 23 '15 17:02

con322


1 Answers

The correct answer is to create a new AssetBundle.

While you can directly place the HTML for the fonts into the of your main.php file, this isn't the Yii way. If you have tried to load jQuery files this way, you might notice odd behavior when directly putting them into the HTML.

For example: Directly place the HTML tag for Bootstrap CDN into the head of your main.php. Then, somewhere in your code try to use the tooltip. You will get an error in your console that tooltip is not a function. - This is because the way Yii puts all your template files together, and at that time, Bootstrap is not available.

While simply loading a font probably won't cause any problems, it is a good idea to do things the way they were intended. Following MVC rules, properly documenting your code, and following the Yii best practices, will go a long way. Not only will you thank yourself a year later when you have to go back into a project, but the next guy will appreciate it. I can't stand going into systems, and seeing stuff thrown everywhere, chincy hacks, and spaghetti code, and no documentation or comments.


Correct Way:

Create a new AssetBundle. In your assets folder, you probably already have AppAsset.php. Duplicate it, and name it FontAsset.php.

Here is an example from my project, using 3 Google fonts.

FontAsset.php

<?php
namespace app\assets;

use yii\web\AssetBundle;

class FontAsset extends AssetBundle
{
    public $basePath = '@webroot';
    public $baseUrl = '@web';
    public $css = [
        '//fonts.googleapis.com/css?family=Open+Sans:400,700',
        '//fonts.googleapis.com/css?family=Ubuntu:400,700',
        '//fonts.googleapis.com/css?family=Oswald:400,700'
    ];
    public $cssOptions = [
        'type' => 'text/css',
    ];
}

In your layout, main.php for example. Right under where you see AppAsset::register($this)

main.php

use app\assets\FontAsset;
FontAsset::register($this);

For every layout file that you want to load those fonts, include the FontAsset.

The AssetBundle is basically a bundle of CSS and/or JS files and options. You could add another one for say JWPlayer say named VideoAsset, and add your JS/CSS files for JWPlayer in it.

Point being, you shouldn't be adding these things directly into the HTML of the layouts directly, as it can cause problems. Let the AssetManager handle them by declaring AssetBundles.

It might save you later down the road!

like image 55
Wade Avatar answered Nov 02 '22 01:11

Wade