우린 Datasource 생성 버튼을 클릭하여 메인 소스를 만들었지만, 추가적으로 필드 에디터 버턴을 생성하여 Content Editor를 Dialog Popup 형식으로 xEditor 띄워 필드정보를 수정할수있다.
데이타소스의 필드정보 업데이트는 "webedit:fieldeditor" 커맨드를 통하여 실행할 수 있지만, "webedit:componentoptions"처럼 Content Editor 팝업에서 "OK" 버튼을 클릭할시 자동저장 (autosave) 기능이 없다.
"webedit:fieldeditor" 커맨드는 Sitecore의 Content Manager 어플리케이션의 FieldEditorPage 클래스를 호출하며 우리는 간단한게 "FieldEditor.aspx" 페이지에 Javascript을 추가하여 Auto-Saving을 적용할것이다. 추후 "componentoptions" 커맨드처럼 기능이 추가될지 모르겠으나, 이 업데이트는 Sitecore 버전 9.1 (현재 가장 최근 버전) 및 하위 버전까지 모두 적용되어질수 있다.
자, 이제 렌더링 아이템의 데이터소스 필드를 xEditor에서 손 쉽게(?) 수정하는 방법과 업데이트 되어진 Field값을 자동저장하는 방법에 대하여 알아보도록 하겠다.
우선, 해당 경로의 FieldEditor 파일을 오픈하고, 아래의 자바스크립을 추가한다.
"\sitecore\shell\Applications\Content Manager\FieldEditor.aspx"
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 | <script type="text/javascript"> var p = parent.parent; var iframes; try { iframes = p.jQuery('#jqueryModalDialogsFrame').contents().find('.ui-dialog'); } catch (e) { } if (p && typeof iframes != 'undefined' && iframes.length == 1) { var footerRow = document.getElementById("FooterRow"); var inp = footerRow.getElementsByTagName("input"); var btn; for (i = 0; i < inp.length; i++) { if (inp[i].value == "OK") { if (p.autoSaveItems != false) { btn = inp[i]; btn.setAttribute("onclick", "javascript:return ClickAndSave()"); } break; } } } function ClickAndSave() { if (p.Sitecore.PageModes.PageEditor.isModified()) { p.Sitecore.PageModes.PageEditor.postRequest("webedit:save", function() { p.onbeforeunload = null; }, false); } scForm.invoke("contenteditor:saveandclose"); p.Sitecore.PageModes.PageEditor.postRequest("webedit:saved", function() { p.location.reload(); }, true); } </script> |
아래는 업데이트 되어진 VIEW (RichTextEditor.cshtml)이다.
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 | @model Sitecore.Custom.Component.Models.RichTextEditor @if (!Model.IsDatasourceSet && Sitecore.Context.PageMode.IsExperienceEditor) { <div style="padding:20px 0;" class="border border-success"> <h4>RichText Editor Added</h4> <button type="button" class="btn btn-success" onclick="SendAjaxPOST(); return false;">Create Rich Text Editor Datasource</button> <script> function SendAjaxPOST() { if (Sitecore.PageModes.PageEditor.isModified()) { alert("There are unsaved items on this page.\rPlease save the page, then create a new datasource."); return false; } var xhr = new XMLHttpRequest(); xhr.open("POST", "http://sc910.sc/customapi/createitem/@Model.PageItem.ID.Guid.ToString()"); xhr.setRequestHeader("Content-Type", "application/json"); xhr.send("{\"itemName\": \"@Model.NewItemName\", \"templateGuid\": \"@Model.RteTemplate.ID.Guid.ToString()\", \"isDatasourceItem\": \"1\", \"renderingUid\": \"@Model.Rendering.UniqueId.ToString()\"}"); xhr.onreadystatechange = function () { if (this.readyState == 4) { if (this.status === 200) { window.onbeforeunload = null; this.returnValue = true; setTimeout(function () { location.reload() }, 500); } else { console.log('Error Status: ' + this.status + '\nHeaders: ' + JSON.stringify(this.getAllResponseHeaders()) + '\nBody: ' + this.responseText); } } }; } </script> </div> } else if (Sitecore.Context.PageMode.IsExperienceEditor) { <div style="border-bottom: solid 1px grey;"> <button type="button" class="btn btn-warning" style="margin-bottom: 5px;" onClick="updateRTEStyle()">Update Style</button> </div> <div style='@Model.Rendering.Item.Fields["Custom CSS"].Value'>@Html.Sitecore().Field("Content")</div> <script> function updateRTEStyle() { Sitecore.PageModes.PageEditor.postRequest( "webedit:fieldeditor(" + "command={11111111-1111-1111-1111-111111111111}, " + "fields=Custom CSS, " + "id=@(Model.RenderingDatasource))" ); } </script> } else { <div style='@Model.Rendering.Item.Fields["Custom CSS"].Value'>@Html.Sitecore().Field("Content")</div> } |
아래는 최종적으로 업데이트 되어진 화면이며, ContentEditor 팝업박스의 OK 버턴을 누르면 자동으로 업데이트되고 xEditor가 Reload 되는것을 볼수가 있다.