레이블이 Sitecore 9인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Sitecore 9인 게시물을 표시합니다. 모든 게시물 표시

2018년 9월 14일 금요일

사이트코어 9 - Solr SSL 설치하기

사이트코어 개발자들은 환경에 따라 Sitecore를 자신의 컴퓨터에 설치해야하는 경우가 있다. 로컬 사이트코어 Instance를 설치함으로써 나만의 Playground가 형성되고, VM이나 서버환경에 접속하여 디버그 하는것보다 부담감(?)을 덜어낼수가 있다.
이번에는 그 중에서도 Solr 설치 및 xConnect와 호환하기 위하여 어떻게 SSL을 적용시키는지 알아보도록하자.

사이트코어 9+ 버전부터는 사이트코어 Instance내의 Lucence보다는 Solr 자체 서비엔진을 설치하고 xConnect 프레임워크를 통하여 데이터를 다른 어플리케이션 및 디바이스와 연동 할수가 있다.
Solr 설치 및 SSL 바운드가 제되로 되지않는다면 xConnect와 연동이 되지 않을뿐더러, Sitecore 플랫폼의 키 요소인 Experience Analytics 및 마케팅 기능들을 사용할수가 없다.

  1. Solr을 설치하기전 Java JDK (현재 필자의 경우 버전 1.8.0)를 설치하고, Command Prompt를 통하여 자바가 잘 작동되는지 그리고 "keytool" 커맨드가 이용가능한지 확인한다.
  2. Solr 다운로드 링크로 이동하여 6.2.2 버전을 원하는 경우에 설치한다. (예, C:\solr-6.2.2)
  3. Command Prompt에서 압축을 푼 경로의 "C:\solr-6.2.2\server\etc\"로 이동하여 아래의 커맨드를 실행한다.

    keytool -genkeypair -alias solr-ssl -keyalg RSA -keysize 2048 -keypass secret -storepass secret -validity 9999 -keystore solr-ssl.keystore.jks -ext SAN=DNS:localhost,IP:127.0.0.1 -dname "CN=localhost, OU=Organizational Unit, O=Organization, L=Location, ST=State, C=Country"
    

  4. 다시 아래의 커맨드를 입력하고 비밀번호를 설정한다. (비밀번호 예, secret)

    keytool -importkeystore -srckeystore solr-ssl.keystore.jks -destkeystore solr-ssl.keystore.p12 -srcstoretype jks -deststoretype pkcs12
    

  5. SSL 설치는 준비가 되었으며, 이젠 JKS keystore로 만들어진 PKCS12 (.p12) 파일을 더블 클릭하여, 로컬 컴퓨터에 Self Certification을 생성한다.
  6. Store Location을 Local Machine로 적용하고 "다음" 버턴을 누른다.

  7. "server\etc\" 폴더에 있는 .p12 파일의 경로를 확인하고, "다음" 버턴을 누른다.

  8. 이전에 설정하였던 비밀번호 "secret"을 입력하고, "다음" 버턴을 누른다.

  9. Certification 저장 경로는 "Trusted Root Certification Authorities"로 설정하고, 모든 세팅을 마친다.

  10. Solr 설치 경로의 "bin/" 폴더의 "solr.in.cmd" (Window 경우)를 오픈하여, 컨맨트 되어진 설정 (REM)들은 삭제하고 아래처럼 SSL설정을 Enable 한다.

    REM Uncomment to set SSL-related system properties
    REM Be sure to update the paths to the correct keystore for your environment
    set SOLR_SSL_KEY_STORE=etc/solr-ssl.keystore.jks
    set SOLR_SSL_KEY_STORE_PASSWORD=secret
    set SOLR_SSL_KEY_STORE_TYPE=JKS
    set SOLR_SSL_TRUST_STORE=etc/solr-ssl.keystore.jks
    set SOLR_SSL_TRUST_STORE_PASSWORD=secret
    set SOLR_SSL_TRUST_STORE_TYPE=JKS
    set SOLR_SSL_NEED_CLIENT_AUTH=false
    set SOLR_SSL_WANT_CLIENT_AUTH=false
    
  11. 머신에 Solr 서비스가 설치가 되어있지 않으므로, Command Prompt에서 Solr의 "bin/" 폴더로 이동하여 "solr start" 커맨드를 통하여 Solr를 실행한다.
  12. 브라우저에서 디폴트 포트 번호인 "8983"과 함께 "https://localhost:8983" 페이지를 오픈한여 Solr를 확인한다.





2018년 3월 26일 월요일

사이트코어 Federated Authentication 설정 및 사용하기

이번에는 사이트코어 9에서 소개된 Federated Authentication (FA)에 대하여 알아보도록 하자.

사이트코어는 .NET 프레임워크를 베이스로 사용하여 플랫폼을 윈도우 환경에 설치한다. 많은 유저 및 컴퍼니들은 CMS 사용자 로그인 프로세스를 Active Directory (AD)와 연동하여 사용하고 있으며, 대표적인 모듈로는 사이트코어에서 제공하는 Activie Direcotry 모듈이 있다.
이는 AD 도메인을 사이트코어 플랫폼과 연동시킨다. 기존 AD에 세팅되는 모든 유저의 Role 및 Permission을 똑같이 사이트코어에 적용하여 추가적인 어카운트 세팅없이 AD에 account가 존재하다면, 똑같이 유저정보로 사이트코어 CMS에 로그인할수있다.

사이트코어 9에서는 다양한 Authentication Provider를 제공한다. 가장 대포적인 예가 ADFS를 통하여 사이트코어를 로그인 하는 방법이다. 이는 기본적으로 AD On-Perm을 Azure Activie Directory Connect synchronization을 통하여 AzureAD와 연동을 하고, AzureAD에 Sync된 정보를 Microsoft의 Owin 미들웨어를 통하여 Token 기반의 OpenID Connect를 사용한다.

지금부터 Federated Authentication을 세팅 및 설정하는 방법에 대하여 알아보도록 하자.
  1. 사이트코어에서 FA를 사용하기 위해서는 "/wwwroot/App_Config/Include/Examples"폴더에 "Sitecore.Owin.Authentication.Enabler.config" 파일을 Include 폴더에 복사하고, "FederatedAuthentication.Enabled"을 "true"로 설정을 한다.
  2. 새로운 class를 만들어 IdentityProvider를 설정한다.

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    using Microsoft.Owin.Security.OpenIdConnect;
    using Owin;
    using Sitecore.Configuration;
    using Sitecore.Diagnostics;
    using Sitecore.Owin.Authentication.Configuration;
    using Sitecore.Owin.Authentication.Pipelines.IdentityProviders;
    using Sitecore.Owin.Authentication.Services;
    using System.Globalization;
    using System.Security.Claims;
    using System.Threading.Tasks;
    using Microsoft.Owin.Security;
    
    namespace MyProject.Sitecore.Owin.AzureAD.Pipelines
    {
        public class CustomAzureADIdentityProvider : IdentityProvidersProcessor
        {
    
            public CustomAzureADIdentityProvider(FederatedAuthenticationConfiguration federatedAuthenticationConfiguration) : base(federatedAuthenticationConfiguration)
            {
            }
    
            protected override string IdentityProviderName => "AzureAd";
    
            protected override void ProcessCore(IdentityProvidersArgs args)
            {
                Assert.ArgumentNotNull(args, nameof(args));
    
                var identityProvider = this.GetIdentityProvider();
                var authenticationType = this.GetAuthenticationType();
    
                string aadInstance = Settings.GetSetting("AADInstance");
                string tenant = Settings.GetSetting("Tenant");
                string clientId = Settings.GetSetting("ClientId");
                string postLogoutRedirectURI = Settings.GetSetting("PostLogoutRedirectURI");
                string redirectURI = Settings.GetSetting("RedirectURI");
    
                string authority = string.Format(CultureInfo.InvariantCulture, aadInstance, tenant);
    
                args.App.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
                {
                    Caption = identityProvider.Caption,
                    AuthenticationType = authenticationType,
                    AuthenticationMode = AuthenticationMode.Passive,
                    ClientId = clientId,
                    Authority = authority,
                    PostLogoutRedirectUri = postLogoutRedirectURI,
                    RedirectUri = redirectURI,
                    
                    Notifications = new OpenIdConnectAuthenticationNotifications
                    {
                        SecurityTokenValidated = (context) =>
                        {
                            ClaimsIdentity identity = context.AuthenticationTicket.Identity;
                            foreach (Transformation current in identityProvider.Transformations)
                            {
                                current.Transform(identity, new TransformationContext(FederatedAuthenticationConfiguration, identityProvider));
                            }
                            return Task.FromResult(0);
                        }
                    }
                });
            }
        }
    }


  3. 새로운 만들어진 Provider를 MyProject.Owin.AzureADconfig 파일을 만들고, /Include 폴더에 적용시킨다.

      1
      2
      3
      4
      5
      6
      7
      8
      9
     10
     11
     12
     13
     14
     15
     16
     17
     18
     19
     20
     21
     22
     23
     24
     25
     26
     27
     28
     29
     30
     31
     32
     33
     34
     35
     36
     37
     38
     39
     40
     41
     42
     43
     44
     45
     46
     47
     48
     49
     50
     51
     52
     53
     54
     55
     56
     57
     58
     59
     60
     61
     62
     63
     64
     65
     66
     67
     68
     69
     70
     71
     72
     73
     74
     75
     76
     77
     78
     79
     80
     81
     82
     83
     84
     85
     86
     87
     88
     89
     90
     91
     92
     93
     94
     95
     96
     97
     98
     99
    100
    <?xml version="1.0" encoding="UTF-8"?>
    <configuration xmlns:patch="http://www.sitecore.net/xmlconfig/" xmlns:role="http://www.sitecore.net/xmlconfig/role/">
        <sitecore role:require="Standalone or ContentDelivery or ContentManagement">
            <settings>
                <setting name="ClientId" value="{{Azure Web service의 클라이언트 아이디를 입력한다}}" />
                <setting name="AADInstance" value="https://login.microsoftonline.com/{0}" />
                <setting name="Tenant" value="{{Azure의 Tenant 정보를 입력한다.}}" />
                <setting name="PostLogoutRedirectURI" value="https://mysite/sitecore/login" />
                <setting name="RedirectURI" value="https://mysite/sitecore" />
            </settings>
            <pipelines>
                <owin.identityProviders help="Processors should derive from Sitecore.Owin.Authentication.Pipelines.IdentityProviders.IdentityProvidersProcessor">
                    <processor type="MyProject.Sitecore.Owin.AzureAD.Pipelines.CustomAzureADIdentityProvider, MyProject.Sitecore.Owin.AzureAD" resolve="true" />            </owin.identityProviders>
            </pipelines>
            <federatedAuthentication type="Sitecore.Owin.Authentication.Configuration.FederatedAuthenticationConfiguration, Sitecore.Owin.Authentication">
                <identityProvidersPerSites hint="list:AddIdentityProvidersPerSites">
                    <mapEntry name="0" type="Sitecore.Owin.Authentication.Collections.IdentityProvidersPerSitesMapEntry, Sitecore.Owin.Authentication">
                        <sites hint="list">
                            <site>shell</site>
                            <site>login</site>
                            <site>admin</site>
                            <site>service</site>
                            <site>modules_shell</site>
                            <site>modules_website</site>
                            <site>website</site>
                            <site>scheduler</site>
                            <site>system</site>
                            <site>publisher</site>
                        </sites>
                        <identityProviders hint="list:AddIdentityProvider">
                            <identityProvider ref="federatedAuthentication/identityProviders/identityProvider[@id='AzureAd']" />
                        </identityProviders>
                        <externalUserBuilder type="Sitecore.Owin.Authentication.Services.DefaultExternalUserBuilder, Sitecore.Owin.Authentication">
                            <param desc="isPersistentUser">true</param>
                        </externalUserBuilder>
                    </mapEntry>
                </identityProvidersPerSites>
                <identityProviders hint="list:AddIdentityProvider">
                    <identityProvider id="AzureAd" type="Sitecore.Owin.Authentication.Configuration.DefaultIdentityProvider, Sitecore.Owin.Authentication">
                        <param desc="name">$(id)</param>
                        <param desc="domainManager" type="Sitecore.Abstractions.BaseDomainManager" resolve="true" />
                        <caption>Sitecore Login by Microsoft ADFS</caption>
                        <icon>/sitecore/shell/themes/standard/Images/24x24/msazure.png</icon>
                        <domain>sitecore</domain>
                        <transformations hint="list:AddTransformation">
                            <transformation name="set idp claim" ref="federatedAuthentication/sharedTransformations/setIdpClaim" />
                            <!-- 해당 그룹의 모든 유저에게 "sitecore\developer" role의 권한을 준다. -->
                            <transformation name="Sitecore Client Users Role" type="Sitecore.Owin.Authentication.Services.DefaultTransformation, Sitecore.Owin.Authentication">
                                <sources hint="raw:AddSource">
                                    <claim name="groups" value="f5428848-ca62-4bcd-a3d1-189977c26c2e" />
                                </sources>
                                <targets hint="raw:AddTarget">
                                    <claim name="http://schemas.microsoft.com/ws/2008/06/identity/claims/role" value="sitecore\Sitecore Minimal Page Editor" />
                                </targets>
                                <keepSource>true</keepSource>
                            </transformation>
                        </transformations>
                    </identityProvider>
                </identityProviders>
                <sharedTransformations hint="list:AddSharedClaimsTransformation">
                    <setIdpClaim name="setIdpClaim" type="Sitecore.Owin.Authentication.Services.SetIdpClaimTransform, Sitecore.Owin.Authentication" />
                </sharedTransformations>
                <propertyInitializer type="Sitecore.Owin.Authentication.Services.PropertyInitializer, Sitecore.Owin.Authentication">
                    <maps hint="list">
                        <!-- Mapping을 통하여 해당 그룹에 있는 모든 유저에게 Administrator 권한을 준다. -->
                        <map name="Sitecore Admin to Administartor" type="Sitecore.Owin.Authentication.Services.DefaultClaimToPropertyMapper, Sitecore.Owin.Authentication">
                            <data hint="raw:AddData">
                                <source name="idp" value="AzureAd" />
                                <source name="groups" value="3e677ddd-89a7-4fab-9f33-b25c5c35f7e6" />
                                <target name="IsAdministrator" value="true" />
                            </data>
                        </map>
                        <!-- Mapping을 통하여 유저 Profile의 Email 필드에 유저 이메일 정보를 업데이트 한다. -->
                        <map name="Emailaddress to email" type="Sitecore.Owin.Authentication.Services.DefaultClaimToPropertyMapper, Sitecore.Owin.Authentication">
                            <data hint="raw:AddData">
                                <!-- <source name="idp" value="AzureAd" /> -->
                                <source name="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn" />
                                <target name="Email" />
                            </data>
                        </map>
                        <!-- Mapping을 통하여 유저 Profile의 FullName 필드에 유저 이름을 업데이트 한다. -->
                        <map name="Name claim" type="Sitecore.Owin.Authentication.Services.DefaultClaimToPropertyMapper, Sitecore.Owin.Authentication">
                            <data hint="raw:AddData">
                                <source name="name" />
                                <target name="FullName" />
                            </data>
                        </map>
                        <!-- Mapping을 통하여 유저 Profile의 Comment 필드에 추가적인 정보를 업데이트 한다. -->
                        <map name="Description claim" type="Sitecore.Owin.Authentication.Services.DefaultClaimToPropertyMapper, Sitecore.Owin.Authentication">
                            <data hint="raw:AddData">
                                <source name="http://schemas.microsoft.com/ws/2008/06/identity/claims/role" />
                                <target name="Comment" />
                            </data>
                        </map>
                    </maps>
                </propertyInitializer>
            </federatedAuthentication>
        </sitecore>
    </configuration>
    

  4. Azure Active Directory -> App registrations 에서 Sitecore CMS의 Sign-on URL을 등록한다.
  5. 등록되어진 사이트코어 App에서 Settings -> Reply URL에서 "https://{yoursitecoresite}/sitecore" 로 등록한다.
  6. Settings -> Required permissions에서 Window Azure Active Directory API의 Delecated Permission을 설정한다.
    1. 체크 "Access the directory as the signed-in user"
    2. 체크 "Sign in and read user profile"
    3. Save
  7. Manifest를 업데이트한다.
    1. "groupMembershipClaims": "SecurityGroup"
    2. "oauth2AllowImplicatFlow": true
  8. Sitecore 9+ 버전을 사용하고 있다면, Web.config 파일에서 "owin:AutomaticAppStartup" 세팅을 True로 설정한다.
  9. AzureAD에 등록된 이메일로 사이트코어 CMS에 로그인한다.









2017년 11월 20일 월요일

Sitecore 9.0 Dynamic Placeholder 사용법

사이트코어는 9.0을 릴리즈하면서, DynamicPlaceholder라는 새로운 SitecoreHelper를 소개하였다.

기존의 @Html.Sitecore().Placeholder("key")와는 달리, @Html.Sitecore().DynamicPlaceholder("Key", optional parameters)는 새로운 Placehoder를 좀 더 효율적으로 생성 및 관리할수 있으며, Placeholder Key이름에 렌더링 아이템 아이디와 인덱스를 추가하여 똑같은 Placeholder key를 중보긍로 사용할수 있도록 하였다.

예: placeholderName-RenderingID-Count
content-{4C770DD9-F840-45AB-A22F-8CCAAC42F646}-0

먼저, 아래는 DynamicPlaceholder Method에서 사용가능 한 Parameter의 목록을 나열하였고, 각각 어떻게 사용되어지는지 알아보도록 하자.


DynamicPlaceholder(string placeholderName, int count = 1, int maxCount = 0, int seed = 0)
DynamicPlaceholder(string placeholderName, TagBuilder chrome, int count = 1, int maxCount = 0, int seed = 0)
DynamicPlaceholder(string placeholderName, Func<DynamicPlaceholderRenderContext, TagBuilder> chromeResolver, int count = 1, int maxCount = 0, int seed = 0)
DynamicPlaceholder(string placeholderName, Func<HtmlString, HtmlString> outputModifier, int count = 1, int maxCount = 0, int seed = 0)
DynamicPlaceholder(DynamicPlaceholderDefinition definition)


  1. DynamicPlaceholder(string placeholderName, int count = 1, int maxCount = 0, int seed = 0)

    기본 Placeholder Method처럼 @Html.Sitecore().DynamicPlaceholder("placeholder name") 처럼 사용할 수 있지만, 추가적으로 기본 선택적인 Parameter인 count, maxCount, 그리고 seed를 사용함으로써 해달 Placeholder를 제한적으로 사용할 수가 있다.

    @Html.Sitecore().DynamicPlaceholder("content", count:2)
    

    - count: 사용하고 싶은 Placeholder 수를 정함.
    - maxCount: 맥시멈 Placeholder 수를 정함. 예를들어, count가 "5"이고 maxCount를 "3"으로 정했다면, 페이지에서는 maxCount인 3개의 Placeholder만 나타남.
    - seed: Placeholder의 카운티은 "0"에서 시작되며, 특정하게 시작하는 수는 정하고 싶다면 seed를 사용하면 됨


  2. DynamicPlaceholder(string placeholderName, TagBuilder chrome, int count = 1, int maxCount = 0, int seed = 0)

    첫번째, 메소드의 형식과 달리 이번 메소드는 TagBuilder 오브젝트를 패스하여 새로운 HTML 마크업을 생성할수가 있다.

    @{
        TagBuilder newTag = new TagBuilder("div");
    
        newTag.GenerateId("unique-id-here");
        newTag.AddCssClass("custom-class-name-here anotheer-class-here");
        newTag.InnerHtml = "This DIV is built by TagBuilder";
    }
    
    @Html.Sitecore().DynamicPlaceholder("content", newTag, count: 2, seed: 5)
    
    // 또는,
    
    @Html.Sitecore().DynamicPlaceholder("content", 
                                        output =>
                                        {
                                            newTag = new TagBuilder("Div");
                                            newTag.GenerateId("unique-id-here");
                                            newTag.AddCssClass("custom-class-name-here another-class-here");
                                            return newTag;
                                        }, 
                                        count: 2,
                                        seed: 5)
    

    위의 예제처럼, 새로운 태크 생성을 위한 Argument를 메소드에 전달하였으며 seed를 "5"로 세팅함으로써 Placeholder 카운터가 "5"부터 시작한다.

    HTML Preview Output 
    <div class="custom-class-name-here another-class-here" id="unique-id-here"></div>
    <div class="custom-class-name-here another-class-here" id="unique-id-here"></div>
    

  3. DynamicPlaceholder(string placeholderName, Func<DynamicPlaceholderRenderContext, TagBuilder> chromeResolver, int count = 1, int maxCount = 0, int seed = 0)

    두번째 예제에서의 문제점은 똑같은 HTML 마크업을 생성할수는 있으나, 마크업의 Attribute (클래스 이름 또는 아이디 이름)등을 Unique하게 생성할수가 없다. 똑같은 클래스 이름이나 아이디를 사용하면 Javascript 이벤트를 불러오는데어서 Conflict 문제가 생길수가 있다. 사이트코어 Presentation 네임스페이스의 DynamicPlaceholderRenderContext 클래스를 사용하여, Placeholder의 속성값을 가져올수가 있다.

    // @View
    <div class="row">
        @functions
        {
            TagBuilder CreateColumn(DynamicPlaceholderRenderContext context)
            {
                var col = new TagBuilder("div");
                col.GenerateId("column-id-" + context.Index);
                col.AddCssClass("col-lg-" + 12/context.PlaceholdersCount));
                return col;
            }
        }
        @Html.Sitecore().DynamicPlaceholder("content", CreateColumn, count: 3, seed: 20, maxCount: 4)
    </div>
    

    위의 예제는 context.PlaceholderCount을 Argument에 세팅한 Count의 값 "3"의 불러와 새로 생성되는 "<div>" 마크업의 클래스이름 "col-lg-{count}"으로 정하도록 하였다. 또한, Unique한 ID를 생성하여 context.Index값을 차려로 나열하도록 만들었다.



    HTML Preview Output
    <div class="row">
        <div class="col-lg-4" id="column-id-0"></div>
        <div class="col-lg-4" id="column-id-1"></div>
        <div class="col-lg-4" id="column-id-2"></div>
    </div>
    

  4. DynamicPlaceholder(string placeholderName, Func<HtmlString, HtmlString> outputModifier, int count = 1, int maxCount = 0, int seed = 0)

    이번에도 3번째 예제와 비슷하게 Placeholder 속성값을 전달하여 새로운 HTML 마크업 또는 값을 생성하여, 원하고자하는 Placeholder의 마크업을 생성할수있다.

    @Html.Sitecore().DynamicPlaceholder("content", 
                                        (input, context) => new HtmlString(String.Format("<div class=\"custom-class-{1}\">{0}</div>", 
                                                            input, 
                                                            context.DynamicKey)
                                        ), 
                                        count: 50,
                                        maxCount: 3, 
                                        seed: 50)
    

    이번 예제에서는 해당 Placeholder의 DynamicKey의 값을 사용하였고, 값은 PlaceholderName-UniqueRenderingID-Count 값으로 HTML 마크업에 나타난다.

    <div class="custom-class-content-{4C770DD9-F840-45AB-A22F-8CCAAC42F646}-50"></div>
    <div class="custom-class-content-{4C770DD9-F840-45AB-A22F-8CCAAC42F646}-51"></div>
    <div class="custom-class-content-{4C770DD9-F840-45AB-A22F-8CCAAC42F646}-52"></div>
    

  5. DynamicPlaceholder(DynamicPlaceholderDefinition definition)

    마지막으로 DynamicPlaceholderDefinition 오브젝트는 지금까지 설명한 모든 옵션을 통합한 클래스이다. 새로운 오브젝트에 Placeholder 이름을 정하고, 필요한 인덱스값을 정해주며, Placeholder의 속성값을 HTML 마크업의 Unique한 값으로 정할수가 있다.

    @Html.Sitecore().DynamicPlaceholder(new DynamicPlaceholderDefinition("content")
    {
        Count = 5,
        MaxCount = 10,
        Seed = 100,
        OutputModifier = (input, context) => new HtmlString(String.Format("<div class=\"definition-{1}\">{0}</div>", input, context.Index))
    })
    


    <div class="definition-0">content-{4C770DD9-F840-45AB-A22F-8CCAAC42F646}-100</div>
    <div class="definition-1">content-{4C770DD9-F840-45AB-A22F-8CCAAC42F646}-101</div>
    <div class="definition-2">content-{4C770DD9-F840-45AB-A22F-8CCAAC42F646}-102</div>
    <div class="definition-3">content-{4C770DD9-F840-45AB-A22F-8CCAAC42F646}-103</div>
    <div class="definition-4">content-{4C770DD9-F840-45AB-A22F-8CCAAC42F646}-104</div>
    


2017년 11월 7일 화요일

Sitecore 9 Forms의 새로운 기능

이전 포스트에 소개한것처럼, 사이트코어 9 에서는 Forms 라는 모듈이 소개되었다.

기존에 사용하던 WFFM (Web Forms For Marketers)를 대체하는 모듈로써, WFFM보다 더 진보(?) 되어진 모듈이라고 할수있으며, Forms는 Web Form이 아닌 MVC 기반으로 만들어져 새로운 UI/UX를 통하여 Non-Technical 유저에게도 사용하기 편하도록 만들어졌다.

기본적으로 HTML Element를 쉽게 추가하고 목록을 변경할수 있도록 Drag & Drop 기능이 소개되었으며, 아래는 Forms 모듈의 기능을 나열하였다.


  • 웹사이트 Visitor들의 폼 페이지를 렌더링 수
  • 필드 검증절차를 통하여, 오류 빈도 및 소요한 시간 분석
  • 멀티 페이지 (예, 페이지1 -> 다음 -> 페이지2 -> 다음 -> 페이지 3 -> 등록) 등록 가능
  • Submit 버턴을 통하여 마케팅 캠페인과 호환
  • Javascript 및 CSS 등 추가 리소스 등록가능
  • CSS Class 필드를 통하여, 새로운 스타일 생성가능
  • Forms 템플릿을 생성하여 많은 페이지를 쉽게 생성할수있음
  • Ajax를 이용하여 페이지 로딩없이 페이지를 이동할수있음
  • 필요에 따라 추가적인 필드 검증과 액션버튼 이벤트 생성 가능

사이트코어 - Sitecore 9 Forms Tab

사이트코어 - Sitecore 9 Forms



* 사이트코어는 9.0까지 WFFM를 지원하지만, 버전 9.1부터는 WFFM Support를 중단할 예정이다.