protected void btnGetPersonalization_ServerClick(object sender, EventArgs e)
        {
            var data = new List <PersonalizationData>();

            Sitecore.Data.Database master = Sitecore.Data.Database.GetDatabase("master");
            var        startItem          = master.GetItem("/sitecore/content");
            DeviceItem device             = master.Resources.Devices["Default"];

            foreach (var item in startItem.Axes.GetDescendants())
            {
                PersonalizationData details = new PersonalizationData();
                Sitecore.Data.Fields.LayoutField           layoutField = item.Fields["__renderings"];
                List <Sitecore.Layouts.RenderingReference> renderings  = layoutField.GetReferences(device) != null?layoutField.GetReferences(device).ToList() : null;

                if (renderings != null)
                {
                    Sitecore.Data.Fields.LayoutField           finalLayoutField = item.Fields["__final renderings"];
                    List <Sitecore.Layouts.RenderingReference> finalRenderings  = finalLayoutField.GetReferences(device) != null?finalLayoutField.GetReferences(device).ToList() : null;

                    if (finalRenderings != null)
                    {
                        renderings.AddRange(finalRenderings);
                        var renderingsWithPersonalization = renderings.Where(r => r.Settings.Rules.Count > 0).ToList();
                        details.ItemName        = item.Name;
                        details.RederingDetails = new List <RenderingDetails>();
                        if (details.ItemName != null && renderingsWithPersonalization != null && renderingsWithPersonalization.Count > 0)
                        {
                            foreach (var rendering in renderingsWithPersonalization)
                            {
                                RenderingDetails renderingDetail = new RenderingDetails();
                                renderingDetail.RenderingID   = master.GetItem(rendering.RenderingID).Paths.FullPath.ToString();
                                renderingDetail.RenderingName = master.GetItem(rendering.RenderingID).Name;
                                details.RederingDetails.Add(renderingDetail);
                            }
                        }
                    }
                    data.Add(details);
                }
                data = data.Where(x => x.RederingDetails.Count() > 0).ToList();
            }
            personalizedData.Text = "";
            if (data.Count > 0)
            {
                foreach (var finalData in data)
                {
                    personalizedData.Text += "Item Name : <strong>" + finalData.ItemName + "</strong></br>";
                    personalizedData.Text += "Renderings with Personalizations defined : </br>";
                    foreach (var renderingData in finalData.RederingDetails)
                    {
                        personalizedData.Text += "Rendering - Path -" + renderingData.RenderingID + "</br>";
                    }
                    personalizedData.Text += "</br>";
                }
            }
            else
            {
                personalizedData.Text += "No renderings with Personalization found";
            }
        }
예제 #2
0
        /// <summary>
        /// Given a rendering get the list of RenderingReferences that contain personalisation Rules.
        /// General a single reference is returned.
        /// </summary>
        /// <param name="currentRendering"></param>
        /// <returns></returns>
        private List <RenderingReference> GetPersonalizedRenderings(Rendering currentRendering)
        {
            var item = Sitecore.Mvc.Presentation.RenderingContext.CurrentOrNull.PageContext.Item;

            Sitecore.Data.Fields.LayoutField layoutField = item.Fields["__final renderings"];
            RenderingReference[]             renderings  = layoutField.GetReferences(Context.Device);

            var renderingsWithPersonalization = renderings.Where(r => r.Settings.Rules.Count > 0).ToList();

            renderingsWithPersonalization = renderingsWithPersonalization.Where(r => currentRendering.Placeholder == r.Settings.Placeholder && currentRendering.DataSource == r.Settings.DataSource).ToList();

            return(renderingsWithPersonalization);
        }
예제 #3
0
        private string RenderPlaceholder(ElementItem item)
        {
            //Get Renderings
            Sitecore.Data.Fields.LayoutField      layoutField = Context.Item.Fields["__renderings"];
            Sitecore.Layouts.RenderingReference[] renderings  = layoutField.GetReferences(Context.Device);

            var output = new StringBuilder();

            foreach (var renderingReference in renderings)
            {
                if (renderingReference.Placeholder == item.PlaceholderKey)
                {
                    var path = renderingReference.RenderingItem.InnerItem.Fields["Path"].Value;
                    output.AppendLine(RenderControl(path));
                }
            }
            return(output.ToString());
        }
예제 #4
0
        protected void ProcessLayoutDefinition(List <RecommendedRenderingModel> result, Item item)
        {
            using (new SecurityStateSwitcher(SecurityState.Disabled))
            {
#if (SC72 || SC75)
                Sitecore.Data.Fields.LayoutField layoutField = item.Fields["__Renderings"];
#else
                Sitecore.Data.Fields.LayoutField layoutField = item.Fields["__Final Renderings"];
#endif

                if (layoutField == null)
                {
                    return;
                }

                // Get all devices
                DeviceRecords devices = item.Database.Resources.Devices;
                foreach (var deviceRecord in devices.GetAll())
                {
                    // Get the rendering references for the default device
                    Sitecore.Layouts.RenderingReference[] renderings = layoutField.GetReferences(deviceRecord);
                    if (renderings == null)
                    {
                        continue;
                    }

                    foreach (var renderingReference in renderings)
                    {
                        result.Add(new RecommendedRenderingModel
                        {
                            Placeholder = renderingReference.Placeholder,
                            RenderingID = renderingReference.RenderingID.ToShortID().ToString()
                        });
                    }
                }
            }
        }
        // note: the dialog option is only because we're being lazy about what we pass along
        public DynamicResponse GetRenderings([FromUri] DynamicGetRequest request)          //[FromUri]DynamicGetRequest request
        {
            var ret = new DynamicResponse(request.ItemId.Replace("{", "").Replace("}", "").ToLower(), request.Database);


            var language = LanguageManager.GetLanguage(request.Language);

            var db   = Database.GetDatabase(request.Database);
            var item = db.GetItem(request.ItemId, language);

            ret.AddLayoutType("shared", "Shared");
            ret.AddLayoutType("final", "Final");


            foreach (var responseLayoutType in ret.LayoutTypes)
            {
                ID layoutFieldId = null;
                switch (responseLayoutType.Name)
                {
                case "final":
                    layoutFieldId = Sitecore.FieldIDs.FinalLayoutField;
                    break;

                case "shared":
                    layoutFieldId = Sitecore.FieldIDs.LayoutField;
                    break;

                default:
                    layoutFieldId = Sitecore.FieldIDs.LayoutField;                             // shouldn't be needed, but just in case
                    break;
                }

                // yes, there are two things holding the layout type - but that is because this one on the next line is for Response only
                //var responseLayoutType = ret.AddLayoutType(layoutTypeName);

                Sitecore.Data.Fields.LayoutField layoutField = item.Fields[layoutFieldId];
                var layoutDefinition = Sitecore.Layouts.LayoutDefinition.Parse(item[layoutFieldId]);

                int i = 0;
                foreach (var device in Devices)
                {
                    i++;
                    // this holds a flat dictionary of all renderings so we can place our parent/child relationships correctly
                    var allRenderings         = new Dictionary <string, ResponseRendering>();
                    var allRenderingsReversed = new Dictionary <string, List <ResponseRendering> >();



                    var responseDevice = responseLayoutType.AddDevice(item, layoutDefinition, device, layoutField.GetLayoutID(device));


                    //Sitecore.Layouts.DeviceDefinition device =	 layout.Devices[i] as Sitecore.Layouts.DeviceDefinition;

                    // TODO: issue: we don't do this for the layout also!


                    Sitecore.Layouts.RenderingReference[] renderings = layoutField.GetReferences(device);

                    // if (renderings == null) return; // this item doesn't have any renderings under the Default device.

                    //string layoutXml = layoutField.Value;

                    //responseDevice.Xml = layoutField.Value;
                    if (renderings != null)
                    {
                        // add akk if them as responseRenderings first, in case my parent is after my child!
                        foreach (var rendering in renderings)
                        {
                            var responseRendering = new ResponseRendering(rendering, layoutDefinition, item);             // responseDevice.AddRendering(rendering); // TODO: no response needed!
                            allRenderings.Add(responseRendering.UniqueId, responseRendering);                             // always add it to the flat list!
                        }

                        foreach (var responseRendering in allRenderings.Values)
                        {
                            // add to the proper rendering. Two cases here, depending on which comes first.

                            // TODO: this line only works on Dyanmic - can we check to see if it's dynamic first?
                            // - or rather we need to "try again" to find the used rendering
                            if (!string.IsNullOrEmpty(responseRendering.ParentUniqueId) && allRenderings.ContainsKey(responseRendering.ParentUniqueId))
                            {
                                allRenderings[responseRendering.ParentUniqueId].AddRendering(item, layoutDefinition, responseRendering);
                            }
                            else if (string.IsNullOrEmpty(responseRendering.ParentUniqueId))
                            {
                                var possiblePlaceholders = allRenderings.SelectMany(r => r.Value.Placeholders.ToList().Where(p => p.Name == responseRendering.PlaceholderName)).ToList();
                                if (possiblePlaceholders.Count > 0)
                                {
                                    // this means we have the placeholder, but it's missing the ParentUniqueId
                                    var effectivePlaceholder = possiblePlaceholders.Last();                                     // this is where Sitecore will put it anyway, the last match.
                                    if (effectivePlaceholder.Dynamic)
                                    {
                                        responseRendering.InvalidDynamicPlaceholder = true;
                                    }

                                    if (!effectivePlaceholder.Dynamic && possiblePlaceholders.Count > 1)
                                    {
                                        effectivePlaceholder.DynamicRecommended = true;
                                    }

                                    effectivePlaceholder.AddRendering(responseRendering);

                                    responseRendering.PossiblePlaceholderPaths.AddRange(possiblePlaceholders.Select(p => p.Name + "-" + p.ParentUniqueId));
                                }
                                else                                     // we just add it to the device if it's really not found. Due to rendering order OR it's really invalid
                                {
                                    responseDevice.AddRendering(item, layoutDefinition, responseRendering);
                                }
                            }
                            else if (allRenderingsReversed.ContainsKey(responseRendering.UniqueId))                                 // I am not sure what this was even for? It will never come here now!
                            //responseRendering.RemoveRenderingRange(allRenderingsReversed);
                            {
                                responseRendering.AddRenderingRange(item, layoutDefinition, allRenderingsReversed[responseRendering.UniqueId]);                                 // could have collected a bunch by now
                            }

                            // TODO: but I need to remove it when this happens. So don't add the ones with parents, duh
                            // - they DEFINITELY don't go in the maincontent then lol (at least, not right now)


                            if (!string.IsNullOrEmpty(responseRendering.ParentUniqueId))
                            {
                                if (!allRenderingsReversed.ContainsKey(responseRendering.ParentUniqueId))
                                {
                                    allRenderingsReversed.Add(responseRendering.ParentUniqueId, new List <ResponseRendering>());
                                }
                                allRenderingsReversed[responseRendering.ParentUniqueId].Add(responseRendering);
                            }
                        }

                        // TODO: loop through and "arange"
                    }
                }
            }

            return(ret);


            //HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK)
            //{
            //	Content = new StringContent("")
            //};
            //result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/xml"); //application/octet-stream
            //return result;
        }
        public DynamicResponse GetRenderings(string id, string language, int version, string database)           //[FromUri]DynamicGetRequest request
        {
            var ret = new DynamicResponse(id.Replace("{", "").Replace("}", "").ToLower(), database);

            var db   = Sitecore.Data.Database.GetDatabase(database);
            var item = db.GetItem(id);


            ret.AddLayoutType("shared", "Shared");
            ret.AddLayoutType("final", "Final");


            foreach (var responseLayoutType in ret.LayoutTypes)
            {
                ID layoutFieldId = null;
                switch (responseLayoutType.Name)
                {
                case "final":
                    layoutFieldId = Sitecore.FieldIDs.FinalLayoutField;
                    break;

                case "shared":
                    layoutFieldId = Sitecore.FieldIDs.LayoutField;
                    break;

                default:
                    layoutFieldId = Sitecore.FieldIDs.LayoutField;                             // shouldn't be needed, but just in case
                    break;
                }

                // yes, there are two things holding the layout type - but that is because this one on the next line is for Response only
                //var responseLayoutType = ret.AddLayoutType(layoutTypeName);

                Sitecore.Data.Fields.LayoutField layoutField = item.Fields[layoutFieldId];
                var layoutDefinition = Sitecore.Layouts.LayoutDefinition.Parse(item[layoutFieldId]);

                int i = 0;
                foreach (var device in devices)
                {
                    i++;
                    // this holds a flat dictionary of all renderings so we can place our parent/child relationships correctly
                    var allRenderings         = new Dictionary <string, ResponseRendering>();
                    var allRenderingsReversed = new Dictionary <string, List <ResponseRendering> >();



                    var responseDevice = responseLayoutType.AddDevice(item, layoutDefinition, device, layoutField.GetLayoutID(device));


                    //Sitecore.Layouts.DeviceDefinition device =	 layout.Devices[i] as Sitecore.Layouts.DeviceDefinition;


                    Sitecore.Layouts.RenderingReference[] renderings = layoutField.GetReferences(device);

                    // if (renderings == null) return; // this item doesn't have any renderings under the Default device.

                    //string layoutXml = layoutField.Value;

                    //responseDevice.Xml = layoutField.Value;
                    if (renderings != null)
                    {
                        // TODO: NEST! that's the WHOLE THING!
                        foreach (var rendering in renderings)
                        {
                            var responseRendering = new ResponseRendering(rendering, layoutDefinition, item);                            // responseDevice.AddRendering(rendering); // TODO: no response needed!
                            // add to the proper rendering. Two cases here, depending on which comes first.
                            if (!string.IsNullOrEmpty(responseRendering.ParentUniqueId) && allRenderings.ContainsKey(responseRendering.ParentUniqueId))
                            {
                                allRenderings[responseRendering.ParentUniqueId].AddRendering(item, layoutDefinition, responseRendering);
                            }
                            else if (allRenderingsReversed.ContainsKey(responseRendering.UniqueId))
                            {
                                //responseRendering.RemoveRenderingRange(allRenderingsReversed);
                                responseRendering.AddRenderingRange(item, layoutDefinition, allRenderingsReversed[responseRendering.UniqueId]);                                 // could have collected a bunch by now
                            }

                            if (string.IsNullOrEmpty(responseRendering.ParentUniqueId))                               // this means the path wasn't built with a GUID, so I couldn't find it. TODO: Fix it anyway!
                            {
                                responseDevice.AddRendering(item, layoutDefinition, responseRendering);
                            }

                            // TODO: but I need to remove it when this happens. So don't add the ones with parents, duh
                            // - they DEFINITELY don't go in the maincontent then lol (at least, not right now)

                            allRenderings.Add(responseRendering.UniqueId, responseRendering);                             // always add it to the flat list!

                            if (!string.IsNullOrEmpty(responseRendering.ParentUniqueId))
                            {
                                if (!allRenderingsReversed.ContainsKey(responseRendering.ParentUniqueId))
                                {
                                    allRenderingsReversed.Add(responseRendering.ParentUniqueId, new List <ResponseRendering>());
                                }
                                allRenderingsReversed[responseRendering.ParentUniqueId].Add(responseRendering);
                            }
                        }

                        // TODO: loop through and "arange"
                    }
                }
            }

            return(ret);


            //HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK)
            //{
            //	Content = new StringContent("")
            //};
            //result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/xml"); //application/octet-stream
            //return result;
        }