문제

실제로 사용자 Control이 페이지 머리글 섹션에서 HTML 유형을 아래에서 렌더링 할 수 있도록 Page 페이지에서 Google 마크 업을 구현하려고했습니다.

<link rel="alternate" hreflang="en-GB" href="http://www.mysite.com/english/index.aspx" />

<link rel="alternate" hreflang="de-DE" href="http://www.mysite.com/de/german/index.aspx" />

<link rel="alternate" hreflang="en-DE" href="http://www.mysite.com/de/english/index.aspx" />

<link rel="alternate" hreflang="ru-RU" href="http://www.mysite.com/ru/russian/index.aspx" />

<link rel="alternate" hreflang="en-RU" href="http://www.mysite.com/ru/english/index.aspx" />

<link rel="alternate" hreflang="fr-FR" href="http://www.mysite.com/fr/french/index.aspx" />

<link rel="alternate" hreflang="it-IT" href="http://www.mysite.com/it/italian/index.aspx" />

<link rel="alternate" hreflang="ja-JP" href="http://www.mysite.com/jp/japanese/index.aspx" />

<link rel="alternate" hreflang="ko-KR" href="http://www.mysite.com/kr/korean/index.aspx" />

<link rel="alternate" hreflang="pt-BR" href="http://www.mysite.com/br/portuguese/index.aspx" />

<link rel="alternate" hreflang="zh-Hans-CN" href="http://www.mysite.com/cn/chinese/index.aspx" />

<link rel="alternate" hreflang="en-US" href="http://www.mysite.com/us/english/index.aspx" />

<link rel="alternate" hreflang="en-GB" href="http://www.mysite.com/uk/english/index.aspx" />

<link rel="alternate" hreflang="en-AU" href="http://www.mysite.com/au/english/index.aspx" />

<link rel="alternate" hreflang="en-AE" href="http://www.mysite.com/ae/english/index.aspx" />
.

위의 HTML에서 Broker Link_Info 테이블에서 HTML "/ae/english/index.aspx, /au/english/index.aspx etc"의이 부분을 찾을 수 있습니다.이 구현은 라이브 브로커로 라이브 웹 사이트를 갔을 때까지 잘 작동했습니다. 데이터베이스 및 서버 성능에 대한이 기능을 사용하면 브로커 데이터베이스의 히트로 히트로 인해 사망했을 때 우리 웹 사이트는 하루 하루에 150 만 개의 히트 히트를 얻었으므로 아래와 같이 작성하는 것처럼 링크 _info 테이블을 잠그고 있습니다 :

  • 모든 웹 사이트 페이지가로드 될 때마다 프록시 및 프록시를 호출 할 때 우리의 WebService 및 WebService는 link_info 테이블에가는 SQL 프로 시저를 호출하고 SQL 프로 시저에 전달 된 PageID를 기반으로 결과 목록을 가져옵니다.
  • SQL 프로 시저 반환 된 XML 결과는 내 XSLT가 사용하고 전체 HTML 위의 렌더링 된 내 컨트롤로 전달됩니다.

    뭔가 잘못되는 것 같습니다. 브로커 데이터베이스를 만지지 않고이 기능을 달성하기 위해 다른 방법이있을 수 있습니다. 페이지 이벤트 쓰기 또는 배포자 사용자 정의가 도움이됩니까?

    제안하십시오 !!

    참고 : 우리는 Tridion 2009 를 사용하고 있습니다

    편집 : 브로커 SQL 프로 시저는 다음과 같습니다.

    ALTER PROCEDURE [dbo].[GETDataFromLinkInfo] 
    -- Add the parameters for the stored procedure here 
    (@PageID INT) 
    AS 
      BEGIN 
          -- SET NOCOUNT ON added to prevent extra result sets from 
          -- interfering with SELECT statements. 
          SET NOCOUNT ON; 
    
          -- Insert statements for procedure here 
          SELECT DISTINCT [PUBLICATION_ID] AS n, 
                          [URL]            AS u 
          FROM   [LINK_INFO] WITH(NOLOCK) 
          WHERE  Page_ID = @PageID 
                 AND Component_Template_Priority > 0 
                 AND PUBLICATION_ID NOT IN( 232, 481 ) 
          ORDER  BY URL 
          FOR XML RAW ('p'), ROOT ('ps'); 
    
          RETURN 
      END
    
    .

  • 도움이 되었습니까?

    해결책

    구현에 몇 가지 표준 코드가 있기를 바랍니다. 올바른 Tridion API 연결을 위해 검색 할 수 있습니다. 분명히 이전에 언급 된 바와 같이, Tridion 브로커를 직접 쿼리하는 것은 지원되지 않지만이 Tridon 핵심 링크 기능에 대한 의미가 없습니다.

    어쨌든, 다음과 같이 보이는 코드를 찾습니다.

    <tridion:ComponentLink runat="server" PageURI='tcm:12-1234-64'
                    TemplateURI="tcm:0-0-0" ComponentURI="tcm:12-1233"
                    LinkText="proper Tridion Linking in .NET" TextOnFail="true"/>
    
    .

    일부 Tridon 문서를 최대한 빨리 가져 오십시오. 그것은 Tridion과 함께 일할 때야합니다!

    행운을 빕니다!


    편집 : PageID (TCM 없음)와 함께 호출 된 메소드 ID가 호출 된 메소드 ID가있는 경우 헤드에 Google 마크 업 다국어 링크를 작성할 수 있어야하는 테스트되지 않은 코드 샘플 :

    using System;
    using Tridion.ContentManager;
    using Tridion.ContentManager.CommunicationManagement;
    using Tridion.ContentManager.ContentManagement;
    using Tridion.ContentManager.Templating;
    
    namespace Website.TridionTBBs.Utilities
    {
        /// <summary>
        /// Class exposing utility methods for frequent Tridion item methods.
        /// </summary>
        public static class TridionCustomUtilities
        {
            #region Constants
    
            public const string PageLinkGoogleMarkup = "<link rel=\"alternate\" hreflang=\"{0}\" href=\"{1}\" />\r\n";
    
            #endregion
    
            #region PageLinks
            /// <summary>
            /// This method will return the MultiLingual Google Markup link
            /// Relies on two important Webconfig entries where the publication and culture information is located
            /// <add key="publications" value="26,27,28,29,30,31,32,33,34" />
            /// <add key="tcm:0-26-1" value="en-GB" />
            /// <add key="tcm:0-27-1" value="de-DE" />
            /// etc...
            /// </summary>
            /// <param name="pageID">The PageId is provided from the page</param>
            static void GoogleMarkupPageLink(int pageID)
            {
    
                string[] publicationIDs = ConfigurationManager.AppSettings["publications"].Split(',');
    
                StringWriter s = new StringWriter();
    
                using (PageLink pageLink = new PageLink())
                {
                    for (int i = 0; i < publicationIDs.Count; i++)
                    {
                        Link link = pageLink.GetLink(String.Format("tcm:{0}-{1}", publicationIDs[i], pageID.ToString()));
    
                        if (link != null && link.IsResolved)
                        {
                            string linkUrl = link.Url;
    
                        }
                        string culture = ConfigurationManager.AppSettings[String.Format("tcm:0-{0}-1", publicationIDs[i])];
    
                        Response.Write(String.Format(PageLinkGoogleMarkup, culture, linkUrl));
                    }
                }
            }
            #endregion
        }
    }
    
    .

    이렇게하면 Web.config의 각 게시와 함께 속한 게시 및 문화 문자열을 저장해야합니다. 물론, 당신은 다른 곳에서도 저장할 수 있지만, 이것은 웹 서버에 가장 빠르고 가장 빠른 스트레스가있는 것처럼 보입니다. 물론 적절한 캐싱이 있어야합니다.

    사용자 정의 배포 스크립트 또는 기타 복잡한 비표준 TRIDION 메소드를 작성하지 않아도됩니다.

    다른 팁

    데이터베이스를 직접 쿼리하는 것은 지원되지 않으며 지원 계약을 무효화 할 수 있으며 분명히 트리 네이션 캐시의 사용을 원 할 수 있습니다 (성과 문제를 부분적으로 설명 할 수 있음).제안 : 달성하려는 작업에 대해 Tridion 연결 API를 사용하십시오.

    데이터베이스 성능 문제가 발생할 때마다 빠른 릴리프를 제공 할 수있는 두 가지 방법이 있습니다.

    1. 쿼리 에 사용되는 (정렬 및 필터링)에 사용되는 열에 추가 인덱스 추가
    2. 특정 시간 동안 값 비싼 쿼리의 결과를 캐시

      이 경우 실제 데이터베이스에 필요한 XML 인덱스가 누락 될 수있는 것처럼 들릴 수 있으므로 인덱스를 볼 수 있습니다. 데이터베이스 조작에 매우 유창하지 않은 경우 정적 변수에서 생성 한 HTML 조각을 유지하고 후속 요청을 위해 다시 사용하십시오. 5 분 동안이 작업을 수행하더라도 요인 별 데이터베이스의 히트를 줄이는 것입니다.


      Tridion 데이터베이스에 대한 SQL 사용에 대한 경고가 지금 충분히 집에 주도되었습니다. 장기적으로 Tridion 콘텐츠 배달 API를 통해 동일한 정보를 얻을 수있는 방법을 확실히 찾아야합니다. 나는 당신이 여기에서 할 수있는 것처럼 결과를 빨리 목록으로 얻을 수 있는지,

      비슷한 성능 문제로 끝날 수 있더라도 그 경로가되면 적어도 지원되는 Tridion 도메인으로 돌아올 수 있습니다. 즉,보다 많은 Tridion 커뮤니티 회원이 당신을 도울 수 있습니다.

      캐싱은 Tridion API를 사용하여 전환하면 성능 문제를 줄이는 옵션이 될 것입니다. 대안 당신은 실제로 언어 / URL 목록을 디스크에 별도의 파일로 유지하고 관련이있는 일이 배포 될 때마다 업데이트 할 수 있습니다. Tridion Deployer의 확장자는이 작업을 수행 할 논리적 인 위치입니다. "Tridion Deployer Extension"에 대한 Google 검색을 수행하면 좋은 결과가 나타납니다.

    라이센스 : CC-BY-SA ~와 함께 속성
    제휴하지 않습니다 StackOverflow
    scroll top