<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <title>Liferay.ru</title>
  <link rel="self" href="https://liferay.ru/en/c/blogs/find_entry?p_l_id=1557" />
  <subtitle>Liferay.ru</subtitle>
  <id>https://liferay.ru/en/c/blogs/find_entry?p_l_id=1557</id>
  <updated>2026-05-06T13:11:40Z</updated>
  <dc:date>2026-05-06T13:11:40Z</dc:date>
  <entry>
    <title>Liferay и Camunda</title>
    <link rel="alternate" href="https://liferay.ru/en/c/blogs/find_entry?p_l_id=1557&amp;entryId=9118586" />
    <author>
      <name>Какунин Алексей</name>
    </author>
    <id>https://liferay.ru/en/c/blogs/find_entry?p_l_id=1557&amp;entryId=9118586</id>
    <updated>2025-12-07T09:47:45Z</updated>
    <published>2025-12-07T09:41:00Z</published>
    <summary type="html">&lt;p data-end="883" data-start="515"&gt;На прошедшей недавно&amp;nbsp;&lt;strong&gt;Liferay DevCon 2025&lt;/strong&gt;&amp;nbsp;были проведены две живые демонстрации, посвящённые совершенно новому&amp;nbsp;&lt;strong&gt;партнёрству Liferay и Camunda&lt;/strong&gt;, и они действительно впечатлили.&amp;nbsp;В демонстрациях были показаны не только точки технической интеграции, но и то, как оркестрация процессов с использованием искусственного интеллекта может изменить процесс адаптации, обслуживание клиентов, финансовые рабочие процессы и многое другое.&lt;/p&gt;

&lt;p data-end="1067" data-start="885"&gt;Во время сессий получилось сделать несколько фотографий.&amp;nbsp;Они не самого лучшего качества (освещение на конференции + камера телефона = заранее прошу прощения!), но я надеюсь, что они всё же помогут передать суть.&amp;nbsp;Обе презентации были записаны, так что, если вы их пропустили, у вас будет возможность посмотреть их (скорее всего, с гораздо более качественным видео).&lt;/p&gt;

&lt;h2&gt;&lt;strong&gt;Демонстрация 1 — Camunda + Liferay в действии&lt;/strong&gt;&lt;/h2&gt;

&lt;p data-end="1197" data-start="1120"&gt;&lt;strong&gt;Представлено:&lt;/strong&gt;&amp;nbsp;&lt;em&gt;Стефаном Визе, старшим техническим менеджером-партнером Camunda&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;&lt;strong&gt;Из серии «Хаос в корпоративной среде…»&lt;/strong&gt;&lt;/h3&gt;

&lt;p data-end="1500" data-start="1235"&gt;Один из первых слайдов, которые показал Стефан, был до боли знакомым: запутанная сеть потоков в корпоративной системе, которые естественным образом развиваются с течением времени.&amp;nbsp;Повсюду пересекающиеся линии, слабо связанные системы, которые непредсказуемым образом взаимодействуют друг с другом, и процессы, которые трудно отслеживать, не говоря уже об их изменении.&lt;/p&gt;

&lt;p data-end="1634" data-start="1502"&gt;Даже в мире, управляемом искусственным интеллектом, простое «добавление агентов» в хаотичную инфраструктуру не решит проблему волшебным образом.&lt;/p&gt;

&lt;p data-end="1634" data-start="1502"&gt;&lt;img data-fileentryid="9118581" src="https://liferay.ru/documents/portlet_file_entry/5388004/demo-1-1.png/28389328-5389-a291-3cd0-935eaa202759" /&gt;&lt;span style="display: none;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;

&lt;p data-end="1634" data-start="1502"&gt;&lt;strong&gt;…к чистой, упорядоченной архитектуре с использованием Camunda&lt;/strong&gt;&lt;/p&gt;

&lt;p data-end="1819" data-start="1701"&gt;Следующий слайд был контрастным.&amp;nbsp;На этом изображении&amp;nbsp;&lt;strong&gt;Camunda становится дирижёром с поддержкой искусственного интеллекта&lt;/strong&gt;, обеспечивающим:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;
	&lt;p data-end="1857" data-start="1823"&gt;Никаких запутанных потоков данных&lt;/p&gt;
	&lt;/li&gt;
	&lt;li&gt;
	&lt;p data-end="1884" data-start="1860"&gt;Централизованный контроль&lt;/p&gt;
	&lt;/li&gt;
	&lt;li&gt;
	&lt;p data-end="1909" data-start="1887"&gt;Мониторинг в реальном времени&lt;/p&gt;
	&lt;/li&gt;
	&lt;li&gt;
	&lt;p data-end="1936" data-start="1912"&gt;Простое управление изменениями&lt;/p&gt;
	&lt;/li&gt;
	&lt;li&gt;
	&lt;p data-end="1969" data-start="1939"&gt;Четкое и логичное перемещение данных&lt;/p&gt;
	&lt;/li&gt;
&lt;/ul&gt;

&lt;p data-end="2127" data-start="1971"&gt;Camunda становится мозгом, координирующим работу всего приложения, а инструменты пользовательского интерфейса отображают ход выполнения задач в реальном времени.&lt;/p&gt;

&lt;p data-end="2127" data-start="1971"&gt;&lt;img data-fileentryid="9118595" src="https://liferay.ru/documents/portlet_file_entry/5388004/demo-1-2.png/1d6c78ba-5e27-213a-a08a-a6410541c8d5" /&gt;&lt;br /&gt;
 &lt;/p&gt;

&lt;p data-end="2127" data-start="1971"&gt;&lt;strong&gt;Новые коннекторы Liferay&lt;/strong&gt;&lt;/p&gt;

&lt;p data-end="2295" data-start="2169"&gt;В основе партнёрства Liferay и Camunda лежит внедрение&amp;nbsp;&lt;strong&gt;двух новых коннекторов Liferay&lt;/strong&gt;&amp;nbsp;в Camunda Marketplace:&lt;/p&gt;

&lt;ol&gt;
	&lt;li&gt;
	&lt;p data-end="2371" data-start="2300"&gt;&lt;strong&gt;Входящий коннектор&lt;/strong&gt;&amp;nbsp;— Liferay → Camunda (запуск процессов Camunda)&lt;/p&gt;
	&lt;/li&gt;
	&lt;li&gt;
	&lt;p data-end="2466" data-start="2375"&gt;&lt;strong&gt;Исходящий коннектор&lt;/strong&gt;&amp;nbsp;— Camunda ↔ Liferay (чтение и обновление данных Liferay через безголовые API)&lt;/p&gt;
	&lt;/li&gt;
&lt;/ol&gt;

&lt;p data-end="2681" data-start="2468"&gt;Исходящий коннектор особенно эффективен, поскольку он позволяет процессам Camunda&amp;nbsp;&lt;em&gt;изменять&lt;/em&gt;&amp;nbsp;данные Liferay в процессе, превращая Liferay в полноценного участника корпоративной автоматизации.&lt;/p&gt;

&lt;p data-end="2681" data-start="2468"&gt;&lt;img data-fileentryid="9118603" src="https://liferay.ru/documents/portlet_file_entry/5388004/demo-1-3.png/0f688fd4-b255-b032-b3c6-52de1d040b93" /&gt;&lt;br /&gt;
 &lt;/p&gt;

&lt;h3&gt;&lt;strong&gt;Чат-бот с искусственным интеллектом на базе Camunda&lt;/strong&gt;&lt;/h3&gt;

&lt;p data-end="2900" data-start="2727"&gt;Затем Стефан продемонстрировал нечто действительно выдающееся:&amp;nbsp;&lt;strong&gt;веб-сайт на базе Liferay с чат-ботом с искусственным интеллектом&lt;/strong&gt;, только этот чат-бот был не просто разговорным, он был&amp;nbsp;&lt;strong&gt;ориентирован на процессы&lt;/strong&gt;&lt;/p&gt;

&lt;p data-end="3060" data-start="2902"&gt;Это был не обычный бот, который «задает вопрос → получает ответ».&lt;br /&gt;
Это был бот, который «задает вопрос → запускает бизнес-процесс → выполняет реальные действия → обновляет системы».&lt;/p&gt;

&lt;p data-end="3076" data-start="3062"&gt;Он представил два сценария:&lt;/p&gt;

&lt;h4&gt;&lt;strong&gt;a.&amp;nbsp;Подача заявки на автокредит&lt;/strong&gt;&lt;/h4&gt;

&lt;p data-end="3197" data-start="3116"&gt;Стефан сказал чат-боту, что хочет взять&amp;nbsp;&lt;strong&gt;автокредит на 15 000 евро&lt;/strong&gt;.&lt;br /&gt;
Вот что произошло:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;
	&lt;p data-end="3266" data-start="3201"&gt;Liferay отправила сообщение в Camunda через&amp;nbsp;&lt;strong&gt;входящий коннектор&lt;/strong&gt;&lt;/p&gt;
	&lt;/li&gt;
	&lt;li&gt;
	&lt;p data-end="3311" data-start="3269"&gt;Camunda AI перенаправила его в&amp;nbsp;&lt;em&gt;процесс выдачи кредита&lt;/em&gt;&lt;/p&gt;
	&lt;/li&gt;
	&lt;li&gt;
	&lt;p data-end="3422" data-start="3314"&gt;Для процесса требовалось больше информации, поэтому Camunda использовала&amp;nbsp;&lt;strong&gt;исходящий коннектор&lt;/strong&gt;, чтобы попросить Liferay запросить данные у пользователя&lt;/p&gt;
	&lt;/li&gt;
	&lt;li&gt;
	&lt;p data-end="3522" data-start="3425"&gt;После того как пользователь ответил, Camunda использовала данные и историю аккаунта для&amp;nbsp;&lt;strong&gt;предварительного одобрения кредита&lt;/strong&gt;&lt;/p&gt;
	&lt;/li&gt;
	&lt;li&gt;
	&lt;p data-end="3604" data-start="3525"&gt;В Liferay было отправлено последнее сообщение: «Кредит одобрен, документы для электронной подписи уже в пути».&lt;/p&gt;
	&lt;/li&gt;
&lt;/ul&gt;

&lt;p data-end="3626" data-start="3606"&gt;Все полностью автоматизировано.&lt;/p&gt;

&lt;h4&gt;&lt;strong&gt;b. Сообщение о краже кредитной карты&lt;/strong&gt;&lt;/h4&gt;

&lt;p data-end="3754" data-start="3673"&gt;Затем Стефан сообщил боту, что у него украли кредитную карту.&lt;br /&gt;
Camunda:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;
	&lt;p data-end="3807" data-start="3758"&gt;Направил запрос в&amp;nbsp;&lt;em&gt;отдел обработки кредитных карт&lt;/em&gt;&lt;/p&gt;
	&lt;/li&gt;
	&lt;li&gt;
	&lt;p data-end="3828" data-start="3810"&gt;Заблокировал карту&lt;/p&gt;
	&lt;/li&gt;
	&lt;li&gt;
	&lt;p data-end="3853" data-start="3831"&gt;Выдал новую&lt;/p&gt;
	&lt;/li&gt;
	&lt;li&gt;
	&lt;p data-end="3910" data-start="3856"&gt;Отправлены два обновления статуса для пользователя в Liferay&lt;/p&gt;
	&lt;/li&gt;
&lt;/ul&gt;

&lt;p data-end="3969" data-start="3912"&gt;Реальные действия.&amp;nbsp;Реальные обновления системы.&amp;nbsp;Все через безголовые API.&lt;/p&gt;

&lt;h3&gt;&lt;strong&gt;Лучшие практики для PO&amp;amp;A&lt;/strong&gt;&lt;/h3&gt;

&lt;p data-end="4141" data-start="4008"&gt;На последнем слайде Стефан поделился лучшими практиками внедрения&amp;nbsp;&lt;strong&gt;PO&amp;amp;A&lt;/strong&gt;&amp;nbsp;(оркестровки и автоматизации процессов).&lt;/p&gt;

&lt;p data-end="4141" data-start="4008"&gt;&lt;img data-fileentryid="9118611" src="https://liferay.ru/documents/portlet_file_entry/5388004/demo-1-4.png/e22a05b3-0356-7251-27da-48a703c2cc0e" /&gt;&lt;br /&gt;
 &lt;/p&gt;

&lt;h3&gt;&lt;strong&gt;Мои выводы из демоверсии 1&lt;/strong&gt;&lt;/h3&gt;

&lt;p data-end="4453" data-start="4177"&gt;Это была очень убедительная демонстрация.&amp;nbsp;Если ваша организация уже использует Camunda, эти коннекторы позволят Liferay полноценно участвовать в сложных корпоративных процессах: либо в качестве&amp;nbsp;&lt;em&gt;триггера&lt;/em&gt;&amp;nbsp;процесса, либо в качестве&amp;nbsp;&lt;em&gt;поставщика/потребителя данных&lt;/em&gt;&amp;nbsp;внутри потока.&lt;/p&gt;

&lt;h2&gt;&lt;strong&gt;Демонстрация 2 — интеграция со стороны Liferay&lt;/strong&gt;&lt;/h2&gt;

&lt;p data-end="4568" data-start="4507"&gt;&lt;strong&gt;Представлено:&lt;/strong&gt;&amp;nbsp;&lt;em&gt;Давиде Микунько, инженер по продажам в Liferay&lt;/em&gt;&lt;/p&gt;

&lt;p data-end="4728" data-start="4570"&gt;Вторая демонстрация прекрасно дополнила первую. На этот раз основное внимание было уделено тому, как&amp;nbsp;&lt;strong&gt;разработчики Liferay&lt;/strong&gt;&amp;nbsp;создают решения, которые напрямую подключаются к процессам Camunda.&lt;/p&gt;

&lt;p data-end="4728" data-start="4570"&gt;&lt;img data-fileentryid="9118619" src="https://liferay.ru/documents/portlet_file_entry/5388004/demo-2.png/0f56e767-9e23-140b-6b08-515ea7dc85ce" /&gt;&lt;br /&gt;
 &lt;/p&gt;

&lt;h3&gt;&lt;strong&gt;Сценарий&lt;/strong&gt;&lt;/h3&gt;

&lt;p data-end="4854" data-start="4771"&gt;Игровая компания набирает разработчиков.&amp;nbsp;Кандидаты подают заявки на сайте.&lt;/p&gt;

&lt;p data-end="4865" data-start="4856"&gt;Ход действий:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;
	&lt;p data-end="4901" data-start="4869"&gt;Заявка создана в Liferay&lt;/p&gt;
	&lt;/li&gt;
	&lt;li&gt;
	&lt;p data-end="4923" data-start="4904"&gt;ИИ проводит предварительную проверку&lt;/p&gt;
	&lt;/li&gt;
	&lt;li&gt;
	&lt;p data-end="4946" data-start="4926"&gt;Если заявка слабая → отклонить&lt;/p&gt;
	&lt;/li&gt;
	&lt;li&gt;
	&lt;p data-end="4963" data-start="4949"&gt;Если заявка хорошая → HR&lt;/p&gt;
	&lt;/li&gt;
	&lt;li&gt;
	&lt;p data-end="4999" data-start="4966"&gt;Если заявка исключительная → менеджер по подбору персонала&lt;/p&gt;
	&lt;/li&gt;
	&lt;li&gt;
	&lt;p data-end="5046" data-start="5002"&gt;HR или менеджер по подбору персонала могут одобрить или отклонить заявку&lt;/p&gt;
	&lt;/li&gt;
&lt;/ul&gt;

&lt;p data-end="5091" data-start="5048"&gt;Все это дерево решений находится в Camunda.&lt;/p&gt;

&lt;h3&gt;&lt;strong&gt;Сведения о реализации в Liferay&lt;/strong&gt;&lt;/h3&gt;

&lt;h4&gt;&lt;strong&gt;Объект Liferay + действие с объектом → веб-перехватчик&lt;/strong&gt;&lt;/h4&gt;

&lt;p data-end="5251" data-start="5192"&gt;Форма заявки на работу поддерживается&amp;nbsp;&lt;strong&gt;объектом Liferay&lt;/strong&gt;.&lt;/p&gt;

&lt;p data-end="5359" data-start="5253"&gt;Действие&amp;nbsp;&lt;strong&gt;после добавления&lt;/strong&gt;&amp;nbsp;отправляет веб-перехватчик в Camunda.&lt;br /&gt;
Это запускает бизнес-процесс в Camunda.&lt;/p&gt;

&lt;h4&gt;&lt;strong&gt;Camunda → Liferay через Headless API&lt;/strong&gt;&lt;/h4&gt;

&lt;p data-end="5480" data-start="5411"&gt;По мере продолжения процесса Camunda использует&amp;nbsp;&lt;strong&gt;исходящий коннектор&lt;/strong&gt;&amp;nbsp;для:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;
	&lt;p data-end="5515" data-start="5484"&gt;Обновить статус заявки&lt;/p&gt;
	&lt;/li&gt;
	&lt;li&gt;
	&lt;p data-end="5549" data-start="5518"&gt;Установить флаги и состояния рабочего процесса&lt;/p&gt;
	&lt;/li&gt;
	&lt;li&gt;
	&lt;p data-end="5609" data-start="5552"&gt;Отразить решения, принятые ИИ, отделом кадров или менеджером по подбору персонала&lt;/p&gt;
	&lt;/li&gt;
&lt;/ul&gt;

&lt;p data-end="5691" data-start="5611"&gt;Когда Дэвид открыл средство просмотра объектов приложений Liferay, вы могли ясно видеть:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;
	&lt;p data-end="5718" data-start="5695"&gt;Отклоненные заявки&lt;/p&gt;
	&lt;/li&gt;
	&lt;li&gt;
	&lt;p data-end="5745" data-start="5721"&gt;Заявки на рассмотрении&lt;/p&gt;
	&lt;/li&gt;
	&lt;li&gt;
	&lt;p data-end="5771" data-start="5748"&gt;Одобренные заявки&lt;/p&gt;
	&lt;/li&gt;
	&lt;li&gt;
	&lt;p data-end="5810" data-start="5774"&gt;Все данные автоматически обновляются Camunda&lt;/p&gt;
	&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;&lt;strong&gt;Это был момент «Ага!»&lt;/strong&gt;&lt;/h3&gt;

&lt;p data-end="5873" data-start="5849"&gt;Ключевая идея заключается в следующем:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p data-end="5954" data-start="5877"&gt;&lt;strong&gt;Liferay не просто запускает процесс в Camunda, Camunda может управлять Liferay.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p data-end="6009" data-start="5956"&gt;Это создает мощную модель интеграции с обратной связью.&lt;/p&gt;

&lt;h2&gt;&lt;strong&gt;Что я узнал из обеих демонстраций&lt;/strong&gt;&lt;/h2&gt;

&lt;p data-end="6133" data-start="6056"&gt;Эти демонстрации показывают, как на самом деле выглядит интеграция Liferay и Camunda:&lt;/p&gt;

&lt;h3&gt;&lt;strong&gt;1.&amp;nbsp;Liferay → Camunda&lt;/strong&gt;&lt;/h3&gt;

&lt;p data-end="6242" data-start="6166"&gt;В любом месте, где Liferay может вызвать&amp;nbsp;&lt;strong&gt;веб-перехватчик&lt;/strong&gt;, он может запустить процесс Camunda:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;
	&lt;p data-end="6262" data-start="6246"&gt;Действия с объектами&lt;/p&gt;
	&lt;/li&gt;
	&lt;li&gt;
	&lt;p data-end="6283" data-start="6265"&gt;Рабочий процесс Liferay&lt;/p&gt;
	&lt;/li&gt;
	&lt;li&gt;
	&lt;p data-end="6317" data-start="6286"&gt;Клиентские расширения&lt;/p&gt;
	&lt;/li&gt;
	&lt;li&gt;
	&lt;p data-end="6337" data-start="6320"&gt;События в сфере коммерции&lt;/p&gt;
	&lt;/li&gt;
	&lt;li&gt;
	&lt;p data-end="6357" data-start="6340"&gt;Пользовательские триггеры&lt;/p&gt;
	&lt;/li&gt;
	&lt;li&gt;
	&lt;p data-end="6399" data-start="6360"&gt;Все, что может вызывать конечную точку HTTP&lt;/p&gt;
	&lt;/li&gt;
&lt;/ul&gt;

&lt;p data-end="6556" data-start="6432"&gt;С помощью&amp;nbsp;&lt;strong&gt;входящего коннектора Liferay&lt;/strong&gt;&amp;nbsp;Camunda может получать события, инициируемые веб-хуками, и направлять их в любой процесс.&lt;/p&gt;

&lt;h3&gt;&lt;strong&gt;2. Camunda ↔ Liferay (двунаправленное взаимодействие)&lt;/strong&gt;&lt;/h3&gt;

&lt;p data-end="6654" data-start="6606"&gt;&lt;strong&gt;Исходящий коннектор Liferay&lt;/strong&gt;&amp;nbsp;позволяет Camunda:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;
	&lt;p data-end="6683" data-start="6658"&gt;Получение данных из Liferay&lt;/p&gt;
	&lt;/li&gt;
	&lt;li&gt;
	&lt;p data-end="6702" data-start="6686"&gt;Обновление записей&lt;/p&gt;
	&lt;/li&gt;
	&lt;li&gt;
	&lt;p data-end="6742" data-start="6705"&gt;Реализация бизнес-логики в DXP&lt;/p&gt;
	&lt;/li&gt;
	&lt;li&gt;
	&lt;p data-end="6785" data-start="6745"&gt;Вынесение решений на информационные панели и в пользовательские интерфейсы&lt;/p&gt;
	&lt;/li&gt;
	&lt;li&gt;
	&lt;p data-end="6813" data-start="6788"&gt;Завершение цикла автоматизации&lt;/p&gt;
	&lt;/li&gt;
&lt;/ul&gt;

&lt;p data-end="6917" data-start="6815"&gt;Благодаря безголовым API-интерфейсам Liferay и оркестрации процессов Camunda&amp;nbsp;&lt;em&gt;становится возможным многое&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;&lt;strong&gt;Заключительные мысли&lt;/strong&gt;&lt;/h2&gt;

&lt;p data-end="7117" data-start="6948"&gt;Интеграция Liferay и Camunda открывает новые горизонты по использование бизнес-процессов в порталах. Стоит отметить что в Incomand эта задача давно решена за счет &lt;a href="https://incomand.ru/konstruktor-processov"&gt;интеграции с Flowable&lt;/a&gt; (который, как и Camunda является форком проекта Activiti и предоставляет аналогичный функционал). При этом интеграция выполнена нативно, не требуется установки каких-либо дополнительных серверов или коннекторов.&lt;/p&gt;</summary>
    <dc:creator>Какунин Алексей</dc:creator>
    <dc:date>2025-12-07T09:41:00Z</dc:date>
  </entry>
  <entry>
    <title>Использование Liferay JS Global в локальной среде разработки/тестирования JS</title>
    <link rel="alternate" href="https://liferay.ru/en/c/blogs/find_entry?p_l_id=1557&amp;entryId=9085640" />
    <author>
      <name>Бодрова Надежда</name>
    </author>
    <id>https://liferay.ru/en/c/blogs/find_entry?p_l_id=1557&amp;entryId=9085640</id>
    <updated>2025-11-29T09:06:02Z</updated>
    <published>2025-11-19T08:54:00Z</published>
    <summary type="html">&lt;p&gt;Сегодня на Liferay DevCon кто-то задал мне отличный вопрос:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;«Как разработать и протестировать локальный пользовательский элемент (стандартный веб-компонент)&amp;nbsp;&lt;em&gt;при этом используя&lt;/em&gt;&amp;nbsp;&lt;code&gt;Liferay&lt;/code&gt;&amp;nbsp;глобальный объект JS?»&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Мы всё обсудили, и я намекнул, что напишу об этом в блоге.&amp;nbsp;Поскольку я уверен, что другие столкнутся с той же проблемой…&amp;nbsp;вот и всё.&lt;/p&gt;

&lt;p&gt;Хорошая новость:&amp;nbsp;&lt;strong&gt;это проще, чем вы думаете.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Всё, что вам действительно нужно, — это упрощённая версия объекта&amp;nbsp;&lt;code&gt;Liferay&lt;/code&gt;&amp;nbsp;(с достаточным количеством API-интерфейсов, на которые опирается ваш пользовательский элемент), которую можно импортировать во время локальной разработки.&lt;/p&gt;

&lt;p&gt;Ниже приведён простой файл&amp;nbsp;&lt;code&gt;Liferay.js&lt;/code&gt;, который я использую:&lt;/p&gt;

&lt;pre&gt;
const Liferay = window.Liferay || {
 Язык: {
 get: (key) =&amp;gt; {
 return key;
 },
 },
 OAuth2: {
 getAuthorizeURL: () =&amp;gt; '',
 getBuiltInRedirectURL: () =&amp;gt; '',
 getIntrospectURL: () =&amp;gt; '',
 getTokenURL: () =&amp;gt; '',
 getUserAgentApplication: (_serviceName) =&amp;gt; {},
 },
 OAuth2Client: {
 FromParameters: (_options) =&amp;gt; {
 return {};
 },
 FromUserAgentApplication: (_userAgentApplicationId) =&amp;gt; {
 return {};
 },
 fetch: (_url, _options = {}) =&amp;gt; {},
 },
 ThemeDisplay: {
 getCompanyGroupId: () =&amp;gt; 20119, 
 getPathThemeImages: () =&amp;gt; ", 
 getPortalURL: () =&amp;gt; 'http://localhost:8080', 
 getScopeGroupId: () =&amp;gt; 20117, 
 getSiteGroupId: () =&amp;gt; 20117, 
 isSignedIn: () =&amp;gt; false, 
}, 
 authToken: ", 
 вкл.: (_event, _callback) =&amp;gt; {}, 
 запуск: (_event, _data) =&amp;gt; {}, 
};

По умолчанию используется Liferay.
&lt;/pre&gt;

&lt;p&gt;This is&amp;nbsp;&lt;em&gt;not&lt;/em&gt;&amp;nbsp;the complete Liferay global object; Liferay’s real runtime includes many more fields and service APIs, but this stub is&amp;nbsp;&lt;strong&gt;perfect for local development and testing&lt;/strong&gt;&amp;nbsp;for the component I was working on at the time.&lt;/p&gt;

&lt;p&gt;I included only the pieces I needed:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;&lt;code&gt;Liferay.Language.get()&lt;/code&gt;&lt;/li&gt;
	&lt;li&gt;&lt;code&gt;Liferay.ThemeDisplay&lt;/code&gt;&amp;nbsp;fields for companyId, groupId, portal URL, etc.&lt;/li&gt;
	&lt;li&gt;&lt;code&gt;Liferay.OAuth2&lt;/code&gt;&amp;nbsp;+&amp;nbsp;&lt;code&gt;Liferay.OAuth2Client&lt;/code&gt;&lt;/li&gt;
	&lt;li&gt;Event helpers (&lt;code&gt;on&lt;/code&gt;,&amp;nbsp;&lt;code&gt;fire&lt;/code&gt;)&lt;/li&gt;
	&lt;li&gt;&lt;code&gt;authToken&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Если бы завтра мне понадобилось что-то вроде&amp;nbsp;&lt;code&gt;Liferay.Session.extend()&lt;/code&gt;, я бы просто добавил ещё одну заглушку в тот же файл.&lt;/p&gt;

&lt;hr /&gt;
&lt;h2&gt;&lt;strong&gt;Версия машинописного текста&lt;/strong&gt;&lt;/h2&gt;

&lt;p&gt;Если вы используете TypeScript, вот версия, которую можно вставить в&amp;nbsp;&lt;code&gt;liferay.ts&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;
interface LiferayType {
 Language: {
 get: (key: string) =&amp;gt; string;
 };
 OAuth2: {
 getAuthorizeURL: () =&amp;gt; string;
 getBuiltInRedirectURL: () =&amp;gt; string;
 getIntrospectURL: () =&amp;gt; string;
 getTokenURL: () =&amp;gt; string;
 getUserAgentApplication: (serviceName: string) =&amp;gt; unknown;
 };
 OAuth2Client: {
 FromParameters: (options: Record&amp;lt;string, unknown&amp;gt;) =&amp;gt; 
 unknown;
 FromUserAgentApplication: (userAgentApplicationId: string) 
 =&amp;gt; unknown;
 fetch: (url: string, options?: Record&amp;lt;string, unknown&amp;gt;) =&amp;gt; 
 unknown;
 };
 ThemeDisplay: {
 getCompanyGroupId: () =&amp;gt; number;
 getPathThemeImages: () =&amp;gt; string;
 getPortalURL: () =&amp;gt; string;
 getScopeGroupId: () =&amp;gt; number;
 getSiteGroupId: () =&amp;gt; number;
 isSignedIn: () =&amp;gt; boolean;
 };
 authToken: string;
 on: (событие: строка, обратный вызов: (...args: unknown[]) =&amp;gt; void) 
 =&amp;gt; void;
 fire: (событие: строка, данные?: unknown) =&amp;gt; void;
}

const Liferay: LiferayType =
 (окно как любое другое).Liferay ||
 ({
 Язык: {
 get: (key: string) =&amp;gt; key,
 },
 OAuth2: {
 getAuthorizeURL: () =&amp;gt; '',
 getBuiltInRedirectURL: () =&amp;gt; '',
 getIntrospectURL: () =&amp;gt; '',
 getTokenURL: () =&amp;gt; '',
 getUserAgentApplication: (_serviceName: string) =&amp;gt; {},
 },
 OAuth2Client: {
 FromParameters: (_options: Record&amp;lt;string, unknown&amp;gt;) =&amp;gt; 
 ({}),
 FromUserAgentApplication: (_id: string) =&amp;gt; ({}),
 fetch: (_url: string, _options?: Record&amp;lt;string, unknown&amp;gt;)
 =&amp;gt; {},
 },
 ThemeDisplay: {
 getCompanyGroupId: () =&amp;gt; 20119, 
 getPathThemeImages: () =&amp;gt; ", 
 getPortalURL: () =&amp;gt; 'http://localhost:8080', 
 getScopeGroupId: () =&amp;gt; 20117, 
 getSiteGroupId: () =&amp;gt; 20117, 
 isSignedIn: () =&amp;gt; false, 
}, 
 authToken: ", 
 on: (_event: строка, _callback: (...аргументы: неизвестны[]) =&amp;gt; 
 void) =&amp;gt; {}, 
 запуск: (_event: строка, _data?: неизвестно) =&amp;gt; {}, 
 } как LiferayType);

По умолчанию используется Liferay.
&lt;/pre&gt;

&lt;p&gt;Он окажется для вас очень полезным, поскольку содержит типобезопасное определение объекта среды выполнения, которого в Liferay нет.&lt;/p&gt;

&lt;p&gt;Добавление недостающих заглушек в версию на TypeScript требует&amp;nbsp;&lt;em&gt;немного&lt;/em&gt;&amp;nbsp;больше усилий.&lt;/p&gt;

&lt;p&gt;Поскольку TypeScript обеспечивает соблюдение структуры, вам нужно убедиться, что ваш интерфейс соответствует&amp;nbsp;&lt;strong&gt;реальному&lt;/strong&gt;&amp;nbsp;глобальному объекту Liferay или, по крайней мере, тем его частям, которые фактически использует ваш компонент.&amp;nbsp;Это означает:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;&lt;strong&gt;Соответствующие сигнатуры методов&lt;/strong&gt;&amp;nbsp;(например, какие параметры&amp;nbsp;&lt;code&gt;Liferay.OAuth2Client.fetch()&lt;/code&gt;&amp;nbsp;ожидает)&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Совпадающие возвращаемые типы&lt;/strong&gt;&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Включая все вложенные сервисы или пространства имён&lt;/strong&gt;&amp;nbsp;ваш компонент зависит от&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Если вы допустите ошибку, ваш компонент может пройти локальную проверку типов, но при развертывании в Liferay будут возникать ошибки.&lt;/p&gt;

&lt;p&gt;Так где же найти настоящие определения?&amp;nbsp;Самый простой способ, который я нашёл, — использовать&amp;nbsp;&lt;strong&gt;консоль браузера:&lt;/strong&gt;&amp;nbsp;Открыть DevTools → ввести&amp;nbsp;&lt;code&gt;Liferay&lt;/code&gt;&amp;nbsp;→ развернуть.&amp;nbsp;Я знаю, это может показаться странным, но если посмотреть на исходный код Liferay, то можно увидеть, что JS-код разбросан по всему коду и объединяется во время выполнения, поэтому бывает сложно найти нужные фрагменты.&lt;/p&gt;

&lt;p&gt;Вам не нужно копировать весь объект, достаточно того, что ваш компонент будет работать локально с соблюдением типобезопасности.&lt;/p&gt;

&lt;h2&gt;&lt;strong&gt;Подведение Итогов&lt;/strong&gt;&lt;/h2&gt;

&lt;p&gt;Этот небольшой шаблон, простая заглушка&amp;nbsp;&lt;code&gt;Liferay.js&lt;/code&gt;&amp;nbsp;(или&amp;nbsp;&lt;code&gt;liferay.ts&lt;/code&gt;) оказалась невероятно полезной для меня при создании&amp;nbsp;&lt;strong&gt;локальных пользовательских элементов, которые зависят от глобального объекта Liferay&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Это позволяет мне:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;Разрабатывайте и тестируйте локально на полной скорости&lt;/li&gt;
	&lt;li&gt;Не создавайте портал каждый раз заново&lt;/li&gt;
	&lt;li&gt;Используйте синтаксис&amp;nbsp;&lt;code&gt;||&lt;/code&gt;, чтобы моя заглушка работала локально, но при развёртывании автоматически ссылалась на&amp;nbsp;&lt;em&gt;реальную&lt;/em&gt;&amp;nbsp;&lt;code&gt;window.Liferay&lt;/code&gt;&amp;nbsp;заглушку&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Кратко и ясно, но очень практично.&lt;/p&gt;

&lt;p&gt;Если вы когда-либо сталкивались с трудностями при локальной разработке пользовательских элементов, интегрированных в Liferay, надеюсь, эта статья немного облегчит вам жизнь.&lt;/p&gt;</summary>
    <dc:creator>Бодрова Надежда</dc:creator>
    <dc:date>2025-11-19T08:54:00Z</dc:date>
  </entry>
  <entry>
    <title>Адаптивная навигация в Liferay</title>
    <link rel="alternate" href="https://liferay.ru/en/c/blogs/find_entry?p_l_id=1557&amp;entryId=9085663" />
    <author>
      <name>Бодрова Надежда</name>
    </author>
    <id>https://liferay.ru/en/c/blogs/find_entry?p_l_id=1557&amp;entryId=9085663</id>
    <updated>2025-11-29T09:04:32Z</updated>
    <published>2025-11-12T08:57:00Z</published>
    <summary type="html">&lt;p&gt;На конференции DEVCON 2025 я проведу практический семинар, посвященный созданию единообразной, доступной и полностью адаптивной навигации с использованием&amp;nbsp;&lt;strong&gt;фрагментов адаптивного меню&lt;/strong&gt;&amp;nbsp;Liferay.&amp;nbsp;Семинар посвящен практическим методам, которые вы можете сразу же применить в реальных проектах, будь то разработка макетов для нескольких сайтов или улучшение навигации на разных устройствах.&lt;/p&gt;

&lt;h2&gt;&lt;b&gt;Сведения о Сеансе&lt;/b&gt;&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Название&lt;/strong&gt;: Адаптивная навигация в Liferay: мастер-класс по использованию адаптивных фрагментов меню&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Когда: среда, 19 ноября, 13:50 по центральноевропейскому времени&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Где: Главная сцена&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Полную программу мероприятия можно посмотреть здесь:&lt;/p&gt;

&lt;p&gt;https://events.liferay.com/event/DEVCON2025/agenda&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h2&gt;&lt;b&gt;Что охватывает Сессия&lt;/b&gt;&lt;/h2&gt;

&lt;p&gt;&lt;b&gt;На занятии основное внимание уделяется рекомендациям, которые вы можете сразу же применить в своих проектах на Liferay:&lt;/b&gt;&lt;/p&gt;

&lt;h3&gt;&lt;b&gt;1. Установка адаптивных фрагментов меню&lt;/b&gt;&lt;/h3&gt;

&lt;p&gt;&lt;b&gt;Как получить их на торговой площадке Liferay и подготовить свою среду.&lt;/b&gt;&lt;/p&gt;

&lt;h3&gt;&lt;b&gt;2. Интеграция меню в мастер-страницы&lt;/b&gt;&lt;/h3&gt;

&lt;p&gt;&lt;b&gt;Настройка фрагментов для единообразной навигации по страницам и макетам.&lt;/b&gt;&lt;/p&gt;

&lt;h3&gt;&lt;b&gt;3. Настройка поведения и внешнего вида&lt;/b&gt;&lt;/h3&gt;

&lt;p&gt;&lt;b&gt;Точки останова, липкость, выравнивание меню, обработка логотипа, взаимодействие с мобильными устройствами и многое другое.&lt;/b&gt;&lt;/p&gt;

&lt;h3&gt;&lt;b&gt;4. Доступность и удобство использования на мобильных устройствах&lt;/b&gt;&lt;/h3&gt;

&lt;p&gt;&lt;b&gt;Навигация с помощью клавиатуры, рекомендации по использованию ARIA и шаблоны для корректной работы на маленьких экранах.&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Почему адаптивные меню так важны&lt;/b&gt;&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Навигация часто является первым взаимодействием пользователя с сайтом Liferay.&amp;nbsp;Если меню плохо адаптируется под разные устройства, недоступно или работает нестабильно, это негативно сказывается на общем впечатлении.&amp;nbsp;Фрагменты адаптивного меню представляют собой многократно используемую настраиваемую основу, которая повышает качество и сокращает время сборки.&lt;/p&gt;

&lt;h2&gt;&lt;b&gt;Ресурсы для Сеанса&lt;/b&gt;&lt;/h2&gt;

&lt;h3&gt;&lt;b&gt;Практическая рабочая тетрадь&lt;/b&gt;&lt;/h3&gt;

&lt;p&gt;Упражнения, использованные во время занятия&lt;/p&gt;

&lt;p&gt;https://github.com/peterrichards-lr/devcon2025-a-мастер-класс-по-использованию-фрагментов-адаптивного-меню&lt;/p&gt;

&lt;h3&gt;&lt;b&gt;Liferay Marketplace — адаптивные фрагменты меню&lt;/b&gt;&lt;/h3&gt;

&lt;p&gt;Предварительно установите фрагменты в свой экземпляр&lt;/p&gt;

&lt;p&gt;https://marketplace.liferay.com/p/responsive-menu-fragments&lt;/p&gt;

&lt;h3&gt;&lt;b&gt;Исходный код&lt;/b&gt;&lt;/h3&gt;

&lt;p&gt;Пример реализации этих и других фрагментов&lt;/p&gt;

&lt;p&gt;https://github.com/peterrichards-lr/liferay-fragments/tree/main/responsive-menus&lt;/p&gt;

&lt;h2&gt;&lt;b&gt;Присоединяйтесь ко мне на DEVCON 2025&lt;/b&gt;&lt;/h2&gt;

&lt;p&gt;Если вы работаете с навигацией, дизайном страниц, мастер-страницами или многосайтовым UX, этот курс предоставит вам практический инструментарий для создания адаптивных и доступных меню для ваших проектов.&lt;/p&gt;

&lt;p&gt;Я с нетерпением жду встречи с вами в среду в 13:50 по центральноевропейскому времени на главной сцене.&lt;/p&gt;</summary>
    <dc:creator>Бодрова Надежда</dc:creator>
    <dc:date>2025-11-12T08:57:00Z</dc:date>
  </entry>
</feed>

