, поскольку вы уже нашли метод для проверки субдомена для вас ('ShowMenuInSubdomain'), теперь ищите шаблон, в котором отображается меню. для стандартной установки silverstripe это, скорее всего, /mysite/templates/Page.ss
или один из файлов в /mysite/templates/layout
.
Ваше меню может отображаться внутри блока, как показано ниже:
<ul>
<% control Menu(1) %>
<li><a href="$Link" title="Go to the $Title page" class="$LinkingMode">$MenuTitle</a></li>
<% end_control %>
</ul>
вам просто нужно обернуть элемент списка затем блоком управления, вызывающим вашу функцию ShowMenuInSubdomain
, например:
<% if ShowMenuInSubdomain %>
<li><a href="$Link" title="Go to the $Title page" class="$LinkingMode">$MenuTitle</a></li>
<% end_if %>
пожалуйста, опубликуйте соответствующий блок кода шаблона на случай, если у вас возникли проблемы с этим.
ПРИМЕЧАНИЕ: я думаю, что есть «!» отсутствует в вашей функции ShowMenuInSubdomain, так как в настоящее время она читается как «if (HideInSubdomains), тогда ShowMenuInSubdomain true», поэтому рассматриваемая строка, вероятно, должна быть:
if($subdomain != 'www' && !$this->HideInSubdomains) {
(обратите внимание на '!' Перед $ this-> HideInSubdomains)
РЕДАКТИРОВАТЬ
Во-первых, забудьте о функции GetSubDomainMenu
, похоже, она была заменена гораздо более чистым решением использования встроенного элемента управления Menu
вместе с функцией ShowMenuInSubdomain
для проверки поддоменов.
во-вторых, забудьте о моей заметке о пропущенном '!' до $this->HideInSubdomains
выше. Из того, как используется функция, я вижу, что она делает то, что должна, функция просто вводит в заблуждение: ShowMenuInSubdomain
должно читаться HideMenuInSubdomain
. сбивает с толку, но не источник проблемы, по-видимому.
Итак, из кода, который вы опубликовали до сих пор, нет видимой ошибки, поэтому вы должны попытаться проверить следующее:
a) действительно ли файл navigation.ss (НЕ .cc, как вы уже опубликовали) на самом деле является шаблоном, который отображается? просто добавьте некоторые тестовые данные в файл (и добавьте '? flush = 1' в ваш URL, чтобы очистить кэш шаблона)
б) действительно ли вызывается функция ShowMenuInSubdomain
? сделайте так, чтобы он возвращал какую-то строку типа 'return "working' 'в первой строке, затем добавьте $ShowMenuInSubdomain
в ваш шаблон
на тот случай, если вы все еще застряли, вы можете заархивировать папку проекта silverstripe и поместить ее куда-нибудь для загрузки (сначала удалите критическую информацию, например, учетные данные для доступа к базе данных!), Чтобы я мог посмотреть.
удачи!
РЕДАКТИРОВАТЬ II - РЕШЕНИЕ - НАКОНЕЦ:)
выглядит так, как будто вы нашли некорректную часть кода. Строки, которые вы удалили, должны были кэшировать навигацию, поэтому ее не нужно собирать каждый раз при рендеринге (я полагаю, вы знакомы с концепцией «кэширования»). взгляните на документы silverstripe по частичному кешированию для более подробного объяснения этого. обратите внимание на первый фрагмент кода в разделе «Агрегаты» - это именно тот код, который вы удалили.
но почему удаление части кэширования решает вашу проблему? на самом деле, ответ довольно прост: так как ваша кэшированная навигация будет обновляться только после редактирования какой-либо страницы, функция проверки поддоменов не будет вызываться, если только в этом случае, независимо от того, находитесь вы на поддомене или нет. иногда это так просто :) 1051