Добрый день, коллеги.

Появилась необходимость произвести следующую доработку: на страницу Заказа вывести деталь, которая будет показывать все заказы, у которых Контакт такой же, как и на отображаемой страницу, но к тому же чтобы была возможность вывода продуктов из каждого заказа, по аналогии с деталью Структура в Проектах. Конечно, аналогия не совсем прямая, в Проектах всё завязано только на одном объекте, когда как в поставленной задаче нужно в первом "слое" выводить записи из Заказов, в во втором "слое" - Продукты в Заказе. Кто-нибудь сталкивался с подобным заданием или разбирал этот функционал? Уже изучил схемы ProjectStructureDetailV2, BaseProjectPageV2 и ProjectUtilities. Также нашёл схему HierarchicalProjectUtilities, там, кажется, находится нечто полезное, но я вообще не нашёл связи между этой схемой и кодом, который ответственен за деталь Структура. Меня более всего интересует сам механизм получения списка того, что нужно отобразить в детали, возможно придётся писать полностью свою логику сборки этого списка, но куда этот составленный список применить - мне не понятно. Будет полезно всё - от указания всех схем, которые участвуют в корректной отрисовке Структуры до принципиального описания как это всё работает и идей, как возможно прикрутить ещё один левый объект. Заранее спасибо!

 

Нравится

3 комментария
Лучший ответ

Если деталь Read-only, то делали View с полем Parent и использовали модуль "Hierarchy list view for creatio" из marketplace

 

Если деталь Read-only, то делали View с полем Parent и использовали модуль "Hierarchy list view for creatio" из marketplace

 

Владимир Соколов, не могли бы вы уточнить, каким образом вы произвели данную доработку именно для двух разных объектов в одной детали? На что должно ссылаться поле Parent в представлении, какой именно раздел преобразовывали в представление для детали? Я имею в виду, модуль всё равно работает только с одним объектом, в их примере они настраивают древовидное отображение дочерних договоров для самих же договоров

Видимо, Владимир имеет в виду создание с нуля view, которая берёт данные из нескольких таблиц и формирует в древовидную структуру со ссылками из одних записей view на другие в поле ParentId.

Если первичный ключ записи в этой view нельзя взять из однозначно соответствующей записи одной из таблиц, его можно также формировать программно, например, взяв первую половину Guid из Id записи одного раздела и вторую половину — из другого. Или md5-хэш от других полей, как в примере тут. Главное, чтобы было полное соответствие Id записей, на которые ссылаются и значений полей-ссылок.

Затем по этому view создать объект и далее его использовать в «Hierarchy list view».

Показать все комментарии

Добрый день, подскажите, хотя бы алгоритмично, как создать деталь с древовидной структурой, вроде ProjectStructureDetail, хотел сделать по аналогии, но так и не нашел никакого упоминания о ней в ProjectPageV2

Нравится

11 комментариев

Олег, здравствуйте!

К данному комментарию прикрепил наглядный пример по реализации иерархической детали.

realizaciyaierarhicheskoydetali.doc

Приятного дня!

Добрый день, спасибо за оперативный ответ, попробовал сделать по инструкции, но иерархичность грида не работает http://goo.gl/yCvmBG, кнопка добавления подчиненной записи вообще не активна, добавляются только по кнопке родительской записи, как обычные записи детали
В принципе не могу найти даже в базовой схеме детали метод getAddChildButtonEnabled

Пришлите список сервисов и сами сервисы в которые Вы вносили изменения на support@bpmonline.com для того чтобы мы детально проанализировали Вашу конфигурацию.
В тему письма впишите номер инцидента 0255638.

Отправил на почту письмо с детальным описанием проделанных действий.
P.S. с форума письмо на восстановление пароля содержит в теме [*****SPAM 4.1 *****] странно как то

Добрый день, по итогу общения по почте:

Согласно предоставленному файлу, в схеме детали после строки:
- "hierarchical": true
следует добавить:
- hierarchicalColumnName: "Parent"

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

Олег, здравствуйте!

Для отображения кнопки «Добавить подчинённый элемент» добавьте в код детали:

getAddChildButtonEnabled: function() {
   return true;
},

Попробуйте в код детали подключить следующий миксин:

define("HierarchicalSectionUtilities", ["HierarchicalSectionUtilitiesResources", "GridUtilitiesV2"],
    function(resources) {
        Ext.define("Terrasoft.configuration.mixins.HierarchicalSectionUtilities", {
            extend: "Terrasoft.BaseObject",
            alternateClassName: "Terrasoft.HierarchicalSectionUtilities",
 
            expandedElements: {},
            expandHierarchyLevels: {},
            ExpandItemId: null,
            ExpandedLevels: null,
 
            changeSorting: function() {
                this.clearExpandHierarchyLevels();
                this.callParent(arguments);
 
            },
 
            /**
             * Обработчик загрузки дочерних элементов. Осуществляет проверку загружености
             * дочерних элеметов выбранной записи. Запускает загрузку нового уровня.
             * @protected
             * @virtual
             * @param {String} primaryColumnValue Уникальный идентификатор записи
             * @param {Boolean} isExpanded Признак того, разворачивает или сворачивает пользователь дочерние элеметы
             * true - если разворачивает, false в обратном случае
             */
            onExpandHierarchyLevels: function(primaryColumnValue, isExpanded) {
                if (!isExpanded || this.isItemExpanded(primaryColumnValue)) {
                    return;
                }
                this.setExpandedItem(primaryColumnValue);
                this.set("ExpandItemId", primaryColumnValue);
            },
 
            /**
             * Удаляет логику постраничности если загружаются дочерние объекты
             * @protected
             * @overridden
             */
            initCanLoadMoreData: function() {
                var parentItem = this.get("ExpandItemId");
                if (!parentItem) {
                    this.callParent(arguments);
                }
            },
 
            /**
             * получает коллекцию развернутых уровней
             * @returns {*}
             */
            getExpandedItems: function() {
                return this.get("expandedElements");
            },
 
            /**
             * Устанавливает новый уровень развернутости иерархии
             * @param primaryColumnValue
             */
            setExpandedItem: function(primaryColumnValue) {
                (this.getExpandedItems()[primaryColumnValue]) = { "page": 0 };
            },
 
            /**
             * Проверяет, были ли загруженны дочерные элементы выбранной записи
             * @protected
             * @virtual
             * @param primaryColumnValue Уникальный идетификатор записи
             * @return {boolean}
             */
            isItemExpanded: function(primaryColumnValue) {
                return !!(this.getExpandedItems()[primaryColumnValue]);
            },
 
            /**
             * Очищет информацию о загруженных и развернутых уровнях
             * @protected
             * @virtual
             */
            clearExpandHierarchyLevels: function() {
                this.set("expandedElements", {});
                this.set("expandHierarchyLevels", []);
                var grid = this.getCurrentGrid();
                if (grid) {
                    grid.expandHierarchyLevels = [];
                }
            },
 
            /**
             * Убирает информацию о том, что элемент развернут из системных параметров
             * @protected
             * @virtual
             * @param {String} itemId Уникальный идентификатор записи
             */
            removeExpandHierarchyLevel: function(itemId) {
                var expandHierarchyLevels = this.get("expandHierarchyLevels");
                this.set("expandHierarchyLevels", Terrasoft.without(expandHierarchyLevels, itemId));
                var grid = this.getCurrentGrid();
                if (grid) {
                    grid.expandHierarchyLevels = Terrasoft.without(grid.expandHierarchyLevels, itemId);
                }
            },
 
            /**
             * Дополнительная обработка после удаления записи
             * Очищает иерархию и перезагружает реестр
             * @overridden
             * @protected
             */
            onDeleted: function(result) {
                this.callParent(arguments);
 
                if (result.Success) {
                    this.clearExpandHierarchyLevels();
                    this.loadGridData();
                    this.reloadGridData();
                }
            },
 
            reloadGridColumnsConfig: function(doReRender) {
                var profile = this.get("Profile");
                var propertyName = this.getDataGridName();
                var gridProfile = profile[propertyName];
                if (!this.Ext.Object.isEmpty(gridProfile)) {
/**
* очень важны две следующие строки, благодаря им при перерисовке реестра в виде вертикального, не разрушаются стили иерархии, и она нормально отображается в вертикальном реестре.
*/
                    gridProfile.isTiled = false;
                    gridProfile.type = "listed";
                    var grid = this.getCurrentGrid();
                    if (!grid) {
                        return;
                    }
                    grid.type = gridProfile.type;
                    var viewGenerator = Ext.create("Terrasoft.ViewGenerator");
                    viewGenerator.viewModelClass = this;
                    var gridConfig;
                    var bindings = this.Terrasoft.deepClone(grid.bindings);
                    if (gridProfile.type === Terrasoft.GridType.LISTED) {
                        gridConfig = {
                            listedConfig: Ext.decode(gridProfile.listedConfig),
                            type: gridProfile.type
                        };
                        viewGenerator.actualizeListedGridConfig(gridConfig);
                        grid.captionsConfig = gridConfig.listedConfig.captionsConfig;
                        grid.columnsConfig = gridConfig.listedConfig.columnsConfig;
                        grid.listedConfig = gridConfig.listedConfig;
                        grid.initBindings(gridConfig.listedConfig);
                    } else {
                        gridConfig = {
                            tiledConfig: Ext.decode(gridProfile.tiledConfig),
                            type: gridProfile.type
                        };
                        var isVertical = (propertyName.indexOf("VerticalProfile") > -1);
                        gridConfig.isVertical = isVertical;
                        grid.isEmptyRowVisible = !isVertical;
                        viewGenerator.actualizeTiledGridConfig(gridConfig);
                        grid.columnsConfig = gridConfig.tiledConfig.columnsConfig;
                        grid.tiledConfig = gridConfig.tiledConfig;
                        grid.initBindings(gridConfig.tiledConfig);
                    }
                    grid.bindings = bindings;
                    if (doReRender) {
                        grid.clear();
                        grid.prepareCollectionData();
                        if (grid.rendered) {
                            grid.reRender();
                        }
                    }
                }
            }
        });
        return Terrasoft.HierarchicalSectionUtilities;
    }
);

В результате деталь должна отобразиться нужным образом.
Также подобную реализацию можете посмотреть в разделе «Контрагенты» (деталь «Структура организации»).

Добрый день, наверное глупый вопрос, но найти ответа не смог, как подключить миксин? создал модуль, поместил в него код миксина, в код детали добавил :

details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
mixins: {
	HierarchicalSectionUtilities: "HierarchicalSectionUtilities"
},
diff: /**SCHEMA_DIFF*/[

и при открытии страницы где расположена деталь в консоль выбивает ошибку

Добрый день, Олег!
Если нужно подключить указаный выше по комментариям мексин HierarchicalSectionUtilities, то нужно подключить/зарегистрировать модуль содержащий мексин в define и подключить его в секции mixins, как показано ниже:

define("SchemeModuleName", ["HierarchicalSectionUtilities"], function() {
                return {
                               messages: {},
                               /**
                               * Классы-миксины, расширяющие функциональность данного класа.
                               */
                               mixins: {
                                               /**
                                               * @class HierarchicalSectionUtilities
                                               */
                                               HierarchicalSectionUtilities: "Terrasoft.HierarchicalSectionUtilities"
                               },
                               methods: {},
                               diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/
                };
});

Добавил миксин, ситуация не изменилась, деталь так же имеет обычную структуру...
http://goo.gl/dexq8R

Олег, в рамках удаленного подключения была предоставлена консультация. В результате деталь отобразилась корректно.
Для того, чтобы деталь была древовидной необходимо было перенести все функции миксина в код детали (классы) и переопубликовать объект.

Огромное спасибо за помощь, понял свои ошибки

Показать все комментарии