web-dev-qa-db-ja.com

保存時にブロックキャッシュがクリアされませんか?

サイトの領域に表示されるカスタムブロックタイプがいくつかあります。画像、テキスト、タイトルなど、これらのブロックのコンテンツを変更すると、保存してページにアクセスしたときに、ブロックデータがキャッシュされ、新しい変更が表示されないことに気付きました。クライアントはこれをバグとして報告し続けるため、これは問題がありますが、更新されない場所や理由がわかりません。

キャッシュをクリアする必要がないようにブロックを保存するときに無効にする方法はありますか?私はこれが通常の動作になると考えましたが、それをクリアする必要があります(UID 1としてもログインしている間)think変なことをしている、またはcontribモジュールがインストールされているこれを妨げます。

編集:私はnotパネルなどを使用しています-これはコアブロックです。

5
Kevin

問題は、キャッシュタグ_block_content:[id]_がバブルアップせず、キャッシュエントリにタグがないことです。このキャッシュタグがないと、変更されたカスタムブロックを保存するときにキャッシュエントリを無効にできません。

2つの回避策があります。

小枝テンプレート(回避策1)

ブロックテンプレートにテーマを設定し、単一のフィールドをレンダリングする場合

_{{ content.field_field1 }}
{{ content.field_field2 }}
_

次に、contentの残りの部分もレンダリングする必要があります。

_{{ content|without('field_field1', 'field_field2') }}
_

これは、contentにブロックコンテンツエンティティのキ​​ャッシュタグが含まれているためです。

前処理(回避策2)

_{{ content }}_をレンダリングするための代替オプションとして、前処理でvariablesの先頭にキャッシュタグを追加できます。

mytheme.theme

_function mytheme_preprocess_block(&$variables) {
  if ($variables['base_plugin_id'] == 'block_content') {
    $renderer = \Drupal::service('renderer');
    $renderer->addCacheableDependency($variables, $variables['content']['#block_content']);
  }
}
_

次に、すべてのcontentをレンダリングするためにtwigテンプレートに依存しなくなります。

Drupal\block\BlockViewBuilder::preRender()には、コンテンツレンダー配列からデータをバブリングする際の問題の回避策があります。次のコードを使用すると、ブロックコンテンツのすべてのキャッシュデータがトップレベルにバブルアップするために、特別な状況でのみ適用されます。

_use Drupal\Core\Cache\CacheableMetadata;

function mytheme_preprocess_block(&$variables) {
  $content = $variables['content'];
  CacheableMetadata::createFromRenderArray($variables)
          ->merge(CacheableMetadata::createFromRenderArray($content))
          ->applyTo($variables);
}
_

しかし、他の場所でどのような副作用が発生するかはわかりません。それが簡単であれば、ブロックビュービルダーは既にこれを実行します。そのため、1つのタグが欠落している特定の問題のみに取り組み、前処理関数の最初のバージョンを使用することをお勧めします。

10
4k4

キャッシュの最大経過時間を0に設定すると、1日節約できました。

function MODULE_NAME_preprocess_block(&$variables) {
    if ($variables['base_plugin_id'] == 'block_content') {
        $variables['#cache']['max-age'] = 0;   
    } 
}
0
Sriman