Drupal China
根据 drupal_get_css() 的文档我们知道,该函数按照一定的顺序加载 CSS,首先是功能模块提供的 CSS,随后是视觉效果主题提供的。并称这样可以确保按照恰当的顺序来如级联样式,并且视觉效果主题可以很方便的重载功能模块中定义的样式。
笔者认为,这个出发点是良好的,不过实际实现中可能在某些清醒下并不能达到预期的目的。至少,对于视觉效果主题的开发人员来说这并不足够友好。我们可以简单的考察一下 Drupal 生成的页面的源代码,我们将会看到,Drupal 按照先内建模块、第三方模块、主题的顺序加载 CSS,并且在同一层次中按照组件的字母顺序加载 CSS。这回造成诸如 modules/book/book.css 早于 modules/system/admin.css,而后者又早于 modules/system/system.css 被加载的情况。尽管 Drupal 内核的开发人员编写的 CSS 代码质量较高,但是对于大量的第三方模块而言情况就不一定如此了。
许多视觉效果主题的开发人员可能会采用某些流行的 CSS 框架,其中有不少框架需要首先加载所谓的 reset.css 来尽可能消除不同浏览器之间的差异。现在的 Drupal 中缺少某种机制来指定需要预先加载的 CSS 文件或者是按照某种自定义的顺序来加载 CSS。
当然,Drupal 允许视觉效果主题的开发人员使用和功能模块同名的 CSS 文件来重载相应的定义。然而在实际应用中这并不现实。视觉效果主题的开发人员很难在一开始就对网站将会加载哪些模块特别是第三方模块有所了解,在设计时就对可能使用的模块根据设计意图进行重载确实存在相当大的困难。
更糟糕的是,即使这样做了,按照字母排序 CSS 文件的规则同样适用于视觉效果主题,Drupal 完全忽略 .info 文件中定义 CSS 文件的顺序而武断的按照字母顺序加载 CSS 文件,这对于开发易于维护的视觉效果主题确实宛如噩梦——若干组织有序的短小的 CSS 显然比一个合并之后的冗长的 CSS 更易于维护。
info
info 文件里的顺序不大清楚,我一般在template.php里边preprocess 函数里自定义css文件顺序,用drupal_add_css , drupal_get_css 等函数。
.info
.info 的情况是即使我在 mytheme.info 中定义:
stylesheets[all][] = c.cssstylesheets[all][] = b.css
stylesheets[all][] = a.css
Drupal 生成的页面仍然采用类似下面的顺序:
<link type="text/css" rel="stylesheet" media="all" href="/sites/all/themes/mytheme/a.css?X" /><link type="text/css" rel="stylesheet" media="all" href="/sites/all/themes/mytheme/b.css?X" />
<link type="text/css" rel="stylesheet" media="all" href="/sites/all/themes/mytheme/c.css?X" />
我也通过编写 template.php 采用了某种 work-around,不过似乎 drupal_get_css() 不支持类似 hook 的机制,因此采用了这些方法改变 CSS 加载顺序后,就不能在 admin > settings > performance 中开启 Optimize CSS files 选项了。
我觉得也是很烦这个事...
我用的css_injector,也经常改来改去,唉...要是能设置权重,就好了。
我是骇虫!
drupal_add_css()的函数如果能增加一个顺序相
drupal_add_css()的函数如果能增加一个顺序相关的参数就好了