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()建立一个数组:

Example模块汉化过程中的一些工具

最近给自己压了个大活,汉化Example模块。因为以前没做过这类事情,所以还是颇费了一些心思来做准备,现在把其中用到的一些工具和技巧整理一下,给大家做个参考。

  1. Git,无需多言了,项目既然放在Github,这个跑不掉。也只是用到简单的分支合并操作而已。
  2. SimpleTest:Drupal模块,用来验证翻译结果。用Drush运行,例如drush run-test -l http://127.0.0.1:8080/example ActionExampleTestCase

  3. Drush系列

使用Drupal Queue API

Tags: 

Drupal 7的诸多改进中,Queue API并没有进行大张旗鼓的宣传。Queue API用于进行任务管理。他的工作很像我们平时接触的TO-DO列表。如果你一天中有上百件事情要做,首先需要记录下来,接下来每完成一件就划掉一件。否则,就无法跟踪做了什么事情,以及还有那些事情需要完成。在Drupal中,这些任务称作数据处理。最明显的例子就是数据聚合(feeds),这个过程可以把大批外部数据导入成为Drupal内容。

在Queue API问世之前,我们一般会选择把数据保存在内存里,或者保存到缓存中。这两种方式的弊端在于,缓存可能会超时,内存可能会超量,这种情况会导致所有数据都消失掉,只能从头开始。另外任务的这种处理方式,在处理庞大的列表时,需要在每个任务请求时候,耗费大量存储进行读写。

Twig 教程


扩展Twig

本章描述了如何对Twig 1.12进行扩展。如果你在使用一个旧版本,请移步到过往文档继续阅读。

有多重扩展Twig的方法,可以加入新的标记、Filter、Test、操作符、全局变量以及函数。甚至还能利用Node visitors对解析器本身进行扩展。

本文的第一章节会介绍如何简单的扩展Twig。如果你想要在不同项目中进行复用,或者共享给他人使用,后面章节中还提供了如何创建扩展的内容。

Drupal的锁定机制

这一功能一般用于协调不同请求中的长时间操作。

在多数环境下,多个Drupal页面请求(也就是线程或者进程)会并发执行。如果两个请求同时执行一段代码,就有发生冲突或者竞争的可能。一个常见的例子就是menu_rebuild()这样的重建过程:这类过程中我们会调用很多hook,来从所有的激活模块中获取并处理信息,最后需要在数据库中删除旧信息,并以新数据取而代之。

任何长时间运行的操作,都可能因为多次请求而产生并发,这种情况应该在处理之前获取一个锁。得到锁的请求会通知其他请求,操作正在进行,无法并发执行。

要使用这个API,需要给锁起一个唯一名称。一般建议使用这个长操作的函数名称。下面是一个例子:

Drupal 7: PHP7 vs PHP5

Environment

  • Server: Ubuntu 14.04.1 LTS
    • Parallels
    • Apache 2.4.7
    • PHP 5.5.9
    • PHP 7.0.0-dev(github master)
    • Drupal 7.34
  • Client
    • OS X 10.10.2
    • Homebrew
    • Siege 3.0.7 (net.inet.tcp.msl: 15000 -> 1000)

Installing the dependencies

apt-get

sudo apt-get install \
libxml2 \
libxml2-dev \
libssl-dev \
pkg-config \
curl \
libcurl4-nss-dev \
enchant \
libenchant-dev \
libjpeg8 \
libjpeg8-dev \
libpng12-0 \
libpng12-dev \
libvpx1 \
libvpx-dev \

Site Builder的CSS

Tags: 

在我第一次使用Drupal的时候,添加CSS是个颇有难度的工作。最初我在主题的主样式表中添加css。可大多数情况下,都不需要覆盖整个网站的所有样式,所以这不是个好办法。可惜的是Drupal 7自身并没在管理页面上提供添加css的方法。所以我开始寻找一些添加/覆盖CSS的变通方法。

有时候站点管理员和运营人员需要添加新的css,覆盖或修改现有主题的css,这都可以通过在主题中添加自定义css直线。然而,有些css的变化目的只是想在一个页面中、一个node或者某一种内容类型中生效。这需要一些Drupal主题方面的知识。对于非开发者来说,这就更加困难了。所以也出现了很多模块,帮助用户来对css进行新增、覆盖或者修改。本文中,我会介绍其中的几个。

Code Per Node

Code Per Node(cpn)模块允许用户向一个内容类型或者Node中加入CSS。如果用户无权修改主题,但是又想在某个页面或者内容类型中加入css,那就再合适不过了。这个模块会为每个你指定的Node加入你的自定义CSS。

下面是这个模块的Node配置的截图:

页面