2012-12-26 3 views
1

웹 상점을 만들고 있으며 언어 선택과 CMS를 구현 중입니다. 또한 CMS를 통해 페이지를 편집 할 수있는 방법을 사이트 관리자에게 제공해야합니다.언어 별 페이지에 CMS를 구현하는 방법에 대한 아이디어

거기에서 문제가되지 않습니다.

문제는 어떻게 이러한 페이지에 대한 테이블을 구축해야합니다. 나는 데이터베이스 디자인을 만들었지 만 웹 페이지는 부분적으로 생각하지 않았습니다.

페이지 (웹 페이지라고 함)의 모든 언어와 정보 또는 언어 또는 문화권 정보 (웹 페이지 _ 로컬)에 대한 정보는 다음 표 구조를 이미 갖습니다. Snippet of database design

어느 내가 CRUD 작업을 수행 할 추가하거나 그래서 동적으로 쉽게 할 수 있습니다 제거 할 수 속성?

url: "{language}/{controller}/{action}/{id}" 

내 주요 관심사가 나는 언어 특정 콘텐츠를 표시하는 방법을 잘 모르겠어요 것을 지금 :

나는 다음과 같은 URL 구조 면도기 구문MVC4을 사용하고 있습니다 예를 들어 방문자가 About (정보) 페이지에 대한 링크를 누르면

어쩌면 URL의 컨트롤러 부분을 사용하여 내 웹 페이지 테이블의 키로 저장하고 선택한 언어뿐만 아니라 필터를 적용 할 수 있습니까?

방문객이 http://example.com/nl/About으로 갈 때, AboutController에서 "nl"과 "about"을 검색하고, 물론 필터를 먼저 필터링 한 다음 데이터베이스에 대한 쿼리를 사용하여 올바른 nl 콘텐츠를 선택하십시오.

기술적으로 어떻게해야합니까?

답변

0

나는이 LANG 과정, 같은 검색 처리 OnActionExecuting을 사용합니다.

UPDATE - 페이지가 동적으로 다음 생성 될 경우 나는 당신의 점을 숙지 =)

당신은 늘 당신은 단지 하나의 ActionResult처럼 필요 ActionResult 페이지 당이 :

public ActionResult ShowPage(int id,string slug) 
{ 
    //Use the slug to check for url attacks and ensure 301 redirections to the correct url 
    var page = db.Webpages_local.First(p=> p.id == id 
      && p.culture.name == Thread.CurrentThread.CurrentCulture); 

    return View(page); 
} 

들어 SEO 이유는 다음과 같은 경로를 정의하는 것이 좋습니다 :

그게 당신에게 URL을 제공합니다 :

/nl/p/about/1 //the p is just an identifier for 'page', to differentiate this routes from others 
+0

좋아, 언어에 대한 좋은 생각이지만, 지금은 약 내 페이지에서 데이터베이스에서 콘텐츠를 검색하고 싶습니다. 언어가 있지만 올바른 페이지를 검색하려면 어떻게해야합니까? 어떤 종류의 식별자를 가져야 만 할 페이지를 알 수 있어야합니다. ID는 테이블의 ID이지만 숨겨진 필드 나 뭔가를 페이지에 연결해야합니다. 나는 컨트롤러 값을 사용하려고 생각하고있다. 데이터베이스에 저장하고 사용합니다. –

+0

올바른 페이지를 검색하는 방법에 대한 대답이 업데이트되었습니다 ... – JOBG

+0

흠, 그게 길이지만 꽤 사악합니다. –

0

여러 개의 테이블 대신 테이블에 language 또는 유사한 열을 추가합니다.

컨트롤러는 메뉴 테이블에서 원하는 언어 키를 찾은 다음 올바른 페이지를 가져온 다음 웹 페이지 테이블의 콘텐츠를 읽을 수 있습니다. 어디서든 코드를 그냥 올바른 언어를 표시 할 수 Thread.CurrentThread.CurrentCulture (이 될 것입니다 글로벌 랭 표시)을 읽는에서 다음

protected override void OnActionExecuting(ActionExecutingContext filterContext) 
     { 
      #region set Language 
      var lang = string.Empty; 
      if (filterContext.RouteData.Values["lang"] != null && !string.IsNullOrWhiteSpace(filterContext.RouteData.Values["lang"].ToString())) 
      { 

       // set the culture from the route data (url {lang}) 
       lang = filterContext.RouteData.Values["lang"].ToString(); 
       switch (lang) 
       { 
        case "es": 
         break; 
        case "en": 
         break; 
        default: 
         lang = "es";//default language 
         filterContext.RouteData.Values["lang"] = lang; 
         filterContext.HttpContext.Response.Redirect("/"); 
         break; 
       } 

      } 
      else 
      { 
       //set default language 
       lang = "es"; 
       filterContext.RouteData.Values["lang"] = lang; 
      } 

      Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(lang); 
      Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(lang); 

      #endregion 

      base.OnActionExecuting(filterContext); 
     } 

:

관련 문제