Take the community feedback survey now.
Take the community feedback survey now.
Hi!
It's a too early stage to access current page in the ViewConfiguration constructor I would guess. And also, ViewType is expected to be a dojo widget. Maybe this will work instead?
[ServiceConfiguration(typeof(ViewConfiguration))]
public class CustomView : ViewConfiguration<CustomPageType>
{
public CustomView()
{
.....
ControllerType = "alloy/contentediting/MyCustomViewController";
}
}
And then your view controller script will look like this:
define([
// dojo
'dojo/_base/array',
'dojo/_base/declare',
'dojo/_base/lang',
'dojo/when',
// dijit
'dijit/_TemplatedMixin',
'dijit/_Widget',
'dijit/_WidgetsInTemplateMixin',
// epi
'epi-cms/core/ContentReference',
'epi-cms/_ContentContextMixin'
],
function (
// dojo
array,
declare,
lang,
when,
// dijit
_TemplatedMixin,
_Widget,
_WidgetsInTemplateMixin,
// epi
ContentReference,
_ContentContextMixin
) {
return declare([_Widget, _TemplatedMixin, _WidgetsInTemplateMixin, _ContentContextMixin], {
templateString:
'<div style="width: 100%; height: 100%;"> \
<div data-dojo-attach-point="mainLayoutContainer" data-dojo-type="epi/shell/layout/PreserveRatioBorderContainer" data-dojo-props="gutters: false, livesplitters: false" style="width: 100%; height: 100%"> \
<div data-dojo-attach-point="toolbar" data-dojo-type="epi-cms/contentediting/EditToolbar" data-dojo-props="region:\'top\'"></div> \
<div data-dojo-attach-point="notificationBar" data-dojo-type="epi-cms/contentediting/NotificationBar" data-dojo-props="region:\'top\', layoutPriority: 99"></div> \
<div data-dojo-attach-point="editLayoutContainer" data-dojo-type="epi/shell/layout/CardContainer" data-dojo-props="region: \'center\', layoutPriority: 100"> \
<div data-dojo-attach-point="iframe" data-dojo-type="epi/shell/widget/Iframe" data-dojo-props="fitContainer: true"> \
</div> \
</div> \
</div> \
</div>',
startup: function () {
if (this._started) {
return;
}
this.inherited(arguments);
when(this.getCurrentContext(), lang.hitch(this, function (context) {
var contentLink = new ContentReference(context.id);
this.iframe.load('/GetRemoteData/' + contentLink.id, null, false, false);
this.contextChanged(context);
}));
}
});
});
For this example, you will need the script to be placed in ~/ClientResources/Scripts/contentediting/MyCustomViewController.js
You also need a dojo path mapping in ~/module.config:
<module loadFromBin="false">
<dojo>
<paths>
<add name="alloy" path="Scripts" />
</paths>
</dojo>
<dojoModules>
<add name="alloy" path="Scripts" />
</dojoModules>
</module>
Hi again!
After some research I have a much better solution for you:
[ServiceConfiguration(typeof(ViewConfiguration))]
public class MyViewConfiguration : ViewConfiguration<CustomPageType>
{
public MyViewConfiguration()
{
this.ControllerType = "alloy/widget/GetRemoteDataIFrameController";
this.ViewType = VirtualPathUtility.ToAbsolute("~/GetRemoteData");
}
}
And this is the custom IFrameController script code (should be placed in ~/ClientResources/Scripts/widget/GetRemoteDataIFrameController.js):
define([
// dojo
'dojo/_base/declare',
'dojo/_base/array',
// epi
'epi-cms/widget/IFrameController'
],
function (
declare,
array,
// epi
IFrameController
) {
return declare([IFrameController], {
updateView: function (data, context) {
// summary:
// Sets up the view by loading the URL of the inner iframe.
if (data && data.skipUpdateView) {
return;
}
this.toolbar.update({
currentContext: context,
viewConfigurations: {
availableViews: data.availableViews,
viewName: data.viewName
}
});
var matchingItems = array.filter(data.availableViews, function (item) {
return item.key === data.viewName;
});
if (matchingItems.length === 0) {
return;
}
this.load(matchingItems[0].viewType + '/' + context.id, null, true);
}
});
});
See my previous post for Dojo path mapping sample.
Thank you for the response.
Your suggestion worked fine apart from a slight issue:
When I use the MyCustomViewController I loose the "breadcrumb" and "toolbar" from the top of the EPi-interface.
I can see that you have defined divs for them in the template markup, but I have no idea how to fill that with default epi content. Any suggestions?
Thanks for the help.
Yes, I actually posted a better solution right before your post, but you have probably already noticed that. :)
Thanks again, I'll try that method and see if it helps with my UI issues!
Hi again!
After somse research I have a much better solution for you:
Actually, if you can settle with query strings in your GetRemoteData controller, you can just use epi-cms/widget/IFrameController and read the pageidentifier from the query string parameter "id". Your view configuration would then be:
[ServiceConfiguration(typeof(ViewConfiguration))]
public class MyViewConfiguration : ViewConfiguration<CustomPageType>
{
public MyViewConfiguration()
{
this.ControllerType = "epi-cms/widget/IFrameController";
this.ViewType = VirtualPathUtility.ToAbsolute("~/GetRemoteData");
}
}
That worked perfectly :)
Thanks for taking the time to help, much appreciated.
I'm wondering if there is a way to access the current page in a ViewConfiguration. My Custom view looks like this:
[ServiceConfiguration(typeof(ViewConfiguration))]");
public class CustomView : ViewConfiguration
{
public CustomView()
{
.....
ViewType = VirtualPathUtility.ToAbsolute("~/GetRemoteData/
}
}
And I need to put some sort of reference to the current page in.
Any suggestions?