Drupal 8 模块开发 9.2 : Twig

原文地址: https://docs.acquia.com/articles/drupal-8-twig   增加一个 Twig 模板 我们已经定义了基本的主题元素,现在可以创建一个 Twig 模板了。Twig 是 Drupal 8 的默认主题系统。 默认 Twig 模板文件的命名规则与 Drupal 7 中的 .tpl.php 模板文件相同: 使用 – 代替 _,以 .html.twig 为扩展名。   我们的 Twig 模板 首先,看下模板文件 templates/my-element.html.twig,你可以使用 {{element}} 打印整个渲染元素或者使用代码 {{element.field}} 打印个别字段或孩子元素。 下载文件 {# /**  * @file  * Default theme implementation to my_element.  *  * Available variables:  * – element: Element […]

Continue Reading

Drupal 8 模块开发 9.1 : 创建元素,主题化元素和管理前端库

原文地址: https://docs.acquia.com/articles/drupal-8-creating-elements-theming-elements-and-managing-frontend-libraries   本课… 组装 examples/theme_example 模块 定义一个元素 通过渲染数据流处理一个元素 学习 Twig 模板 学习向元素追加 JavaScript 和 Css 学习 Drupal 8 中使用的其他处理模式   本课将演示怎样创建页面的一个组件(元素),包括标记以及 JavaScript、Css 等前端这些东西。我们将展示如何在 PHP 后端定义这个元素,以及它被处理、随着 JavaScript 和 CSS 渲染到页面的整个过程。   定义 元素 Drupal 里,页面的片段被组织成元素,这些元素经常会包含其他的元素。因此我们把这些片段捆绑为大的嵌套结构,修改这些片段,之后渲染为页面或处理为其他的输出形式。元素包括链接(links),按纽(buttons),字段(fields),图片( images),节点(nodes),区块(blocks),页面(pages)等等。所有东西都是某种类型的元素。   渲染数组 PHP 概念中被用于存储元素信息的东西叫做渲染数组(render array),它包含可渲染元素的所有信息。   渲染数组包含定义元素片段信息的元素(例如它的类型)和变量。例如,一个链接有一个类型 link 和使用 title、URL 产生一个 HTML <a> 元素。链接也有很多其他可选的变量,例如 class 和 id 。   […]

Continue Reading

Drupal 8 模块开发 8.4 : 概要

原文地址: https://docs.acquia.com/articles/drupal-8-dependency-injection-summary   总结 服务容器的力量在于允许我们书写解耦合的功能,并把这些功能传递给需要它的地方。当注册服务时你也可以声明依赖。这意味着当 Drupal 实例化一个服务对象时,它也会实例化它的依赖,并传递给它的构造器。想了解更多可以查看 documentation for Services and dependency injection 。   我们回顾下服务,他们是什么以及他们是怎样工作的 —– 他们是维护可重用、解耦合功能片断的一种伟大方式。我们也引入了依赖注入这个概念 —– 等价向函数(构造函数或者 setter 方法)传递参数。   额外练习 追加一个能够作为服务的函数。 演示这个函数的静态和依赖注入版本。 查看核心代码,找出一到三处你认为可以用依赖注入代替的情况。 描述使用依赖注入的两种不同情况。 描述一种使用静态函数代替依赖注入的情况。

Continue Reading

Drupal 8 模块开发 8.3 : 依赖注入

原文地址: https://docs.acquia.com/articles/drupal-8-dependency-injection   Drupal 8 使用 Symfony 的依赖注入容器管理服务实例以及把这些服务注入到需要他们的类内。依赖注入可以解耦功能和改善可测试性。仅出于这两个原因就有必要了解清楚依赖注入是什么及怎样使用它。   上节你已经创建和使用了一个服务,现在你可能想更深入的理解依赖注入和服务定义。   服务定义 Symfony 文档的 Service Container 部分定义了服务(Services)。 简单的说,一个服务是执行某种全局任务的一些 PHP 对象。它是计算机术语中的一个通用名称, 用于描述为特定目的而创建的一个对象(例如投递邮件)。 服务是执行了一项任务的对象(你想在全局范围内重复使用,但又无需多次重复书写相同的代码)。这是实用的,例如设置一个数据库联接或者创建一个邮件发送器。服务把功能分割为可重用的组件。一个服务是执行了一些全局操作的 PHP 类,并且被服务容器注册以便能够被访问。   服务容器是存在的另一个对象 —– 它管理服务的集合。你使用 [module_name].services.yml 实例化服务,之后这些信息会保存在容器对象里。通过服务容器的 get 和 set 方法访问这些服务。   通常,你使用依赖注入把服务容器传递到自己的方法内,之后调用那些服务。   通常服务的例子: 配置和 Config 对象 Drupal 8 提供了一个 Config 对象,我们能够使用它与配置通信。 就象 services and dependency injection in Drupal 8 描述的那样,一些类已经通过依赖注入生效了。 […]

Continue Reading

Drupal 8 模块开发 8.2 : 服务和控制器

原文地址: https://docs.acquia.com/articles/drupal-8-services-and-controllers   创建个控制器 我们已经创建了控制器,现在把服务追加进去。当 simple_example() 函数被调用时它会返回一个渲染数组。扩展基类总是个好办法。本例中我们的控制器扩展 ControllerBase  类。我们很快就会看到,这使我们能够访问服务。 下载文件 <?php   /**  * @file  * Contains \Drupal\service_example\ServiceExampleController.  */   namespace Drupal\service_example\Controller;   use Drupal\Core\Controller\ControllerBase;   class ServiceExampleController extends ControllerBase {   /**    * {@inheritdoc}    */   public function __construct() {   }     /**    * {@inheritdoc}    */   public […]

Continue Reading

Drupal 8 模块开发 8.1 : 服务

原文地址: https://docs.acquia.com/articles/drupal-8-services-dependency-injection-and-service-containers   本课… 创建模块 examples/service_example,使用自定义服务(service )和依赖注入(dependency injection) 学习服务及他们与依赖注入的关系 研究依赖注入的含义及使用 研究服务容器的含义及使用 专注“服务在编程中意味着什么、为什么他们比较实用” 研究创建和注册一个简单的服务   我们将创建一个定义 service_example.example_service 服务的模块,之后在页面 examples/service-example/simple 中使用它,页面由一个简单的 ServiceExampleController 控制器控制。   创建基础模块 我们将创建以下文件。之前课程里已经解释如何创建路由和 info 文件。 service_example.info.yml 文件: name: ‘Service example’ type: module description: ‘An example module showing how to create and use a service.’ package: ‘Acquia Example modules’ core: 8.x   service_example.routing.yml 文件: service_example_simple: […]

Continue Reading

Drupal 8 模块开发 7.2 : 加载字段的例子

原文地址:https://docs.acquia.com/articles/drupal-8-loading-fields-examples   例子模块 我们将创建一个例子模块,加载一个节点(node),输出它的一些信息。 首先,至少创建一个节点,body 字段填写一些内容。 然后,我们创建这个模块,加载单一节点。   创建文件 field_example.info.yml : name: Field Example type: module description: Example showing how to use fields core: 8.x package: Examples   创建文件 field_example.routing.yml : field_example.simple:   path: ‘examples/field-example/simple’   defaults:     _controller: ‘\Drupal\field_example\Controller\FieldExampleDefaultController::simple’   requirements:     _access: ‘TRUE’   创建控制器文件 src/Controller/FieldExampleDefaultController.php : 下载文件 <?php /**  * @file  * […]

Continue Reading

Drupal 8 模块开发 7.1 : 加载和编辑字段

原文地址:https://docs.acquia.com/articles/drupal-8-loading-and-editing-fields   Drupal 7 中的字段经常被存储为能够接纳多种模式的复杂数组。Drupal 8 中字段全部使用相同模式。不管字段是单值、多值、多语言、内置字段或者是附加字段,他们全部是类  FieldItemList 的对象。在某些方面,这使得开发 Drupal 8 容易,但也意味着原本在 Drupal 7 内比较简单的东西可能变得更复杂。   Drupal 7 里我们经常直接访问字段,使用钩子在他们加载时直接改变、保存他们。 Drupal 8 由关注字段改为关注实体,所以如果我们要改变字段首先需要通过实体得到他们。   下载隶属于实体的字段 要收集作为实体一部分的字段信息,使用以下代码: /** * @var $entity \Drupal\Core\Entity\Entity */ $entity = $entity_storage->load($entity_id); /** * @var $field \Drupal\Core\Field\FieldItemList */ $field = $entity->get($field_name);   获取和设置简单字段 FieldItemList 类有 __get() 和 __set() 方法,可以处理多数情况。 这些方法假设你处理第一个项目(Item)。 // We get […]

Continue Reading

Drupal 8 模块开发 6.3 : 实验室和其他信息

原文地址: https://docs.acquia.com/articles/drupal-8-load-and-query-entities-lab    总结 本课我们看到了在 Drupal 8 中如何查询和加载实体。Drupal 8 把 7 中的 EntityFieldQuery 类进行了大修,提供了查询内容实体和配置实体的健壮 API。我们只看了查询内容实体,但查询配置实体用法是相同的。   我们也看到了怎样通过查询实体得到的 ID 加载实体的方法。接下来我们会看下 Drupal 8 中如何定义内容实体类型,要复习下这个在 Drupal 7 是怎么做的,请查看 Sitepoint articles。   完整步骤: 在内容类型 Article 内追加 5 个节点(node),至少一个标题为”ipsum lorem“ 拷贝课程 1 中的 page_example 模块,重命名为 query_example。 重命名相应的文件、术语、方法和类。 改变 PageExampleController 类 a. 创建 simpleQuery() 方法,返回 ID 列表。 b. 创建方法 basicQuery(),返回 simpleQuery() […]

Continue Reading

Drupal 8 模块开发 6.2 : 加载实体

原文地址: https://docs.acquia.com/articles/drupal-8-loading-entities   加载实体 查询对象的 execute() 方法只是返回实体 ID 数组。要使用这些实体我们必须加载这些实体对象。Drupal 7 使用  entity_load() 函数返回一个实体对象数组(基于传递给它的 ID 数组)。Drupal 8 里这个函数变为只返回一个实体对象(当然参数也不再是 ID 数组,而只是一个 ID),而额外又提供了一个加载多个实体的方法: entity_load_multiple() 。   有三种方法加载实体: 类方法(推荐) 依赖注入将在之后章节讨论。代码中的重要部分是 example() 方法,它使用 entityManager 对象构建了一个节点存储对象。之后我们使用这个存储对象获得一个节点对象或者节点对象列表。 下载文件 protected $entityManager; /**  * {@inheritdoc}  */ public function __construct(EntityManagerInterface $entityManager) {   $this->entityManager = $entityManager; } /**  * {@inheritdoc}  */ public static function create(ContainerInterface […]

Continue Reading