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

蒲公英 提交于 周四, 08/17/2017 - 16:24
Drupal8模块开发

原文地址:
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 the string value from the field.
$value = $field->value;

// Get the summary from a body field.
$summary = $body_field->summary;

$field->value = 'changed value';

获取和设置复杂字段

这个例子演示了字段多余一个值的情况 ---- 例如,body 字段有一个 summary。如果一个字段有多个值,你需要使用较长的 getValue() 模式访问它。

下载文件

// We get a complex field (like the body).
$value = $field->getValue();

/**
 * Value will look like this,
 * $value = [
 *   [
 *     'value' => 'hello world',
 *     'summary' => 'the summary',
 *   ],
 *   [
 *     'value' => 'foo',
 *     'summary' => 'bar',
 *   ],
 *   [
 *     'value' => 'foo',
 *     'summary' => 'bar',
 *   ],
 * ];
 */

// We can access the value from before with,
$string = $value[0]['value'];

$value[0]['value'] = 'changed value';

// Update the value
$field->setValue($value);

获得字段信息

如果你想获取字段的信息(例如字段的类型),你需要先得到字段的定义。使用 getFieldDefinition ,字段定义是字段项目列表(the field item list)中的另一个对象。

/**
* @var $definition \Drupal\Core\Field\BaseFieldDefinition
*/
$definition = $field->getFieldDefinition();

$field_type = $definition->get('field_type');