Клонировать Page и все его элементы

Button: Clone Page Branch

const current = new SimpleRecord('page');
current.get('166912584810909604');  //opportunities_my_company


  // На будущее предполагаю несколько парадигм  копирования (paradigmCopy) портала
  // 1 - копируется только портал и все необходимые ноды, страницы и виджеты идут из коробки неизменные. Можем баловаться только стилями портала заставкой иконкой, все.
  // 2 - первый пункт + клонируем все пейжи с их наполнением (без виджетов). Можем менять структуру страниц стили раскраску расстановка, логика виджетов идет от вендора.
  // 3 - пункт1,2, и клонирование виджетов. т.е. можно менять все что угодно, следить за своим порталом будем сами, ничего обновляться не будет, мы свободны в своих желаниях.

  // Код ниже реализует только втору парадигму, 3-я набросок - еще не проверена, 1-й не реализована

const widgetClonMapping = {};
let newPageId = clonePageBranch(current);
let path = createPortalNode(newPageId);

//ss.setRedirect(path);
ss.info("Path to cloned page: " + ss.getProperty('simple.instance.uri') + path);


function clonePageBranch(pageRecord, paradigmCopy = 2){ // deep level
  let pageRecordAttr = pageRecord.getAttributes();
  pageRecordAttr.table_name = 'page';
  let clonePage = cloneRecord(pageRecordAttr, {'path_name': pageRecord.path_name + "_clone", 'description': pageRecord.description + "\n Clone page \/record\/page\/" + pageRecord.sys_id});
  let pageСontainers = getСontainers(pageRecord.sys_id);
 // ss.info("pageСontainers: " + pageСontainers);
  pageСontainers.forEach((pageСontainer) => {
      let clonePageСontainer = cloneRecord(pageСontainer, {"page_id" : clonePage.sys_id});
      let pageRows = getRows(pageСontainer.sys_id);// ss.info("pageСontainer.sys_id: " + pageСontainer.sys_id); ss.info("pageRows: " + pageRows);
      pageRows.forEach((pageRow) => {
        let clonePageRow = cloneRecord(pageRow, {"page_container_id" : clonePageСontainer.sys_id});
        let pageColumns = getPageColumns(pageRow.sys_id);
        pageColumns.forEach((pageColumn) => {
            let clonePageColumn = cloneRecord(pageColumn, {"page_row_id" : clonePageRow.sys_id});
            let widgetInstances = getWidgetInstances(pageColumn.sys_id);
            widgetInstances.forEach((widgetInstance) => {
                let cloneWidgetInstance = cloneRecord(widgetInstance, {"page_column_id" : clonePageColumn.sys_id});
                if(paradigmCopy == 3){
                  let widgetId = getClonedWidgetId(widgetInstance.widget_id.sys_id);
                  cloneWidgetInstance.widget_id = widgetId;
                  cloneWidgetInstance.update();
                }
            })
          })
      })
  })
  return clonePage.sys_id;
}

function createPortalNode(newPageId, portalId = '158962736118668190') // '158962736118668190' -- "Self-Service Portal"
  {
      const portalNode = new SimpleRecord('portal_node');
      portalNode.page_id = newPageId;
      portalNode.portal_id = portalId;
      portalNode.insert();
      return `/${portalNode.portal_id.path_name}/${portalNode.page_id.path_name}`;
  }

function getClonedWidgetId(widgetId){
    if(widgetClonMapping[widgetId] == null){
        let widget = (new SimpleRecord('sys_widget')).get(widgetId);
        let cloneWidget = cloneRecord(widget, {'name': "Clone " + widget.name, 'description': widget.description + "\n Clone widget \/record\/sys_widget\/" + widget.sys_id});
        widgetClonMapping[widgetId] = cloneWidget.sys_id;
    }
   return widgetClonMapping[widgetId];
}

function getWidgetInstances(pageColumnId){
    return getChilds(pageColumnId, 'page_column_id', 'sys_widget_instance'); //parentID, byField, childEssense
}

function getPageColumns(parentPageRowId){
    return getChilds(parentPageRowId, 'page_row_id', 'page_column'); //parentID, byField, childEssense
}

function getRows(parentPageContainerId){
    return getChilds(parentPageContainerId, 'page_container_id', 'page_row'); //parentID, byField, childEssense
}

function getСontainers(parentPageId){
    return getChilds(parentPageId, 'page_id', 'page_container');
}

function getChilds(parentID, byField, childEssense){
    let childs = [];
    let childRecord = new SimpleRecord(childEssense);
    childRecord.addQuery(byField, parentID);
    childRecord.query(); // ss.info("Count: " + childRecord.getRowCount() + " --  "+ `${ss.getProperty('simple.instance.uri')}/list/${childEssense}?condition=${byField}=${parentID}`);
    while(childRecord.next()){
        let recordAttr = childRecord.getAttributes();
        recordAttr.table_name = childEssense;
        childs.push(recordAttr);
        //ss.info("print(childs) 0: ");
       // print_r(childs);  
    }
  //  ss.info("print(childs) 1: ");
 //   print_r(childs);
    return childs;
}

function cloneRecord(recordAttr, fillAttr = {}){  // fillAttr для замены поля(полей) при клонировании, например тайтл или нейм
const ignoredColumns = [
    'number',
    'sys_id',
    'sys_created_by',
    'sys_created_at',
    'sys_updated_by',
    'sys_updated_at',
    'policy',
    'application_id',
    'table_name'
];
 // ss.info("policy: "+ ignoredColumns['policy']);
  let newRecord;
  newRecord = new SimpleRecord(recordAttr.table_name);
//  ss.info("====================="); print_r(recordAttr.getAttributes());
    for (let key in recordAttr) {
        // skip ignored columns
        if (ignoredColumns.includes(key)) {
            continue;
        }
        newRecord[key] = recordAttr[key];
    }
    for (var prop in fillAttr) {
      newRecord[prop] = fillAttr[prop];
    }
  
  newRecord.insert();  //ss.info("Copy: "); //print_r(newRecord.getAttributes());
  return newRecord;
}

Впишите сюда текст цитаты
[CRM] - MVV - Button_ Clone Page_2023-06-16 13_47_03.sop (3,1 КБ)

Во вложении, кнопка размещенная на странице page в бургер меню и сам скрипт

6 лайков

Думал сопку приложить, но не нашел как крепить файлы,
если кто знает расскажите

shot_230616_152403

3 лайка

Добрый день, попытался импортировать ваш пакет и естественно получил ошибку “Related application “166452097111650278” does not exist. Please repack this pack on the source instance.”, есть ли возможность, как то кроме как через базу создавать приложения с таким же sys_id, как в SOP? или как то редактировать SOP файл?

В сопке только скрипт который в теле поста.
Корректное приложение можно проставить, во время загрузки сопки, на вкладке Retrieved Record.

А так буду иметь ввиду, что бы приложеньку тоже добавлять в сопку

[CRM] - MVV - Aplication_2023-06-23 12_19_39.sop (568 байтов)

Спасибо, скрипт не заработал, он содержит ошибки
image

Очень похоже, что это какая то промежуточная версия.