<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>theme | 伪架构师</title>
    <link>/tags/theme/</link>
      <atom:link href="/tags/theme/index.xml" rel="self" type="application/rss+xml" />
    <description>theme</description>
    <generator>Source Themes Academic (https://sourcethemes.com/academic/)</generator><language>zh</language><lastBuildDate>Mon, 10 Aug 2015 04:51:17 +0800</lastBuildDate>
    <image>
      <url>/img/logo-wide.png</url>
      <title>theme</title>
      <link>/tags/theme/</link>
    </image>
    
    <item>
      <title>Drupal 主题系统原理</title>
      <link>/post/drupal-theme-system-design/</link>
      <pubDate>Mon, 10 Aug 2015 04:51:17 +0800</pubDate>
      <guid>/post/drupal-theme-system-design/</guid>
      <description>&lt;p&gt;原作者：&lt;a href=&#34;https://www.drupal.org/u/camorim&#34; target=&#34;_blank&#34;&gt;camorim&lt;/a&gt;, &lt;a href=&#34;https://www.drupal.org/u/dsquaredb&#34; target=&#34;_blank&#34;&gt;DSquaredB&lt;/a&gt;, &lt;a href=&#34;https://www.drupal.org/u/carolyn&#34; target=&#34;_blank&#34;&gt;Carolyn&lt;/a&gt;, &lt;a href=&#34;https://www.drupal.org/u/rootwork&#34; target=&#34;_blank&#34;&gt;rootwork.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;原文：&lt;a href=&#34;https://www.drupal.org/node/337173&#34; target=&#34;_blank&#34;&gt;How the Drupal theme system works&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;这个系列描述了Drupal主题系统的基本原理，包括主题的组成和设置，.info文件和页面模板。可作为新建自定义主题的起点教程。&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Drupal 7：如何从设计稿开始制作主题</title>
      <link>/post/drupal7-theme-from-scratch/</link>
      <pubDate>Wed, 05 Aug 2015 10:32:19 +0800</pubDate>
      <guid>/post/drupal7-theme-from-scratch/</guid>
      <description>&lt;p&gt;Drupal的主题制作是个复杂且繁重的工作。即使是一个入门主题，也会充斥着令人迷惑的PHP代码和错综复杂的CSS。一个设计师能做什么？无需担心，从设计草图入手制作主题是完全可行的。本文将一步一步的演示制作自己Drupal主题的过程，从info文件，页面模板，区域一直到CSS。&lt;/p&gt;

&lt;p&gt;本文假设你了解一些Drupal术语，具有基本的Drupal安装设置以及主题方面的基本知识。当然，读者还需要知道完成设计稿中可能涉及的HTML和CSS，因为这里只会讲解Drupal相关的编码技巧。&lt;/p&gt;

&lt;p&gt;还有一篇&lt;a href=&#34;http://www.apaddedcell.com/how-create-drupal-6-theme-scratch&#34; target=&#34;_blank&#34;&gt;《如何根据设计图制作Drupal 6主题》&lt;/a&gt;可以作为本文的前传，如题，这篇文章是针对Drupal 6的。&lt;/p&gt;

&lt;p&gt;##为什么根据设计图制作主题&lt;/p&gt;

&lt;p&gt;一般对Drupal主题的介绍都是从一个现存主题或基主题的定制入手的。首先要面对的问题就是这些主题非常通用。一般都具有左边栏或者右边栏或者两边都有，很多区域，很多的CSS。如果你有这么多需要，那当然是好的，但是这有个直接后果就是，大量的模板文件和CSS让人无所适从。可能有很多的CSS并不需要却不便移除。定制一个这种主题是个非常心烦的过程。&lt;/p&gt;

&lt;p&gt;另外一个问题是，这些主题的复杂性让你无法了解Drupal主题的工作方式，无助于用户学习创建自己的主题。我希望读者能从本文获取这方面的知识。&lt;/p&gt;

&lt;p&gt;##创建自己的主题&lt;/p&gt;

&lt;p&gt;###1. 创建目录结构&lt;/p&gt;

&lt;p&gt;首先你需要为新主题创建一个目录。这个目录应该位于&lt;code&gt;sites/all/themes&lt;/code&gt;或者&lt;code&gt;sites/yoursite/themes&lt;/code&gt;之下，这个路径决定了新主题是为单个站点服务还是服务于所有站点。记得给这个目录起一个唯一的且不包含空格的名字。&lt;/p&gt;

&lt;p&gt;为CSS和图片文件创建子目录能让主题目录整洁有序。一般的目录结构如下所示：&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;--Theme name
----css
----images
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;###2. 创建.info文件&lt;/p&gt;

&lt;p&gt;Drupal6和以后的版本，所有主题都会有一个info文件用来提供一些基本信息。有些信息用于主题管理页面，同时这些信息也决定了主题设置中的可用选项。&lt;/p&gt;

&lt;p&gt;Info文件是个简单的文本文件，他的主文件名会被Drupal当作该主题的机读名称使用，例如你命名info文件为yourtheme.info，则这个主题的机读名称就是“yourtheme”。&lt;/p&gt;

&lt;p&gt;在info文件里，我们需要用键值对的格式为主题输入信息。其中包含：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;name - 用于人阅读的友好名称&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;description - 主题的描述&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;core - 对应的Drupal版本&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;a href=&#34;http://drupal.org/node/171205#engine&#34; target=&#34;_blank&#34;&gt;engine&lt;/a&gt;主题使用的主题引擎（一般是phptemplate）。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;regions - 主题为区块提供的可用区域。方括号内的内容是机读名称（例如&lt;code&gt;regions[&#39;sidebar_first&#39;]&lt;/code&gt;）。这些配置会把区域插入到模板文件之中。指定的标签名称会出现在管理界面中为Block指定区域的页面上。&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;在Drupal 7中，在自定义区域之外，&lt;strong&gt;必须&lt;/strong&gt;包含内容区域。推荐使用Drupal标准名称为侧边栏区域命名（Drupal 7中的&lt;code&gt;sidebar_first&lt;/code&gt;以及&lt;code&gt;sidebar_second&lt;/code&gt;）。这使得Drupal能够在body标签中加上标记来说明使用了哪些侧边栏（没有/左/右等）。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&#34;http://drupal.org/node/171205#features&#34; target=&#34;_blank&#34;&gt;features&lt;/a&gt; - Drupal 7 主题管理界面中可以开启或者关闭的主题功能（例如指定站点名称，标志等）。只有info文件中列出的功能才能展现在主题管理界面上，并且可以在页面模板中作为变量使用。如果你希望清楚所有特性，留空即可；如要包含所有特性，可以删掉features项。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;stylesheets - 你的CSS文件。第一个方括号用于指定媒体类型(例如stylesheets[all]或者stylesheets[print])。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;scripts - 主题所需的所有脚本（记住Drupal自带jQuery）。&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;scripts和stylesheet的值是相对于主题目录的（例如sites/yoursite/themes/yourtheme路径会被自动包含）。如果你需要指定一个在主题目录之外的文件，可以参考&lt;a href=&#34;http://drupal.org/node/171205#comments&#34; target=&#34;_blank&#34;&gt;《info文件说明》&lt;/a&gt;来获取包含外部脚本的方法的介绍。&lt;/p&gt;

&lt;p&gt;下面是一个info文件示例：&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;name = My Cool Theme
description = Custom theme for my site
core = 7.x
engine = phptemplate
regions[header] = Header
regions[sidebar_first] = Right sidebar
regions[content] = Content
regions[footer] = Footer

stylesheets[all][] = css/style.css
stylesheets[print][] = css/print.css

features[] = name
features[] = main_menu
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;a href=&#34;http://drupal.org/node/171205&#34; target=&#34;_blank&#34;&gt;《info选项的更多信息》&lt;/a&gt;，包含缺省值和一些其他的键，可以在Drupal.org获得。&lt;/p&gt;

&lt;p&gt;###3. 理解Drupal模板文件&lt;/p&gt;

&lt;p&gt;Drupal主题建立在模板之上，扩展名是.tpl.php。这些文件包含了主题所需的html，以及一些用于指导Drupal工作的变量。&lt;/p&gt;

&lt;p&gt;如果想要创建一个非常简单的主题，压根就不需要任何的模板文件。Drupal自带了所有输出的缺省模板，所以你的模板可以只包含CSS。这些缺省内容是随着产生这些内容的模块而来的。例如node的html标记就存在于Node模块的node.tpl.php中；Block的html标记包含在block模块的block.tpl.php文件中。&lt;/p&gt;

&lt;p&gt;只有在需要改变缺省行为的情况下才需要创建自己版本的模板文件。否则Drupal会简单的使用缺省文件。修改核心文件&lt;strong&gt;绝对&lt;/strong&gt;不是个好主意。在自己的主题中进行覆盖才是合适的办法。&lt;/p&gt;

&lt;p&gt;要创建自己版本的模板文件，可以把缺省版本从模块目录拷贝到自己的主题中。有时候很难确定什么模块做了部分渲染工作，如果真的遇到这种麻烦，可以试试看&lt;a href=&#34;http://drupal.org/project/devel_themer&#34; target=&#34;_blank&#34;&gt;Theme developer模块&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;最重要的模板文件，也可能是最需要修改的文件就是&lt;strong&gt;page.tpl.php&lt;/strong&gt;，这个模板文件包含了页面文件的主体。缺省的page.tpl.php存在于system模块中。缺省文件包含了很多附加的可能无用的选项，所以为了方便，我会根据设计稿编写自己的page.tpl.php。&lt;/p&gt;

&lt;p&gt;在Drupal 7中还有一个&lt;a href=&#34;http://api.drupal.org/api/drupal/modules--system--html.tpl.php/7&#34; target=&#34;_blank&#34;&gt;&lt;strong&gt;html.tpl.php&lt;/strong&gt;&lt;/a&gt;模板，这其中包含有全局的文档结构（doctype, head节，body和html标记的开始和结束等）。因为通常这个文件没什么麻烦，所以我们一般不需要理会这个文件。如果你真的要修改他，也可以从system模块中拷贝到自己的主题目录中进行修改。&lt;/p&gt;

&lt;p&gt;###3.1. 创建page.tpl.php&lt;/p&gt;

&lt;p&gt;要开始创建你的主题文件，可以从新建一个空的名为page.tpl.php的文本文件开始。在这里会存放所有的body内容。这个文件包含三个元素：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;HTML标记（包含div，以及其他的主要结构元素）&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;区域定义&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;其他内容项的变量（例如标题，导航栏）&lt;/p&gt;

&lt;div id=&#34;header&#34;&gt;
 
&lt;/div&gt;

&lt;div id=&#34;wrapper&#34;&gt;

  &lt;div id=&#34;content&#34;&gt;

  &lt;/div&gt;
    

&lt;p&gt;&lt;div id=&#34;sidebar&#34;&gt;&lt;/p&gt;

&lt;p&gt;&lt;/div&gt;&lt;/p&gt;

&lt;p&gt;&lt;/div&gt;&lt;/p&gt;

&lt;div id=&#34;footer&#34;&gt;

&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;###3.2 创建区域&lt;/p&gt;

&lt;p&gt;任何需要在Drupal界面上通过Block方式进行编辑的部分都需要成为一个区域。在我们的例子里，包含了头部，右边栏，内容区以及页脚。不要忘记所有的区域都需要在Info中进行声明。&lt;/p&gt;

&lt;p&gt;但是如果你不声明任何区域，Drupal会提供一系列的缺省区域， 其中包括头部、高亮、帮助、内容、第一边栏以及第二边栏。&lt;/p&gt;

&lt;p&gt;在Drupal 7中，变量，包含区域变量都使用&lt;a href=&#34;http://drupal.org/node/930760&#34; target=&#34;_blank&#34;&gt;Render Arrays&lt;/a&gt;插入到最终页面。入门阶段对这个过程无需了解太多，有个例外就是这里包含了把区域以及其他元素输出到页面模板的方法。我会尝试在今后的文章中对这个过程做个详细一些的介绍。&lt;/p&gt;

&lt;p&gt;内容区域有一种可能的意外——这个区域可能是空的。你可能不想在没有内容的时候输出任何东西。所以应该在输出之前进行判断这些变量是否存在。&lt;/p&gt;

&lt;p&gt;下面的代码用一个条件来判断页脚区域是否有内容，如果有就输出：&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;?php if ($page[&#39;footer&#39;]): ?&amp;gt;    
  &amp;lt;?php print render($page[&#39;footer&#39;]); ?&amp;gt;
&amp;lt;?php endif; ?&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;对每个区域的输出都应该这样，将$page[&amp;lsquo;footer&amp;rsquo;]替换成区域的机读名称（info文件中区域声明的方括号里面的那部分）。content比较特别，因为这个区域总是有内容的，所以无需判断。&lt;/p&gt;

&lt;p&gt;容器div在判断之外还是判断之内，取决于你的选择——是否需要在区域为空时让div继续存在？&lt;/p&gt;

&lt;p&gt;下面是目前阶段的page.tpl.php文件样本：&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;div id=&amp;quot;header&amp;quot;&amp;gt;

&amp;lt;/div&amp;gt;

&amp;lt;div id=&amp;quot;wrapper&amp;quot;&amp;gt;

  &amp;lt;div id=&amp;quot;content&amp;quot;&amp;gt;
    &amp;lt;?php print render($page[&#39;content&#39;]); ?&amp;gt;
  &amp;lt;/div&amp;gt;

  &amp;lt;?php if ($page[&#39;sidebar_first&#39;]): ?&amp;gt;    
    &amp;lt;div id=&amp;quot;sidebar&amp;quot;&amp;gt;
      &amp;lt;?php print render($page[&#39;sidebar_first&#39;]); ?&amp;gt;
    &amp;lt;/div&amp;gt;
  &amp;lt;?php endif; ?&amp;gt;  
&amp;lt;/div&amp;gt;

&amp;lt;div id=&amp;quot;footer&amp;quot;&amp;gt;
  &amp;lt;?php if ($page[&#39;footer&#39;]): ?&amp;gt;    
    &amp;lt;?php print render($page[&#39;footer&#39;]); ?&amp;gt;
  &amp;lt;?php endif; ?&amp;gt;  
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;###3.3 为基础的页面元素添加变量&lt;/p&gt;

&lt;p&gt;页面除了区域之外还有另外一部分。这一节中我们会为关键的页面元素添加变量，其中包括页面标题以及Drupal导航栏。如同Drupal文档页中的描述一样，&lt;a href=&#34;http://api.drupal.org/api/drupal/modules--system--page.tpl.php/6&#34; target=&#34;_blank&#34;&gt;page.tpl.php包含了很多的变量&lt;/a&gt;。想要主题有什么就包含什么。需要面包屑么？$breadcrumbs变量就可以。&lt;/p&gt;

&lt;p&gt;最常见的包括：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;$site_name&lt;/code&gt;

* $logo(标志是从主题设置中上传的，只有在你实现了logo功能时才有作用)

* $title(页面标题)

* &lt;code&gt;$main_menu&lt;/code&gt;

* &lt;code&gt;$secondary_menu&lt;/code&gt;

* &lt;code&gt;$breadcrumbs&lt;/code&gt;

还有一些对Drupal管理员有用的变量：

* $tabs (用于编辑/查看管理菜单，通常由模块使用)

* $messages

* &lt;code&gt;$action_links&lt;/code&gt;

另外一些有用的变量：

* &lt;code&gt;$base_path&lt;/code&gt;：站点根目录

* &lt;code&gt;$front_page&lt;/code&gt;：站点首页

* &lt;code&gt;$directory&lt;/code&gt;：主题所在路径

变量由&lt;a href=&#34;http://drupal.org/node/930760&#34; target=&#34;_blank&#34;&gt;Render API&lt;/a&gt;插入：

&amp;lt;?php print render($tabs); ?&amp;gt;

&amp;gt;  &lt;strong&gt;menu和主题设置的说明&lt;/strong&gt;
&amp;gt; &amp;gt;主菜单和副菜单是标准的导航菜单块，由系统缺省提供，也是有效的变量。用两种方式都可以插入连接到页面模板。如果想要方便移动，那么用Block比较好，否则可以用硬编码的方式写入模板。
&amp;gt;
&amp;gt;显示其他站点元素，例如Logo也可以用这样的逻辑。如果你希望轻易的通过管理界面更改Logo或者关闭主菜单，使用主题设置和相关的变量；否则可以直接写入page模板。
&amp;gt;
&amp;gt;另外一个要点是，菜单连接返回的是一个数组。当你把他包含到页面模板时，需要用&lt;a href=&#34;http://api.drupal.org/api/function/theme&#34; target=&#34;_blank&#34;&gt;theme()&lt;/a&gt;函数来展开他。
&amp;gt;
&amp;lt;?php if ($main_menu): ?&amp;gt;
  &amp;lt;?php print theme(&amp;lsquo;links__system_main_menu&amp;rsquo;, array(&amp;lsquo;links&amp;rsquo; =&amp;gt; $main_menu, &amp;lsquo;attributes&amp;rsquo; =&amp;gt; array(&amp;lsquo;id&amp;rsquo; =&amp;gt; &amp;lsquo;main-menu&amp;rsquo;))); ?&amp;gt;
&amp;lt;?php endif; ?&amp;gt;
&lt;br /&gt;
这个例子里，因为我不想更换Logo，所以我把Logo作为一个简单的图片来使用，而不是使用$logo变量。这里也展示了&lt;code&gt;$base_path&lt;/code&gt;、&lt;code&gt;$directory&lt;/code&gt;以及&lt;code&gt;$site_name&lt;/code&gt;变量的使用。

注意在Drupal 7中还有$title_prefix以及$title_suffix变量。模块可能使用他们，所以要记得包含在所有的主题中。

还有一点就是有的变量需要用&lt;strong&gt;render()&lt;/strong&gt;函数来显示，而其他的可以简单的打印输出。区别在哪里呢？如果变量是个数组（&lt;a href=&#34;http://api.drupal.org/api/drupal/modules--system--page.tpl.php&#34; target=&#34;_blank&#34;&gt;page.tpl.php参考&lt;/a&gt;），需要使用render()；相反的，可以直接用print输出（&amp;lt;?php print $varible; ?&amp;gt;），如果有问题，可以查阅缺省的page.tpl.php来看看缺省模板的实现方式。

现在page.tpl.php文件变成了这样


&lt;div id=&#34;wrapper&#34;&gt;

  &lt;div id=&#34;header&#34;&gt;
    &lt;a href=&#34;&lt;?php print $front_page;?&gt;&amp;rdquo;&amp;gt;
      &lt;img src=&#34;/&lt;?php print $directory;?&gt;/images/logo.png&amp;rdquo; alt=&amp;rdquo;&amp;lt;?php print $site_name;?&amp;gt;&amp;rdquo; height=&amp;ldquo;80&amp;rdquo; width=&amp;ldquo;150&amp;rdquo; /&amp;gt;
    &lt;/a&gt;

    &amp;lt;?php if ($main_menu): ?&amp;gt;
      &amp;lt;?php print theme(&amp;lsquo;links&amp;rsquo;, $main_menu); ?&amp;gt;
    &amp;lt;?php endif; ?&amp;gt;

  &lt;/div&gt;

  &lt;div id=&#34;content&#34;&gt;
    &amp;lt;?php print render($title_prefix); ?&amp;gt;
      &amp;lt;?php if ($title): ?&amp;gt;&lt;h1&gt;&amp;lt;?php print $title; ?&amp;gt;&lt;/h1&gt;&amp;lt;?php endif; ?&amp;gt;
    &amp;lt;?php print render($title_suffix); ?&amp;gt;

    &amp;lt;?php print render($messages); ?&amp;gt;
    &amp;lt;?php if ($tabs): ?&amp;gt;&lt;div class=&#34;tabs&#34;&gt;&amp;lt;?php print render($tabs); ?&amp;gt;&lt;/div&gt;&amp;lt;?php endif; ?&amp;gt;
    &amp;lt;?php if ($action_links): ?&amp;gt;&lt;ul class=&#34;action-links&#34;&gt;&amp;lt;?php print render($action_links); ?&amp;gt;&lt;/ul&gt;&amp;lt;?php endif; ?&amp;gt;

    &amp;lt;?php print render($page[&amp;lsquo;content&amp;rsquo;]); ?&amp;gt;
  &lt;/div&gt;

  &amp;lt;?php if ($page[&amp;lsquo;sidebar_first&amp;rsquo;]): ?&amp;gt;&lt;br /&gt;
    &lt;div id=&#34;sidebar&#34;&gt;
      &amp;lt;?php print render($page[&amp;lsquo;sidebar_first&amp;rsquo;]); ?&amp;gt;
    &lt;/div&gt;
  &amp;lt;?php endif; ?&amp;gt;&lt;br /&gt;

  &lt;div id=&#34;footer&#34;&gt;
    &amp;lt;?php if ($page[&amp;lsquo;footer&amp;rsquo;]): ?&amp;gt;&lt;br /&gt;
      &amp;lt;?php print render($page[&amp;lsquo;footer&amp;rsquo;]); ?&amp;gt;
    &amp;lt;?php endif; ?&amp;gt;&lt;br /&gt;
  &lt;/div&gt;

&lt;/div&gt;
&lt;br /&gt;
##4. 创建自己的CSS

这个工作跟其他的情况类似，尽管做就是了。

##5. 试试看

现在你已经创建了自己的页面模板，可以启用你的模板来看看运行情况。如果你有些修改没有反应到运行上来，可以试试清空缓存。

这几乎是所有“修改代码不生效”问题的解决方法。

##6. 制作截图

在Drupal管理界面会在你的主题名称旁边会显示一张截图。要制作这个图片很简单，抓取一下屏幕，尺寸改成150*90，并把这个文件起名叫screenshot.png即可。

Drupal有些&lt;a href=&#34;http://drupal.org/node/11637&#34; target=&#34;_blank&#34;&gt;截图指导&lt;/a&gt;，不过这个只在你决定要公开发布你的贡献的时候才需要。

## 下载主题文件

下载本教程生成的主题文件：&lt;a href=&#34;http://www.apaddedcell.com/sites/www.apaddedcell.com/files//mycooltheme.tar.gz&#34; target=&#34;_blank&#34;&gt;mycooltheme.tar.gz&lt;/a&gt;。

为了这个例子，我包含了很简单的CSS用来摆放基本的元素。如果你希望只使用自己的出品，可以移除这些多余的CSS。

##下一步？

这只是Drupal主题的冰山一角，还有很多很多的事情要在Drupal中完成。还好有很多适合入门者的资源。

##讨论

要讨论，提问或者评论本文，请去站长论坛的关于&lt;a href=&#34;http://www.webmaster-forums.net/html-css-and-javascript/apc-article-how-create-simple-drupal-7-theme-scratch&#34; target=&#34;_blank&#34;&gt;如何从设计搞创建Drupal 7&lt;/a&gt;的讨论。可以说说你在本课程中的疑问。

##资源

* &lt;a href=&#34;http://drupal.org/theme-guide&#34; target=&#34;_blank&#34;&gt;Drupal 主题指南&lt;/a&gt;

* &lt;a href=&#34;http://drupal.org/node/171205&#34; target=&#34;_blank&#34;&gt;Info文件的结构&lt;/a&gt;

* &lt;a href=&#34;http://api.drupal.org/api/drupal/modules--system--page.tpl.php&#34; target=&#34;_blank&#34;&gt;page.tpl.php&lt;/a&gt;

* &lt;a href=&#34;http://drupal.org/node/190815&#34; target=&#34;_blank&#34;&gt;核心模板列表&lt;/a&gt;

###附件

&lt;a href=&#34;http://www.apaddedcell.com/sites/www.apaddedcell.com/files/mycooltheme.tar.gz&#34; target=&#34;_blank&#34;&gt;mycooltheme.tar.gz&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>主题文件概述</title>
      <link>/post/drupal-theme-file-summary/</link>
      <pubDate>Wed, 05 Aug 2015 10:32:19 +0800</pubDate>
      <guid>/post/drupal-theme-file-summary/</guid>
      <description>&lt;p&gt;#主题文件概览&lt;/p&gt;

&lt;p&gt;主题是对表达层的定义，由一系列文件组成。也可以为某个主题创建一个或更多的子主题或修改一个主题。只有.info文件是必要的，不过大多数主题或子主题会使用另外的一些文件，下图说明了一个典型的主题或子主题中会包含的内容：&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Drupal 6&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;/sites/default/files/get_image/602dd5b48bc64fcd57ac2be0d3a098ed.png&#34; alt=&#34;drupal 6 theme files&#34; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Drupal 7&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;/sites/default/files/get_image/1c6fc515ef163a33c47aaca81136b645.png&#34; alt=&#34;drupal 7 theme files&#34; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;.info（必须）&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;主题中，所有对Drupal需要的信息都存在于&amp;rdquo;.info&amp;rdquo;文件之中。主题所需的包括元数据、&lt;a href=&#34;https://www.drupal.org/node/171209&#34; target=&#34;_blank&#34;&gt;样式表&lt;/a&gt;、&lt;a href=&#34;https://www.drupal.org/node/171213&#34; target=&#34;_blank&#34;&gt;JavaScript&lt;/a&gt;、&lt;a href=&#34;https://www.drupal.org/node/171224&#34; target=&#34;_blank&#34;&gt;区块&lt;/a&gt;等信息也都在这一文件中定义。所有其他都是可有可无的。&lt;/p&gt;

&lt;p&gt;主题的内部名称也是从这个文件来的。例如，如果命名为&amp;rdquo;drop.info&amp;rdquo;，则Drupal会认为这个主题的名字叫做drop，Drupal 5或者更早的版本会使用目录名作为主题名。&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Info文件是在Drupal 6中开始的，Drupal 5中只在模块中使用。&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;模板文件（.tpl.php）&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;模板是由(x)HTML标记和PHP变量构成的。在一些特例中，也可能输出其他格式的数据，例如&lt;a href=&#34;http://api.drupal.org/api/function/theme_aggregator_page_rss&#34; target=&#34;_blank&#34;&gt;xml rss&lt;/a&gt;。每个.tpl.php文件负责输出一种特定的可渲染的数据，在某种情况下，使用&lt;a href=&#34;https://www.drupal.org/node/223440&#34; target=&#34;_blank&#34;&gt;模板建议&lt;/a&gt;，可能出现多个.tpl.php对应同一种数据的情况。这些都是可选的，如果你的主题中不存在合适的对应关系，则会使用标准输出。在这些文件里，需要尽量避免使用复杂逻辑，大多数情况下，这里只应该由(x)HTML标记以及PHP变量构成。核心和模块目录中也会存有少量的tpl文件，把它们拷贝到你的主题目录中，就能够让Drupal使用你的版本了。&lt;/p&gt;

&lt;p&gt;&lt;em&gt;注意：&lt;a href=&#34;https://www.drupal.org/node/173880#theme-registry&#34; target=&#34;_blank&#34;&gt;主题注册表&lt;/a&gt;会缓存主题数据。所以当对主题文件进行修改之后，要进行复位。（就是常说的清空缓存）&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;template.php&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;template.php文件用来处理所有输出中的判断逻辑和数据加工工作。这个文件不是必须的，不过对于保持.tpl.php文件的整洁是至关重要的：他可以在变量传递给.tpl.php文件进行输出之前进行&lt;a href=&#34;https://www.drupal.org/node/223430&#34; target=&#34;_blank&#34;&gt;加工&lt;/a&gt;。自定义函数、&lt;a href=&#34;https://www.drupal.org/node/173880#function-override&#34; target=&#34;_blank&#34;&gt;重写主题函数&lt;/a&gt;以及其他对原始输出进行自定义的过程都应该在这里完成。这个文件必须用&lt;code&gt;&amp;lt;?php&lt;/code&gt;标记开始，不过结束标记不是必须的，推荐省略掉。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&#34;https://www.drupal.org/node/225125&#34; target=&#34;_blank&#34;&gt;子主题&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;表面上看，子主题跟其他主题差不多。唯一的区别是，它们从父主题继承资源。要创建一个子主题，必须在info文件中指定一个&amp;rdquo;base theme&amp;rdquo;(基主题)。多级继承也是允许的，也就是说一个子主题可以声明另外一个子主题为自己的父主题，继承的层次并无硬性限制。&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Drupal 5以及更总的版本要求子主题放置在父主题的子目录中，更高版本没有这种规定。&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;其他&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Logo和截图对主题的功能是完全没有影响的，不过推荐提供，尤其是在想要把你的主题&lt;a href=&#34;https://www.drupal.org/node/14208&#34; target=&#34;_blank&#34;&gt;贡献到Drupal仓库&lt;/a&gt;的时候。在主题管理页面，用户帐号中的主题选择页面都能看到截屏。可以在&lt;a href=&#34;https://www.drupal.org/node/11637&#34; target=&#34;_blank&#34;&gt;主题截图指南&lt;/a&gt;中获得更多相关信息。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;如果你希望在一个核心主题的基础之上工作，可以使用&lt;a href=&#34;https://www.drupal.org/node/225125&#34; target=&#34;_blank&#34;&gt;子主题&lt;/a&gt;，或者拷贝一个主题并进行重命名。Bartik、 Garland或者Minnelli这几个主题在安装或者升级的过程中会用到，直接对这些主题进行修改是应该严格禁止的。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;一个非核心或修改过的核心主题应该安装到&amp;rdquo;sites/all/themes&amp;rdquo;目录来同核心主题区分开来。如果你计划运行多站点模式，可以让主题仅对某个指定站点可用，&lt;a href=&#34;https://www.drupal.org/node/43816&#34; target=&#34;_blank&#34;&gt;《多站点安装》&lt;/a&gt;讲解了更多的这方面的内容。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Drupal 6中&lt;a href=&#34;https://api.drupal.org/api/drupal/modules%21system%21page.tpl.php/6&#34; target=&#34;_blank&#34;&gt;page.tpl.php&lt;/a&gt;包含了完整的html结构，在Drupal 7中引入了&lt;a href=&#34;https://api.drupal.org/api/drupal/modules!system!html.tpl.php/7&#34; target=&#34;_blank&#34;&gt;html.tpl.php&lt;/a&gt;。缺省情况下，这些文件保存在/modules/system目录中，要覆盖或改变这些内容仅需把这些文件拷贝到自定义主题目录下即可。&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>创建子主题</title>
      <link>/post/drupal-create-sub-theme/</link>
      <pubDate>Sat, 05 Jul 2014 07:38:43 +0800</pubDate>
      <guid>/post/drupal-create-sub-theme/</guid>
      <description>&lt;p&gt;子主题跟其他主题类似，只有一点区别：他们继承了父主题的资源。子主题和父主题的层次是没有限制的。一个子主题可能是另外一个子主题的父主题，也可能存在分支的关系，这种随意性给了子主题很大的操作空间。&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;/sites/default/files/get_image/90e9fdd7980deaebf1dd75b647df765f.png&#34; alt=&#34;sub-theme branch&#34; /&gt;&lt;/p&gt;

&lt;p&gt;想象一下，从线框图做一个父主题，然后在子主题中应用和实现所有的细节。然后利用同样的线框图，出一份不同的分支的子主题。在一个多站点Drupal上，需要一份具有一致性的主题？利用子主题，很多设计资源都可以进行分享。每站点的变化都可以应用到一个子主题中，共享资源的变化则可以应用到所有的子主题中。在合理的规划之下，子主题具有无穷的可能。&lt;/p&gt;

&lt;p&gt;##创建一个子主题&lt;/p&gt;

&lt;p&gt;一个子主题必须有一个跟父主题不同的内部名称。这个名字不能包含任何空格和特殊字符。&lt;strong&gt;子主题的名字必须以字母开始，并只能包含小写字母、数字和下划线&lt;/strong&gt;。我们假设我们的子主题命名为&amp;rdquo;my_subtheme&amp;rdquo;。&lt;/p&gt;

&lt;p&gt;###目录：my_subtheme&lt;/p&gt;

&lt;p&gt;子主题应该保存在自己的目录中。这个目录应该和名称一致。&lt;/p&gt;

&lt;p&gt;子主题的文件夹应该放在sites/example.com/themes/（&amp;rdquo;example.com&amp;rdquo;代表你的站点名称），如果要在多个站点使用这个子主题，可以放在sites/all/themes/里面。&lt;/p&gt;

&lt;p&gt;###my_subtheme.info文件&lt;/p&gt;

&lt;p&gt;要声明一个主题是另外一个主题的子主题，必须在my_subtheme文件夹里面放置一个my_subtheme.info文件。最简单的办法是把父主题的info文件拷贝过来，把名字改成my_subtheme.info。然后在my_subtheme.info中添加&amp;rdquo;base theme&amp;rdquo;来声明这个子主题的父主题或者说父主题；把&amp;rdquo;theme_name&amp;rdquo;改成父主题的机读名称。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;base theme = theme_name
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;修改name = 这行的内容，来起个供人阅读的名称也是个好主意。还可以修改description的值来对子主题做一个描述：&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;name = My sub-theme
description = This is a sub-theme of theme Bartik, made by John for the web site example.com (red, responsive).
core = 7.x
base theme = bartik
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;子主题从父主题继承了&lt;strong&gt;大部分&lt;/strong&gt;的属性。最大的例外是区域、核心版本和颜色。你可能想要从父主题赋值区域以及核心一节的内容。如果你的父主题支持Color模块，并且你希望你的子主题也支持他，你可能还要把color目录拷贝过来，并且把父主题的info文件中相应的内容拷贝到子主题的info文件中：&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;stylesheets[all][] = css/colors.css
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;然后把colors.css从你的父主题赋值到子主题的css目录中。&lt;/p&gt;

&lt;p&gt;##继承样式表&lt;/p&gt;

&lt;p&gt;只要在子主题info文件中声明最少一个样式表，所有父主题中定义的&lt;a href=&#34;https://www.drupal.org/node/171209&#34; target=&#34;_blank&#34;&gt;样式表&lt;/a&gt;都会被继承。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;覆盖继承的样式表&lt;/strong&gt;：给子主题中的一个样式表指定同样的文件名。例如要覆盖父主题继承来的style.css，只要在子主题的info文件里加入以下内容：&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;stylesheets[all][]   = style.css
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;如果你只是想禁用引入的样式，只要创建一个同名空文件就可以了。&lt;/p&gt;

&lt;p&gt;###继承JavaScript&lt;/p&gt;

&lt;p&gt;所有父主题中的&lt;a href=&#34;https://www.drupal.org/node/171213&#34; target=&#34;_blank&#34;&gt;JavaScript&lt;/a&gt;都会被继承。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;覆盖继承的JavaScript&lt;/strong&gt;：在子主题的info文件里指定一个同名的文件。例如要覆盖父主题中的script.js，在info文件中加入这一行：&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;scripts[] = script.js
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;如果只是想要禁用引入的脚本，只要创建一个同名空文件。（原作应该就是copy过来的——译者注）&lt;/p&gt;

&lt;p&gt;###Template.php函数的继承&lt;/p&gt;

&lt;p&gt;父主题中template.php定义的任何内容都会被继承，其中包括&lt;a href=&#34;https://www.drupal.org/node/173880#function-override&#34; target=&#34;_blank&#34;&gt;主题函数覆盖&lt;/a&gt;、&lt;a href=&#34;https://www.drupal.org/node/223430&#34; target=&#34;_blank&#34;&gt;预处理函数&lt;/a&gt;以及其他的任何东西。每个子主题也应该有自己的template.php，可以在这里添加自己的函数，或覆盖继承来的函数。&lt;/p&gt;

&lt;p&gt;template.php中包含两种主要类型：&lt;a href=&#34;https://www.drupal.org/node/173880#function-override&#34; target=&#34;_blank&#34;&gt;主题函数覆盖&lt;/a&gt;，以及&lt;a href=&#34;https://www.drupal.org/node/223430&#34; target=&#34;_blank&#34;&gt;预处理函数&lt;/a&gt;。模板系统用截然不同的方式来处理这两种函数。&lt;/p&gt;

&lt;p&gt;主题函数通过调用&lt;code&gt;theme(&#39;[hook]&#39;, $var, ....)&lt;/code&gt;的方式进行。当子主题覆盖了一个主题函数后，其他版本的这一函数就不会再执行了。&lt;/p&gt;

&lt;p&gt;而预处理函数会在处理tpl文件之前执行。例如，&lt;code&gt;[theme]_preprocess_page&lt;/code&gt;会在page.tpl.php渲染之前执行。而且，父主题的预处理函数会先于子主题的预处理函数被调用。&lt;/p&gt;

&lt;p&gt;综上所述，覆盖父主题的主题函数是可行的；而覆盖的方式无法阻止父主题预处理函数的执行，但可以通过&lt;code&gt;hook_theme_registry_alter()&lt;/code&gt;来移除一个父主题的预处理函数。&lt;/p&gt;

&lt;p&gt;###页面、节点、Block以及其他模板文件的继承&lt;/p&gt;

&lt;p&gt;Drupal提供了大量的文件，子主题可以用这些文件来继承属性。通过指定某种文件名或者结构，能够达到继承或覆盖模板的目的，这一技巧称为&lt;a href=&#34;http://drupal.org/node/223440&#34; target=&#34;_blank&#34;&gt;模板预测&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Drupal 7&lt;/strong&gt; 中会继承父主题中所有.tpl.php文件。可以添加更加明确指向的模板，例如用&lt;code&gt;node--blog.tpl.php&lt;/code&gt;在node.tpl.php的基础上工作。&lt;/p&gt;

&lt;p&gt;单独的连字符还是用于普通的分隔单词的目的，例如&lt;code&gt;user-picture.tpl.php&lt;/code&gt;或者&lt;code&gt;node--long-content-type-name.tpl.php&lt;/code&gt;，而一对连字符则代表对符号之前的类型的某一子类型的指示。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Drupal 6&lt;/strong&gt; 同7类似，也同样会继承父主题中的模板，但是如果想要进行更具针对性的渲染，必须首先把父主题中的这一模板（例如Node.tpl.php）拷贝到本主题之中。例如，要在子主题中添加一个&lt;code&gt;node-blog.tpl.php&lt;/code&gt;，必须先把node.tpl.php从父主题中拷贝出来。这其实是个Bug，在Drupal 7中已经修复，&lt;a href=&#34;http://drupal.org/node/279573#comment-2736592&#34; target=&#34;_blank&#34;&gt;在Drupal 6中则不会进行修复了&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;覆盖继承的模板&lt;/strong&gt;：在子主题中添加一个和父主题名字相同的模板，会覆盖掉父主题的同名模板。&lt;/p&gt;

&lt;p&gt;###截屏，Logo以及favicon的继承&lt;/p&gt;

&lt;p&gt;父主题的截屏会被继承，而Logo和favicon则&lt;strong&gt;不会被继承&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;覆盖继承来的截屏&lt;/strong&gt;：用info文件指定一个新的。&lt;/p&gt;

&lt;p&gt;###区域的继承&lt;/p&gt;

&lt;p&gt;子主题并不会继承父主题的区域定义。如果希望复用父主题的区域，需要从父主题的info文件中复制区域定义信息到自己的info文件重。如果你在使用非缺省的features，也应该将features的声明从父主题的info文件中拷贝出来。&lt;/p&gt;

&lt;p&gt;###颜色的继承&lt;/p&gt;

&lt;p&gt;color目录中对&lt;a href=&#34;https://www.drupal.org/node/108459&#34; target=&#34;_blank&#34;&gt;Color.module&lt;/a&gt;的支持不会被继承。&lt;/p&gt;

&lt;p&gt;###配置的继承&lt;/p&gt;

&lt;p&gt;theme-settings.php中的&lt;a href=&#34;https://www.drupal.org/node/177868&#34; target=&#34;_blank&#34;&gt;主题设置&lt;/a&gt;不会被继承，除非把设置声明从父主题info文件里拷贝到子主题info中。&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>清空主题缓存</title>
      <link>/post/drupal-clean-theme-cache/</link>
      <pubDate>Sat, 05 Jul 2014 01:21:46 +0800</pubDate>
      <guid>/post/drupal-clean-theme-cache/</guid>
      <description>&lt;p&gt;原文：&lt;a href=&#34;https://www.drupal.org/docs/7/theming/clearing-the-theme-cache&#34; target=&#34;_blank&#34;&gt;Clearing the theme cache&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;info 文件被缓存在数据库中（不一定是数据库，反正是缓存了——译者注），所以对这个文件的变更，Drupal 是没有感知的。如果你新增了 tpl.php 文件，或者覆盖了新的主题方法，那么你需要清空主题缓存才能让这些变更生效。&lt;/p&gt;

&lt;p&gt;不要把这个缓存和&lt;a href=&#34;https://www.drupal.org/node/173880#theme-registry&#34; target=&#34;_blank&#34;&gt;主题注册表&lt;/a&gt;混淆了。要清理缓存，按照如下步骤进行：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;点击Performance页面里的“Clear all caches”按钮。注意这个按钮会清空&lt;strong&gt;所有&lt;/strong&gt;的缓存，其中不只是主题缓存。如果你的站点有很多页面或者很大流量，你可能希望用下面的&lt;strong&gt;其他&lt;/strong&gt;办法只清除主题缓存。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Drupal 7&lt;/strong&gt;  &amp;ldquo;Administration &amp;gt; Configuration &amp;gt; Development &amp;gt; Performance&amp;rdquo;（admin/config/development/performance）。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;Drupal 6&lt;/strong&gt;  &amp;ldquo;Administer &amp;gt; Site configuration &amp;gt; Performance&amp;rdquo; （admin/settings/performance）。&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;其他办法：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&#34;http://drupal.org/project/admin_menu&#34; target=&#34;_blank&#34;&gt;Admin menu&lt;/a&gt;在Home图标下面有一个清空缓存的按钮。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;a href=&#34;http://drupal.org/project/devel&#34; target=&#34;_blank&#34;&gt;Devel project&lt;/a&gt;中的Devel Block模块提供了一个&amp;rdquo;Empty cache&amp;rdquo;的连接。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;D7中的&lt;a href=&#34;http://api.drupal.org/api/function/drupal_theme_rebuild/7&#34; target=&#34;_blank&#34;&gt;drupal_theme_rebuild&lt;/a&gt;或者D6中的&lt;a href=&#34;http://api.drupal.org/api/drupal/includes!theme.inc/function/drupal_rebuild_theme_registry/6&#34; target=&#34;_blank&#34;&gt;drupal_rebuild_theme_registry&lt;/a&gt; API 函数。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;有些主题（Zen, Fusion等）在每个页面提供了一个复选框来重建主题缓存，带有漂亮的警告来提示你不要忘记关闭这东西。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;a href=&#34;http://drupal.org/project/drush&#34; target=&#34;_blank&#34;&gt;Drush&lt;/a&gt;提供了一个命令：drush cc theme-registry.&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;a href=&#34;https://drupal.org/project/magic&#34; target=&#34;_blank&#34;&gt;The Magic Module&lt;/a&gt;有一个设置&amp;rdquo;Rebuild Theme Registry on Page Reload&amp;rdquo;（在页面重新载入时重建主题注册表）可以用于任何主题。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;浏览主题选择页也会清空.info文件缓存&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;如果上面的办法都失败了，还可以尝试&lt;a href=&#34;http://drupal.org/node/42055&#34; target=&#34;_blank&#34;&gt;清空全部缓存&lt;/a&gt;。&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>主题的设置</title>
      <link>/post/drupal-theme-configuration/</link>
      <pubDate>Fri, 04 Jul 2014 19:40:33 +0800</pubDate>
      <guid>/post/drupal-theme-configuration/</guid>
      <description>&lt;p&gt;主题输出的很多页面元素都可以通过主题的配置页面打开或者关闭。&lt;/p&gt;

&lt;p&gt;##Drupal 7&lt;/p&gt;

&lt;p&gt;在&amp;rdquo;Administer &amp;gt; Appearance &amp;gt; Settings &amp;gt; themeName&amp;rdquo;可以找到这些设置。例如，网站的口号可以通过&amp;rdquo;Site slogan&amp;rdquo;复选框来控制。&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;/sites/default/files/get_image/8dfd372be1d63a9fef5aa050e80a13ad.png&#34; alt=&#34;slogan&#34; /&gt;&lt;/p&gt;

&lt;p&gt;这些复选框来自于&lt;a href=&#34;https://drupal.fleeto.us/translation/writing-theme-info-files&#34; target=&#34;_blank&#34;&gt;info文件&lt;/a&gt;中的定义，必须利用info文件中的&amp;rsquo;features&amp;rsquo;键来声明，例如&lt;code&gt;features[] = the_feature&lt;/code&gt;。如果没有指定，则会采用下列的缺省值：&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;features[] = logo
features[] = name
features[] = slogan
features[] = node_user_picture
features[] = comment_user_picture
features[] = comment_user_verification
features[] = favicon
features[] = main_menu
features[] = secondary_menu
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Drupal 7移除了以前版本中的mission和search主题元素，原因是现在这些功能已经利用Block来实现了。Drupal 7中新增了“注释中的用户校验状态”这一选项。&lt;/p&gt;

&lt;p&gt;注意：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;info文件内容会被缓存到数据库，所以修改这一文件不会直接生效，生效前需要清理缓存。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;hook_features()已经弃用。&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;##Drupal 6&lt;/p&gt;

&lt;p&gt;在Drupal 6中，这些设置存在于“Administer &amp;gt; Site building &amp;gt; Themes &amp;gt; themeName”，&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;/sites/default/files/get_image/f6607a36786c586cf16a75738fcfe55a.png&#34; alt=&#34;Drupal6 settings&#34; /&gt;&lt;/p&gt;

&lt;p&gt;Drupal 6中的缺省值&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;features[] = logo
features[] = name
features[] = slogan
features[] = mission
features[] = node_user_picture
features[] = comment_user_picture
features[] = search
features[] = favicon
features[] = primary_links
features[] = secondary_links
&lt;/code&gt;&lt;/pre&gt;
</description>
    </item>
    
    <item>
      <title>为主题编写info文件</title>
      <link>/post/drupal-theme-info-file/</link>
      <pubDate>Fri, 04 Jul 2014 10:01:30 +0800</pubDate>
      <guid>/post/drupal-theme-info-file/</guid>
      <description>&lt;p&gt;.info文件是一个静态文本文件，用于主题的定义和配置。info文件的每一行都由一个键值对构成，例如name = my_theme。分号用来表明注释。有些键使用一点特别的语法：用中括号把一组相关内容组合为一个列表（类似数组）。如果你对数组不了解，可以看看Drupal核心主题中的.info文件，阅读其中的解释。即使.info文件并没有一个典型的缺省编辑工具，可以在Mac上使用TextEdit或者在Windows中使用Notepad来查看、编辑或者修改。&lt;/p&gt;

&lt;p&gt;注意本节讲解的.info文件是Drupal主题相关的，而不是模块中使用的info文件。可以在&lt;a href=&#34;https://www.drupal.org/developing/modules&#34; target=&#34;_blank&#34;&gt;模块开发指南&lt;/a&gt;的&lt;a href=&#34;https://www.drupal.org/node/542202&#34; target=&#34;_blank&#34;&gt;编写info文件&lt;/a&gt;学习模块中info文件的写法。&lt;/p&gt;

&lt;p&gt;举例&lt;/p&gt;

&lt;p&gt;下面的例子是一个Drupal 6中Garland主题的.info文件&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;name = Garland
description = Tableless, recolorable, multi-column, fluid width theme (default).
version = VERSION
core = 6.x
engine = phptemplate
stylesheets[all][] = style.css
stylesheets[print][] = print.css
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;##主题命名规则&lt;/p&gt;

&lt;p&gt;名字应该以字母开头，可以包含数字和下划线，不应含有连字符、空格以及标点。这个名字会被Drupal以&lt;a href=&#34;http://us3.php.net/manual/en/language.functions.php&#34; target=&#34;_blank&#34;&gt;PHP函数&lt;/a&gt;的方式来使用，所以需要遵循同样的规则。需要注意的是，不要同其他的主题或者模块重名。对于本地的主题，使用一个前缀来保证命名的唯一性是个好办法，例如example.com的主题可以叫做ex_themename。&lt;/p&gt;

&lt;p&gt;.info文件会被缓存，因此对这个文件的修改需要&lt;a href=&#34;https://www.drupal.org/node/337176&#34; target=&#34;_blank&#34;&gt;清空缓存&lt;/a&gt;才能获得正确的结果。&lt;/p&gt;

&lt;p&gt;.info文件也可以指定Drupal管理界面如何设置主题。&lt;/p&gt;

&lt;p&gt;##编码&lt;/p&gt;

&lt;p&gt;文件必须用UTF-8无BOM的方式进行保存。&lt;/p&gt;

&lt;p&gt;##内容&lt;/p&gt;

&lt;p&gt;Drupal能够识别下面的键，如果info文件重没有包含某些可选键，Drupal会使用这些键的&lt;a href=&#34;https://www.drupal.org/node/171206&#34; target=&#34;_blank&#34;&gt;缺省值&lt;/a&gt;。在核心主题中有相应的&lt;a href=&#34;https://www.drupal.org/node/171205#example&#34; target=&#34;_blank&#34;&gt;例子&lt;/a&gt;可供参考。&lt;/p&gt;

&lt;p&gt;###name&lt;/p&gt;

&lt;p&gt;现在在内部机读名称之外，可以独立设置可供人阅读的名称。相对于机读名称，这一名称对于可选字符的限制较少。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;name = A fantasy name
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;###description&lt;/p&gt;

&lt;p&gt;对主题的简短描述。这段描述会在位于&lt;strong&gt;&amp;ldquo;Administer &amp;gt; Site building &amp;gt; themes&amp;rdquo;&lt;/strong&gt;的主题选择页面显示。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;description = Tableless multi-column theme designed for blogs.
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;###screenshot&lt;/p&gt;

&lt;p&gt;这个可选键告诉Drupal在哪里找到这个主题的缩略图，同样用于主题选择页面。如果这个键被省略，Drupal会在主题目录中查找&amp;rdquo;screenshot.png&amp;rdquo;文件。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;screenshot = screenshot.png
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;参考：&lt;a href=&#34;https://www.drupal.org/node/11637&#34; target=&#34;_blank&#34;&gt;为管理页面创建截图&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;###version&lt;/p&gt;

&lt;p&gt;version在主题被打包发布时会由drupal.org自动添加。所以如果要创建要发布到官网的主题，可以省略这一内容。然而，如果你的主题不准备在官网发布，就可以随便使用什么字符串来给这个键赋值了。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;version = 1.0
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;###core&lt;/p&gt;

&lt;p&gt;从Drupal 6以后，所有的主题和模块的.info文件必须指明兼容的Drupal核心的主版本。这个值会同&lt;a href=&#34;http://api.drupal.org/api/constant/DRUPAL_CORE_COMPATIBILITY&#34; target=&#34;_blank&#34;&gt;DRUPAL_CORE_COMPATIBILITY&lt;/a&gt;这一常量进行比较。如果不符合，这个主题会被禁用。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;core = 6.x
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;a href=&#34;http://drupalcode.org/project/drupalorg.git/blob/refs/heads/6.x-3.x:/drupalorg_project/plugins/release_packager/DrupalorgProjectPackageRelease.class.php&#34; target=&#34;_blank&#34;&gt;drupal.org打包脚本&lt;/a&gt;会根据Drupal核心版本为每个发布节点自动设置这个值，所以用户从drupal.org下载主题时总会得到正确的版本。对于其他方式的下载和安装，这个项是很有帮助的。&lt;/p&gt;

&lt;p&gt;###engine&lt;/p&gt;

&lt;p&gt;主题所使用的引擎。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Drupal 6&lt;/strong&gt;：如果没有指定这个值，会假设这个主题是独立的，也就是用“.theme”实现的。多数主题会使用phptemplate作为缺省引擎。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Drupal 7&lt;/strong&gt;：Drupal 7中用PHPTemplate为缺省引擎，这一行不再必要。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;engine = phptemplate
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;###base theme&lt;/p&gt;

&lt;p&gt;子主题可以声明一个基主题。这使得主题可以继承，意味着基主题的的资源可以在子主题中进行复用。子主题也能够作为其他子主题的基主题，形成多级继承的模式。base theme的值是基主题的机读名称，下面代码来自于Minnelli，Garland的子主题。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;base theme = garland
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;a href=&#34;https://www.drupal.org/node/225125&#34; target=&#34;_blank&#34;&gt;《子主题，结构和继承》&lt;/a&gt;一文描述了更多细节。&lt;/p&gt;

&lt;p&gt;###regions&lt;/p&gt;

&lt;p&gt;区域的定义来自于主题info中的&amp;rsquo;regions&amp;rsquo;，后面的中括号中代表这个区域的机读名称，值则是标题。例如regions[theRegion] = The region name.&lt;/p&gt;

&lt;p&gt;如果没有定义regions，则会假设使用如下定义&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Drupal 6的缺省区域&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;regions[left] = Left sidebar
regions[right] = Right sidebar
regions[content] = Content
regions[header] = Header
regions[footer] = Footer
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;Drupal 7的缺省区域&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;regions[header] = Header
regions[highlighted] = Highlighted
regions[help] = Help
regions[content] = Content
regions[sidebar_first] = Left sidebar
regions[sidebar_second] = Right sidebar
regions[footer] = Footer
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;用户可以根据自身需求进行定义。&lt;/p&gt;

&lt;p&gt;如果在Drupal 7中进行区域定义，会强制用户定义regions[content] = content。如果需要使用任何缺省区域，也都需要重新定义，这方面内容可以参考&lt;a href=&#34;https://www.drupal.org/node/171224&#34; target=&#34;_blank&#34;&gt;《块，内容和区域》&lt;/a&gt;一文。&lt;/p&gt;

&lt;p&gt;###features&lt;/p&gt;

&lt;p&gt;很多主题输出的页面元素都可以在主题的配置页面上设置开关。&amp;rdquo;features&amp;rdquo;键控制了哪些复选框出现在主题的配置页面上。注释掉部分features，相对应的复选框就会隐藏，然而如果注释掉所有的，那么就会缺省显示所有的复选框。&lt;/p&gt;

&lt;p&gt;下面的例子展示了所有features控制的元素。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Drupal 6 features&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;primary_links 和 secondary_links被注释，他们对应的复选框会被隐藏。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;features[] = logo
features[] = name
features[] = slogan
features[] = mission
features[] = node_user_picture
features[] = comment_user_picture
features[] = search
features[] = favicon
; These last two disabled by redefining the
; above defaults with only the needed features.
; features[] = primary_links
; features[] = secondary_links
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;Drupal 7 features&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;features[] = logo
features[] = name
features[] = slogan
features[] = node_user_picture
features[] = comment_user_picture
features[] = comment_user_verification
features[] = favicon
features[] = main_menu
features[] = secondary_menu
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;更多细节可以参考&lt;a href=&#34;https://www.drupal.org/node/221905&#34; target=&#34;_blank&#34;&gt;《定制主题设置项》&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;###theme settings&lt;/p&gt;

&lt;p&gt;可以利用info文件中的这一配置来设置features中的选中状态。用&lt;code&gt;settings[toggle_&amp;quot;feature&amp;quot;] = 0&lt;/code&gt; 来设置某个feature为未选状态。&lt;/p&gt;

&lt;p&gt;例如缺省设置：&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Drupal 7&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;settings[toggle_logo] = 1
settings[toggle_name] = 1
settings[toggle_slogan] = 1
settings[toggle_node_user_picture] = 1
settings[toggle_comment_user_picture] = 1
settings[toggle_comment_user_verification] = 1
settings[toggle_favicon] = 1
settings[toggle_main_menu] = 1
settings[toggle_secondary_menu] = 1
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;这个设置的更多细节可以参考&lt;a href=&#34;https://www.drupal.org/node/177868&#34; target=&#34;_blank&#34;&gt;《高级主题设置》&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;###stylesheets&lt;/p&gt;

&lt;p&gt;一般来说，主题缺省会使用style.css，并可以利用&lt;a href=&#34;http://api.drupal.org/api/function/drupal_add_css&#34; target=&#34;_blank&#34;&gt;drupal_add_css&lt;/a&gt;的方式在template.php中增加附加的css。Drupal 6开始，主题还可以利用info文件来添加css。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;stylesheets[all][] = theStyle.css
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;在Drupal 7中，主题不再缺省使用style.css。&lt;/p&gt;

&lt;p&gt;&lt;a href=&#34;https://www.drupal.org/node/171209&#34; target=&#34;_blank&#34;&gt;《样式表》&lt;/a&gt;一节提供了这方面的更多信息。&lt;/p&gt;

&lt;p&gt;###scripts&lt;/p&gt;

&lt;p&gt;传统上，主题可以在template.php中使用&lt;a href=&#34;http://api.drupal.org/api/function/drupal_add_js&#34; target=&#34;_blank&#34;&gt;drupal_add_js&lt;/a&gt;来引入js文件。从Drupal 6.x开始，如果主题目录下存在一个名为stript.js的文件，那么这个文件会被自动包含。然而，在Drupal 7中这一行为再次变更，一个脚本文件只有在scripts中声明，才会被导入。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;scripts[] = myscript.js
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;a href=&#34;https://www.drupal.org/node/171213&#34; target=&#34;_blank&#34;&gt;《JavaScript和jQuery》&lt;/a&gt;一节可以找到更多这方面的内容。&lt;/p&gt;

&lt;p&gt;###php&lt;/p&gt;

&lt;p&gt;这里定义对PHP版本的最低需求。这一项的缺省值来自于常量&lt;a href=&#34;http://api.drupal.org/api/constant/DRUPAL_MINIMUM_PHP&#34; target=&#34;_blank&#34;&gt;DRUPAL_MINIMUM_PHP&lt;/a&gt;，代表核心需要的最低PHP版本。主题可以声明需要一个更高的版本，当然，一般不建议这样做。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;php = 4.3.3
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;###核心主题的info文件实例&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Garland&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;https://www.drupal.org/files/info_display.png&#34; alt=&#34;Garland info&#34; /&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;name = Garland
description = Tableless, recolorable, multi-column, fluid width theme (default).
version = VERSION
core = 6.x
engine = phptemplate
stylesheets[all][] = style.css
stylesheets[print][] = print.css
; Information added by drupal.org packaging script on 2008-02-13
version = &amp;quot;6.0&amp;quot;
project = &amp;quot;drupal&amp;quot;
datestamp = &amp;quot;1202913006&amp;quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;Garland的子主题：Minnelli&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;name = Minnelli
description = Tableless, recolorable, multi-column, fixed width theme.
version = VERSION
core = 6.x
base theme = garland
stylesheets[all][] = minnelli.css
; Information added by drupal.org packaging script on 2008-02-13
version = &amp;quot;6.0&amp;quot;
project = &amp;quot;drupal&amp;quot;
datestamp = &amp;quot;1202913006&amp;quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;注意所有;标记的行之后都是drupal.org的打包脚本生成的，不需要手工添加project和时间戳。第一节中的version是用来从其他途径获取你的主题的用户区别版本需求使用的。&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>
