logo

[ELMA3] Создание портлетной страницы с портлетом при активации контейнера модулей

В данном примере при активации контейнера модулей (все модули, точки расширения загружены) создается новая портлетая страница, а также добавляется на страницу портлет. Контейнер модулей активируется при запуске приложения или при пересоздании контейнера (это происходит при включении/отключении модуля).

Пример отображения данных

Рис. 1. Портлетная страница с портлетом при активации контейнера модулей

Методы расширения (интерфейса)

Точка расширения (интерфейс) IModuleContainerEvents имеет следующие методы:

/// <summary>
/// Контейнер активирован (все модули, точки расширения загружены). 
/// Вызывается после выполнения активации контейнера. 
/// Контейнер активируется:
/// 1) при запуске приложения
/// 2) при пересоздании контейнера (это происходит при включении/отключении модуля)
/// </summary>
void Activated();
        
/// <summary>
/// Контейнер уничтожается (вызывается при перезагрузке модулей)
/// </summary>
void Terminating();

Пример класса точки расширения

[Component]
public class ModuleContainerEvents : IModuleContainerEvents
{
    private const string UidS = "{159E131B-1F56-46ad-B31D-2A6EE573C9CF}";
    public static Guid UID = new Guid(UidS); // Гуид портлетной страницы

    public IEntityManager<IPortletPage> PageManager { get; set; }
    public PortletManager PortletManager { get; set; }
    public ISecurityService SecurityService { get; set; }
    public UserManager UserManager { get; set; }
    public IUnitOfWorkManager UnitOfWorkManager { get; set; }
    public TwoColumn5050Layout Layout { get; set; }


    public void Activated()
    {
        var admin = UserManager.Load(SecurityConstants.AdminUserUid);
        var pagecount = PageManager.Find(a => a.Uid == UID).Count;
        if (pagecount == 0)
        {
            SecurityService.RunByUser(admin,
                () =>
                    CreateDefaultPage(admin, UID,
                        "Моя страница с портлетом"));
        }
    }

    public void Terminating()
    {

    }

    public virtual void CreateDefaultPage(EleWise.ELMA.Security.Models.IUser admin, Guid portletPageGuid,
        string portletPageName)
    {
        UnitOfWorkManager.Execute(delegate
        {
            //Создание портлетной страницы
            var portletPage = PageManager.Create();
            portletPage.Uid = portletPageGuid;
            portletPage.Name = portletPageName;
            portletPage.CreationAuthor = admin;
            portletPage.PortletsLayoutId = Layout.Id;
            PageSecurity.GrandAllUsersViewPermission(portletPage);
            portletPage.Save();


            SecurityService.RunWithElevatedPrivilegies(delegate
            {
                var portalPageDataPath = PortletsRestrictionProvider.PortalPageDataPath(portletPage);
                var sharedPortletManager = PortletManager.Create(PersonalizationScope.Shared, portalPageDataPath);
                    
                var portlet = PortletManager.GetPortlet(MyPortlet.UID);
                var zone = Layout.LeftZone.Id;
                //Добавление портлета на страницу
                var portletPersonalization = sharedPortletManager.AddPortlet(portlet, portalPageDataPath);
                portletPersonalization.Zone = zone;
                portletPersonalization.Frame = PortletFrame.Full; 
                sharedPortletManager.SavePersonalization(portletPersonalization, portalPageDataPath);
            });
        });
    }
}

В данном примере добавляется портлет на страницу, созданную в методе CreateDefaultPage. Подробнее о том, как создать свой портлет можно посмотреть здесь.

Ссылки на элементы API

IModuleContainerEvents: 3.13, 3.15, 4.0.

Прикрепленные файлы