web-dev-qa-db-ja.com

カスタムコンポーネントのキャッシュなし設定

作成したカスタムコンポーネントがあり、結果をフィルタリングするための検索フィルターツールバーがあります。問題は、Joomlaのキャッシュがオンになっている場合、フィルターがページデータと共にキャッシュされるため、フォームを送信して新しいフィルターを設定すると、キャッシュされたページであるプレフィルターが返されるだけです。

新しいパラメーターを渡すときに、キャッシュなしのヘッダーを設定するか、Joomlaにキャッシュされたビューのバージョンを無視させるにはどうすればよいですか?

追加して編集:

この動作は、保守的キャッシュまたはプログレッシブキャッシュの両方で発生し、ファイルとMemcachedの両方で発生します。

4
user101289

この問題の原因となっているキャッシュ設定を明記していません。 Joomlaにはいくつかのキャッシュレベルがあります https://docs.joomla.org/Cache

最も積極的なキャッシングオプションは、ページキャッシングです(キャッシュシステムプラグインを介してオンになります)。これにより、コンポーネントが実行される前に、URIに基づいてキャッシュされたページが選択されます。ここでは、フォームのメソッドを「取得」に設定するのが唯一のオプションだと思います。これにより、フォームフィールドのデータがクエリ文字列の一部として渡されるため、一意の検索ごとに一意のキャッシュページが生成されます。これには、ユーザーがフォームのデータを再投稿するかどうかをブラウザに尋ねずに、ブラウザの戻るボタンを押すことができるという利点もあります。ただし、欠点は、使用しているフィルターの数によってはクエリ文字列がすぐに非常に長くなるため、ページのURLが読みにくくなる可能性があることです。

システムプラグインを使用していないが、サイトのグローバル構成を介してキャッシュをアクティブ化している場合、これは「ビュー」キャッシングと呼ばれ、コンポーネントのコントローラーで処理できます。

この場合、投稿されたフォームデータからcacheidを構築して、フィルターのセットごとに一意のキャッシュページが作成されるようにする必要があります。

// Create the view
$view = $this->getView('myView', 'html');

// Build a cache id which will be unique per search: 
$user = JFactory::getUser();
$uri = JURI::getInstance();
$input = JFactory::getApplication()->input;
$cacheId = serialize(array($uri, $input->post, $user->get('id')));

// Create the cache
$cache = JFactory::getCache('com_mycomponent', 'view');
$cache->get($view, 'display', $cacheId);

私は、Fabrikのリストコントローラーから上記のコードを切り取ってまとめました https://github.com/Fabrik/fabrik/blob/joomla3/components/com_fabrik/controllers/list.php 対処する必要があります同様の問題で。

3
Rob Clayburn
0
kumarramalingam