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

Drupal 8 模块开发 6.1 : 实体查询和加载

原文地址: https://docs.acquia.com/articles/drupal-8-entity-queries-and-loading-entities   本课将解释在 Drupal 8 中如何查询实体。   本课… 组装模块 examples/query_example 学习实体查询 学习实体加载 研究、构建 PageExampleController  类   Drupal 历史上核心提供的操作和使用实体系统的方法比较有限,更丰富功能需要捐助模块来提供(Entity API)。Drupal 7 的核心提供了EntityFieldQuery 类,用于以编程的方式搜索实体。这个类包含了几个方法,帮助基于字段值或类属性进行实体查询。更多相关文档请查看 How to use EntityFieldQuery。   Drupal 7 之后,EntityFieldQuery 被核心叫做 entity.query 的服务代替,它可以为特定的实体类型实例化一个查询对象。entity.query 是  QueryInterface 的一个实现。也可以通过 \Drupal 名字空间或依赖注入静态的使用这个服务。   实体查询服务 这个查询服务允许我们取得匹配某种模式的一个节点列表。这类似一个 SQL 查询,但不是写一条语句,而是创建一个查询对象,之后执行它。我们能够调用这个查询对象的函数追加过滤或查询参数。   有两种方式创建查询对象。   基于类的方法(推荐) 之后章节中我们会讨论更多服务(services)内容。本例中,我们将使用类变量和函数获得一个查询对象,使用这个查询对象取得符合模式的节点 ID 列表。 下载文件 // This function and […]

Continue Reading

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

原文地址: https://docs.acquia.com/articles/drupal-8-fields-lab-and-other-information   新字段类型 Drupal 8 附带的几个新模块扩展了默认的字段 API。 Datetime – 不包含循环日期功能。 Email – 带有校验和 email 字段格式化器(转换纯文本 email 地址为可点击的 mailto)。 Entity reference – 链接到用户、术语和内容,一个自动完成字段。 Link – 包含基本的校验(只校验 http://)和几个常见选项(例如 nofollow 和在新窗口打开),以及不同的链接格式。 HTML 5 字段也支持 schema.org 标记(微数据)。核心没有用户界面,但你可以使用 RDF UI 模块把字段映射到 schema.org。   完整步骤 使用 Drupal 8 的用户界面创建内容类型 External 激活 Link 模块 向内容类型中追加 link 和 image 字段 导出站点配置 创建空模块 […]

Continue Reading

Drupal 8 模块开发 5.2 : 导出配置

原文地址: https://docs.acquia.com/articles/drupal-8-exporting-configurations   导出配置 有三种方法可以导出配置文件。 完全导出 – 把站点的所有配置导出为一个压缩包 导航到 /admin/config/development/configuration/full/export,点击“导出”按钮,叫做 config-xxx.tar.gz 的压缩包会被下载下来。 部分导出 – 使用单独的导出配置,分别导出每个文件。 导航到 /admin/config/development/configuration/single/export,使用“配置类型”和“配置名称”选择你要导出的配置。 Drush – 用 Drush 导出配置 上节我们已经使用 Drush 导出了配置。 导出结构类似这样: sites/default/files/config_[your config path]/sync drush config-export 导出后我们就可以把想要的配置文件拷贝到自己的模块内了。   创建空模块 创建空模块的步骤如下: 在 Drupal 8 的模块目录创建 fields_example 目录 创建子目录 config 在 config 内创建目录 install 从导出的配置内拷贝 node.type.external.yml 文件放在 config/install 目录下 在  fields_example 根下创建 […]

Continue Reading

Drupal 8 模块开发 5.1 : 实体字段

原文地址: https://docs.acquia.com/articles/drupal-8-fields-entities   此时,要创建一个带字段的内容类型最简单的方式是让 Drupal 写配置文件,之后在模块内直接使用这些配置文件。 我们可以看下 Drupal 核心的 YML 文件: core/profiles/standard/config/install/field.storage.node.field_image.yml   可以看出完全通过手写 YML 文件生成实体字段太繁琐、乏味而且很具挑战性。   本课… 组装 examples/field_example 模块 学习 Drupal 7 和 Drupal 8 实体字段的不同 研究用模块创建自定义字段 研究用模块改变既存的字段    创建“初始导出配置” 在我们通过用户界面管理配置之前,需要把数据库中的默认配置导出到文件系统。 这允许我们更新存储的配置、在不同环境间迁移配置。   确认已更新 Drush 到最新版本后,运行以下指令: drush config-export 想了解更多 Drush 信息,请查看 Drush based workflow 。   创建一个新的内容类型 之前课程里已经讨论了如何创建内容类型,我们现在要创建一个。 确保 Link 模块激活 创建新内容类型 External,保存、编辑字段。 […]

Continue Reading

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

原文地址: https://docs.acquia.com/articles/entities-lab   总结 在 Drupal 8 中,无论你选择三种方式(手动,用户界面,象 Console 这样的工具)中的那种创建实体类型都比较容易。尽管内容类型可能是你创建的第一个实体,但很快你会发现想创建其他的。   完整步骤 切换到 Examples 根目录 创建空目录 entity_example 创建 entity_example.info.yml 文件 创建 *.routing.yml 安装路由 创建 *.links.menu.yml 安装菜单 创建 *.links.action.yml 在页面追加路由 创建 *.links.task.yml 文件,在实体查看页和设置页追加 tabs。 创建实体类 在 src 目录创建 *Interface.php 文件 在 src/Entity 目录创建 *.php 文件定义实体类 创建控制器文件 在 src/Entity/Form 目录创建 *Form.php 文件,定义追加和编辑实体内容 在 src/Entity/Form 下的 *Form.php 文件定义删除实体类型的表单 […]

Continue Reading

Drupal 8 模块开发 4.1 : 实体,内容实体和配置实体

原文地址: https://docs.acquia.com/articles/drupal-8-entities-content-entities-and-configuration-entities   Drupal 7 引入了实体(entities)这个主要概念,根源在于面向对象编程。 所有东西都以实体的概念存在是 Drupal 7 的目标,Drupal 7 的核心只有几个实体类型:节点(nodes)、评论( comments)、 词汇(terms)和用户(users)。   要进一步扩展 Drupal 7 核心的实体 API,需要借助第三方捐助模块 Entity API,由捐助模块提供处理实体和属性的统一接口。这个模块也包括一个实体 CRUD(Create, Read, Update 和 Delete) 控制器,用于创建新的实体类型。   Drupal 7 之前,只有节点(nodes)可字段化。然而随着把 Drupal 7 核心框架部分建模为实体后,也可以向评论、词汇和用户添加字段。   随着 Drupal 8 的到来,Drupal 已经有能力通过配置管理产生实体和字段(第 5 课会介绍此内容)。 实体和实体类型 一个实体(像 Drupal 7 在 An introduction to entities 中定义的那样)是一个独立存在的对象。Drupal 8 中他们又被定义为一种特定类型的对象,每一个实体是一个实体类型(一种事物的抽象)的实例。这允许开发者把字段组织为可重用的形式。Drupal […]

Continue Reading

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

原文地址: https://docs.acquia.com/articles/drupal-8-configuration-lab-and-other-information   总结 本课我们研究了配置和配置表单。也了解了 ConfigFormBase 。 现在你可以尝试在多个站点间导入导出配置操作。   总体来讲,你现在应该看到 Drupal 8 配置是如何强大,以及对比 Drupal 7 在部署方面的改善。   我们学习了模块级别的配置实现: 配置管理代替了 Drupal 7 大杂烩的功能集合,为模块存储配置数据提供了一个核心位置。 YAML 文件作为了把配置记录在代码中的统一实现标准。 配置表单是把配置数据存储到数据库和文件系统的特定使用形式。 一个配置对象(Config Object)是一个配置的实例化。   完整步骤 切换到 Examples 根目录 创建空目录 configform_example 切换到 configform_example 目录 创建 configform_example.info.yml 文件 粘贴例子代码到 configform_example.info.yml 文件 创建 configform_example.routing.yml 文件 粘贴例子代码到 configform_example.routing.yml 文件 创建空目录 src 切换到 src 创建空目录 Form […]

Continue Reading