Bonjour
我在Drupal 8上有一个无法解决的问题,这就是为什么我打电话给你。
我对同一节点有2个别名:
我有一个block_1仅出现在“ / public / *”页面上,而一个block_2出现在“ / pro / *”页面上。
当我访问网址“ / pro / event / 10”时,显示的是block_1,而不是block_2。
我得出的结论是,当我在页面“ / pro / event / 10”上时,Drupal选择了别名“ / public / event / 10”(可能是他找到的第一个)。
如何以编程方式告诉Drupal要使用的正确别名?
预先感谢您的帮助。
答案 0 :(得分:1)
这是可以帮助某人的代码
class OOutboundPathProcessor implements OutboundPathProcessorInterface
{
function processOutbound($path, &$options = [], Request $request = NULL, BubbleableMetadata $bubbleable_metadata = NULL)
{
// Only for nodes
if (!isset($options['entity_type']) OR $options['entity_type'] !== 'node')
{
return $path;
}
// Get current 'space'
$espace = \Drupal::service('session')->get('espace');
// Get the node to process
$node = $options['entity'];
// New path
$str_path = "/%s/%s/%s";
$new_path = sprintf($str_path, $espace, $node->bundle(), $node->id());
// Check new path
$isValid = \Drupal::service('path.validator')->isValid($new_path);
if ($isValid === true) return $new_path;
return $path;
}
}
答案 1 :(得分:0)
您可能想通过实现path_processor_outbound
来创建自己的OutboundPathProcessorInterface
服务。
如果当前请求路径匹配/node/{id}
或/public/event/**
,则此实现可以在/pro/event/**
路径上工作。
分析节点实体的类型(捆绑):如果是event
,则生成并返回所需的路径;如果不是event
,请不要操纵路径并返回原始路径。
用PHP代码编写实际的实现可能是您的荣幸;-)