. Интеграция Kerio Connect в 1C Битрикс Корпоративный Портал
Интеграция Kerio Connect в 1C Битрикс Корпоративный Портал

Интеграция Kerio Connect в 1C Битрикс Корпоративный Портал

Задача: Добавить почтовый веб-интерфейс Kerio в КП, да не просто добавить а интегрировать, и производить обмен информацией между системами.

Решение: Решения я изначально видел два: Первое , долгое и тернистое, НО в конечном итоге качественное и гибкое.

Интерфейс керио выполнен на PHP, загружаясь в браузер он обменивается с сервером по API используя Аякс, запросы выполняются в json'e.С первого взгляда всё просто пишем в битриксе интерфейс используем уже готовый API для получения полноценного интерфейса Керио WebMail.Но, во первых, для тех кто не видел код керио:

Кусок любого кода Kerio в студию!

Как видите здесь всё "понятно" и "просто" не правда ли? PHP код выглядит так же, с зашифрованными названиями функций и переменных.

Увиденная картина уже вызывает отвращение к первому варианту, ведь это всё предстоит понять.А теперь решение.

Второе , быстрое и незамысловатое, по пути которого я и пошел, НО меня не покидают смутные сомнения, не приду ли я в тупик.

В этом решении нам поможет библиотека jquery и естественно iframe.

Дальше буду описывать свои действия по мере выполнения, возможно кому-нибудь поможет это, так как я не нашел похожих тем, которые помогли бы мне, и надеюсь на адекватную критику и советы.

Добавил в header.php шаблона КП загрузку библиотеки jquery

и кнопку в виде дива с фиксированной позицией, она пока что будет у меня прилеплена справа, а так же не много стиля, что бы выглядела по человечески

ну и конечно же его величество керио во фрейме

что бы фрейм принимал размеры окна и плавно появлялся при вызове его.

И вот у нас уже есть керио в битриксе, вроде бы чего еще хотеть.

Давайте для начала захотим видеть на кнопке количество не прочитанных писем.

Ого вот тут начинается самое интересное.Для тех кто не знает что такое

Same Origin Policy

ЦитатаПолитика одного источника работает так: при загрузке документа из одного источника, скрипт, загруженный из другого источника, не может получить или установить конкретные свойства конкретного браузера и объектов HTML в окне или фрэйме.

Проще говоря я не могу простым парсингом вытягивать информацию из фрейма, мне не позволит это сделать браузер.

Однако есть решение :

Обмен между фреймом и родительским документом JS предлагает вести с помощью некой функции

Важные моменты:- стандарт HTML5- работает в браузерах Firefox 3.5, Opera 10, Safari 4.0/Chrome 3.0+, Internet Explorer 8.0, соответственно и выше.

Мне подойдет Оперу я отрицаю, а в офисе стоит FF и IE последних версий, сам использую Хром. 8)

Итак у нас есть канал обмена данных между двумя системами в одно окне браузера это функция postMessage() Спасибо JavaScript, угодило. Кратко о работе функции, пример для тех кто не знаком с ней:

Функция может отправлять строку в фрейм и из фрейма.

Отправка в фрейм:

© Взято и слегка откоректировано с javascript.ru

Итак вернёмся к нашему кериву.

Хотим мы значит видеть на кнопке количество непрочитанных сообщений.

Моем руки и лезем в код керио, в файлик index2.htmlчто бы не потеряться я добавил туда комменты, а между ними вставил ссылки на библиотеку jq и мой скрипт интеграции.

дальше открываем сам керио в браузере и (я это делал с помощью инструментов разработчика Chrome) ищем нужную нам информацию

Находим её в диве имеющем класс mailMsgCount

Это очень хорошо, что в этом диве только число, вот везение, осталось только взять и отправить в родительский фрейм на кнопку.

Цитатаnukemonk пишет:вам необходим именно jQ 2 ?это не очень хороший метод подключения либы, можно столкнуться с конфликтом, если она будет подключаться где-то ещё.лучше использовать CUtil::InitJSCore('jquery'); будет подключена из поставки битрикса.ну и подключение стилей и скриптов лучше делать с помощью апи, а не напрямую.

Для проверки достаточно.

Идём в битриксДобавляем в кнопку поле для количества писем

И дописываем скрипт который будет принимать все сообщения керио

Работает на ура

А значит так можно производить обмен всей информации между сервисами.

Я продолжу описывать свои действия по как можно чаще.

для наглядности скрины

Цитатаnukemonk пишет:вам необходим именно jQ 2 ?это не очень хороший метод подключения либы, можно столкнуться с конфликтом, если она будет подключаться где-то ещё.лучше использовать CUtil::InitJSCore('jquery'); будет подключена из поставки битрикса.ну и подключение стилей и скриптов лучше делать с помощью апи, а не напрямую. Цитатаnukemonk пишет:я уже написал про конфликт, когда будут подключены две версии jQ, например. одна в шаблоне, другая где-нибудь в компоненте. будет неприятно. ЦитатаАнтон Долганин пишет:Вендор сам когда хочет может сменить версию jquery. ЦитатаАнтон Долганин пишет:Да и порой верстка проекта сделана под иную версию jquery.

Спасибо за подсказку nukemonk, заменил

а так же добавил ссылку на файл со скриптом интеграции в таком виде

.Итак продолжу описание

Имея прямой кросбраузерный канал обмена данными между фреймами, можно уже делать всё что душе угодно!А далее мне угодно сделать автоматическую авторизацию, т.к. всем известно что пользователи ленивы на запоминание, а тем более на ввод пароля.Сразу понятно что запоминание пароля на уровне браузера дело бессмысленно, т.к. пересев за чужой компьютер вне доменной сети уже придётся вводить пароль снова. Поэтому требуется держать пароль в базе битрикса, логином будет служить стандартное поле E-mail, которое заполняется автоматически из AD.

Первое над чем я стал мучатся это рыть форумы как создать пользовательское поле, типа password, и что бы оно не отображалось при просмотре личных данных пользователя.

Где задать тип поля я так и не нашел, по этому до сих пор смотрю в сторону костыля - используя jq при загрузке страницы менять тип поля.А вот что бы оно не отображалось в профиле пользователя, но при открытии пользователем редактирования своего профиля это поле присутствовало я нашел решение =)

А теперь по пунктам:

В пользовательских полях я создал поле с характерным названием UF_EMAIL_PASSWORD , которое является строкой и относится к объекту USER , потом поняв что через интерфейс битрикса я не могу сделать это поле видимым только для пользователя, пришлось залезть в шаблон:

здесь меня заинтересовал массив полей MAIN

он повторяется дважды вернее выводится по разному при условии наличия модуля bitrix24

Как видно добавил это поле и в первом и во втором случае.(Сначала я добавил только в первый массив, который выводится в случае наличия модуля bitrix24, но видимо модуля этого у меня нет т.к. поле не было выведено)

А так же добавил в параметрах компонента это поле в "Редактируемые свойства".

Как видите получилось, поле появилось в нужном месте, и видно только пользователю при редактировании профиля, но оно не имеет тип password

И вот у нас уже есть заветная пара логин и пароль, перейдём к передачи её в фрейм с Kerio и выполним авторизацию автоматически.

📎📎📎📎📎📎📎📎📎📎