#FYI #SPEAK #XSLT
SPEAK UI는 무엇인가?
Sitecore는 버전 6.6부터 SPEAK(Sitecore Process Enablement and Acceleration Kit) UI를 CMS 추가하기 시작하였다. 부분적으로, 기존에 사용하고있던 Sheer UI의 약점(?)을 보완하기 위하여 시작하였으며, 개발자에게 있어서 어플리케이션을 만드는데 더 유연하게 사용할수있도록 설계가 되어있다.
기존의 Sheer UI는 XSLT기기반으로 코드는 aspx/ascx/xml 등으로 만들어져있으며, 부분적으로 플래쉬 파일(.swf)을 렌더링하여 유저에게 인터페이스를 제공한다. 다시 말하면, Sheer UI를 업데이트하는데 있어서, 많은 리소스가 필요할뿐더러 개발자로써도 수정을 많은 어려움을 있을수있다. 하지만 SPEAK UI는 MVC기반으로 만들어졌으며, 인터페이스는 Javascript를 이용하여 유저의 Request를 실행한다. 추가적으로 /App_Config/Inlcue/ 폴더에서 "Sitecore.Speak.Applications.config" 파일을 수정하여 SPEAK UI를 Disable 할수가 있다.
2015년 10월 26일 월요일
2015년 10월 14일 수요일
미디어 아이템 렌더링
#FYI #HowTo #.NET
먼저, 렌더링 아이템의 미디어 정보를 가져오는 중, 아주 유용한 정보를 찾았다. 아래는 Muhammad Jameel 블로그에서 가져온것이다.
Create an object for the target item in the database- replace itempath with the relative path to the item in the Content Tree, such as “home/about/item1” or start the path with a backslash (/) to indicate an absolute path, such as “/sitecore/content/home/about/item1”– a null value will be set in either case if the item does not exist - Sitecore does compare case when evaluating item paths.
먼저, 렌더링 아이템의 미디어 정보를 가져오는 중, 아주 유용한 정보를 찾았다. 아래는 Muhammad Jameel 블로그에서 가져온것이다.
Create an object for the target item in the database- replace itempath with the relative path to the item in the Content Tree, such as “home/about/item1” or start the path with a backslash (/) to indicate an absolute path, such as “/sitecore/content/home/about/item1”– a null value will be set in either case if the item does not exist - Sitecore does compare case when evaluating item paths.
1 2 3 4 5 6 7 8 9 10 11 12 | Sitecore.Data.Database db = Sitecore.Context.Database; Sitecore.Data.Items.Item item = db.GetItem("itempath"); Sitecore.Data.Fields.ImageField image = item.Fields["imagefield"]; if (image!=null && image.MediaItem!=null) { Sitecore.Data.Items.MediaItem image = new Sitecore.Data.Items.MediaItem(imageField.MediaItem); string src = Sitecore.StringUtil.EnsurePrefix('/', Sitecore.Resources.Media.MediaManager.GetMediaUrl(image)); if (!string.IsNullOrEmpty(src)) { string imgTag = String.Format(@"<img src=""{0}"" alt=""{1}"" />", src, image.Alt); } } |
2015년 9월 29일 화요일
자바스크립트를 통하여 Item 업데이트 하기
#HowTo #Javascript #WebEdit
Sitecore에서는 자바스크립트를 통하여 Sitecore.Client 또는 Sitecore.Kernel에 포함되어진 Class의 Method를 실행할 수 가 있다.
Sitecore Website폴더에서 /Website/App_Config/ 폴더를 보면 Command.config 파일이 있는데, 해당 파일을 열어보면 각각 커맨드에 해당되는 Assembly와 네임스페이스를 포함하고 있다. 해당 컨맨드 목록을 여기를 참고한다. https://github.com/udt1106/Sitecore-Item-Buckets/blob/master/Sitecore.ItemBucket.Tests/App_Config/Commands.config
먼저 내가 자주 사용하고 Command는 save, new, delete 등등이 있는데, 기본적인 사용법은:
Sitecore에서는 자바스크립트를 통하여 Sitecore.Client 또는 Sitecore.Kernel에 포함되어진 Class의 Method를 실행할 수 가 있다.
Sitecore Website폴더에서 /Website/App_Config/ 폴더를 보면 Command.config 파일이 있는데, 해당 파일을 열어보면 각각 커맨드에 해당되는 Assembly와 네임스페이스를 포함하고 있다. 해당 컨맨드 목록을 여기를 참고한다. https://github.com/udt1106/Sitecore-Item-Buckets/blob/master/Sitecore.ItemBucket.Tests/App_Config/Commands.config
먼저 내가 자주 사용하고 Command는 save, new, delete 등등이 있는데, 기본적인 사용법은:
1 2 3 | <a href="#" onclick="javascript:Sitecore.PageModes.PageEditor.postRequest('webedit:save()')">Save current item</a> <a href="#" onclick="javascript:Sitecore.PageModes.PageEditor.postRequest('webedit:delete()')">Delete current item</a> <a href="#" onclick="javascript:Sitecore.PageModes.PageEditor.postRequest('webedit:fieldeditor(command={11111111-1111-1111-1111-111111111111},fields=Field Name 1|Field Name 2,id={item-id-to-edit-with-braces})')">Edit Fields</a> |
자바스크립트를 통하여 페이지 감지
#HowTo #DetectMode
Sitecore에서는 자바스크립트를 통하여 Code-behind에서 선언할수있는 클래스의 method들을 실행할수가 있다. 기본적으로 code-behind에서 현재 페이지가 Page Editor인지 아니면 Preview mode인지 확인하는 방법은,
이것과 같은 방법으로 자바스크립트를 통하여 현재 페이지를 Detect할 수 가있다.
Sitecore에서는 자바스크립트를 통하여 Code-behind에서 선언할수있는 클래스의 method들을 실행할수가 있다. 기본적으로 code-behind에서 현재 페이지가 Page Editor인지 아니면 Preview mode인지 확인하는 방법은,
1 2 3 4 5 | if (Sitecore.Context.PageMode.IsPageEditor) { // this is page page editor } else if (Sitecore.Context.PageMode.IsPreview) { // this is preview } |
이것과 같은 방법으로 자바스크립트를 통하여 현재 페이지를 Detect할 수 가있다.
1 2 3 4 5 6 7 | var isPageEditor = function(){ return !!(Sitecore && Sitecore.PageModes && Sitecore.PageModes.PageEditor); }; if(isPageEditor()) { // this is PageEditor } |
2015년 9월 2일 수요일
Sitecore PowerShell Script
#HowTo #PowerShell
이번에는 Sitecore PowerShell Script에 관한여 소개해보겠다.
페이지 템플릿 또는 아이템의 필드 템플릿 값을 변경해야할경우, 간혹 많이 아이템을 하나하나씩 들어가 업데이트 해야하는 경우가 있다. 이럴경우 많은 시간이 소비될 뿐아니라 페이지를 만들고 업데이트하는 과정에서 Best Practice라고 할수가 없다.
이럴경우, 두가지 옵션이 있는데, 첫번째는 템플릿의 Standard Value를 리셋하는 것이고, 두번째는 Sitecore PowerShell의 스크립트를 통하여 변경하고 싶은 아이템의 값을 모두 업데이트하는것이다. 첫번째의 경우 가장 간편하고 안전한 업데이트라고 할수있으나, 만약 템들릿이 많은 필드 타입을 가지고 있고, __Standard Value를 통하여 만들어진 아이템이 아니라면 곤란하다.
이럴경우 두번째 옵션을 선택하는데, 아래는 선택되어진 Context 아이템에 Workflow 필드를 없데이트 하는것이다.
아래는 이런문제때문에 StackworkFlow에 질문하여 답변한 링크이다.
http://stackoverflow.com/questions/29263398/sitecore-workflow-is-not-working/29286256#29286256
이번에는 Sitecore PowerShell Script에 관한여 소개해보겠다.
페이지 템플릿 또는 아이템의 필드 템플릿 값을 변경해야할경우, 간혹 많이 아이템을 하나하나씩 들어가 업데이트 해야하는 경우가 있다. 이럴경우 많은 시간이 소비될 뿐아니라 페이지를 만들고 업데이트하는 과정에서 Best Practice라고 할수가 없다.
이럴경우, 두가지 옵션이 있는데, 첫번째는 템플릿의 Standard Value를 리셋하는 것이고, 두번째는 Sitecore PowerShell의 스크립트를 통하여 변경하고 싶은 아이템의 값을 모두 업데이트하는것이다. 첫번째의 경우 가장 간편하고 안전한 업데이트라고 할수있으나, 만약 템들릿이 많은 필드 타입을 가지고 있고, __Standard Value를 통하여 만들어진 아이템이 아니라면 곤란하다.
이럴경우 두번째 옵션을 선택하는데, 아래는 선택되어진 Context 아이템에 Workflow 필드를 없데이트 하는것이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | ###################################################################### ## 1. 먼저 default workflow state 세팅한다 ## ## 2. 스크립트를 실행하기전 반드시 아이템의 아이디가 정확한지 확인하다 ## ###################################################################### function SetWorkflow($item) { ## Update only items assigned __Default workflow if ($item."__Default workflow" -eq "{A5BC37E7-ED96-4C1E-8590-A26E64DB55EA}") { $item.__Workflow = "{A5BC37E7-ED96-4C1E-8590-A26E64DB55EA}"; $item."__Workflow state" = "{190B1C84-F1BE-47ED-AA41-F42193D9C8FC}"; } } ## Update correct workflow information. get-item . -Language * | foreach-object { SetWorkFlow($_) } get-childitem . -recurse -Language * | foreach-object { SetWorkFlow($_) } ## Show Updated Result get-item . -Language * | Format-Table Id, Name, Language, __Workflow, "__Workflow state", "__Default workflow" get-childitem . -recurse -Language * | Format-Table Id, Name, Language, __Workflow, "__Workflow state", "__Default workflow" |
아래는 이런문제때문에 StackworkFlow에 질문하여 답변한 링크이다.
http://stackoverflow.com/questions/29263398/sitecore-workflow-is-not-working/29286256#29286256
2015년 7월 30일 목요일
MVC Field Update in Page Editor (xEditor)
#HowTo #MVC #Ajax
Sitecore CMS에는 Page Editor (xEditor) 그리고 Content Editor가 있다. CMS 사용자는 Page Editor에서 해당 페이지의 컨텐츠를 수정하며, 필요한 Rendering또는 Sublayout을 추가하는데, 사용자의 편의에 따라 Page Editor에서 해당 페이지의 템플릿 필드항목을 수정할때가 있다.
Sitecore CMS에는 Page Editor (xEditor) 그리고 Content Editor가 있다. CMS 사용자는 Page Editor에서 해당 페이지의 컨텐츠를 수정하며, 필요한 Rendering또는 Sublayout을 추가하는데, 사용자의 편의에 따라 Page Editor에서 해당 페이지의 템플릿 필드항목을 수정할때가 있다.
Sitecore는 XSLT extensions은 RenderField Pipeline를 기반으로 적용되지만, MVC에서는 "Sitecore.Web.UI.WebControls.FieldRenderer" 에서 "Render" 메써드를 지원하여, 이 메써드를 통하여, 템플릿을 Data Type을 내부적으로 캐치한다.
그러므로, MVC에서는 굳이 XSLT에서의 <sc:text ../>, <sc:image .../> 등등 Element를 선언할 필요가 없다.
아래의 코드는 Page Editor에 해당 Rendering Component의 체크박스 필드를 Droplist (Enabled/Disable options)로 구현하였으며, DropList에서 Enable이 선택되면 컴포넌트 아이템의 해당 체크박스 필드가 자동으로 체크가 되며, 반대로 Disable경우 해당 필드의 체크가 없어진다.
Model
public class ComponentModel : IRenderingModel { public string Title { get; set; } public Item Item { get; set; } public Item PageItem { get; set; } public Sitecore.Data.Fields.CheckboxField chBox { get; set; } ... some other declared data types based on templates if you want ... public void Initialize(Sitecore.Mvc.Presentation.Rendering rendering) { Rendering = rendering; Item = rendering.Item; PageItem = Sitecore.Mvc.Presentation.PageContext.Current.Item; Title = FieldRenderer.Render(Item, "Title"); ... more if you want ... } }
Controller
public class Components : Controller { // // POST: /Components/ public ActionResult ComponentView(string changedValue, string fieldName) { ComponentModel ss = new ComponentModel(); ss.Initialize(RenderingContext.Current.Rendering); Item item = ss.Item; if (!String.IsNullOrEmpty(changedValue) && !String.IsNullOrEmpty(fieldName)) { ss.Item.Editing.BeginEdit(); using (new SecurityDisabler()) { switch (fieldName) { ... conditions ... } } ss.Item.Editing.EndEdit(); } return PartialView(ss); } }
View
@model yournamespace.ComponentModel @using Sitecore.Mvc @if (Sitecore.Context.PageMode.IsPageEditor) { if (!@Sitecore.Data.ID.IsID(Model.Rendering.DataSource)) { <div>No Associated Datasource.<br />Please Create New Datasource</div><br /> } else { <div class="newdata"> <h3>This is page editor</h3> Title: @Html.Raw(Model.Title) <br /> DropList: <select name="list" id="fieldName" onclick="javascript:dlOnChangeUpdate('fieldName');"> <option value="True" @Html.Raw((Model.chBox.Checked) ? "selected" : "")>Enable</option> <option value="False" @Html.Raw((!Model.chBox.Checked) ? "selected" : "")>Disable</option> </select><br /> <script type="text/javascript"> function dlOnChangeUpdate(fieldName) { $("#" + fieldName).on('change', function () { var changedValue = $("#" + fieldName).val(); $.ajax({ url: '@Url.Action("ComponentModel","Components")', type: "POST", data: { "changedValue": changedValue, "fieldName": fieldName }, context: this, success: function (data) { Sitecore.PageModes.PageEditor.postRequest('webedit:save()'); console.log("success", data); }, error: function (data) { alert('error: ' + data); console.log("error", data); } }); }); } </script> </div> } } else { <div id="info"> <h3>This is preview</h3> </div> }
2015년 7월 28일 화요일
템플릿 필드 업데이트 ItemEditing
#HowTo #Template
사이트코어를 사용하다 보면은 프로그램상으로 해당 페이지 또는 Sublayout/Rendering component의 템플릿 필드 값을 업데이트 해야하는 경우가 있다.
아래의 코드는:
아래의 코드는 윗 코드와 달리, 선택적으로 통계정보를 업데이트할수있으며, 또한 파라미터를 전달하는데 있어서 보안체크 또한 가능하다.
사이트코어를 사용하다 보면은 프로그램상으로 해당 페이지 또는 Sublayout/Rendering component의 템플릿 필드 값을 업데이트 해야하는 경우가 있다.
Sitecore.Data.Items.ItemEditing
아래의 코드는:
- 아이템 저장
- 업데이트 아이템 정보 (수정날짜, 에디터 및 통계정보)
- 아이템 저장과 관련된 이벤트를 실행한다
Sitecore.Data.Database master = Sitecore.Configuration.Factory.GetDatabase("master"); Sitecore.Data.Items.Item path = master.GetItem("/sitecore/content/the/path/you/want/to/get"); //Begin Editing Sitecore Item path.Editing.BeginEdit(); try { path["fieldName"] = "This is updated value"; // This will commit the field value path.Editing.EndEdit(); } catch (Exception) { //Revert the Changes path.Editing.CancelEdit(); }
Sitecore.Data.Items.EditContext
아래의 코드는 윗 코드와 달리, 선택적으로 통계정보를 업데이트할수있으며, 또한 파라미터를 전달하는데 있어서 보안체크 또한 가능하다.
Sitecore.Data.Database master = Sitecore.Configuration.Factory.GetDatabase("master"); Sitecore.Data.Items.Item path = master.GetItem("/sitecore/content/the/path/you/want/to/get"); //Enable or disable statistics information bool updateStatistics = false; //Temporary enable or disable events bool silent = true; //Begin Editing Sitecore Item path.Editing.BeginEdit(); using (new EditContext(path, updateStatistics, silent)) { path["fieldName"] = "This is updated value"; } path.Editing.EndEdit();
Sitecore.Data.Database master = Sitecore.Configuration.Factory.GetDatabase("master"); Sitecore.Data.Items.Item path = master.GetItem("/sitecore/content/the/path/you/want/to/get"); // Disable security check path.Editing.BeginEdit(); using (new EditContext(path, SecurityCheck.Disable)) { path["fieldName"] = "This is updated value"; } path.Editing.EndEdit();
피드 구독하기:
글 (Atom)