Drupal 8 模块开发 9.5 : 模式概述

原文地址: https://docs.acquia.com/articles/drupal-8-patterns-overview   多分支中的第一个 渲染数组首先检查是否有 #markup,如果有,只渲染这个标记。 决定怎样处理复杂元素 如果渲染数组比较复杂,去主题找出怎样处理这个渲染数组。系统检查 #type 和 #theme。 #type 和 #theme 的区别 #type 是定义元素的面向对象方式,而 #theme 是非面向对象方法。不幸地,这两种形式有些缠结。开始,#type 方式为元素定义设置,如果我们使用 #theme,hook_theme() 之后将被用于定义默认值,这些将被合并。 渲染元素和变量的区别 渲染数组必须设置渲染元素或变量。区别主要体现在模板变量上。对于渲染元素,所有变量在一个单独元素下面,而变量都在顶级。 {# Render Element #} {{ element }} {{ element.field_one }} {{ element.field_two }} {# Variables #} {{ field_one }} {{ field_two }} 本课输出是这样: {# Render Element #} {{ element }} {{ […]

Continue Reading

Drupal 8 模块开发 9.4 : 高级渲染数组模式

原文地址: https://docs.acquia.com/articles/drupal-8-advanced-render-array-patterns   HTML 属性 你能通过渲染数组设置 HTML 属性(例如 ID 和 Class)。这些属性会被传递到 Twig 模板,也允许 themer 添加和覆盖这些值。为了做这个,向渲染数组添加 #attributes 变量。数组的键是属性,值是属性的值。 $element = [   ‘#type’ => ‘my_element’,   ‘#config_one’ => ‘blue’, ]; $element[‘#attributes’] = [   ‘id’ => ‘my_blue_element_1’,   ‘class’ => [‘my-element’,’blue’], ]; 这允许下面类型的预处理钩子对其进行覆盖 —– $variables[‘attributes’] 被 theme.inc 内的 template_process() 函数创建,template_process() 运行于所有的渲染数组。$variables[‘attributes’] 是一个副本,原始值存储在 $variables[‘element’][‘#attributes’] 内,但这个原始值基本不怎么用。 function hook_preprocess_my_element(&$variables) […]

Continue Reading

Drupal 8 模块开发 9.3 : 向组件添加 Javascript/CSS/库

原文地址: https://docs.acquia.com/articles/drupal-8-adding-javascript-css-libraries-components   Drupal 7 里,推荐使用渲染数组里的 #attached 向组件添加 JavaScript 或 CSS 。许多开发者也使用 drupal_add_js,drupal_add_css 和 drupal_add_library 。Drupal 8 只支持  #attached 。所以现在推荐把所有的 JavaScript 和 CSS 定义为一个库,之后附加到渲染数组。   创建一个库 模块的 libraries.yml 文件把你渲染页面所需要的 CSS 和 JavaScript 定义为库。这个文件指定了库中每个组件的位置。   下面是 theme_example.libraries.yml 例子。在这个例子中,我们只定义了一个库 sample-library。它包含 JavaScript 和 CSS,也依赖几个核心库。Drupal 7 里,我们假定 jQuery,jQuery.once 和 settings 是有效的。Drupal 8 ,你必须把这些定义为依赖,因为默认它们不会被加载。 sample_library:   css:     # For some reason, […]

Continue Reading

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