Using EPiServer's content selector widget in dojo component

Mattias Olsson 2015-04-29 03:48:07

The server-side part

As I needed a way to pass settings to my dojo component, for example AllowedTypes and Roots for the content selector, I let my component inherit from EPiServer.Shell.ViewComposition.ComponentDefinitionBase and overrode the CreateComponent method.

public override IComponent CreateComponent()
{
    IComponent component = base.CreateComponent();
    component.Settings.Add(new Setting("startpageContentLink", SiteDefinition.Current.StartPage, false));
    component.Settings.Add(new Setting("allowedTypes", new [] { typeof(PageData) }, false ));
    component.Settings.Add(new Setting("storeUrl", "/api/myapicontroller/", false));
    return component;
}


The client-side part


Dojo template

<div data-dojo-attach-point="stateNode, tooltipNode" class="dijit dijitReset dijitInline">
   <div class="dijit dijitReset">
       <div class="nho-content-picker dijit dijitReset dijitInline" data-dojo-attach-point="contentPickerContainer"></div>
        <div data-dojo-attach-point="btnSelectPage" data-dojo-type="dijit/form/Button" data-dojo-attach-event="onClick: _onSelectPageClick">Add page</div>
   </div>
</div>


Javascript

define(
    [
        "dojo/_base/declare",
        "dojo/_base/lang",
        "dojo/dom",
        "dojo/dom-construct",

        "dijit/_WidgetBase",
        "dijit/_TemplatedMixin",
        "dijit/_WidgetsInTemplateMixin",
        "epi/epi",
        "epi-cms/widget/_HasChildDialogMixin",
        "epi-cms/widget/ContentSelector",
        "dojo/text!./templates/MyComponent.html",
        "xstyle/css!./styles/MyComponent.css"
    ],
    function (
        declare,
        lang,
        xhr,
        dom,
        domConstruct,
        _WidgetBase,
        _TemplatedMixin,
        _WidgetsInTemplateMixin,
        epi,
        _HasChildDialogMixin,
        ContentSelector,
        template
     ) {
        return declare("alloy.components.MyComponent", [_WidgetBase, _TemplatedMixin, _WidgetsInTemplateMixin, _HasChildDialogMixin], {
            templateString: template,
            baseClass: "my-component",
            value: null,
            widgetsInTemplate: true,

            postCreate: function () {
                this.inherited(arguments);

                // Create an instance of the EPiServer ContentSelector. Pass in the settings defined in the server-side part.
                this.contentPicker = new ContentSelector({
                    roots: [this.startpageContentLink],
                    allowedTypes: this.allowedTypes,
                    showAllLanguages: false
                });
                
                // Put the content selector in our container defined in the template.
                this.contentPicker.placeAt(this.contentPickerContainer);
            },

            _onSelectPageClick: function () {
                // Do something with the value (ContentReference).
                console && console.log(this.contentPicker.value);

                // Empty the selector after you're done.
                this.contentPicker.reset();
            }
        });
    });

Kontakta oss

Christian Öman

Christian Öman

Sales Executive

Charlotte Tyldhed

Charlotte Tyldhed

CEO Geta Digital Sverige

Kontakta oss

Christian Öman

Christian Öman

Sales Executive

Charlotte Tyldhed

Charlotte Tyldhed

CEO Geta Digital Sverige