Как я могу установить выбранную вкладку в режиме редактирования EPiServer CMS?

У нас есть окно редактирования EPiServer (формы) с несколькими вкладками. Заказчик попросил, чтобы вкладка №2 (называемая «альтернативное содержимое») автоматически выбиралась при определенных условиях, когда редакторы открывают страницу редактирования. Мы не хотим менять порядок вкладок. Как этого добиться? Мы используем EPiServer 11.

Обновление:

Я пытался сделать это с помощью Dojo-скрипта. Результат в EPiServer зависит от того, как я его настроил, что в данном случае для меня немного странно. Вот файл

Web \ modules \ CMSDefaultTabSelector \ module.config:

module.config

Вот как это называется в ModifyMetadata:

Код вызова в ModifyMetadata

... а сам скрипт CMSDefaultTabSelector.js выглядит так:

CMSDefaultTabSelector.js

Результат, в зависимости от того, отправляете ли вы в EditLayoutContainer, Dialog или полностью его пропускаете (как он должен выглядеть), будет следующим:

Результат с EditLayoutContainer

Результат с EditLayoutContainer

Результат с диалогом

Результат с диалогом

Результат такой, каким он должен быть

Исходный результат

Если я попытаюсь пропустить этот параметр, я получаю сообщение об ошибке «ctor не является конструктором». Другие элементы макета просто отображают пустую вкладку, более странные ошибки или вы получаете другие сообщения об ошибках. Если я использую require([...]), функция вызывается при каждой перезагрузке страницы, что не, что я хочу. Я хочу, чтобы он вызывался только тогда, когда срабатывает код из ModifyMetadata. Надеюсь, кто-то может помочь.


person Pedery    schedule 24.01.2019    source источник
comment
Честно говоря, я не думаю, что есть способ сделать это без создания настраиваемого виджета Dojo, который мог бы, например, подписаться на событие contentContextChanged, чтобы определить, следует ли выбирать другую вкладку. Если вы хотите изменить порядок сортировки, вы можете условно отображать / скрывать вкладки или изменять порядок сортировки при выполнении определенных условий. Это может оказаться полезным: gregwiechec.com/2018/ 03 / hide-tabs-and-properties-in-edit-mode   -  person Ted Nyberg    schedule 28.01.2019
comment
Спасибо за ваш вклад. Я уже выполнил большую часть этого, и я почти достиг додзё. Я могу выборочно загружать виджет в функцию ModifyMetaData, и я нажимаю JS-щелчок на вкладке, которую хочу выбрать, когда загружается Dojo-DOM. На этом этапе мне было более любопытно, есть ли более разумный способ сделать это, потому что это немного похоже на прыжок через обручи и архитектуру, просто чтобы выполнить простой привет мир.   -  person Pedery    schedule 28.01.2019
comment
@Ted: Я обновил вопрос, добавив новую информацию и подход Dojo (у которого есть свои особенности).   -  person Pedery    schedule 30.01.2019
comment
Вы пробовали наследовать LayoutContainer? Если да, то как это отображается? В противном случае я бы воздержался от изменения ClientLayoutClass и вместо этого просто подключился бы к подходящему событию (ям). Вы можете использовать registry, чтобы найти dijit.layout.TabContainer виджеты в пользовательском интерфейсе для взаимодействия с виджетами для вкладок редактирования.   -  person Ted Nyberg    schedule 30.01.2019
comment
К вашему сведению, я новичок в этом. Я пробовал dijit / layout / TabContainer (приводит к пустой вкладке), dijit / layout / ContentPane (вкладка только со свойствами, без пробела и без начального текста), epi / shell / layout / LayoutContainer (приводит к вкладке со свойствами и правильным интервалом, но по-прежнему без начального текста для каждого свойства) и epi / shell / layout / GroupContainer (дает вкладку со свойствами и начальным текстом без изменений, но с текстом заголовка вкладки, повторяющимся во второй раз внутри вкладки) . Это самое близкое, что у нас есть на данный момент. Не знаю, как использовать реестр, чтобы найти TabContainer, как вы говорите.   -  person Pedery    schedule 30.01.2019


Ответы (1)


Поработав некоторое время, я наконец нашел волшебный код. Поскольку другие люди также могут задаться вопросом, как это делается, вот как это было решено в итоге (с помощью Dojo):

define([
"dojo/_base/declare",
"epi/shell/layout/SimpleContainer"
],

function (
    declare,
    SimpleContainer
)
{
    return declare([SimpleContainer], {
        //constructor: function () {},

        postCreate: function () { /* PostCreate fires too soon, and the tab strip is not completely rendered */ },

        startup: function () {
            // Use Jquery to select the tab we manually want to change to, and click it:
            var tabElement = $("div.dijitContentPane span.tabLabel:contains('Additional content')");
            if ($(tabElement).length) {
                $(tabElement).trigger("click");
            }
        }

    });
}

);

person Pedery    schedule 30.01.2019
comment
Виджет не обязательно был прикреплен к DOM, когда его событие postCreate запускается, в отличие от startup, которое запускается после того, как виджет был отрисован. См. жизненный цикл виджетов Dojo: dojotoolkit.org/ справочное руководство / 1.9 / dijit / _WidgetBase.html - person Ted Nyberg; 01.02.2019
comment
Ага, я знаю. Я добавил комментарий для справки. - person Pedery; 01.02.2019