Ссылки: Построение URL
При программировании в Мете во всех случаях стройте ссылки стандартными функциями, всегда стройте относительные ссылки (без имени домена).
Параметры URL
- a - applicationId
- p - pageId
- e - entityId. ID типа сущности.
- o - objectId. PrimaryKey в таблице сущности
- env - environment params. JSON закодированный в base64 Тут все фильтры, сортировки и пр.
Стандартные механизмы
В мете уже есть стандартные средства генерации url на карточку объекта или на обычную страницу. Используйте для этого:
- Основной вариант для таблиц - стройте ссылки в таблице запросом через entity_link_field_ (https://samples-demo.devision.io/page?p=3292&a=35 (opens in a new tab)), page_link_field_ (https://samples-demo.devision.io/page?p=3294&a=35 (opens in a new tab)) или href_field_
- Для дашбордов - LinkBuildService для meta/js или meta/sql (Пример использования: https://samples-demo.devision.io/page?p=fbb6c1ca-69f8-471f-97a7-f83950022acd&a=35 (opens in a new tab))
- Не рекомендуется, так как обычно есть варианты проще - $root.buildEnvUrl для html шаблонов (https://samples-demo.devision.io/page?p=3788&a=35 (opens in a new tab))
LinkBuildService пример
Пример как использовать билдер урл вместе с me-lego, стилизованную под прямоугольную карточку дашборда
Для ссылки на /page
var elem = {
name: "me-lego",
label: "Эффективность рекламы",
span: 12,
attrs: {
style: 'card',
externalLink: {
url: LinkBuildService.getPageFullUrl(
'{YOUR_PAGE_ID}',
{
// env.sp
period: env.sp.period
},
{
// НЕОБЯЗАТЕЛЬНО
// env.search
"offset": 0,
"limit": 100,
"orderByField": 2, // инлекс столбца сортировки. имя передать нельзя
"orderBySort": "DESC"
}
),
text: "Посмотреть отчет"
}
}
}
Для email рассылок хорошо подходит вариант генерации ссылки с env на абсолютный урл с основным доменом приложения.
Для этого надо указать applicationId
кроме других параметров.
[#assign url = get_bean('LinkBuildService').getPageFullUrl({"pageId": '4552', "sp": {"ds_state":["PENDING_PROCESSING"]}, "applicationId": "58"}) /]
Для ссылки на /card
var elem = {
name: "me-lego",
label: "Эффективность рекламы",
span: 12,
attrs: {
style: 'card',
externalLink: {
url: LinkBuildService.getCardFullUrl(
'{YOUR_ENTIY_ID}',
'{YOUR_OBJECT_ID}',
'{YOUR_PAGE_ID}',
{
// env.sp. Нужно если вам нужна ссылка на карточку объекта сущности, а там таблица и в ней фильтры
period: env.sp.period
},
{
// НЕОБЯЗАТЕЛЬНО
// env.search
"offset": 0,
"limit": 100,
"orderByField": 2, // инлекс столбца сортировки. имя передать нельзя
"orderBySort": "DESC"
}
),
text: "Посмотреть отчет"
}
}
}
Параметры
- a - applicationId
- p - pageId
- e - entityId. ID типа сущности.
- o - objectId. PrimaryKey в таблице сущности
- env - environment params. JSON закодированный в base64 Тут все фильтры, сортировки и пр.
Ручная генерация ссылок
Когда вам нужно построить правильную ссылку на страницу Меты из другого проекта и эта ссылка должна содержать фильтры или параметры страниц вы должны следовать этому алгоритму генерации.
Например у нас есть ссылка:
/page?p=onec_doc_info&env=eyJwX29uZWNfZG9jX2luZm8iOnsic3AiOnsiYWN0aXZlX21vZGUiOiJhbGwiLCJvcmdfaWRzIjpbM119fX0&a=58
- onec_doc_info - будет означать вполне конкретную страницу. Вы должны знать этот ID
- a - будет означать id приложения. Вы должны знать этот ID
Раскодированный env будет выглядеть так:
{
"p_onec_doc_info": {
"sp": { /* StateParams. Фактически параметры страницы. Зависят от конкретной страницы */
"active_mode": "all",
"org_ids": [
3
]
},
"search": { /* Это фильтры общего поиска и сортировки таблиц, скорее всего они вам не понадобятся */
"offset": 0,
"limit": 20,
"orderByField": 5,
"orderBySort": "DESC"
}
}
}
Ключ в словаре строится по шаблону "p_{PAGE_ID}$e_{ENTIRY_ID}$o_{OBJECT_ID}". При этом если entityId или objectId нет, то и $e_* b $o_* не должны присутствовать в url. Скорее, лучше всего алгоритм пояснит код на JavaScript:
function getPageUrlKey(data) {
let key = 'p_' + data.pageId;
if (data.entityId) {
key += '$e_' + data.entityId;
}
if (typeof data.objectId !== 'undefined') {
key += '$o_' + data.objectId;
}
return key;
}