Минимизируйте звонки на контроллер из шаблона SilverStripe

В SilverStripe приложение, которое я создаю, у меня есть NewsArticles который имеет NewsTags (создано с использованием SilverStripe-tagfield). Я использую NewsTags создать виджет «Связанные новости» в боковой панели каждого NewsArticle, Я создал RelatedArticles действие в NewsArticle Контроллер и все работает отлично.

Однако для того, чтобы использовать RelatedArticles Действие Я вынужден вызвать функцию три раза. Не большая проблема, но я хотел бы свести к минимуму количество раз, когда я вызываю функцию, которая делает несколько обращений к базе данных.

Вот урезанная версия моего RelatedNewsModule.ss файл шаблона:

// First call to check if there are related articles
<% if $RelatedArticles %>

// second call to get the array
<% loop $RelatedArticles() %>
...
<% end_loop %>

// third call to check if there are more than one so we need navigation
<% if $RelatedArticles.Count > 1 %>
... navigation markup
<% end_if %>

<% end_if %>

Я хотел бы вызвать функцию один раз и, возможно, использовать свойства в шаблоне SilverStripe, которые будут ссылаться на две проверки и массив статей. Я не уверен, как, однако.

Как лучше всего справиться с этой ситуацией?

1

Решение

Как сказано в комментариях, SilverStripe должен вызывать базу данных только один раз и кэшировать RelatedArticles результаты для следующих 2 звонков.

Для дальнейшего кеширования запросов мы можем использовать Частичное кеширование кешировать части шаблона.

<% cached 'RelatedArticles', $ID, $List('RelatedArticles').max('LastEdited'), $List('RelatedArticles').count() %>
<% if $RelatedArticles %>

// second call to get the array
<% loop $RelatedArticles %>
...
<% end_loop %>

// third call to check if there are more than one so we need navigation
<% if $RelatedArticles.Count > 1 %>
... navigation markup
<% end_if %>

<% end_if %>
<% end_cached %>
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]