Tôi đã sử dụng các bộ lọc Twig của riêng mình để hỗ trợ các trường thực thể, với điều này bạn có thể sử dụng các trường làm mảng gốc:
{{ content.field_mytext|length }}
hoặc là
{{ content.field_mytext|first|value }}
hoặc là
{% if content.field_mytext is empty %}
Bạn có thể dễ dàng thêm các bộ lọc Twig của riêng mình thông qua một mô-đun tùy chỉnh. Bạn có thể tìm hiểu thêm tại đây: drupal.org/docs/8/creating-custom-modules . Tóm lại, bạn cần tạo một thư mục mô-đun, ví dụ path/to/drupal/modules/custom/common/
, đặt ở đó common.info.yml
với định nghĩa mô-đun và common.services.yml
với định nghĩa của dịch vụ (xem nhận xét trong mã) và đặt mã của tôi vào /path/to/drupal/modules/custom/common/src/TwigExtension.php
.
<?php
namespace Drupal\common;
use Drupal\Core\Field\FieldItemInterface;
use Drupal\Core\Field\FieldItemListInterface;
use Drupal\Core\TypedData\ComplexDataInterface;
/**
* A class providing Twig extensions.
*
* This provides a Twig extension that registers various Field-API-specific
* extensions to Twig, overriding empty and array related filters.
*
* Don't forget about common.services.yml
* services:
* common.twig.TwigExtension:
* class: Drupal\common\TwigExtension
* tags:
* - { name: twig.extension }
*
* Usage (in *.html.twig file):
* - check is field empty {% if content.field_foo is empty %}
* - get field first value {{ content.field_foo|first|value }}
*/
class TwigExtension extends \Twig_Extension {
/**
* {@inheritdoc}
*/
public function getTests() {
return [
new \Twig_SimpleTest('empty', [$this, 'twigEmptyField']),
];
}
/**
* {@inheritdoc}
*/
public function getFilters() {
return [
new \Twig_SimpleFilter('length', [$this, 'twigLengthFilter'], ['needs_environment' => TRUE]),
new \Twig_SimpleFilter('slice', [$this, 'twigSlice'], ['needs_environment' => TRUE]),
new \Twig_SimpleFilter('first', [$this, 'twigFirst'], ['needs_environment' => TRUE]),
new \Twig_SimpleFilter('last', [$this, 'twigLast'], ['needs_environment' => TRUE]),
new \Twig_SimpleFilter('value', [$this, 'twigFieldValue']),
];
}
/**
* Check if value is field item object.
*
* @param mixed $value
* Mixed Twig variable.
*
* @return \Drupal\Core\Field\FieldItemListInterface|mixed
* FieldItemListInterface or same value as passed.
*/
private function checkItems($value) {
if (is_array($value) && !empty($value['#items']) && $value['#items'] instanceof FieldItemListInterface) {
return $value['#items'];
}
return $value;
}
/**
* Get field item value.
*
* @param object $field
* Field object.
*
* @return array|mixed
* List of values or value.
*/
public function twigFieldValue($field) {
if ($field instanceof FieldItemInterface) {
$prop = $field->mainPropertyName();
$value = $field->getValue();
return $prop ? $value[$prop] : $value;
}
if ($field instanceof FieldItemListInterface) {
$value = [];
foreach ($field as $item) {
$value[] = $this->twigFieldValue($item);
}
return $value;
}
return '';
}
/**
* Checks if a variable is empty.
*
* @see twig_test_empty
*/
public function twigEmptyField($value) {
$value = $this->checkItems($value);
if ($value instanceof ComplexDataInterface) {
return $value->isEmpty();
}
// Return TRUE, because there is no data only cache and weight.
elseif (!is_object($value) && isset($value['#cache']) && count($value) == 2) {
return TRUE;
}
return twig_test_empty($value);
}
/**
* Returns the length of a variable.
*
* @param \Twig_Environment $env
* Twig environment.
* @param mixed $item
* A variable.
*
* @return mixed
* The first element of the item.
*
* @see twig_length_filter
*/
public function twigLengthFilter(\Twig_Environment $env, $item) {
$item = $this->checkItems($item);
return twig_length_filter($env, $item);
}
/**
* Slices a variable.
*
* @param \Twig_Environment $env
* Twig environment.
* @param mixed $item
* A variable.
* @param int $start
* Start of the slice.
* @param int $length
* Size of the slice.
* @param bool $preserveKeys
* Whether to preserve key or not (when the input is an array)
*
* @return mixed
* The first element of the item.
*
* @see twig_slice
*/
public function twigSlice(\Twig_Environment $env, $item, $start, $length = NULL, $preserveKeys = FALSE) {
$item = $this->checkItems($item);
return twig_slice($env, $item, $start, $length, $preserveKeys);
}
/**
* Returns the first element of the item.
*
* @param \Twig_Environment $env
* Twig environment.
* @param mixed $item
* A variable.
*
* @return mixed
* The first element of the item.
*
* @see twig_first
*/
public function twigFirst(\Twig_Environment $env, $item) {
$item = $this->checkItems($item);
return twig_first($env, $item);
}
/**
* Returns the last element of the item.
*
* @param \Twig_Environment $env
* Twig environment.
* @param mixed $item
* A variable.
*
* @return mixed
* The first element of the item.
*
* @see twig_last
*/
public function twigLast(\Twig_Environment $env, $item) {
$item = $this->checkItems($item);
return twig_last($env, $item);
}
}