Справка TeamWoxЧатПубличная частьПример PHP

Пример публичной части на PHP

В данном разделе приводится расширенный пример оформления публичной части модуля "Чат" с использованием языка PHP. Данный пример включает в себя реализацию дополнительной возможности получения информации о присутствии сотрудников онлайн в группах обслуживания.

Пояснения к примеру

В следующей строке примера указывается адрес, на который будут посылаться запросы:

define("TEAMWOX_HOST", "your.domain.com");

Необходимо заменить адрес "your.domain.com" на адрес вашей системы TeamWox. Внутренняя страница TeamWox, к которой обращается код, указывается в следующей строке:

$query = "GET /public/chat/groups?json HTTP/1.1\r\n";

Обращение происходит к странице /public/chat/group, результат возвращается в формате JSON. Именно с этой страницы запрашивается список доступных групп обслуживания, а также их статус онлайн/оффлайн.

Полный код

Ниже приведен полный код реализации публичной части:

<?php
  define("TEAMWOX_HOST", "your.domain.com");
  /**
   * проверка строки в hex формате
   *
   * @param string $hex
   * @return boolean true если строка в hex формате, иначе false
   */
  function is_hex($hex)
    {
    // обработка строки
    $hex = strtolower(trim(ltrim($hex, "0")));
    if (empty($hex))
      {
      $hex = 0;
      }
    $dec = hexdec($hex);
    return ($hex == dechex($dec));
    }
 
  /**
   * сборка чанков http 'transfer-encoding: chunked'
   *
   * @param string $chunk исходная строка
   * @return string строка с объединенными чанками
   */
  function http_chunked_decode($chunk)
    {
    $pos = 0;
    $len = strlen($chunk);
    $dechunk = null;
    //--- в цикле получаем чанки и соединяем
    while (($pos < $len) && ($chunk_len_hex = substr($chunk, $pos, ($new_line_at = strpos($chunk, "\n", $pos + 1)) - $pos)))
      {
      if (!is_hex($chunk_len_hex))
        {
        trigger_error('Не правильное число', E_USER_WARNING);
        return $chunk;
        }
      //--- информация о следующем чанке
      $pos = $new_line_at + 1;
      $chunk_len = hexdec(rtrim($chunk_len_hex, "\r\n"));
      //--- объединение чанков
      $dechunk .= substr($chunk, $pos, $chunk_len);
      $pos = strpos($chunk, "\n", $pos + $chunk_len) + 1;
      }
    return $dechunk;
    }
 
  /**
   * Функция получения данных обо всех группах и их статусах
   * @return object
   */
  function MQ_Query_get_chat_group()
    {
    //--- открываем сокет к TEAMWOX_HOST 443-й порт с таймаутом в 30 секунд
    $socket = fsockopen(TEAMWOX_HOST, 80, $errno, $errstr, 30);
    if (!$socket)
      {
      trigger_error($errstr, E_USER_WARNING);
      return false;
      }
    //--- создадим запрос
    $query = "GET /public/chat/groups?json HTTP/1.1\r\n";
    $query .= "Host: " . TEAMWOX_HOST . "\r\n";
    $query .= "User-agent: Web-site\r\n";
    $query .= "Connection: Close\r\n\r\n";
    //--- пишем в сокет запрос
    fwrite($socket, $query);
    //--- получаем ответ
    $answer = '';
    while (!feof($socket))
      {
      $answer .= fgets($socket, 4096);
      }
    //--- закрываем сокет
    fclose($socket);
    //--- проверяем ответ
    $pos = strpos($answer, "\r\n\r\n");
    if ($pos > 0)
      {
      //--- нашли тело ответа
      $body = substr($answer, $pos + 4);
      $body = http_chunked_decode($body);
      return json_decode($body);
      }
    return false;
    }
 
  /**
   * Функция для вывод статусов
   * @return void
   */
  function MQ_Print_status()
    {
    $data = MQ_Query_get_chat_group();
    if (empty($data)) return;
    //---
    if (empty($data->groups)) return;
    foreach ($data->groups as $info)
      {
      if (empty($info)) continue;
      //--- вывод статуса
      echo $info->name, " ", ($info->online == 1 ? "on-line" : "off line"), "<br>\r\n";
      }
    }
 
  //--- вызов функция отображения статусов
  MQ_Print_status();
?>