В приложении 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, которые будут ссылаться на две проверке и массив статьи. Я не знаю, как это сделать.
Что было бы лучшим способом справиться с этой ситуацией?
Вам не нужны скобки в петле. И обычно он должен кэшировать запрос, поэтому 'if $ RelatedArticles' и' loop $ RelatedArticles', по крайней мере для отношений $ has_many или $ many_many. В вашем случае вы будете кэшировать его вручную в своем действии. См. Также https://docs.silverstripe.org/en/3.1/developer_guides/performance/caching#using-caches – wmk
Право о. Я удалю скобки и посмотрю. В соответствии с кэшем причиной, по которой я задавал этот вопрос, было то, что я заметил, что при отладке его var_dump вызывается 3 раза. – rath3r
ну, вам нужно проверить, запрашивается ли DB три раза или если он кэшируется. Просто поставьте? Showqueries = 1 на свой URL. См. Https://docs.silverstripe.org/en/3.2/developer_guides/debugging/url_variable_tools/#database – wmk