예제 #1
0
        protected override bool Execute(T ruleContext)
        {
            SC.Diagnostics.Assert.ArgumentNotNull(ruleContext, "ruleContext");
            SC.Diagnostics.Assert.ArgumentNotNull(
                ruleContext.Item,
                "ruleContext.Item");
            SC.Diagnostics.Assert.ArgumentNotNullOrEmpty(
                this.PlaceholderKey,
                "PlaceholderKey");
            SC.Diagnostics.Assert.IsTrue(
                this.MaxRenderings > 0,
                "MaxRenderings");
            // note: retrieving the field value without using LayoutField
            // would not support layout deltas.
            SC.Data.Fields.LayoutField field =
                ruleContext.Item.Fields[SC.FieldIDs.LayoutField];
            string xml = field.Value;

            if (String.IsNullOrEmpty(xml))
            {
                // number 5 is alive
                return(false);
            }

            ArrayList devices = SC.Layouts.LayoutDefinition.Parse(xml).Devices;

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

            return(this.CheckRenderingCounts(devices, ruleContext));
        }
        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";
            }
        }
        [Route("SaveRenderings")]         ///{itemid}/{database} do these still need to be here?
        public DynamicResponse SaveRenderings(DynamicSaveRequest request)
        {
            var ret = GetRenderings(request);

            // TODO: compare (or keep a log of changes to send on the front end?)

            // this first iteration assumes the same structure with only updates.

            // TODO: SAVE it!
            // wait - we don't care about hierarchy! we only care about updating the placeholder!

            // start with the placeholer path and the datasource field...
            // which needs to be reverse mapped, maybe
            var language = LanguageManager.GetLanguage(request.Language);

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


            foreach (var layoutType in request.LayoutTypes)
            {
                ID layoutFieldId = null;
                switch (layoutType.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;
                }

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

                string layoutXml = layoutField.Value;


                var xmlLayoutDoc = new XmlDocument();
                xmlLayoutDoc.LoadXml(layoutXml);

                foreach (var device in layoutType.Devices)
                {
                    UpdateRendering(device.Placeholders, xmlLayoutDoc, db, device);
                }


                item.Editing.BeginEdit();
                layoutField.Value = xmlLayoutDoc.OuterXml;
                //var test = xmlLayoutDoc.OuterXml;
                item.Editing.EndEdit();
            }
            return(GetRenderings(request));
        }
 public override void Execute(Sitecore.Shell.Framework.Commands.CommandContext context)
 {
     if (context.Parameters != null && context.Parameters.Count > 0)
     {
         try
         {
             string itemID = context.Parameters["itemID"] ?? "";
             itemID = Util.FormatID(itemID);
             string dsID = context.Parameters["dataSourceID"] ?? "";
             dsID = Util.FormatID(dsID);
             string renderingID = context.Parameters["renderingID"] ?? "";
             renderingID = Util.FormatID(renderingID);
             string deviceID = context.Parameters["deviceID"] ?? "";
             deviceID = Util.FormatID(deviceID);
             string dbName             = context.Parameters["dbName"] ?? "";
             Sitecore.Data.Database db = Sitecore.Data.Database.GetDatabase(dbName);
             if (db != null)
             {
                 Item i = db.GetItem(itemID);
                 try
                 {
                     string name = i.Name;
                 }
                 catch { }
                 if (i != null && Sitecore.Data.ID.IsID(renderingID) && Sitecore.Data.ID.IsID(dsID))
                 {
                     using (new EditContext(i))
                     {
                         Sitecore.Data.Fields.LayoutField  layoutField      = new Sitecore.Data.Fields.LayoutField(i.Fields[Sitecore.FieldIDs.LayoutField]);
                         Sitecore.Layouts.LayoutDefinition layoutDefinition = Sitecore.Layouts.LayoutDefinition.Parse(layoutField.Value);
                         Sitecore.Layouts.DeviceDefinition deviceDefinition = layoutDefinition.GetDevice(deviceID);
                         foreach (Sitecore.Layouts.RenderingDefinition rd in deviceDefinition.Renderings)
                         {
                             if (HealthIS.Apps.Util.FormatID(rd.UniqueId) == renderingID)
                             {
                                 rd.Datasource     = HealthIS.Apps.Util.FormatID(dsID);
                                 layoutField.Value = layoutDefinition.ToXml();
                             }
                         }
                     }
                 }
                 else
                 {
                     Exception ex = new Exception("Update Datasource Issue with id: " + itemID + " or dsID: " + dsID + " or i: " + i);
                     Util.LogError(ex.Message, ex, this);
                 }
             }
         }
         catch (Exception ex)
         {
             Util.LogError(ex.Message, ex, this);
         }
     }
 }
        // GET: Rules
        public ActionResult Index(string id)
        {
            var db = Sitecore.Context.Database;

            var testUathentication = Sitecore.Context.User.IsAuthenticated;

            if (db == null)
            {
                Sitecore.Configuration.Factory.GetDatabase("master");
            }

            var item = db.GetItem(ID.Parse(id));

            Sitecore.Data.Fields.LayoutField layoutField = item.Fields["__Final renderings"];
            //Sitecore.Layouts.RenderingReference[] renderings = layoutField.GetReferences(Sitecore.Context.Device);
            var renderings = item.Visualization.GetRenderings(Sitecore.Context.Device, false);

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

            var rulesName = new List <string>();

            foreach (var rendering in renderingsWithPersonalization)
            {
                foreach (var rule in rendering.Settings.Rules.Rules)
                {
                    var ruleContext =
                        new Sitecore.Rules.ConditionalRenderings.ConditionalRenderingsRuleContext(
                            renderings.ToList(), rendering);

                    if (rule.Evaluate(ruleContext))
                    {
                        rulesName.Add(rule.Name);
                    }
                }
            }

            return(View(rulesName));

            //Item item = db.GetItem(ID.Parse(id));
            //item.
            //Item ruleItem = db.GetItem(new Sitecore.Data.ID(SitecoreConstants.ItemGUID), item.Language);
            //String rule = ruleItem.Fields["Rule"].Value;
            //var rules = RuleFactory.ParseRules<RuleContext>(item.Database, XElement.Parse(rule));

            //var ruleContext = new RuleContext()
            //{
            //    Item = item
            //};
            //rules.Rules.First().
            //if (rules.Rules.Any())
            //    return rules.Rules.First().Evaluate(ruleContext);
        }
예제 #6
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);
        }
예제 #7
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());
        }
예제 #8
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()
                        });
                    }
                }
            }
        }
        public override void Apply(T ruleContext)
        {
            SC.Diagnostics.Assert.ArgumentNotNull(ruleContext, "ruleContext");
            SC.Diagnostics.Assert.ArgumentNotNull(
                ruleContext.Item,
                "ruleContext.Item");
            SC.Data.Fields.LayoutField layoutDetails =
                ruleContext.Item.Fields[SC.FieldIDs.LayoutField];
            SC.Diagnostics.Assert.IsNotNull(layoutDetails, "layoutDetails");

            if (String.IsNullOrEmpty(layoutDetails.Value) ||
                layoutDetails.InnerField.ContainsStandardValue)
            {
                return;
            }

            SC.Layouts.LayoutDefinition layout =
                SC.Layouts.LayoutDefinition.Parse(layoutDetails.Value);
            bool modified = false;

            for (int i = 0; i < layout.Devices.Count; i++)
            {
                SC.Layouts.DeviceDefinition device =
                    layout.Devices[i] as SC.Layouts.DeviceDefinition;
                SC.Diagnostics.Assert.IsNotNull(device, "device");

                for (int j = 0; j < device.Renderings.Count; j++)
                {
                    SC.Layouts.RenderingDefinition rendering =
                        device.Renderings[j] as SC.Layouts.RenderingDefinition;
                    SC.Diagnostics.Assert.IsNotNull(rendering, "rendering");

                    if (String.IsNullOrEmpty(rendering.Datasource) ||
                        !rendering.Datasource.StartsWith("/"))
                    {
                        continue;
                    }

                    SC.Data.Items.Item dataSource =
                        ruleContext.Item.Database.GetItem(rendering.Datasource);

                    if (dataSource == null)
                    {
                        string msg = this
                                     + " : unable to retrieve data source item "
                                     + rendering.Datasource
                                     + " in "
                                     + ruleContext.Item.Paths.FullPath;
                        SC.Diagnostics.Log.Warn(msg, this);
                        continue;
                    }

                    rendering.Datasource = dataSource.ID.ToString();
                    modified             = true;
                }
            }

            if (modified)
            {
                using (new SC.Data.Items.EditContext(ruleContext.Item, false, false))
                {
                    layoutDetails.Value = layout.ToXml();
                }
            }
        }
        // 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;
        }