Вопрос

Ссылка на правильную editPage

Коллеги, доброго времени суток!

 

Столкнулся с такой проблемой.

Дано:

1. Имеется Project

2. Имеется собственное поле в объекте Opportunity (пусть будет UsrProject), которое ссылается на проект (тип ессно Lookup по объекту Project)

3. Есть собственный объект, записи которого всегда ссылаются на Opportunity (назовем их даты получения пакетов документов). Содержимое этой сущности не важно.

 

Задача: при отображении связанной сущности Project генерировать правильную ссылку на редактирование Project.

 

Проблема:

Изначально в системе есть две страницы редактирования для сущности Project: ProjectPageV2 и WorkPageV2. Система как-то сама должна определять типа записи и генерировать ссылку либо на ProjectPageV2, либо на WorkPageV2. Я точно помню, что как только я добавил поле UsrProject в Opportunity, то ссылка на связанный проект проставлялась как WorkPageV2, вместо положенной ProjectPageV2. Спустя какое-то время, проблема ушла сама собой (что произошло - загадка). Т.е. сейчас на странице редактирования Opportunity все корректно.

Проблема проявилась в другом месте. Я создал раздел по собственным объектам (см. Дано п.3), где я могу фильтровать эти объекты по нужным мне параметрам. Для нормального вывода настроен Tile View, где выводится информация о связанной Opportunity, через Opportunity выводиться информация об Account и Project. Так вот в этом списке упорно проставляется ссылка на проект через WorkPageV2, вместо положенной проверки на тип записи проекта.

 

Вопрос: как в явном виде форсировать определение нужной страницы редактирования как на страницах редактирования мастер записи (в данном случае Opportunity), так и при отображении в списке на секции или той же детали.

Нравится

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

Максим, привет.

Тоже разбираюсь с этим вопросом и не совсем понимаю где тебе нужна ссылка на Project. Для детали посмотри метод AddColumLink, он как раз и формирует ссылку на соответствующую карточку. Он просто смотрит по какому полю отличаются карточки данного объекта и соответственно подставляет нужную карточку. 

Дмитрий, спасибо за отклик.

Смотри, есть объект, назовем его "платежи в оппортьюнити". Для управления наполнением этого объекта существует соответствующая деталь на странице редактирования оппортьюнити.

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

В настройках Tile view для секции добавляются поля из связанных сущностей:

Таким образом я могу видеть проект в секции, но ссылка ведет всегда на WorkPageV2 без разбора типа записи:

Этот проект точно имеет типа записи Project, а не Project task, но ссылка сгенерирована так, будто это таска в проекте.

 

Максим, привет.

У меня на проекте тоже используются Проекты и Работы, попробовал у себя сделать так же как ты показал - у меня всё отрабатывает как надо. Попробуй поотлаживать addColumnLink - возможно у тебя что-то не так в БД.

Добрый день, соглашусь с Максимом, все ссылки в гриде генерируется в методе addColumnLink из GridUtilitiesV2. Бывают случаи, что некорректно отрабатывает клик на ссылку, хотя ссылка сформирована верно. Но в вашем случае (если верить скриншоту) ошибка в самой ссылке. Без отладки сложно сказать что могло пойти не так.

Разобрался с данной проблемой. Как правильно замечено выше, обработкой занимается addColumnLink, которая в свою очередь вызывает createLink (либо собственный из GridUtilities, либо из LinkColumnHelper). Вся проблематика сводится к тому, что item грида (т.е. по факту строчка грида) ничего не знает про ProjectEntryType, поскольку это значение не подтягивается в item при простом добавлении колонки Project.

Код вычитывает из item значение примерно так:

var type = this.get(columnPath + "." + attribute) || this.get(attribute);
var typeId = type ? type.value : type;

Тут есть несколько вариантов решения проблемы:

1. Добавить на грид вывод соответствующего ProjectEntryType, тогда штатный код все прекрасно найдет и прочитает

2. В коде схемы страницы секции (ну, или детали, если грид рисуется в детали) сделать явное проставление атрибута, чтобы форсировать тип проекта. Минус в данном случае - нет определения типа записи проекта и форсируется конкретная страница редактирования. Для однородных данных этого в принципе достаточно.

Код примерно такой получился:

addColumnLink: function(item, column) {
	var referenceSchemaName = column.referenceSchemaName;
	if (referenceSchemaName === "Project") {
		item.set("ProjectEntryType", {value: "6b4928d7-456a-4acd-a863-3361d46b7649"});
	}
	this.callParent([item, column]);
},

3. В коде схемы (как в варианте выше) делать вычитывание типа проекта из базы и проставлять соответствующий атрибут для item

 

В моем случае быстрее было сделать вариант 2, поскольку не хотелось отображать тип записи проекта в секции. Непонятно, почему штатыные средства получения лукапных полей прописывают в объект только displayValue и Id записи. Правильнее было бы для пногостраничных объектов также включать значение поля, по которому делается определение страница редактирования а генерировать ссылку на базе этого значения.

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