子域问题

时间:2011-05-25 21:29:25

标签: php silverstripe

我正在研究一个silverstripe子域名的问题,其他人做了代码,所以任何帮助都将不胜感激。

主网站上有一个“关于我们”导航栏,例如www.mainwebsite.com,我们希望“关于我们”在任何子域名中消失,例如subdomain.mainwebsite.com。

我可以从Silverstripe后端看到,有一个'Hide in Subdomains'功能,我勾选了它。但是,“关于我们”链接会在一段时间内消失,并在主站点和子域名的其他主题中显示。

有人能指出我正确的方向如何解决这个问题?如果需要,我可以在这里复制任何代码。请帮忙。

谢谢堆, S:)

添加评论,我在我的网站中的page.php中找到了这段代码 - 代码文件夹,如果有用的话

function ShowMenuInSubdomain()
{
    $host = explode('.',$_SERVER['HTTP_HOST']);
    $subdomain = $host[0];
    if($subdomain != 'www' && $this->HideInSubdomains) {
        return true;    
    }       
}

添加评论,这里是主题中的Page.ss中的导航部分 - 我正在使用的模板文件夹

<div id="Header">
    <div id="HeaderWrapper">
        <div id="LogoWrapper"><a href="{$BaseHref}">$GetSubDomainHeaderImage</a></div>
        <div id="Navigation">
            <% cached 'Navigation', Aggregate(Page).Max(LastEdited) %>
            <% include Navigation %>
          <% end_cached %>
        </div>
    </div>
</div>

添加评论,这是我的模板中的navigation.ss - 包含文件夹

<ul>
<% control Menu(1) %>
    <% if ShowMenuInSubdomain %>
    <% else %>
    <li <% if Children %>class="hasChildren"<% end_if %>>
    <a href="$Link" title="$Title.XML" class="$LinkingMode">$MenuTitle.XML <% if ShowMenuInSubdomain %>0<% end_if %></a>
        <% if Children %>
        <ul>
        <% control Children %>
            <li <% if Children %>class="hasChildren"<% end_if %>>
            <a href="$Link" title="$Title.XML" class="$LinkingMode">$MenuTitle.XML</a>
            <% if Children %>
            <ul>
            <% control Children %>
            <ul class="thridUL{$Pos}">
                <% if DisableLink %>
                <li>
                <span class="$LinkingMode thirdLevelTitle lookLikeALink">$MenuTitle.XML</span>
                </li>
                <% else_if ShowLabelInMenu==0 %>
                <li>
                <a href="$Link" title="$Title.XML" class="$LinkingMode thirdLevelTitle">$MenuTitle.XML</a>
                </li>
                <% end_if %>
                <% if Children %>
                <% control Children %>
                <li>
                <a href="$Link" title="$Title.XML" class="$LinkingMode">$MenuTitle.XML</a>
                <% if Summary %>
                    <span class="menuSummary">
                        $Summary
                        <span class="menuSummaryThumb">$Thumbnail.PaddedImage(160, 160)</span>
                    </span>
                <% end_if %>
                </li>
                <% end_control %>
                <% end_if %>
            </ul>
            <div class="clear">&nbsp;</div>
            <% end_control %>
            </ul>
            <% end_if %>
            </li>
        <% end_control %>
        </ul>
        <% end_if %>
    </li>

    <% end_if %>
<% end_control %>
<li id="calculatorWrapper">
 <a id="Calculator" href="$distanceCalculator.Link" rel="shadowbox;height=800;width=1000"><span>Journey Planner</span></a>
</li> </ul>

对不起,它有点长,但任何帮助表示赞赏。感谢。

  

大家好,似乎工作正常   现在当我删除&lt;%cached时   '导航',   Aggregate(Page).Max(LastEdited)%&gt; &LT;%   end_cached%&gt;在page.ss.有人可以   请详细解释这是什么   它的意义还是意义呢?感谢。

2 个答案:

答案 0 :(得分:2)

这样做:

$_host = explode('.', $_SERVER['HTTP_HOST']); 
if(count($_host) == 3 && $_host[0] != "www") echo "Hide About Us";

答案 1 :(得分:1)

因为您已经找到了一个子域检查方法('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-&gt; HideInSubdomains之前注意'!')

编辑

首先,忘记GetSubDomainMenu函数,看起来好像已被替换为使用内置Menu控件和子域ShowMenuInSubdomain函数更清晰的解决方案检查。

第二,忘掉关于遗失'!'的笔记。在$this->HideInSubdomains之前。从使用函数的方式来看,我可以看到它做了它应该做的事情,该函数只是以误导的方式命名:ShowMenuInSubdomain应该读HideMenuInSubdomain。显然是混乱,但不是问题的根源。

所以,从你到目前为止发布的代码来看,没有明显的错误,所以你应该尝试验证以下内容: a)是'navigation.ss'(不是你发布的.cc)实际上是渲染的模板吗?只需在文件中添加一些测试输出以确保(并将'?flush = 1'添加到您的网址以清除模板缓存) b)ShowMenuInSubdomain函数实际上是否被调用?让它返回一些字符串,如第一行中的“return”working“”,然后将$ShowMenuInSubdomain添加到模板中

如果您仍然卡住了,那么您可以压缩您的silverstripe项目文件夹并将其放在某处下载(首先删除关键信息,如数据库访问凭据!),所以我可以看看。 祝你好运!

编辑II - 解决方案 - 最后:)

看起来好像你发现了有缺陷的代码部分。您删除的行应该缓存导航,因此每次渲染时都不需要组合(我猜您熟悉'缓存'的概念)。请查看silverstripe docs on partial caching以获得有关此问题的进一步说明。注意“聚合”下的第一个代码片段 - 它正是您删除的代码。

但为什么删除缓存部分可以解决您的问题?事实上,答案很简单:由于您的缓存导航只会在编辑某个页面后更新,因此除非您在子域上,否则不会调用子域检查功能。这有点容易:)