November Happy Hour will be moved to Thursday December 5th.

How to refresh IFrameComponent after page is published

Vote:
 

I have an iframecomponent whose values depend on the values of URLSegment/PageName, so when a page is published, I have to refresh the values inside the component.

This is the definition of the component:

[IFrameComponent(Url = "modules/xx/yy.aspx",
        ReloadOnContextChange = true,
        PlugInAreas = "/episerver/cms/assets",
        Categories = "cms",
        MinHeight = 400,
        MaxHeight = 650,
        SortOrder = 201,
        Title = "xx",
        Description = "xx",
        IsAvailableForUserSelection = true
        )]
public partial class YY: ContentBaseWebForm 

    

Earlier (until 7.5 version, this code worked):

            var editPanel = HttpContext.Current.Handler as EditPanel;
            if (editPanel != null)
            {
                editPanel.SavedChanges += new EventHandler(editPanel_SavedChanges);
            }

Now, EditPanel doesn't seem to exist and I am not sure how to do this differently.

#79172
Dec 10, 2013 15:16
Vote:
 

Any ideas?

#79588
Dec 20, 2013 13:43
Vote:
 

Please try this:

var contentEvents = ServiceLocator.Current.GetInstance<IContentEvents>();
contentEvents.PublishedContent += contentEvents_PublishedContent;

       

Hope that help!

Ha Bui

#79645
Edited, Dec 26, 2013 10:54
Vote:
 

Hi, habu,

I don't think this helps me, I don't have a problem with C# code, I am not sure how to execute the code after a page is published. I wanted to avoid using javascript polling.

I imagined there should be some way to subscribe to some dojo event that is raised after a page is published.

#79978
Jan 13, 2014 10:13
Vote:
 

Hi Marija!

We don't have a really nice way to do this at the moment. Since our widgets bind to the data on the client and this is updated we really don't have this need ourselves. I found that we do publish an event when publishing to handle potentially changes in sort order and it should be possible to listen to this event using the pub/sub system. I consider this somewhat a hack/temporary solution that can be used until we have a more proper way to do this:

//(topic = "dojo/topic")

topic.subscribe("/epi/cms/contentdata/childrenchanged", function (contentReference) {

});

#79985
Edited, Jan 13, 2014 11:24
Vote:
 

Hey, Linus, thx a bunch for the answer, it seems like I am on the right track.

There is just one tiny glitch - this even is called when page is saved, not when it's published. My stuff get executed after a page is published, so I guess I need another event. I can't find it, however. Is there one?

#80009
Jan 13, 2014 15:42
Vote:
 

Hi Marija,

As Linus said, that's a temporary way! Because Publish command will publish this event when content is published. So you can listen and get content right back by version agnostic id and check its status!

I found another way (at the server side):

1. After content published the context will be changed!

2. After context changed IFrameContextComponent.js will be reload (because you set ReloadOnContextChange = true)

3. It will query back to server with url like: http://yoursite/<url to your modules>/<your control>?uri=epi.cms.contentdata:///6&id=6

I don't think we can not handle by this way!

Hope that help!

// Ha Bui

#80014
Edited, Jan 13, 2014 16:28
Vote:
 

Hi, habu,

Thx for the answer, however, this still doesn't work.

I already have ReloadOnContextChange = true, however, IFrameContextComponent.js does not refresh my plugin. 

#80018
Edited, Jan 13, 2014 16:53
Vote:
 

Ah, I know why, when IFrameComponent.js call to IFrame.js > load method, the method will be resolved immediately because the url is not dfference with current and we don't force reload! :(

The final way you can try is customize wiget type inherited from IFrameComponent.js and override method below:

_constructQuery: function (context)

    

You can override like this:

_constructQuery: function (context) {
            return {
                uri: context.uri,
                id: context.id || "",
                clientTicks: new Date().getMilliseconds()
            };
        }

    

Just a trivival way! I'll try find out a better way!

// Ha Bui

#80023
Edited, Jan 13, 2014 17:35
Vote:
 

I do not having a direct solution (other than listening to the event mentioned previosly) but have noted this for future improvements.

#80247
Jan 17, 2014 13:55
* You are NOT allowed to include any hyperlinks in the post because your account hasn't associated to your company. User profile should be updated.