七月 2014

如何使用EntityFieldQuery

如何使用 EntityFieldQuery

EntityFieldQuery 是 Drupal 7 中新增的一个类,允许利用指定条件获取符合条件的实体。查询条件可以基于属性,字段值以及一些其他的通用的实体元数据。他的语法非常紧凑和实用,而且这一功能由Drupal核心提供,无需另外安装其他模块。

API 手册以及 modules\simpletest\tests\entity_query.test 中的测试用例,可以作为 EntityFieldQuery 的权威文档。"EntityFieldQuery" 类包含于 includes/entity.inc中。本文仅作为一个入门的简介供读者参考。

Drupal 7:如何从设计稿开始制作主题

Drupal的主题制作是个复杂且繁重的工作。即使是一个入门主题,也会充斥着令人迷惑的PHP代码和错综复杂的CSS。一个设计师能做什么?无需担心,从设计草图入手制作主题是完全可行的。本文将一步一步的演示制作自己Drupal主题的过程,从info文件,页面模板,区域一直到CSS。

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

还有一篇《如何根据设计图制作Drupal 6主题》可以作为本文的前传,如题,这篇文章是针对Drupal 6的。

为什么根据设计图制作主题

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

entity_metadata_wrapper极简说明

你熟悉entity_metadata_wrapper么?如果不熟悉,那么赶快补课吧。

Entity Metadata Wrapper(实体元数据封装),在模块开发过程中对Field的操作来说,是最正确,也是最简单的方式。没错,在CCK年代,我们对Node中Field的操作熟练无比,不过现在看来,那些代码真的很邋遢。

干净的代码!

以前是:

<?php
$first_name = '';
if (!empty($node->field_first_name)) {
  $name = $node->field_first_name[LANGUAGE_NONE][0]['value'];
}
?>

现在可以把它浓缩成这样:

创建子主题

子主题跟其他主题类似,只有一点区别:他们继承了父主题的资源。子主题和父主题的层次是没有限制的。一个子主题可能是另外一个子主题的父主题,也可能存在分支的关系,这种随意性给了子主题很大的操作空间。

sub-theme branch

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

创建一个子主题

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

目录:my_subtheme

子主题应该保存在自己的目录中。这个目录应该和名称一致。

清空主题缓存

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

不要把这个缓存和主题注册表混淆了。要清理缓存,按照如下步骤进行:

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

  • Drupal 7 "Administration > Configuration > Development > Performance"(admin/config/development/performance)。

全局设置

接下来讲讲全局的主题设置选项,这些选项让用户可以显示主题支持的特性。注意这些全局设置可以被各个主题的独立设置所覆盖。

这里列出了缺省的选项并作出一些简单解释。

注意并不是所有的主题都支持全部的特性,有些可能压根就不显示(主题可以隐藏不支持的特性)。

Logo

多数主题会输出一个可点击的Logo,这个选项设置Logo的开关。用户可以在配置Form上传自己的Logo或者直接在主题文件夹替换logo.png,多数主题会按惯例使用logo.png作为文件名。

Site name, Site slogan

设置站点名称和口号是否显示。这些内容都在"Site Infomation"页面上配置。多数主题会在首页头部打印站点名称。

Mission statement

很多主题支持在"Site Information"页面上设置的Mission Statement,通常只会显示在首页上。

User picture in posts, User picture in comments

主题的设置

主题输出的很多页面元素都可以通过主题的配置页面打开或者关闭。

Drupal 7

在"Administer > Appearance > Settings > themeName"可以找到这些设置。例如,网站的口号可以通过"Site slogan"复选框来控制。

slogan

这些复选框来自于info文件中的定义,必须利用info文件中的'features'键来声明,例如features[] = the_feature。如果没有指定,则会采用下列的缺省值:

为区域指派内容

如果没有定义,Drupal 6中会做如下假设:

regions[left] = Left sidebar
regions[right] = Right sidebar
regions[content] = Content
regions[header] = Header
regions[footer] = Footer

而在Drupal 7中增加了Highligted和Help作为缺省区域。Help区域的文字内容默认和Drupal 6中的page.tpl.php$help变量一致。侧边栏的机读名称也发生了变化。

regions[sidebar_first] = Left sidebar
regions[sidebar_second] = Right sidebar
regions[content] = Content
regions[header] = Header
regions[footer] = Footer
regions[highlighted] = Highlighted
regions[help] = Help

Drupal 7的bartik主题设置了如下的默认区域:

info文件中的缺省值

下面是info文件中的缺省值,如果没有明确定义,则会没人采用这些值。

这些值定义于_system_rebuild_theme_data()

*注意:这些值以组为单位,换句话说,利用regions[sub_header] = Sub_header 会省略其他的缺省区域。对样式表也是一样的情况。虽然技术上样式表不算什么组,不过一单你定义了其他的样式表,那么style.css这一缺省包含的内容就会被略过,必须要显示声明才可使用。 *

为主题编写info文件

.info文件是一个静态文本文件,用于主题的定义和配置。info文件的每一行都由一个键值对构成,例如name = my_theme。分号用来表明注释。有些键使用一点特别的语法:用中括号把一组相关内容组合为一个列表(类似数组)。如果你对数组不了解,可以看看Drupal核心主题中的.info文件,阅读其中的解释。即使.info文件并没有一个典型的缺省编辑工具,可以在Mac上使用TextEdit或者在Windows中使用Notepad来查看、编辑或者修改。

注意本节讲解的.info文件是Drupal主题相关的,而不是模块中使用的info文件。可以在模块开发指南编写info文件学习模块中info文件的写法。

举例

下面的例子是一个Drupal 6中Garland主题的.info文件

页面