Drupal 8 模块 里面添加js或者css的时候,一般是通过在模块里面定义library,然后附加到各种页面元素上来添加到页面上,参考http://jahng.cn/node/60。
但是之前开发百度地图模块的时候遇到一个问题,就是我要添加到页面的js是带有参数的,这个参数其实是百度AK,如果这个模块是我自己项目使用的话,那很好办,我直接在library定义文件里面hard code就行了,比如像下面这种方式:
baidumap: version: 1.x js: http://api.map.baidu.com/api?v=2.0&ak=xxxxxx: { type: external, minified: true } header: true
这里的ak=xxxxxx的xxxxxx表示从百度地图官网申请到的ak。
问题在于,这个模块开发是贡献到官网,给所有需要这个modolue的人使用的,所以这里的ak自然也不能hard code,而是让使用的用户可以自己通过后台配置。
所以,我自己暂时没想到什么方法,在google上也没找到方法通过libraries.yml 文件定义library,同时可以在yml文件里面引用到php变量生成动态js外部链接。
所以我想到的办法就是不在libraries.yml文件里面定义,而是通过drupal8 的hook_library_info_build定义library,就像相面这种方式:
function mymodule_library_info_build(){ $config = \Drupal::config('mymodule.settings'); $ak = ($config->get('baidumap_ak')); $libraries = []; if (Drupal::moduleHandler()->moduleExists('mymodule')) {
$libraries['baidumap.api']['header'] = true;
$js_uri = 'http://api.map.baidu.com/api?v=2.0&ak=' . $ak; $libraries['baidumap.api']['js'][$js_uri] = [ 'type' => 'external', '' ]; } return $libraries; }