对于D8,我有一个节点(内容类型:基本页面),我使用它作为自定义403 (访问拒绝)页面。
我将其设置为:/admin/config/system/site-information上的自定义403页。路径是/node/21,别名是/error/403。
在块管理页面上,我将user登录块添加到内容区域。我添加了“仅显示在某些页面上”的限制:
我有一个视图,需要“添加内容类型ABC权限”才能访问。视图的路径是/view/abc。匿名用户没有此权限。
因此,作为一个匿名用户,我会访问/view/abc并向其展示/node/21的内容。但是,未显示用户登录块。
如果我转到块管理屏幕并删除“仅显示在特定页面上”的限制,那么我将该块视为/view/abc上的匿名用户,但我不想在每个页面上显示登录块;我只想在403 s的页面上显示它。
用户登录块只显示在自定义403页上的“路径”是什么?
发布于 2019-01-17 17:08:22
一种方法是将页面模板添加到主题注册表中:
function MYMODULE_theme_suggestions_page_alter(array &$suggestions, array $variables) {
//Allow theming the site error pages
$route_name = \Drupal::routeMatch()->getRouteName();
switch ($route_name) {
case 'system.401':
// Unauthorized Access.
$error = 401;
break;
case 'system.403':
// Access Denied.
$error = 403;
break;
case 'system.404':
// Page Not Found.
$error = 404;
break;
}
if (isset($error)) {
$suggestions[] = 'page__' . $error;
}
}然后,在page--403.html.twig中,您可以使用Twig呈现特定的块。见:如何在特定节点中嵌入视图?和细枝上的程序打印块
*我喜欢这种方法的一个原因是Login块是Drupal核心块,而不是自定义的。您可以随身携带一个很好的403模板文件,并且始终知道它会呈现出这个块。上面的预处理功能似乎是最少的侵入性和时间消耗(通过查看不同的方法),而且它提供了主题这些错误页面的能力。我认为将模板文件用于错误页面是非常理想的。
发布于 2019-01-15 13:50:48
如果你能编码,你应该选择一个ConditionPlugin。
就像RequestPath*(ConditionPlugin)一样,我们构建了一个定制的RouteCondition插件。这就允许我们在每条路线上都有粒度。
在您的例子中,一个简单的ConditionPlugin可能是正确的起点。
下面是一个示例* (www/modules/custom/{your_module}/src/Plugin/Condition/NotFoundCondition.php)
getRouteName();
// Does we have a match
return strpos( $route_name, 'system.403') === 0 * $this->isNegated();
// EDIT: the negate concept might be a bit overwelming at first.
// Maybe you don't need it right now
}
public function summary() {
if (!empty($this->configuration['negate'])) {
return $this->t('Do not return true on 403 pages');
}
return $this->t('Return true on 403 pages');
}
}在缓存重新生成之后,您应该能够使用structure>block布局将登录块放置在403页上。
https://drupal.stackexchange.com/questions/275148
复制相似问题