London Dev Meetup Rescheduled! Due to unavoidable reasons, the event has been moved to 21st May. Speakers remain the same—any changes will be communicated. Seats are limited—register here to secure your spot!

"Virtual" properties substituting e.g. MainBody on special pages

Vote:
 

A recurring problem with pages typically holding data more than being articles is that functionality of list pages & search result pages, showing the site's "standard" page properties.

Now, if I have pages that do not have these properties at all, what would be the simplest way to make the pages show a "custom" header / text without actually implementing the Header & the MainBody fields ?

What I need is a readonly "MainBody" property that concatinates & formats data from different page properties. How ?

Regards, Bjørge

#36319
Jan 25, 2010 15:41
Vote:
 

Not sure I understand completely.. you wish to check for the Header and MainBody property, if their not available display some other custom content?

#36333
Jan 25, 2010 20:52
Vote:
 

Yes, by design all pages have MainBody and Heading properties. So far so good. What I don't think is a good design "twist", would be letting the search page know the internals of all kinds of pages it may display.

Hence, I would like my "special" page to have some kind of "virtual property" MainBody to render in listings other than the pages specially designed for the custom contents.

With CMS6 I could possibly use a custom property type with settings - to allow for runtime rendering via a template-like property type, like:

Property Name: MainBody

Property type: VirtualProperty

Property Settings: DisplayMask={AUTHORS}<BR /><B>{PUBLISHER}</B>, <I>{YEAR}</I>

Show in Editor: false

...so that this field would output a mix of specified fields with some formatting inbetween.

I like this idea, but I'd rather wait 'til CMS6 upgrade is due...

#36401
Jan 27, 2010 13:44
Vote:
 

Well, it seems like the link is stored in table tblPageSoftlink - so it should be easy to retrieve. I guess ? ? ?

How do I retrieve a collection of pages having linked to a specific page ?

Regards, Bjørge

#36402
Edited, Jan 27, 2010 14:02
Vote:
 

EPiServer.DataAbstraction.SoftLink.LoadReferencing finds links in inline content pointing to a specific page. The links are extracted during indexing so there is a small delay (default 1 minute) until this data surfaces if you don't change the indexing delay in web.config.

#36406
Jan 27, 2010 16:15
Vote:
 

Thanks !

This sounds perfectly fine.

Is there a simple way to extract a set of pages being referenced, or do I have to do this the "hard way" ?

#36410
Jan 27, 2010 17:07
Vote:
 

SoftLink.Load loads the what pages are being referenced.

#36412
Jan 27, 2010 17:52
Vote:
 

Something went wrong with this thread, obviously, it was mixed with my other thread:

 

Property / content type for person-links

Well, the person-linking is now thoroughly explained. Jolly good.

Remaining is the "Virtual property" question, I'm really keen on hearing how others have solved this...

Anny suggestions ?

#36435
Jan 28, 2010 11:00
Vote:
 

Have you seen this?

http://blogs.interakting.co.uk/post/Property-Data-Injection-in-EPiServer.aspx

 

#36436
Jan 28, 2010 11:19
Vote:
 

Yes, this was interesting !

I went down another route, though, I created a custom property type that looks for [PropertyName] and substitutes the named property with the actual property value found on the page. Example:

First name: [FirstName]<br>Last name: [Lastname]

....would render as:

First name: Bjørge

last name: Sæther

...and so far, this kind of works. On my development server. However, I can't get it to work on our web server.

The custom property type installs nice, I can get to define a property of the type in a page type, but when it is to be displayed, it simply displays the contents apparently not calling my overridden CreateDefaultFields().

Any ideas, anyone ?

Source code:

public class stringUtils : Object
    {
        public static Boolean extractBetween(ref String s, String LeftD, String RightD, ref int index, out String Contents, Boolean doDelete, Boolean doDeleteDelimiters)
        {
            int indexR;
            int lenDelimL = LeftD.Length;
            int lenDelimR = RightD.Length;
            index = s.IndexOf(LeftD, index);
            indexR = s.IndexOf(RightD, index + 1);
            if ((index >= 0) && (indexR >= 0))
            {
                Contents = s.Substring(index + lenDelimL, indexR - (index + lenDelimL));
                if (doDeleteDelimiters)
                {
                    s = s.Remove(index, (indexR - index) + lenDelimR);
                }
                else if (doDelete)
                {
                    s = s.Remove(index + lenDelimL, Contents.Length);
                    index += 1;
                }
                return true;
            }
            Contents = "";
            return false;
        }
    }

    public class PropertyProxyFieldsControl : PropertyStringControl
    {
        private String _replaceFields()
        {
            String propName = "";
            String propValue = "";
            int index = 0;
            String s = this.PropertyData.ToString();
            try
            {
                while (stringUtils.extractBetween(ref s, "[", "]", ref index, out propName, true, true))
                {
                    propValue = this.PropertyData.Parent[propName].ToString();
                    s = s.Insert(index, propValue);
                }
            }
            catch
            {
                s = " (Error: property [" + propName + "] not found)";
                return s;
            }
            return s;
        }

        public override void CreateDefaultControls()
        {
            Panel target = new Panel();
            Literal child = new Literal();
            child.Text = this._replaceFields();
            target.Controls.Add(child);
            base.CopyWebAttributes(target);
            this.Controls.Add(target);
        }
        
    }

    [Serializable]
    [PageDefinitionTypePlugIn]
    public class PropertyProxyFields : EPiServer.Core.PropertyString
    {
        public override IPropertyControl CreatePropertyControl()
        {
            return new PropertyProxyFieldsControl();
        }

    }
#36824
Feb 11, 2010 15:15
This topic was created over six months ago and has been resolved. If you have a similar question, please create a new topic and refer to this one.
* 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.