Я новичок в Drupal. Использую Drupal 8. Распишу подробно:
1. Имеем тип материала - "Модель автомобиля". В нем поле - field_car_model - которое ссылается на словарь таксономии "Марки и модели автомобилей". Словарь таксономии - 3 уровня, пример:
Hyundai
Creta
I поколение (2018-2020)
Использую модуль Automatic Label для автоматического создания title в новом материале.
В "Модель автомобиля" в title прописал:
[node:field_car_model:entity:root] [node:field_car_model:entity:parent] [node:field_car_model:entity:name]
В итоге при создании новой ноды "Модель автомобиля" получаю в title:
Hyundai Creta I поколение (2018-2020)
Мне нужно получить title без (2018-2020) - то есть Hyundai Creta I поколение.
В самом термине убрать года выпуска нельзя, так как очень неудобно далее работать при создании нового контента.
Было принято решение написать custom token, который бы при получении имени термина таксономии убирал бы (2018-2020) например с помощью функции preg_match.Написал модуль test_token:
/**
* Implements hook_token_info().
*/
function test_token_token_info() {
$node['field_car_model:entity:name-without-years'] = [
'name' => t('Title without years of car model'),
'description' => t('Returns the title without years of car model.'),
];
return [
'tokens' => ['node' => $node],
];
}
/**
* Implements hook_tokens().
*/
function test_token_tokens($type, $tokens, array $data, array $options, \Drupal\Core\Render\BubbleableMetadata $bubbleable_metadata) {
$replacements = [];
if ($type == 'node' && !empty($data['node'])) {
/** @var \Drupal\node\NodeInterface $node */
$node = $data['node'];
foreach ($tokens as $name => $original) {
switch ($name) {
case 'field_car_model:entity:name-without-years':
$replacements[$original] = 'new test token';
break;
}
}
}
return $replacements;
}
Понятно что в данном случае я просто присвоил последнему значению текст.
Мне не хватает моих знаний по друпалу. Во многих примерах используются простые примеры, такие как например формат даты или присваивание текста. Собственно два вопроса:
1. Как вставить свой токен в любой type, а не только в type node??? Нужно что бы данный токен я мог выбирать с учетом иерархии, что бы он находился на том же уровне, там же где стандартный токен [node:field_car_model:entity:name]
Думаю что так но знаний не хватает:
function test_token_token_info() {
$node['name-without-years'] = [
'name' => t('Title without years of car model'),
'description' => t('Returns the title without years of car model.'),
];
return [
'tokens' => ['node' => 'field_car_model' => 'entity' => $node],
];
}
Может так (брал из описание Drupal 7 на drupal.org) :
$node['field_car_model']['entity']['name-without-years'] = [
'name' => t('Title without years of car model'),
'description' => t('Returns the title without years of car model.'),
];
return [
'tokens' => ['node' => $node],
];
Это гадание на кофейной гуще - у меня не хватает знаний, их надо получить, нужен пример в котором можно было бы разобраться
Что есть:
Нужно:
2. Я читал конечно здесь: https://niklan.net/blog/191 - но мне как новичку - это пока не понять - слишком сложно когда есть цепочка токенов. Читал и на зарубежных сайтах - но опять там чаще всего простые случаи, а если сложнее то мне понять.
Может кто нибудь написать как мне получить имя термина таксономии и убрать из него года выпуска????