drupal

Drupal 开发和服务环境的最佳实践

Tags: 

一个新项目在启动初期,往往需要向客户描述一下我们的开发流程。这一过程帮助我们的客户相信,我们的流程能够为项目的短期和长期目标提供有力的保障。这其中自然需要描述我们的环境。幸运的是,有很多 Drupal 为中心的项目主机环境可以参考,我们的团队根据项目需要进行主机选择。这意味着我们几乎同所有的 Drupal 主机平台打过交道,因此我们对各个选项的优劣是比较清楚的。

Git 是基础的基础

第一,最重要的,所有的 Drupal 开发(其他开发也应该是)都应该使用 Git。Git 是一个用于分布式开发、非线性流程的版本控制系统。简单说来,Git 能有效的保护你的代码,防止误操作等人为损失。他还提供了详细的工作历史。Git 具有最佳的性价比

git

利用 Git 进行版本控制,解决开发问题,保障工作成果。

参与 2016 年度 Drupal 状况调查

Tags: 

我已经写了很多我认为对 Drupal 未来很重要的事情,现在轮到你了。在每个 Drupal 主版本发布之后,我会做一个“产品管理调查”,来搜集你的意见和数据,用于确认未来版本的 Drupal(8.x/9 )的焦点。

上次做这个调查的时候是 Drupal 7 的发布。当时 Drupal 8 的开发进行了六个月。我在 2011 年度 DrupalCon London 上公布了结果。调查结果不仅是 Drupal 社区的参考,更是 Drupal 8 定义提案的基础。现在我希望获得同样甚至更好的结果,帮助 Drupal 更好的响应复杂的市场趋势。

参与 2016 年度 Drupal 状况调查

编程管理手册大纲

本文假设读者具有编程操作 Node 的需求和经验。

Drupal 核心带有一个 Book 模块,用于生成具有多层上下级关系的内容大纲,这一功能对于特定需求的展示是非常有用的,这里介绍一下如何使用代码来生成层级大纲。

心急的同学可以直接拉到页尾抄代码。

Book 模块激活后,会在内容编辑界面上生成新的手册大纲标签页。这里即可编辑手册内容,并对大纲进行创建和添加。

我们可以通过新建一个手册的方式来观察 Drupal 中手册的行为,以此可以大致清楚创建的过程。

首先我们可以利用 Firebug 或者 Chrome 开发控制台等工具来观察新加入的标签页中 From 的具体内容,经过观察后我们知道,新建手册的选择,基本上是选择了之前我们创建的封面所在 Node 的 nid,注意这一下拉框的 ID 中的bid字样;如果我们选择了一个已经存在的手册的话,会多出一个选择上级的下拉框,其中列出了已经存在的手册项供选择,选择后就成为新内容的上级,注意这个下拉框 ID 中的plid

利用 Drupal Workflow 模块实现审批发表流程

工作流,在大多数出版和办公情景下都属于一个必选组件。在之前的译文中我也介绍了一些相关的 Drupal Module,不过之前的介绍都流于表面,并没有很完整的解决问题,因此这里以一个典型的编辑审批流程为样本,详细介绍 Workflow 模块的工作流设置方法。

目标需求

  1. 编辑人员在未完成编辑时,可以暂存草稿。
  2. 编辑完成之后,提交给上级进行审核。
  3. 审核人员可以选择批准或者驳回,审核通过的稿件即可发布,未能通过的则退回到草稿箱。
  4. 只有审核通过的内容才能被浏览

这里假设读者熟悉一般的 Drupal/Drush 操作,能够自行解决模块依赖等常见问题。

准备工作

首先是安装,这里我们用 Drush 来解决:

如何保存Node的单一字段

Drupal提供了node_save()这一核心功能,用于保存和变更包含Field在内的Node的数据。如果想要更新一个Node字段,可以这样做:

<?php
  $node = node_load($nid);
  $node->field_fieldname[LANGUAGE_NONE][0]['value'] = 'some value';
  node_save($node);
?>

然而,有些场合我们可能只想保存其中的一个字段,而不是整个Node。例如,我在代码中修改一些数据的时候,不想引起Node的更新时间的变动——因为更新时间应该只在用户界面上发生内容更新时发生变动。有时候为了防止触发一些其他调用——例如邮件通知之类的功能,我们也不想调用node_save(),这两种情况都发生在我的开发过程中。

Drupal有个field_attach_update()可能可以解决这个问题。调用方式跟node_save()很像:

Drupal Example Module 模块翻译更新

7.15.2015

Theming Example 翻译完成。顺手改了个Bug。

7.11.2015

完成 Form Example的更新,此Module巨大。

完成了Menu Example 这一块的更新。

这个例子稍有特别。

  1. 因为示例菜单中一部分内容试使用了base_path()函数,因此不要用drush cc 的方式来清空缓存,否则会造成部分网址错误。

  2. 测试用例中的测试字符串暂时没有包含到PO文件中,因此自动测试会失败。

项目网址:github

使用Drupal的Batch API

最近我在做一个图书馆网站,这个网站有很多数据需要导入到Drupal并转换为Node。书籍标题、电子书、DVD等都需要进行导入;不仅如此,还有一个外部数据库需要进行同步的新增,以及少量的修改和删除工作。估计有30到40万Node需要创建,并且需要同他们的内部数据库进行同步。在本文中,我会大致描述一下我如何使用Drush结合Batch API,在控制台中导入这些数据。

引入数据

我的第一个挑战是把数据导入到Drupal中。这其中包含大量数据,所以我需要使用batch API。Batch API让你可以在无需担心PHP超时的情况下,运行一个或多个方法来操作大量数据,并提供相应的进度指示。我创建了一个模块来处理图书馆数据的更新和导入。要创建这个批处理队列,首先要给batch_set()建立一个数组:

页面