2016-02-04 4 views
1

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

Однако для того, чтобы использовать действие 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, которые будут ссылаться на две проверке и массив статьи. Я не знаю, как это сделать.

Что было бы лучшим способом справиться с этой ситуацией?

+0

Вам не нужны скобки в петле. И обычно он должен кэшировать запрос, поэтому 'if $ RelatedArticles' и' loop $ RelatedArticles', по крайней мере для отношений $ has_many или $ many_many. В вашем случае вы будете кэшировать его вручную в своем действии. См. Также https://docs.silverstripe.org/en/3.1/developer_guides/performance/caching#using-caches – wmk

+0

Право о. Я удалю скобки и посмотрю. В соответствии с кэшем причиной, по которой я задавал этот вопрос, было то, что я заметил, что при отладке его var_dump вызывается 3 раза. – rath3r

+1

ну, вам нужно проверить, запрашивается ли DB три раза или если он кэшируется. Просто поставьте? Showqueries = 1 на свой URL. См. Https://docs.silverstripe.org/en/3.2/developer_guides/debugging/url_variable_tools/#database – wmk

ответ

0

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

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

<% 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 %>