0

私はシルバーストライプサブドメインの問題に取り組んでいます。他の誰かがコードを作成したので、助けていただければ幸いです。

メインのウェブサイト(www.mainwebsite.comなど)には「AboutUs」ナビゲーションバーがあり、subdomain.mainwebsite.comなどのサブドメインでは「AboutUs」を非表示にします。

Silverstripeバックエンドからわかるように、「サブドメインに非表示」機能があり、チェックマークを付けました。ただし、「About Us」リンクはしばらくの間消え、メインサイトとサブドメインの両方で他のテーマに戻ります。

誰かが私を正しい方向に向けることができますか?どうすればこの問題を解決できますか?必要に応じて、ここに任意のコードをコピーできます。助けてください。

ヒープに感謝します、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は次のようになります-includesフォルダーは次のようになります

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

申し訳ありませんが、少し長いですが、助けていただければ幸いです。ありがとう。

みなさん、こんにちは。page.ssの<%cached'Navigation'、Aggregate(Page).Max(LastEdited)%> <%end_cached%>を削除すると、動作しているようです。この行の目的や意味を教えていただけますか?ありがとう。

4

2 に答える 2

2

これを行うだけです:

$_host = explode('.', $_SERVER['HTTP_HOST']); 
if(count($_host) == 3 && $_host[0] != "www") echo "Hide About Us";
于 2011-05-25T22:03:20.490 に答える
1

subodmainチェックのメソッド('ShowMenuInSubdomain')を既に見つけたので、ここでメニューがレンダリングされるテンプレートを探します。標準のシルバーストライプインストールの場合、これはおそらく/mysite/templates/Page.ss、またはのファイルの1つです/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)then ShowMenuInSubdomain is true」のようになっているため、問題の行はおそらく次のようになります。

if($subdomain != 'www' && !$this->HideInSubdomains) {

($ this-> HideInSubdomainsの前の「!」に注意してください)

編集

まず、関数を忘れて、サブドメインチェックの関数と組み合わせてGetSubDomainMenu組み込みのコントロールを使用するというはるかにクリーンなソリューションに置き換えられたように見えます。MenuShowMenuInSubdomain

第二に、行方不明の「!」に関する私のメモを忘れてください。上記の前$this->HideInSubdomainsに。関数の使用方法から、関数が想定どおりに機能していることがわかります。関数には誤解を招くような名前が付けられていShowMenuInSubdomainますHideMenuInSubdomain。紛らわしいですが、明らかに問題の原因ではありません。

したがって、これまでに投稿したコードから、目に見える間違いはないので、次のことを確認する必要があります。a)実際には「navigation.ss」(投稿したように.ccではない)です。レンダリングされたテンプレート?確認するためにファイル内にテスト出力を追加するだけです(そして、URLに「?flush = 1」を追加してテンプレートキャッシュをクリアします)b)ShowMenuInSubdomain関数は実際に呼び出されますか?最初の行に「return"working"」のような文字列を返すように$ShowMenuInSubdomainしてから、テンプレートに追加します

それでも問題が解決しない場合は、silverstripeプロジェクトフォルダーを圧縮してダウンロードできる場所に置くことができます(最初にdbアクセスクレデンシャルなどの重要な情報を削除してください)。幸運を!

編集II-解決策-最後に:)

欠陥のあるコード部分を見つけたように見えます。削除した行はナビゲーションをキャッシュすることになっているので、レンダリングするたびに組み立てる必要はありません(「キャッシュ」の概念に精通していると思います)。これに関する詳細な説明については、部分キャッシュに関するsilverstripeドキュメントを参照してください。そこにある「Aggregates」の下の最初のコードスニペットに注意してください。これは、削除したコードとまったく同じです。

しかし、なぜキャッシング部分を削除することで問題が解決するのでしょうか。実際、答えは非常に単純です。キャッシュされたナビゲーションは一部のページを編集した後にのみ更新されるため、サブドメインを使用しているかどうかに関係なく、サブドメインチェック関数は呼び出されません。それは時々とても簡単です:)

于 2011-05-26T08:04:55.263 に答える