META

Ссылки: Построение URL

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

Параметры URL

  • a - applicationId
  • p - pageId
  • e - entityId. ID типа сущности.
  • o - objectId. PrimaryKey в таблице сущности
  • env - environment params. JSON закодированный в base64 Тут все фильтры, сортировки и пр.

Стандартные механизмы

В мете уже есть стандартные средства генерации url на карточку объекта или на обычную страницу. Используйте для этого:

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;
}