D8では、カスタム403(アクセス拒否)ページとして使用するノード(コンテンツタイプ:基本ページ)があります。
これをカスタム403ページとして設定しました:/admin/config/system/site-information
。パスは/node/21
で、エイリアスは/error/403
です。
ブロック管理ページで、ユーザーログインブロックをコンテンツリージョンに追加しました。 「特定のページにのみ表示する」という制限を追加しました。
アクセスするには、「コンテンツタイプの追加ABC権限」が必要なビューがあります。ビューへのパスは/view/abc
です。匿名ユーザーにはこの権限がありません。
そこで、匿名ユーザーとして/view/abc
にアクセスすると、/node/21
のコンテンツが表示されます。ただし、ユーザーログインブロックは表示されません。
ブロック管理画面に移動し、「特定のページにのみ表示する」制限を削除すると、ブロックが/view/abc
の匿名ユーザーとして表示されますが、すべてのユーザーにログインブロックを表示したくないページ; 403のページだけに表示したい。
ユーザーのログインブロックをカスタム403ページにのみ表示するために使用する「パス」は何ですか?
1つの方法は、テーマレジストリにページテンプレートを追加することです。
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で特定のブロックをレンダリングできます。参照: 特定のノードにビューを埋め込む方法? および プログラムで小枝にブロックを印刷する
*このアプローチが好きな理由は、ログインブロックがDrupalコアブロックであり、カスタムブロックではないことです。Nice403
テンプレートファイルを使用して、このブロックがレンダリングされることを常に認識しています。上記の前処理機能は、(さまざまなアプローチを検討することから)最も侵襲的で時間がかからないようであり、さらにこれらのエラーページにテーマを設定する機能を提供します。エラーページにはテンプレートファイルを利用するのが理想的だと思います。
コーディングできる場合は、ConditionPluginを使用する必要があります。
RequestPath *(ConditionPlugin)と同様に、カスタムRouteConditionプラグインを作成しました。これにより、各ルートに粒度を持たせることができます。
あなたの場合、単純なConditionPluginが適切な出発点になる可能性があります。
ここに例があります*(www/modules/custom/{your_module} /src/Plugin/Condition/NotFoundCondition.php)
<?php
namespace Drupal\{your_module}\Plugin\Condition;
use Drupal\Core\Condition\ConditionPluginBase;
/**
* Provides a 'Error Pages 403' condition.
*
* @Condition(
* id = "error_403_pages",
* label = @Translation("Error 403 Pages"),
* )
*/
class ErrorPages extends ConditionPluginBase {
/**
* @return bool
*/
public function evaluate() {
// Retrieve the current route
$route_name = \Drupal::service('current_route_match')->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');
}
}
キャッシュの再構築後、構造>ブロックレイアウトを使用して403ページにログインブロックを配置できるはずです