symfony3.3でカスタマイズしたbootstrapを使う

## プロジェクトを作る

symfonyコマンドで新しいプロジェクトを作る

```
$ symfony new foo
```

## nodeインストールする

centos7.2ぐらいではこんな感じ

```
$ sudo yum install -y gcc-c++ make
$ curl -sL https://rpm.nodesource.com/setup_6.x | sudo bash -
$ sudo yum install -y nodejs
```

## yarn インストールする

npmでyarnをインストールする

```
$ sudo npm install -g yarn

```

## プロジェクトにpackage.jsonを作る

こんな感じで。

```foo/package.json
{
  "name": "sample1",
  "version": "1.0.0",
  "description": "sample1 =======",
  "main": "webpack.config.js",
  "directories": {
    "test": "tests"
  },
  "dependencies": {
  },
  "devDependencies": {
      "@symfony/webpack-encore": "^0.9.1",
    "bootstrap-sass": "^3.3.7",
    "eonasdan-bootstrap-datetimepicker": "^4.17.47",
    "font-awesome": "^4.7.0",
    "jquery": "^3.2.1",
    "node-sass": "^4.5.3",
    "sass-loader": "^6.0.5"
    
  },
  "scripts": {
    "dev-server": "./node_modules/.bin/encore dev-server",
    "dev": "./node_modules/.bin/encore dev",
    "watch": "./node_modules/.bin/encore dev --watch",
    "build": "./node_modules/.bin/encore production"
  },
  "author": "",
  "license": "ISC"
}

```

webpack-encore ,bootstrap-sass, node-sass,sass-loaderは必須。

## webpack.config.jsを作る

```foo.webpack.config.js
// webpack.config.js
var Encore = require('@symfony/webpack-encore');

Encore
    // directory where all compiled assets will be stored
    .setOutputPath('web/build/')

    // what's the public path to this directory (relative to your project's document root dir)
    .setPublicPath('/build')

    // empty the outputPath dir before each build
    .cleanupOutputBeforeBuild()

    // will output as web/build/app.js
    .addEntry('js/app', './app/Resources/assets/js/main.js')

    // will output as web/build/global.css
    .addStyleEntry('css/global', './app/Resources/assets/css/global.scss')

    // allow sass/scss files to be processed
    .enableSassLoader()

    // allow legacy applications to use $/jQuery as a global variable
    .autoProvidejQuery()

    .enableSourceMaps(!Encore.isProduction())

    // create hashed filenames (e.g. app.abc123.css)
    // .enableVersioning()
;

// export the final configuration
module.exports = Encore.getWebpackConfig();
```

## main.jsを作る

foo/app/Resources/assets/js/main.js を作成する。

## global.scssとカスタマイズ用の_variables.scssを作る

global.scssが_variables.scssとnode-module内のbootstrap.scssをimportするようにする。

```foo/app/Resources/assets/css/global.scss
$web-font-path: 'data:text/css;base64,';

@import "_variables.scss";
@import "~bootstrap-sass/assets/stylesheets/bootstrap";
```

_variables.scss はbootstrapの変数を適当にサイトデザインに沿って修正、追加する。
例えば

```foo/app/Resources/assets/css/_variables.scss
$brand-primary:         darken(#428bca, 6.5%) !default; // #337ab7
$brand-success:         #88ff88 !default;
$brand-info:            #8888ff !default;
$brand-warning:         #ffff88 !default;
$brand-danger:          #ff0000 !default;
```
この例は極端だけれど。

## yarnでトランスパイル

```
$ yarn run encore dev
```

これで foo/web/build/css と foo/web/build/js にトランスパイルされたcssとjsが出来上がる。

## linkタグを書く

レイアウトファイルのスタイルシートリンクを書き換える

```foo/app/Resources/views/base.html.twig
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8" />
        <title>{% block title %}Welcome!{% endblock %}</title>
        <link rel="icon" type="image/x-icon" href="{{ asset('favicon.ico') }}" />
        {% block stylesheets %}
            {% stylesheets 'build/css/*' filter='cssrewrite' %}
                <link rel="stylesheet" href="{{ asset_url }}" />
            {% endstylesheets %}
        {% endblock %}

    </head>
    <body>
    	<div class="container">
        {% block body %}{% endblock %}
    	</div>
        {% block javascripts %}
		    <script src="{{ asset('build/js/app.js') }}"></script>
        {% endblock %}
    </body>
</html>
```

ほら、変わった。