class and index
This commit is contained in:
parent
a6f8d863d5
commit
bd62c0fa3c
|
|
@ -0,0 +1,349 @@
|
|||
<?php
|
||||
|
||||
class ClientbaseAPI
|
||||
{
|
||||
|
||||
private $apiURL;
|
||||
private $token;
|
||||
|
||||
public function __construct($clientbaseURL, $token)
|
||||
{
|
||||
$this->apiURL = $clientbaseURL . "/api/dev";
|
||||
$this->token = $token;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Получить список пользовательских таблиц
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getTablesList()
|
||||
{
|
||||
$rawResult = $this->query("/table");
|
||||
$result = $this->_rawToResult($rawResult);
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Получить информацию о таблице
|
||||
* @param $tableId int id таблицы
|
||||
* @param $includeFields bool Получить информацию о полях таблицы
|
||||
* @return stdObject
|
||||
*/
|
||||
public function getTable($tableId, $includeFields = false)
|
||||
{
|
||||
$queryParams = $includeFields ? ['include' => 'fields'] : [];
|
||||
$rawResult = $this->query("/table/" . $tableId, "GET", $queryParams);
|
||||
$result = $this->_rawToResult($rawResult);
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Получить список записей таблицы
|
||||
*
|
||||
* @param $tableId int id таблицы
|
||||
* @param $offset int Отступ от начала списка
|
||||
* @param $limit int Количество элементов
|
||||
* @param $filter mixed Фильтр в виде строки или массива
|
||||
* @return array
|
||||
*/
|
||||
public function getDataList($tableId, $offset=0, $limit=0, $filter='')
|
||||
{
|
||||
$queryParams = ['page' => []];
|
||||
if ($offset) {
|
||||
$queryParams['page']['offset'] = $offset;
|
||||
}
|
||||
if ($limit) {
|
||||
$queryParams['page']['limit'] = $limit;
|
||||
}
|
||||
if ($filter) {
|
||||
$queryParams['filter'] = $filter;
|
||||
}
|
||||
|
||||
$rawResult = $this->query("/data" . $tableId, "GET", $queryParams);
|
||||
$result = $this->_rawToResult($rawResult);
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Получить информацию о записи в таблице
|
||||
*
|
||||
* @param $tableId int id таблицы
|
||||
* @param $lineId int id записи в таблице
|
||||
* @return stdObject
|
||||
*/
|
||||
public function getData($tableId, $lineId)
|
||||
{
|
||||
$rawResult = $this->query("/data" . $tableId . "/" . $lineId);
|
||||
$result = $this->_rawToResult($rawResult);
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Удалить запись из таблицы
|
||||
*
|
||||
* @param $tableId int id таблицы
|
||||
* @param $lineId int id записи в таблице
|
||||
*
|
||||
*/
|
||||
public function deleteData($tableId, $lineId)
|
||||
{
|
||||
$this->query("/data" . $tableId . "/" . $lineId, "DELETE");
|
||||
}
|
||||
|
||||
/**
|
||||
* Перевести массив с данными в формат, подходящий для отправки на сервер
|
||||
*
|
||||
* @param $data array Массив с данными для добавления/обновления записи в таблице
|
||||
* @return stdObject
|
||||
*/
|
||||
public function bodyFromData($data)
|
||||
{
|
||||
$body = new stdClass();
|
||||
$body->data = new stdClass();
|
||||
$body->data->attributes = (object) $data;
|
||||
|
||||
return $body;
|
||||
}
|
||||
|
||||
/**
|
||||
* Добавить строку в таблицу
|
||||
*
|
||||
* @param $tableId int id таблицы
|
||||
* @param $data array Данные для добавления
|
||||
* @return stdObject
|
||||
*/
|
||||
public function addData($tableId, $data)
|
||||
{
|
||||
$body = $this->bodyFromData($data);
|
||||
$body->data->type = "data" . $tableId;
|
||||
$rawResult = $this->query("/data" . $tableId . "/" . $lineId, "POST", "", $body);
|
||||
$result = $this->_rawToResult($rawResult);
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Обновить строку в таблице
|
||||
*
|
||||
* @param $tableId int id таблицы
|
||||
* @param $lineId int id записи в таблице
|
||||
* @param $data array Данные для обновления
|
||||
* @return stdObject
|
||||
*/
|
||||
public function updateData($tableId, $lineId, $data)
|
||||
{
|
||||
$body = $this->bodyFromData($data);
|
||||
$body->data->type = "data" . $tableId;
|
||||
$body->data->id = $lineId;
|
||||
$rawResult = $this->query("/data" . $tableId . "/" . $lineId, "PATCH", "", $body);
|
||||
$result = $this->_rawToResult($rawResult);
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Получить список пользователей
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getUsersList()
|
||||
{
|
||||
$rawResult = $this->query("/user");
|
||||
$result = $this->_rawToResult($rawResult);
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Получить информацию о пользователе
|
||||
*
|
||||
* @param $userId id пользователя
|
||||
* @return stdObject
|
||||
*/
|
||||
public function getUser($userId)
|
||||
{
|
||||
$rawResult = $this->query("/user/" . $userId);
|
||||
$result = $this->_rawToResult($rawResult);
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Получить список групп пользователей
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getGroupsList()
|
||||
{
|
||||
$rawResult = $this->query("/group");
|
||||
$result = $this->_rawToResult($rawResult);
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Получить информацию о группе пользователей
|
||||
*
|
||||
* @param $groupId id группы пользователей
|
||||
* @return stdObject
|
||||
*/
|
||||
public function getGroup($groupId)
|
||||
{
|
||||
$rawResult = $this->query("/group/" . $groupId);
|
||||
$result = $this->_rawToResult($rawResult);
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Получить информацию о файле
|
||||
*
|
||||
* @param $tableId id таблицы
|
||||
* @param $fieldId id поля таблицы
|
||||
* @param $lineId id записи таблицы
|
||||
* @param $fileName string Название файла
|
||||
* @return stdObject
|
||||
*/
|
||||
public function getFile($tableId, $fieldId, $lineId, $fileName)
|
||||
{
|
||||
$rawResult = $this->query("/file/" . $tableId . "/" . $fieldId . "/" . $lineId . "/" . $fileName);
|
||||
$result = $this->_rawToResult($rawResult);
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Произвольный запрос к API
|
||||
*
|
||||
* @param $path string адрес запроса
|
||||
* @param $method string метод запроса
|
||||
* @param $urlQuery array GET-параметры запроса в виде массива
|
||||
* @param $body stdObject данные для запросов POST, PATCH
|
||||
* @return stdObject
|
||||
*/
|
||||
public function query($path, $method="GET", $urlQuery = [], $body = null)
|
||||
{
|
||||
$requestURL = $this->apiURL . $path;
|
||||
|
||||
if ($urlQuery) {
|
||||
$urlQueryLine = http_build_query($urlQuery);
|
||||
$requestURL .= "?" . $urlQueryLine;
|
||||
}
|
||||
|
||||
//echo "<br/><br/>URL: [" . $method . "] " . $requestURL . "<br/><br/>";
|
||||
|
||||
if ($body) {
|
||||
$body = json_encode($body);
|
||||
//echo $body;
|
||||
}
|
||||
|
||||
$out = $this->_sendRequest($requestURL, $method, $body);
|
||||
$result = json_decode($out);
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Преобразование полученных данных в удобный формат
|
||||
*
|
||||
* @param $rawResult stdObject Данные, полученные по API
|
||||
* @return mixed
|
||||
* @throws HttpException
|
||||
*/
|
||||
private function _rawToResult($rawResult)
|
||||
{
|
||||
$result = null;
|
||||
|
||||
if (!empty($rawResult->data)) {
|
||||
$result = $rawResult->data;
|
||||
if (is_array($result)) {
|
||||
foreach ($result as $k => $item) {
|
||||
$result[$k] = $this->_simpleData($item);
|
||||
}
|
||||
} else {
|
||||
$result = $this->_simpleData($result);
|
||||
if (!empty($rawResult->included)) {
|
||||
foreach ($rawResult->included as $includedItem) {
|
||||
$type = $includedItem->type;
|
||||
$itemId = $includedItem->id;
|
||||
if (!isset($result->$type)) {
|
||||
$result->$type = [];
|
||||
}
|
||||
$includedItem = $this->_simpleData($includedItem);
|
||||
$result->$type[$itemId] = $includedItem;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Преобразование полученных данных в удобный формат
|
||||
*
|
||||
* @param $rawResult stdObject Данные, полученные по API
|
||||
* @return mixed
|
||||
* @throws HttpException
|
||||
*/
|
||||
private function _simpleData($data)
|
||||
{
|
||||
if ($data->meta) {
|
||||
foreach ($data->meta as $key => $metaItem) {
|
||||
$data->$key = $metaItem;
|
||||
}
|
||||
}
|
||||
|
||||
return $data;
|
||||
}
|
||||
|
||||
/**
|
||||
* Отправка запроса
|
||||
*
|
||||
* @param $requestURL string URL обращения к API
|
||||
* @param $method string метод запроса
|
||||
* @param $body mixed тело запроса
|
||||
* @return mixed
|
||||
* @throws HttpException
|
||||
*/
|
||||
private function _sendRequest($requestURL, $method="GET", $body=null)
|
||||
{
|
||||
if ($curl = curl_init()) {
|
||||
|
||||
curl_setopt($curl, CURLOPT_URL, $requestURL);
|
||||
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
|
||||
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
|
||||
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
|
||||
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);
|
||||
|
||||
if ($body) {
|
||||
|
||||
curl_setopt($curl, CURLOPT_POSTFIELDS, $body);
|
||||
|
||||
}
|
||||
|
||||
$headers = [
|
||||
'Content-Type: application/vnd.api+json',
|
||||
'X-Auth-Token: ' . $this->token
|
||||
];
|
||||
|
||||
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
|
||||
$out = curl_exec($curl);
|
||||
curl_close($curl);
|
||||
|
||||
return $out;
|
||||
|
||||
} else {
|
||||
throw new HttpException('Can not create connection to ' . $requestURL, 404);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,163 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* Пример работы с API CRM "Клиентская База"
|
||||
*
|
||||
* В скрипте приведены примеры вызова функций API с помощью класса ClientbaseAPI
|
||||
*
|
||||
* ВНИМАНИЕ! Скрипт работает с реальными данными вашей CRM.
|
||||
*
|
||||
*/
|
||||
|
||||
//Подключаем класс для работы с API
|
||||
require_once "../api/dev/ClientbaseAPI.php";
|
||||
|
||||
//Укажите URL вашей "Клиентской Базы"
|
||||
$url = 'http://localhost/distr';
|
||||
|
||||
//Укажите токен, который вы создали для работы с API в настройках "Клиентской Базы"
|
||||
$token = "P8O49OmRKgjh8EVmfCSkvKbBtyFiQpVnj0vDzNolr8xLbgdC";
|
||||
|
||||
//Создаем объект для работы с API
|
||||
$cbAPI = new ClientbaseAPI($url, $token);
|
||||
|
||||
?>
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Language" content="ru">
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||
<title>API CRM "Клиентская База" - пример использования</title>
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.0.0/dist/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous"/>
|
||||
<link rel="shortcut icon" href="//clientbase.ru/favicon.ico">
|
||||
<style>
|
||||
h1 {margin: 45px 0px;}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<?
|
||||
|
||||
$action = $_GET['action'];
|
||||
|
||||
switch ($action) {
|
||||
|
||||
case "delete":
|
||||
$tableId = $_GET['table_id'];
|
||||
$lineId = $_GET['line_id'];
|
||||
//Удаляем запись $lineId из таблицы $tableId
|
||||
$cbAPI->deleteData($tableId, $lineId);
|
||||
break;
|
||||
|
||||
case "save":
|
||||
$tableId = $_GET['table_id'];
|
||||
$lineId = $_GET['line_id'];
|
||||
$data = $_POST['data'];
|
||||
//Обновляем запись $lineId в таблице $tableId
|
||||
$cbAPI->updateData($tableId, $lineId, $data);
|
||||
break;
|
||||
|
||||
case "add":
|
||||
$tableId = $_GET['table_id'];
|
||||
$data = $_POST['data'];
|
||||
//Добавляем запись в таблицу $tableId
|
||||
$cbAPI->addData($tableId, $data);
|
||||
break;
|
||||
|
||||
|
||||
}
|
||||
|
||||
$display = $_GET['display'];
|
||||
|
||||
switch ($display) {
|
||||
|
||||
case "table":
|
||||
$tableId = $_GET['table_id'];
|
||||
//Получаем информацию о таблице $tableId, включая поля таблицы
|
||||
$table = $cbAPI->getTable($tableId, true);
|
||||
//print_r($table);
|
||||
//Получаем последние 10 записей таблицы $tableId
|
||||
$tableData = $cbAPI->getDataList($tableId, 0, 10);
|
||||
|
||||
echo '<h1>Таблица "' . $table->attributes->table_name . '"</h1>';
|
||||
echo '<table class="table">';
|
||||
echo '<thead><tr>';
|
||||
foreach ($table->fields as $field) {
|
||||
if ($field->attributes->view_tb) {
|
||||
echo '<th>' . $field->attributes->field_name . '</th>';
|
||||
}
|
||||
}
|
||||
echo '<td></td><td></td></tr></thead>';
|
||||
if ($tableData) {
|
||||
echo '<tbody>';
|
||||
foreach ($tableData as $data) {
|
||||
echo '<tr>';
|
||||
foreach ($table->fields as $field) {
|
||||
if ($field->attributes->view_tb) {
|
||||
echo '<td>' . $data->attributes->{$field->attributes->int_name} . '</td>';
|
||||
}
|
||||
}
|
||||
echo '<td><a class="btn btn-info" href="?display=edit&table_id=' . $tableId . '&line_id=' . $data->id . '">Изменить</a></td>';
|
||||
echo '<td><a class="btn btn-danger" onClick="if (!confirm(\'Внимание! Вы удаляете данные из таблицы в CRM! Уверены, что хотите продолжить?\')) {return false;}" href="?display=table&table_id=' . $tableId . '&action=delete&line_id=' . $data->id . '">Удалить</a></td>';
|
||||
echo '</tr>';
|
||||
}
|
||||
echo '</tbody>';
|
||||
}
|
||||
echo '</table>';
|
||||
echo '<br/><br/><p><a class="btn btn-info" href="?display=edit&table_id=' . $tableId . '">Добавить запись</a></p>';
|
||||
echo '<br/><br/><p><a href="?">Вернуться к списку таблиц</a></p>';
|
||||
|
||||
break;
|
||||
|
||||
case "edit":
|
||||
$tableId = $_GET['table_id'];
|
||||
$lineId = $_GET['line_id'];
|
||||
//Получаем информацию о таблице $tableId, включая поля таблицы
|
||||
$table = $cbAPI->getTable($tableId, true);
|
||||
|
||||
if ($lineId) {
|
||||
//Получаем информацию о записи $lineId таблицы $tableId
|
||||
$data = $cbAPI->getData($tableId, $lineId);
|
||||
$formAction = '?action=save&display=table&table_id=' . $tableId . '&line_id=' . $lineId;
|
||||
echo '<h1>Редактирование записи</h1>';
|
||||
} else {
|
||||
$data = null;
|
||||
$formAction = '?action=add&display=table&table_id=' . $tableId;
|
||||
echo '<h1>Добавление записи</h1>';
|
||||
}
|
||||
|
||||
echo '<form action="' . $formAction . '" method="POST">';
|
||||
foreach ($table->fields as $field) {
|
||||
if ($field->attributes->view_tb && in_array($field->attributes->field_type, [1,3])) {
|
||||
$label = $field->attributes->field_name;
|
||||
$inputName = 'data[' . $field->attributes->int_name . ']';
|
||||
$inputValue = $data ? $data->attributes->{$field->attributes->int_name} : "";
|
||||
|
||||
echo '<div class="form-group">';
|
||||
echo '<label>' . $label . '</label>';
|
||||
echo '<div><input type="text" class="form-control" name="' . $inputName . '" value="' . $inputValue . '"/></div>';
|
||||
echo '</div>';
|
||||
}
|
||||
}
|
||||
echo '<div><input type="submit" value="Сохранить" class="btn btn-info" />';
|
||||
echo '</form>';
|
||||
echo '<br/><br/><p><a href="?display=table&table_id=' . $tableId . '">Вернуться к таблице</a></p>';
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
//Получаем список пользовательских таблиц
|
||||
$tables = $cbAPI->getTablesList();
|
||||
|
||||
echo '<h1>Таблицы</h1><ul>';
|
||||
foreach ($tables as $table) {
|
||||
echo '<li><a href="?display=table&table_id=' . $table->id . '">' . $table->attributes->table_name . '</a></li>';
|
||||
}
|
||||
echo '</ul>';
|
||||
|
||||
|
||||
}
|
||||
|
||||
?>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
Loading…
Reference in New Issue