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 в бургер меню и сам скрипт