2013-03-06 1 views
1

DataObjectsAsPage 모듈을 사용하고 있습니다. 그것은 각 $ 항목을 반복하는 홀더 페이지에 Datalist ($ Items)를 반환합니다. 또한이 페이지의 부분 캐싱 전략을 개발하려고합니다. 부분 캐시 멤버

<% cached 'items', LastEdited, CacheSegment %> 
    <% loop $Items %> 
     $Me 
    <% end_loop %> 
<% end_cached %> 

내가 silverstripe 캐시/캐시 디렉토리를 확인하고 이것이 캐싱 것 같다 : 내 DataObjectsAsPageHolder 페이지에서, 나는 그래서 다음, 당신은 루프의 내부 캐시 블록을 배치 할 수 없습니다 워드 프로세서 읽어 $ Items 목록.

문제는 각 $ Item에 관리자가 CurrentMember 그룹을 기반으로 $ Item을 볼 수 있는지 여부를 설정할 수 있도록 DataExtension을 추가 한 것입니다.

<% if HasAccess %> 
<% end_if %> 

나는 두 가지 문제가 있습니다 : 그래서 각 $ 나 템플릿에서 나는 다음이

인증 된 회원이 다음, 페이지를 볼 수있는 첫 번째의 경우, 위의 캐시 키를 감안할 때
  1. 페이지가 캐싱되고 후속 페이지 뷰에서 독점 자료가 비회원에게 표시됩니다.

  2. 나는 다음 캐시 키를 조정하는 경우 :

<% cached 'items', Items.max(Created), CacheSegment unless CurrentMember %> 
    <% loop $Items %> 
     $Me 
    <% end_loop %> 
<% end_cached %> 
이 그런 다음 각 $ 나 템플릿의 내용은 회원 캐시되지 않습니다 - 내 사이트 시청자의 가장 큰 부분이다.

회원 및 비회원을 위해 $ Items 목록을 캐시하고 루프 내에서 $ Item에 대한 HasAccess 검사를 계속 사용할 수있는 방법이 있습니까?

답변

3

가장 간단한 해결책은 현재 구성원의 ID를 캐시 키에 추가하는 것입니다.

<% cached 'items', LastEdited, CacheSegment, CurrentMember.ID %> 
    <% loop $Items %> 
     $Me 
    <% end_loop %> 
<% end_cached %> 

그러나 이렇게하면 등록 된 각 구성원에 대해 블록이 고유하게 캐시됩니다. 캐싱을 좀 더 유용하게 만들려면 캐시 키에서 현재 멤버의 그룹을 사용해야합니다. 불행히도, 구성원을위한 그룹의 템플릿 캐시 키 준비 목록을 얻는 방법을 쉽게 알 수 없습니다.

이 문제를 해결하는 가장 쉬운 방법은 Page 클래스에 GroupsCacheKey 함수를 추가하는 것입니다. 조금 더러운 해결책이지만 효과적으로 작동해야합니다. 그런 다음 템플릿

// Untested function 
public function GroupsCacheKey() { 
    if ($member = Member::currentUser()) { 
     return implode('', $member->Groups()->map('ID', 'ID')->toArray()); 
    } 
    return 'nonmember'; 
} 

:

<% cached 'items', LastEdited, CacheSegment, GroupsCacheKey %> 
    <% loop $Items %> 
     $Me 
    <% end_loop %> 
<% end_cached %> 

어딘가에 거기에 이것보다 더 나은 솔루션이있다, 그러나 그것은 작동합니다.

+0

두 번째 해결책은 내 상황에 잘 맞습니다. 필요한 유일한 변경 사항은 asArray 메소드를 toArray로 변경하는 것입니다. 그 외에도 캐시 된 페이지를 테스트했으며 유사한 그룹의 구성원은 각각의 캐시 된 페이지를 제공 받고 있습니다. 고마워, 도움을 많이! –

+0

내가 말했듯이, 테스트되지 않았다. 위에서 수정 된 답변. – drzax