Beispiel #1
0
        ///<summary>
        ///	When working with the Presentation Layer for Sitecore, you can specify a Datasource as a property
        ///	for a control.  However, accessing the item that is set brings a bit of a challenge.  Hopefully this fixes that.
        ///</summary>
        ///<param name = "database">Sitecore Database to Use.  Usually From Context.</param>
        ///<param name = "device">Sitecore Device to Use.  Usually from Context.</param>
        ///<param name = "item">Item to get the Layout Renderings from.</param>
        ///<param name = "sublayoutItem">
        ///	Item reference to the Sublayout or Webcontrol that you would like to use for getting the datasource from.
        ///</param>
        ///<returns>Datasource Item.  If no Datasource Item is listed in the layout properties, returns Null.</returns>
        ///<exception cref = "ItemNotFoundException">Thrown when Sitecore can't find a specified datasource item entry.</exception>
        public static Item GetDatasourceFromControl(Database database, DeviceItem device, Item item, Item sublayoutItem)
        {
            Item datasourceItem = null;

            // Get the Layout definition from the current item
            string           rend   = item.Fields["__renderings"].Value;
            LayoutDefinition layout = LayoutDefinition.Parse(rend);
            // Get the current device definition
            DeviceDefinition deviceDef = layout.GetDevice(device.ID.ToString());
            // Get the sublayout to find
            Item mySublayout = database.GetItem(sublayoutItem.ID);
            // Get the definition for the sublayout
            RenderingDefinition rendering = deviceDef.GetRendering(mySublayout.ID.ToString());

            if (!String.IsNullOrEmpty(rendering.Datasource))
            {
                datasourceItem = database.GetItem(rendering.Datasource);
                if (datasourceItem == null)
                {
                    throw new ItemNotFoundException("Could not find datasource item at " + rendering.Datasource);
                }
            }

            return(datasourceItem);
        }
Beispiel #2
0
        /// <summary>
        ///     Checks to see if the passed in item has presentation settings for the provided device and sublayout.
        /// </summary>
        /// <param name = "theItem">The item.</param>
        /// <param name = "device">The device.</param>
        /// <param name = "sublayoutItem">The sublayout item.</param>
        /// <returns>True if the item contains the device and sublayout in it's presentation settings, false otherwise.</returns>
        public static bool ItemHasPresentationSettingsForSublayout(Item theItem, DeviceItem device,
                                                                   SublayoutItem sublayoutItem)
        {
            if (theItem == null || device == null || sublayoutItem == null)
            {
                return(false);
            }

            //If the item does not contain settings for the passed in device do not bother with the
            // rest of the check.
            if (!ItemHasPresentationSettingsForDevice(theItem, device))
            {
                return(false);
            }

            //Try and get the device definition from the layout definition
            DeviceDefinition deviceDef = GetDeviceDefinition(theItem, device);

            if (deviceDef == null)
            {
                return(false);
            }

            //Try and get the rendering for the passed in display item
            RenderingDefinition rendering = deviceDef.GetRendering(sublayoutItem.ID.ToString());

            return(!(rendering == null));
        }
Beispiel #3
0
        private bool UpdateRendering(Database db, Sitecore.Data.Items.Item homeItem, Sitecore.Data.Items.Item newHomeItem)
        {
            try
            {
                // get rendering, layout
                Sitecore.Layouts.RenderingReference[] renderings = newHomeItem.Visualization.GetRenderings(Sitecore.Context.Device, true);
                LayoutField      layoutField      = new LayoutField(newHomeItem.Fields[Sitecore.FieldIDs.LayoutField]);
                LayoutDefinition layoutDefinition = LayoutDefinition.Parse(layoutField.Value);
                DeviceDefinition deviceDefinition = layoutDefinition.GetDevice(Sitecore.Context.Device.ID.ToString());

                // update rendering's datasource
                foreach (RenderingReference rendering in renderings)
                {
                    string datasouceString = deviceDefinition.GetRendering(rendering.RenderingID.ToString()).Datasource;
                    if (!string.IsNullOrEmpty(datasouceString))
                    {
                        // get datasource item
                        var currentDatasouceItem = Sitecore.Data.ID.IsID(datasouceString) ? db.GetItem(new Sitecore.Data.ID(datasouceString)) : db.GetItem(datasouceString);
                        if (currentDatasouceItem != null)
                        {
                            // get new path
                            datasouceString = currentDatasouceItem.Paths.FullPath.Replace(homeItem.DisplayName, newHomeItem.DisplayName);
                            var newItem = db.GetItem(datasouceString);
                            if (newItem != null)
                            {
                                // set new datasource id
                                deviceDefinition.GetRendering(rendering.RenderingID.ToString()).Datasource = newItem.ID.ToString();
                                newHomeItem.Editing.BeginEdit();
                                layoutField.Value = layoutDefinition.ToXml();
                                newHomeItem.Editing.EndEdit();
                            }
                        }
                    }
                }
                return(true);
            }
            catch (Exception ex)
            {
                SetMesasgeInCookie(ex.Message, 1);
                return(false);
            }
        }
Beispiel #4
0
        public static void AddRenderings(Item parentItem)
        {
            if (parentItem == null)
            {
                return;
            }

            if (parentItem.Children.Count == 0)
            {
                return;
            }
            else
            {
                localDatasource = parentItem.Children.FirstOrDefault();
            }

            if (localDatasource.Children.Count == 0)
            {
                return;
            }

            ResetRenderings(parentItem);

            // Get the default device
            DeviceRecords devices       = parentItem.Database.Resources.Devices;
            DeviceItem    defaultDevice = devices.GetAll().Where(d => d.Name.ToLower() == "default").First();

            var renderingsList = parentItem.Visualization.GetRenderings(defaultDevice, true);

            if (renderingsList == null)
            {
                return;
            }

            LayoutField      layoutField      = new LayoutField(parentItem.Fields[FieldIDs.FinalLayoutField]);
            LayoutDefinition layoutDefinition = LayoutDefinition.Parse(layoutField.Value);
            DeviceDefinition deviceDefinition = layoutDefinition.GetDevice(defaultDevice.ID.ToString());

            foreach (Item child in localDatasource.Children)
            {
                if (child.TemplateID.ToString() == NewsChild.Text)
                {
                    Guid   newGuid           = Guid.NewGuid();
                    string renderingUniqueID = newGuid.ToString().TrimStart('{').TrimEnd('}').ToLower();

                    if (layoutDefinition.Devices.Count > 0)
                    {
                        if (!RenderingAvailable(layoutDefinition, Renderings.BodyContent_Rendering))
                        {
                            RenderingDefinition textSubLayout = new RenderingDefinition();

                            textSubLayout.ItemID      = Renderings.BodyContent_Rendering;
                            textSubLayout.Placeholder = "page-layout";
                            textSubLayout.UniqueId    = renderingUniqueID;
                            deviceDefinition.AddRendering(textSubLayout);
                        }
                        else
                        {
                            var rendering = deviceDefinition.GetRendering(Renderings.BodyContent_Rendering);
                            renderingUniqueID = rendering.UniqueId;
                            renderingUniqueID = renderingUniqueID.TrimStart('{').TrimEnd('}').ToLower();
                        }
                    }

                    RenderingDefinition newRenderingDefinition = new RenderingDefinition();
                    newRenderingDefinition.ItemID = Renderings.Text;
                    string placeholderValue = !string.IsNullOrEmpty(renderingUniqueID) ? "/page-layout/body-content_" + renderingUniqueID : "/page-layout/body-content";
                    newRenderingDefinition.Placeholder = placeholderValue;
                    newRenderingDefinition.Datasource  = child.ID.ToString();

                    deviceDefinition.AddRendering(newRenderingDefinition);
                }
                else if (child.TemplateID.ToString() == NewsChild.Quote)
                {
                    Guid   newGuid           = Guid.NewGuid();
                    string renderingUniqueID = newGuid.ToString().TrimStart('{').TrimEnd('}').ToLower();

                    if (layoutDefinition.Devices.Count > 0)
                    {
                        if (!RenderingAvailable(layoutDefinition, Renderings.BodyContent_Rendering))
                        {
                            RenderingDefinition quoteSubLayout = new RenderingDefinition();
                            quoteSubLayout.ItemID      = Renderings.BodyContent_Rendering;
                            quoteSubLayout.Placeholder = "page-layout";
                            quoteSubLayout.UniqueId    = renderingUniqueID;

                            deviceDefinition.AddRendering(quoteSubLayout);
                        }
                        else
                        {
                            var rendering = deviceDefinition.GetRendering(Renderings.BodyContent_Rendering);
                            renderingUniqueID = rendering.UniqueId;
                            renderingUniqueID = renderingUniqueID.TrimStart('{').TrimEnd('}').ToLower();
                        }
                    }

                    RenderingDefinition newRenderingDefinition = new RenderingDefinition();
                    newRenderingDefinition.ItemID = Renderings.Quote;

                    string placeholderValue = !string.IsNullOrEmpty(renderingUniqueID) ? "/page-layout/body-content_" + renderingUniqueID : "/page-layout/body-content";

                    newRenderingDefinition.Placeholder = placeholderValue;
                    newRenderingDefinition.Datasource  = child.ID.ToString();

                    deviceDefinition.AddRendering(newRenderingDefinition);
                }
            }

            using (new SecurityDisabler())
            {
                parentItem.Editing.BeginEdit();
                if (parentItem.Editing.IsEditing)
                {
                    parentItem["__Renderings"] = layoutDefinition.ToXml();
                }
                parentItem.Editing.EndEdit();
            }
        }