В 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, которые будут ссылаться на две проверки и массив статей. Я не уверен, как, однако.
Как лучше всего справиться с этой ситуацией?
Как сказано в комментариях, 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 %>
Других решений пока нет …