web-dev-qa-db-ja.com

403ページにユーザーログインブロックを表示するにはどうすればよいですか?

D8では、カスタム403(アクセス拒否)ページとして使用するノード(コンテンツタイプ:基本ページ)があります。

これをカスタム403ページとして設定しました:/admin/config/system/site-information。パスは/node/21で、エイリアスは/error/403です。

ブロック管理ページで、ユーザーログインブロックコンテンツリージョンに追加しました。 「特定のページにのみ表示する」という制限を追加しました。

  • /エラー/*
  • /見る/*
  • / node/21

アクセスするには、「コンテンツタイプの追加ABC権限」が必要なビューがあります。ビューへのパスは/view/abcです。匿名ユーザーにはこの権限がありません。

そこで、匿名ユーザーとして/view/abcにアクセスすると、/node/21のコンテンツが表示されます。ただし、ユーザーログインブロックは表示されません。

ブロック管理画面に移動し、「特定のページにのみ表示する」制限を削除すると、ブロックが/view/abcの匿名ユーザーとして表示されますが、すべてのユーザーにログインブロックを表示したくないページ; 403のページだけに表示したい。

ユーザーのログインブロックをカスタム403ページにのみ表示するために使用する「パス」は何ですか?

4
Patrick Kenny

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テンプレートファイルを使用して、このブロックがレンダリングされることを常に認識しています。上記の前処理機能は、(さまざまなアプローチを検討することから)最も侵襲的で時間がかからないようであり、さらにこれらのエラーページにテーマを設定する機能を提供します。エラーページにはテンプレートファイルを利用するのが理想的だと思います。

2
Prestosaurus

コーディングできる場合は、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ページにログインブロックを配置できるはずです

0
SwingingTom