<?php
|
|
/**
|
|
* Class provides connection to a-real redmine api.
|
|
* Use class_bitrix_to_redmine
|
|
*
|
|
* @package redmine_api
|
|
* @author Mikhail Grebenkin <mix@m14xa.ru>
|
|
*/
|
|
|
|
class class_redmine {
|
|
protected $redmine_key = '';
|
|
protected $redmine_url = '';
|
|
|
|
/**
|
|
* Upload $filecontent and return token.
|
|
*
|
|
* @param mixed $filecontent - content of file
|
|
* @return mixed $token is object, string can be obtained in $token->upload->token
|
|
*/
|
|
function get_upload_token($filecontent) {
|
|
$upload_url = $this->redmine_url.'uploads.json?key='.$this->redmine_key;
|
|
$request['type'] = 'post';
|
|
$request['content_type'] = 'application/octet-stream';
|
|
return $token = $this->curl_redmine($upload_url,$request,$filecontent);
|
|
}
|
|
|
|
/**
|
|
* Uploads an attachment, attaches it to an issue and returns updated issue
|
|
*
|
|
* @param string $issue_id numeric id of issue to attach file
|
|
* @param string $filename name of file
|
|
* @param string $filetype type of content i.e. "image/png"
|
|
* @param mixed $filecontent content of file.
|
|
* @return mixed $issue updated issue
|
|
*/
|
|
function upload_attachment(string $issue_id, string $filename, string $filetype, $filecontent){
|
|
$token = $this->get_upload_token($filecontent);
|
|
if (!$token) {
|
|
return null;
|
|
}
|
|
$upload_token = $token->upload->token;
|
|
return $this->attach_to_issue($issue_id,$upload_token, $filename, $filetype);
|
|
}
|
|
|
|
/**
|
|
* Download an attachment or thumbnail
|
|
*
|
|
* @param string $attachment_id numeric id of attachment
|
|
* @param bool $thumbnail if true downloading thumbnail
|
|
|
|
* @return mixed $filecontent - content of file
|
|
*/
|
|
function download_attachment(string $attachment_id, bool $thumbnail=false) {
|
|
if ($thumbnail) {
|
|
$file_url = $this->redmine_url.'attachments/thumbnail/'.$attachment_id.'?key='.$this->redmine_key;
|
|
return file_get_contents($file_url);
|
|
} else {
|
|
$at_url = $this->redmine_url.'attachments/'.$attachment_id.'.json?key='.$this->redmine_key;
|
|
$at_descr = $this->curl_redmine($at_url);
|
|
if (!$at_descr) {
|
|
return null;
|
|
}
|
|
var_dump($at_descr);
|
|
$file_url = $this->redmine_url.'attachments/download/'.
|
|
$attachment_id.'/'.$at_descr->attachment->filename.'?key='.$this->redmine_key;
|
|
return file_get_contents($file_url);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Create issue
|
|
*
|
|
* @param $post_data - string to post to redmine (need to update)
|
|
* @return mixed $issue - new data
|
|
*/
|
|
function create_issue($post_data) {
|
|
$issue_url = $this->redmine_url.'issues.json?key='.$this->redmine_key;
|
|
$request['type'] = 'post';
|
|
$request['content_type'] = 'application/json';
|
|
return $this->curl_redmine($issue_url,$request,$post_data);
|
|
}
|
|
|
|
/**
|
|
* get issue
|
|
*
|
|
* @param string $issue_id numeric issue id
|
|
* @param string $project_id numeric project id
|
|
* @param array $inc array of string with options to include. Example: array( 0 => "journals", 1 => "attachments" );
|
|
* @return mixed $issue - new data
|
|
*/
|
|
function get_issue(string $issue_id='',string $project_id='', array $inc=array()) {
|
|
if (count($inc) > 0) {
|
|
$inc = implode(",", $inc);
|
|
$inc = '&include='.$inc;
|
|
} else {
|
|
$inc = '';
|
|
}
|
|
if($project_id!='') {
|
|
$issue_url = $this->redmine_url.'issues.json?key='.$this->redmine_key.'&project_id='.$project_id.$inc;
|
|
}else{
|
|
$issue_url = ($issue_id=='')
|
|
?$this->redmine_url.'issues.json?key='.$this->redmine_key.$inc
|
|
: $this->redmine_url.'issues/'.$issue_id.'.json?key='.$this->redmine_key.$inc;
|
|
}
|
|
return $this->curl_redmine($issue_url);
|
|
}
|
|
|
|
/**
|
|
* get issue
|
|
*
|
|
* @param string $issue_id digits only issue id
|
|
* @param string $upload_token digits only project id
|
|
* @param string $upload_token
|
|
* @param array $inc array of string with options to include. Example: array( 0 => "journals", 1 => "attachments" );
|
|
* @return mixed $issue - new data
|
|
*/
|
|
function attach_to_issue(string $issue_id,string $upload_token, string $filename, string $filetype) {
|
|
$issue_url = $this->redmine_url.'issues/'.$issue_id.'.json?key='.$this->redmine_key;
|
|
$update = array( "issue" => array(
|
|
"uploads"=> array( 0 => array("token" => $upload_token,
|
|
"filename" => $filename,
|
|
"content_type"=> $filetype)
|
|
),
|
|
)
|
|
);
|
|
$request['type'] = 'put';
|
|
$request['content_type'] = 'application/json';
|
|
|
|
$post_data = json_encode($update);
|
|
return $this->curl_redmine($issue_url, $request , $post_data);
|
|
}
|
|
|
|
/**
|
|
* add comment to issue
|
|
*
|
|
* @param string $issue_id digits only issue id
|
|
* @param string $comment comment to add to the issue
|
|
* @return mixed $issue - new data
|
|
*/
|
|
function post_issue_comment(string $issue_id,string $comment) {
|
|
$issue_url = $this->redmine_url.'issues/'.$issue_id.'.json?key='.$this->redmine_key;
|
|
$update = array( "issue" => array(
|
|
"notes"=> $comment,
|
|
)
|
|
);
|
|
$request['type'] = 'put';
|
|
$request['content_type'] = 'application/json';
|
|
|
|
$post_data = json_encode($update);
|
|
return $this->curl_redmine($issue_url, $request , $post_data);
|
|
}
|
|
|
|
|
|
//Projects
|
|
function get_projects($project_id='') {
|
|
$proj_url = ($project_id=='')?$this->redmine_url.'projects.json?key='.$this->redmine_key : $this->redmine_url.'projects/'.$project_id.'.json?key='.$this->redmine_key;
|
|
return $this->curl_redmine($proj_url);
|
|
}
|
|
|
|
//Contacts
|
|
function get_contacts() {
|
|
$cont_url = $this->redmine_url.'contacts.json?key='.$this->redmine_key;
|
|
return $this->curl_redmine($cont_url);
|
|
}
|
|
|
|
function search_contacts_str(string $search_str) {
|
|
$cont_url = $this->redmine_url.'contacts.json?key='.$this->redmine_key.'&search='.$search_str;
|
|
return $this->curl_redmine($cont_url);
|
|
}
|
|
|
|
function get_contact_id(string $id, bool $issues) {
|
|
$cont_url = ($issues)
|
|
? $this->redmine_url."contacts/$id.json?key=".$this->redmine_key.'&include=issues'
|
|
: $this->redmine_url."contacts/$id.json?key=".$this->redmine_key;
|
|
echo($cont_url);
|
|
return $this->curl_redmine($cont_url);
|
|
}
|
|
|
|
function create_contact(array $contact) {
|
|
$cont_url = $this->redmine_url.'contacts.json?key='.$this->redmine_key;
|
|
$request['type'] = 'post';
|
|
$request['content_type'] = 'application/json';
|
|
$post_data = json_encode($contact);
|
|
return $this->curl_redmine($cont_url,$request,$post_data);
|
|
}
|
|
|
|
/**
|
|
* attach contact to issue
|
|
*
|
|
* @param string $issue_id digits only issue id
|
|
* @param string $contact_id digits only contact id
|
|
* @return mixed $issue - new data
|
|
*/
|
|
function attach_issue_to_contact(string $issue_id,string $contact_id) {
|
|
$contact_url = $this->redmine_url."contacts/".$contact_id."?key=".$this->redmine_key;
|
|
$update = array( "contact" => array(
|
|
"issues"=> array( 0=> array("id" => $issue_id))
|
|
)
|
|
);
|
|
$request['type'] = 'put';
|
|
$request['content_type'] = 'application/json';
|
|
|
|
$post_data = json_encode($update);
|
|
return $this->curl_redmine($contact_url, $request , $post_data);
|
|
}
|
|
|
|
function create_ticket(string $contact_id, string $subject, string $description) {
|
|
$issue_url = $this->redmine_url."helpdesk/create_ticket.xml?key=".$this->redmine_key;
|
|
$issue = array( "ticket" => array (
|
|
"issue" => array(
|
|
"project_id" => "xtesx",
|
|
"tracker_id" => "3",
|
|
"subject" => $subject,
|
|
"description"=> $description,
|
|
),
|
|
"contact" => array ("id" => $contact_id),
|
|
));
|
|
$issue_xml = "<?xml version=\"1.0\"?>
|
|
<ticket>
|
|
<issue>
|
|
<project_id></project_id>
|
|
<tracker_id>3</tracker_id>
|
|
<subject>$subject</subject>
|
|
<description>$description</description>
|
|
</issue>
|
|
<contact>
|
|
<id>$contact_id</id>
|
|
</contact>
|
|
</ticket>";
|
|
$request['type'] = 'post';
|
|
$request['content_type'] = 'application/xml';
|
|
return $this->curl_redmine($issue_url, $request, $issue_xml );
|
|
}
|
|
|
|
//Curl
|
|
function curl_redmine(string $redmine_url,array $request=array(),string $post_data='') {
|
|
if(!isset($request['type'])){ $request['type']=null; }
|
|
if(!isset($request['content_type'])){ $request['content_type']=null; }
|
|
//Create a curl object
|
|
$ch = curl_init();
|
|
//Set the useragent
|
|
//$agent = $_SERVER["HTTP_USER_AGENT"];
|
|
//curl_setopt($ch, CURLOPT_USERAGENT, $agent);
|
|
|
|
//Set the URL
|
|
curl_setopt($ch, CURLOPT_URL, $redmine_url );
|
|
if($request['type'] == 'post'){
|
|
//This is a POST query
|
|
curl_setopt($ch, CURLOPT_POST,1);
|
|
curl_setopt($ch, CURLOPT_POSTFIELDS,$post_data);
|
|
|
|
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
|
|
'Content-Type: '.$request['content_type'],
|
|
'Content-Length: ' . strlen($post_data))
|
|
);
|
|
} elseif ($request['type'] == 'put') {
|
|
//This is a PUT query
|
|
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
|
|
curl_setopt($ch, CURLOPT_POSTFIELDS,$post_data);
|
|
|
|
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
|
|
'Content-Type: '.$request['content_type'],
|
|
'Content-Length: ' . strlen($post_data))
|
|
);
|
|
}
|
|
//We want the content after the query
|
|
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
|
|
|
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
|
|
|
|
//Follow Location redirects
|
|
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
|
|
|
|
//curl_setopt($ch, CURLOPT_HEADER, true);
|
|
|
|
/*
|
|
Set the cookie storing files
|
|
Cookie files are necessary since we are logging and session data needs to be saved
|
|
*/
|
|
|
|
//curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt');
|
|
//curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie.txt');
|
|
|
|
//Execute the action to login
|
|
$postResult = curl_exec($ch);
|
|
echo(curl_getinfo($ch, CURLINFO_HTTP_CODE));
|
|
// for debug purposes
|
|
// if($postResult == false){ return $info = curl_getinfo($ch);}
|
|
$response = json_decode($postResult);
|
|
return $response;
|
|
}
|
|
|
|
}//class_redmine
|
|
|
|
class class_bitrix_to_redmine extends class_redmine {
|
|
protected $redmine_key = '68692662158cb38c8fddb8e084b6dfd55d77b85c';
|
|
protected $redmine_url = 'https://tracker.a-real.ru/';
|
|
|
|
function send_contact($data){
|
|
$contact = array("contact" => array("first_name" => $data['last_name'],
|
|
"project_id" => "managers",
|
|
"phone" => $data["phone_work"],
|
|
"email" => $data['webtolead_email1']
|
|
)
|
|
);
|
|
return $this->create_contact($contact);
|
|
}
|
|
}
|
|
|
|
?>
|
Powered by TurnKey Linux.