web-dev-qa-db-ja.com

Twig / Drupal 8カスタムキャッシュコンテキストがノードの前処理で機能しない?

twigテンプレートがあり、小さいディスプレイ(モバイルデバイス)または大きいディスプレイでは異なる方法でレンダリングする必要があります。たとえば、ブレーククラムをモバイルデバイスのフッターに移動します。

デバイスタイプを確認するために、-i Mobile Detect moduleを使用およびiは新しいcache_contextを作成しました "mobile_detect"という名前を付けます。このcache_contextを "node--page.html.twig"で使用したい。

現在、キャッシュコンテキストは「スーパーユーザー」としてログインしている場合にのみ機能するようですが、ログインしていない場合、ノードは一度キャッシュされ、キャッシュコンテキストは使用されません

これが機能しない理由はありますか?

本当にありがとう、私の悪い英語をごめんなさい:(

私の前処理:

function theme_preprocess_node(&$variables)
{
    //mobile detect variable
    $mobileDetector = \Drupal::service('krs.mobile_detect');
    $variables['isMobile'] = $mobileDetector->isMobile();

    //cache context
    $variables['#cache']['contexts'][] = 'mobile_detect';

}

私のtwig:

{% if isMobile %}
  {# content for mobile device #}
{% endif %}

私のcache_contextサービス:

私のモジュールにあるファイルmodules/custom/customCacheContext/src/Cache

<?php

namespace Drupal\customCacheContext\Cache;

use Drupal\Core\Cache\Context;
use Drupal\Core\Cache\Context\CacheContextInterface;
use Drupal\Core\Cache\CacheableMetadata;

/**
 * Defines the MobiledetectCacheContext service, for mobile or desktop caching.
 *
 * Cache context ID: 'mobile_detect'.
 */
class MobiledetectCacheContext implements CacheContextInterface  {


    /**
     * Constructor
     */
    public function __construct(MobileDetect $mobileDetector)
    {
        $this->mobileDetector = $mobileDetector;
    }

    /**
     * {@inheritdoc}
     */
    public static function getLabel() {
        return t('Mobile Detect');
    }

    /**
     * {@inheritdoc}
     */
    public function getContext($parameters = NULL) {

        if($this->mobileDetector->isMobile()) {
            return 'mobile';
        }

        return 'desktop';

    }

    /**
     * {@inheritdoc}
     */
    public function getCacheableMetadata($parameters = NULL) {

        return new CacheableMetadata();

    }

}

私のcache_context service.yml:

services:
  cache_context.mobile_detect:
    class: Drupal\customCacheContext\Cache\MobiledetectCacheContext
    arguments: ['@krs.mobile_detect']
    tags:
      - { name: cache.context }
1
Leonhard Hermle

ようやく解決策を見つけました。私のスクリプトはかなりうまくいきます。キャッシュモジュールについての小さなことを1つ忘れてしまいましたDrupalコアでデフォルトで有効にします。

「内部ページキャッシュ」モジュールを無効にする必要があり、「動的ページキャッシュ」のみを有効にしておく。実際、「内部ページキャッシュ」は匿名ユーザーのみに機能し、より良いパフォーマンスを得るためにページ全体をキャッシュします。したがって、動的パーツを作成することはできず、「max-age」または「cache context」は機能しません。したがって、モジュールを無効にすると、drupalはデフォルトで「動的ページキャッシュ」を使用し、「max-age」または「キャッシュコンテキスト」が機能します。

これがお役に立てば幸いです。

詳細はこちら: http://wimleers.com/article/drupal-8-dynamic-page-cache

1
Leonhard Hermle