使用定制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这样实现:

从内容管理到数字化体验管理

Tags: 

Drupal刚过了第十三个生日!我很荣幸的陪伴Drupal这样一个从业余爱好起步的小项目,一路坎坷前行。Drupal社区在充满了爱和激情的大量付出中逐步成长。

Drupal的生日给了我们一个回顾和反思的契机。当然,多年以来的积累,有太多的事情可供思考,本文仅从宏观的角度,来阐述对市场的分析——也就是说,本文主要从业务而非技术视角出发。

从Web到数字化

Drupal的诞生源于我对Web的浓厚兴趣。今天,他已经成为很多组织的IT基础设施的一部分。对多数机构来说,一个网站或移动应用,是业务运行的重要组成部分,这一重要性还在逐步提高。随着移动和社交媒体的兴起,我们不再只是谈论“网站”或“网站应用”,而是“数字化体验”。为浏览者或顾客提供最佳的数字化体验,已经从“选修课”变成了“必修课”。

Field API

利用Field API可以把字段附加到Drupal实体中,并提供了对字段数据的存储、载入、编辑以及渲染支持。Field API能把包括Node、User在内的任何实体变得“字段化”,也就是说可以把字段附加在实体之上。其他模块可以提供基于用户界面,可以通过浏览器来管理各种数据类型的字段,Form元素以及显示兼容性等。

Field API定义了两个重要的数据结构:Field(字段)和Instance(字段实例),以及一个重要的概念:Bundle。字段定义了可以附加到实体智商的数据类型。字段实例是一个附加到一个Bundle上的字段。一个Bundle是一系列的用Field Attach API组织起来的字段集合,并且这一集合会被附加到一个字段化的实体之上。

页面