コード例 #1
0
        public ActionResult Container(EntityModel entity, int containerSize = 0)
        {
            SetupViewData(entity, containerSize);

            AbstractContainerModel container = (AbstractContainerModel)entity;

            /*
             * request.setAttribute("container", container);
             * request.setAttribute(REGION_MODEL, container.getRegion());
             * request.setAttribute("webRequestContext", this.webRequestContext);
             */

            return(View(entity.MvcData.ViewName, entity));
        }
コード例 #2
0
        public void BuildPageModel(ref PageModel pageModel, DD4T.ContentModel.IPage page, IEnumerable <DD4T.ContentModel.IPage> includes, Localization localization)
        {
            var containers = new List <AbstractContainerModel>();

            // Get absolute order of the different container items
            //
            var regionAbsoluteOrder    = new Dictionary <string, IList <int> >();
            var containerAbsoluteOrder = new List <int>();
            int index = 0;

            foreach (var cp in page.ComponentPresentations)
            {
                if (cp.ComponentTemplate.MetadataFields.ContainsKey("regionName"))
                {
                    string      regionName = (string)cp.ComponentTemplate.MetadataFields["regionName"].Values[0];
                    IList <int> orderList  = null;
                    regionAbsoluteOrder.TryGetValue(regionName, out orderList);
                    if (orderList == null)
                    {
                        orderList = new List <int>();
                        regionAbsoluteOrder.Add(regionName, orderList);
                    }
                    orderList.Add(index);
                }
                else if (cp.ComponentTemplate.MetadataFields.ContainsKey("action"))
                {
                    string controllerAction = (string)cp.ComponentTemplate.MetadataFields["action"].Values[0];
                    if (controllerAction.Equals("Container"))
                    {
                        containerAbsoluteOrder.Add(index);
                    }
                }
                index++;
            }

            // Go through the entity list and extract all containers
            //
            index = 1;
            foreach (var region in pageModel.Regions)
            {
                // TODO: Remove container region from the top level? Otherwise XPM drop zones are generated for them as well?

                foreach (var entity in region.Entities)
                {
                    if (entity is AbstractContainerModel)
                    {
                        AbstractContainerModel container = (AbstractContainerModel)entity;

                        // Override region name using MVC route values
                        //
                        string containerRegionName = null;
                        container.MvcData.RouteValues.TryGetValue("containerRegion", out containerRegionName);
                        if (containerRegionName != null)
                        {
                            container.Name = containerRegionName;
                        }
                        // TODO: if no container region name -> should we skip this container then???
                        try
                        {
                            container.Region = new ContainerRegionModel(container);
                        }
                        catch (DxaException e)
                        {
                            throw new DxaException("Could not create empty region for container: " + container.Name, e);
                        }
                        container.Index = index;
                        index++;
                        containers.Add(container);
                    }
                }
            }

            // Move all container items to the containers (to avoid the container items to be rendered outside the container)
            //
            foreach (var container in containers)
            {
                if (containerAbsoluteOrder.Count == 0)
                {
                    break;
                }
                int containerIndex = containerAbsoluteOrder[0];
                containerAbsoluteOrder.RemoveAt(0);
                RegionModel regionWithContainerItems = null;
                pageModel.Regions.TryGetValue(container.Name, out regionWithContainerItems);
                if (regionWithContainerItems == null)
                {
                    // No container items found on the page -> continue
                    //
                    continue;
                }
                IList <int> orderList = null;
                regionAbsoluteOrder.TryGetValue(container.Name, out orderList);
                if (orderList != null && orderList.Count > 0)
                {
                    index = orderList[0];
                    if (containerIndex + 1 == index)
                    {
                        int noOfItems = 0;
                        foreach (var entity in regionWithContainerItems.Entities)
                        {
                            container.Region.Entities.Add(entity);
                            noOfItems++;
                            orderList.RemoveAt(0);
                            if (orderList.Count == 0)
                            {
                                break;
                            }
                            int nextIndex = orderList[0];
                            if (nextIndex != index + 1)
                            {
                                break;
                            }
                            else
                            {
                                index = nextIndex;
                            }
                        }
                        for (int i = 0; i < noOfItems; i++)
                        {
                            regionWithContainerItems.Entities.RemoveAt(0);
                        }
                    }
                }
            }
        }