使用Deploy和Features导出Entities

Deploy Module可以把任何支持UUID的Entity导出到Features中。这个功能在创建安装范本或演示时非常有用,或者用于处理一些既非配置,也非内容的对象。

使用Deploy导出内容:

  • 安装DeployFeatures。如果不需要使用Deploy进行Drupal站点之间的内容同步,知识想要导出到Features的话,就无需关心Service Module的安装了。

  • 进入admin/structure/deploy/plans/add建立一个新的部署计划。

  • 选择聚合方式,参考Deploy基础用法,来获取关于将内容加入部署计划的不同方法。

  • 选择Fetch only,因为我们不需要部署处理,也不需要服务节点,而且没有选择这个选项的话,部署计划也不会出现在Features界面中。

Deploy的基本用法

在这个演示中,我们会创建和部署一个新的Node,然后发布一个针对该Node的更新。

部署

一次部署分为两个阶段:把内容添加到部署计划,发布部署计划。部署计划的发布将内容添加到目标服务器。

部署计划

一个部署计划包含一组将要发布到目标服务器上的内容。这些内容可以手工添加到部署计划中,也可以使用Views聚合或者Rules进行自动化操作。

手工添加内容

  1. 在源服务器进入node/add/article,创建一个新的Article。然后随便选一些选项并保存。

  2. 进入admin/content/node,查看刚新建的Node,从Update options中,Add to managed deployment plan下选择部署计划,点击Update按钮,然后在其他需要添加的内容上做同样的操作。

  3. 要发布这个计划,进入admin/structure/deploy然后点击Deploy连接,点击Deploy按钮进行确认。

使用定制Entity的时机和动机

介绍

Drupal 7开始出现了Entity,这一改进大大的提高了Drupal模块的数据建模能力。在这之前,Drupal是一个为文章设计的数据结构,我们的方案和数据建模只能在这个基础上修修补补。

然而,在我们已经习惯于利用内容类型和字段解决所有的数据模型问题的情况下,向Entity迁移也的确不是一个轻而易举的事情。

Entity需要一些时间和经验

如果你没有很多时间,也没有直接面对Entity API的经验,而手上的项目又逼近Deadline,那么这不是一个开始Entity的好时机,Entity的学习曲线也是颇为陡峭的。

利用 Entity construction kit(ECK)可能可以简化这一学习过程,这个模块提供了一个Entity的管理界面,尽管如此,要获得Entity的好处,还是需要一些开发工作的。ECK支持Features,能够把一个自定义Entity导出成为代码化配置,并且封装成为一个现成的模块形式。

尽管受限于实际情况,你可能不能立即投入Entity的怀抱之中,不过尽早投入时间来学习Entity还是值得的。

在版本管理过程中增强Drupal编码标准控制

根据Drupal.org的统计结果,Drupal社区共拥有:

* 27098个模块

* 2012个主题

* 827个发行版

* 33875个开发者

另外,来自230个国家,说着181种不同语言的107万4000多个用户在使用Drupal。上述数据完全来自Drupal社区。

我想要花时间来说一下这一条:27098个模块,这些模块由大约33875个开发者贡献的巨量代码构成。世上没有两片相同的树叶,如此众多的开发者,当然也可能产生各自的编码风格,如果这样下去,一个模块的代码对于其他开发者来说,可能就完全是晦涩难懂的了。

编码规范很重要,尤其是对于Drupal这种大规模项目来说。规范的代码能让初次接触项目的开发者不至于一头雾水。在规范代码的帮助下,新晋者可以顺利的进入代码并顺利完成工作,而无需在奇怪的变量命名和古怪的代码格式上浪费时间。

Drupal实现了大量的规范。从简单的代码格式,到复杂的安全实现,都被这些规范所涵盖。每个Drupal模块都要遵守这些标准。如果所有的模块都满足这一要求,那么Drupal就能够在安全、性能以及易读性方面更上一层楼。

如何使用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'];
}
?>

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

Drupal 7测试指南(simpletest)

本指南中的代码在 Examples 模块中维护。这意味着:

  • 你可以获得一份拷贝,进行修改和试验。

  • 如果发现了问题,可以提出 issue,并获得修正。当然,尤其欢迎给出补丁或增强功能的帮助。

这个指南能够帮你了解 Drupal 测试的基础知识,随后你应该有能力编写自己的第一个测试。在本例中,我们会创建一个叫做 simpletest_example 的测试模块。这个模块提供一种名为 simpletest_example 的内容类型。这个内容类型跟基础的 Drupal Node 是一致的。接下来会解释如何通过测试来证明 simpletest_example 这一内容类型能够正常工作。

准备工作

首先,我们要确认已经安装了 Simpletest 模块。Drupal 7 中,Simpletest 随核心发布,命名为 Testing。请确认该模块是否被激活。

Drupal数据库异常臃肿的检测和排除

Drupal网站利用数据库来保存配置和内容。

在普遍情况下(小规模部署),这个数据库是很紧凑的。例如我管理的这个网站一般只在5-20M之间。数据库尺寸主要受到内容数量和模块的影响。

然而,我曾经被一条主机商发来的通知吓了一跳,说我的网站使用了超过2G的存储,我想一定是出了什么问题。

这里我会分享我解决这个问题的一些心得,我想如果你遇到这些问题,也会有相似的情况。

(提示一下,可以使用drush sqlc来在你的网站数据库上运行SQL命令)

数据库层面

找到受影响的数据库。一般来说,每个网站对应一个数据库——除非你在使用一个多站点配置。

Drush提示用户输入的三种方式

Drush是个能让Drupal变简单的好东西。他不仅带有大量的有用工具,同时为用户提供了接口,让用户可以轻松实现自己的命令。如果你需要为你的模块创建Drush命令,只要创建一个包含这些功能命令即可。

在这个教程中,我们会演示如何在这些命令中获取用户反馈。这里我不会提到参数或选项之类的东西。这里主要讲述的是,如何获取一个是或否的确认,或者如何提示用户进行一个选择。另外,我们也会说说如何获取用户输入的文本。

首先让我们看一下drush_module_name_example_command()这个回调函数:

  /**
   * Callback function for the example command
   */
  function drush_module_name_example_command() {
    // Command code we will look at
    drush_print('Hello world!');
  }

确认

首先我们要试验的是如何获取用户的确认。在我们的例子中,我们会请用户确认是否显示内容,可以用Drush API这样实现:

页面