You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

468 lines
18 KiB

<?php
if (!defined('ABSPATH'))
exit;
include_once ( plugin_dir_path(__FILE__) . 'vendor/autoload.php' );
class CF7GSC_googlesheet {
private $token;
private $spreadsheet;
private $worksheet;
/////=========desktop app
const clientId_desk = '1075324102277-drjc21uouvq2d0l7hlgv3bmm67er90mc.apps.googleusercontent.com';
const clientSecret_desk = 'RFM9hElCqJMsXyc8YNjhf9Zs';
/////=========web app
const clientId_web = '1075324102277-mdac3ljkp964kie3usoc8qj28laen2tb.apps.googleusercontent.com';
const clientSecret_web = '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';
private static $instance;
public function __construct() {
}
public static function setInstance(Google_Client $instance = null) {
self::$instance = $instance;
}
public static function getInstance() {
if (is_null(self::$instance)) {
throw new LogicException("Invalid Client");
}
return self::$instance;
}
//constructed on call
public static function preauth($access_code) {
$newClientSecret = get_option('is_new_client_secret_cf7gscfree');
$clientId = ($newClientSecret == 1) ? CF7GSC_googlesheet::clientId_web : CF7GSC_googlesheet::clientId_desk;
$clientSecret = ($newClientSecret == 1) ? CF7GSC_googlesheet::clientSecret_web : CF7GSC_googlesheet::clientSecret_desk;
$client = new Google_Client();
$client->setClientId($clientId);
$client->setClientSecret($clientSecret);
$client->setRedirectUri('https://oauth.gsheetconnector.com');
$client->setScopes(Google_Service_Sheets::SPREADSHEETS);
$client->setScopes(Google_Service_Drive::DRIVE_METADATA_READONLY);
$client->setScopes(Google_Service_Oauth2::USERINFO_EMAIL);
$client->setAccessType('offline');
$client->fetchAccessTokenWithAuthCode($access_code);
$tokenData = $client->getAccessToken();
CF7GSC_googlesheet::updateToken($tokenData);
}
public static function updateToken($tokenData) {
$expires_in = isset($tokenData['expires_in']) ? intval($tokenData['expires_in']) : 0;
$tokenData['expire'] = time() + $expires_in;
try {
if (isset($tokenData['scope'])) {
$permission = explode(" ", $tokenData['scope']);
if ((in_array("https://www.googleapis.com/auth/drive.metadata.readonly", $permission)) && (in_array("https://www.googleapis.com/auth/spreadsheets", $permission))) {
update_option('gs_verify', 'valid');
} else {
// update_option('gs_verify', 'Something went wrong! It looks you have not given the permission of Google Drive and Google Sheets from your google account.Please Deactivate Auth and Re-Authenticate again with the permissions.');
update_option('gs_verify','invalid-auth');
}
}
$tokenJson = json_encode($tokenData);
update_option('gs_token', $tokenJson);
} catch (Exception $e) {
Gs_Connector_Utility::gs_debug_log("Token write fail! - " . $e->getMessage());
}
}
public function auth() {
$tokenData = json_decode(get_option('gs_token'), true);
if (!isset($tokenData['refresh_token']) || empty($tokenData['refresh_token'])) {
throw new LogicException("Auth, Invalid OAuth2 access token");
exit();
}
try {
$newClientSecret = get_option('is_new_client_secret_cf7gscfree');
$clientId = ($newClientSecret == 1) ? CF7GSC_googlesheet::clientId_web : CF7GSC_googlesheet::clientId_desk;
$clientSecret = ($newClientSecret == 1) ? CF7GSC_googlesheet::clientSecret_web : CF7GSC_googlesheet::clientSecret_desk;
$client = new Google_Client();
$client->setClientId($clientId);
$client->setClientSecret($clientSecret);
$client->setScopes(Google_Service_Sheets::SPREADSHEETS);
$client->setScopes(Google_Service_Drive::DRIVE_METADATA_READONLY);
$client->setScopes(Google_Service_Oauth2::USERINFO_EMAIL);
$client->refreshToken($tokenData['refresh_token']);
$client->setAccessType('offline');
CF7GSC_googlesheet::updateToken($tokenData);
self::setInstance($client);
} catch (Exception $e) {
throw new LogicException("Auth, Error fetching OAuth2 access token, message: " . $e->getMessage());
exit();
}
}
public function get_user_data() {
$client = self::getInstance();
$results = $this->get_spreadsheets();
echo '<pre>';
print_r($results);
echo '</pre>';
$spreadsheets = $this->get_worktabs('1mRuDMnZveDFQrmzHM9s5YkPA4F_dZkHJ1Gh81BvYB2k');
echo '<pre>';
print_r($spreadsheets);
echo '</pre>';
$this->setSpreadsheetId('1mRuDMnZveDFQrmzHM9s5YkPA4F_dZkHJ1Gh81BvYB2k');
$this->setWorkTabId('Foglio1');
$worksheetTab = $this->list_rows();
echo '<pre>';
print_r($worksheetTab);
echo '</pre>';
}
//preg_match is a key of error handle in this case
public function setSpreadsheetId($id) {
$this->spreadsheet = $id;
}
public function getSpreadsheetId() {
return $this->spreadsheet;
}
public function setWorkTabId($id) {
$this->worksheet = $id;
}
public function getWorkTabId() {
return $this->worksheet;
}
public function add_row($data) {
try {
$client = self::getInstance();
$service = new Google_Service_Sheets($client);
$spreadsheetId = $this->getSpreadsheetId();
$work_sheets = $service->spreadsheets->get($spreadsheetId);
if (!empty($work_sheets) && !empty($data)) {
foreach ($work_sheets as $sheet) {
$properties = $sheet->getProperties();
$sheet_id = $properties->getSheetId();
$worksheet_id = $this->getWorkTabId();
if ($sheet_id == $worksheet_id) {
$worksheet_id = $properties->getTitle();
$worksheetCell = $service->spreadsheets_values->get($spreadsheetId, $worksheet_id . "!1:1");
$insert_data = array();
if (isset($worksheetCell->values[0])) {
foreach ($worksheetCell->values[0] as $k => $name) {
if (isset($data[$name]) && $data[$name] != '') {
$insert_data[] = $data[$name];
} else {
$insert_data[] = '';
}
}
}
/* RASHID */
$tab_name = $worksheet_id;
$full_range = $tab_name . "!A1:Z";
$response = $service->spreadsheets_values->get($spreadsheetId, $full_range);
$get_values = $response->getValues();
if ($get_values) {
$row = count($get_values) + 1;
} else {
$row = 1;
}
$range = $tab_name . "!A" . $row . ":Z";
$range_new = $worksheet_id;
// Create the value range Object
$valueRange = new Google_Service_Sheets_ValueRange();
// set values of inserted data
$valueRange->setValues(["values" => $insert_data]);
// Add two values
// Then you need to add configuration
//$conf = ["valueInputOption" => "USER_ENTERED"];
$conf = ["valueInputOption" => "USER_ENTERED"];
// append the spreadsheet(add new row in the sheet)
$result = $service->spreadsheets_values->append($spreadsheetId, $range, $valueRange, $conf);
}
}
}
} catch (Exception $e) {
return null;
exit();
}
}
public function add_multiple_row($data) {
try {
$client = self::getInstance();
$service = new Google_Service_Sheets($client);
$spreadsheetId = $this->getSpreadsheetId();
$work_sheets = $service->spreadsheets->get($spreadsheetId);
if (!empty($work_sheets) && !empty($data)) {
foreach ($work_sheets as $sheet) {
$properties = $sheet->getProperties();
$sheet_id = $properties->getSheetId();
$worksheet_id = $this->getWorkTabId();
if ($sheet_id == $worksheet_id) {
$worksheet_id = $properties->getTitle();
$worksheetCell = $service->spreadsheets_values->get($spreadsheetId, $worksheet_id . "!1:1");
$insert_data = array();
$final_data = array();
if (isset($worksheetCell->values[0])) {
foreach ($data as $key => $value) {
foreach ($worksheetCell->values[0] as $k => $name) {
if (isset($value[$name]) && $value[$name] != '') {
$insert_data[] = $value[$name];
} else {
$insert_data[] = '';
}
}
$final_data[] = $insert_data;
unset($insert_data);
}
}
//$range_new = $worksheet_id;
/* RASHID */
$tab_name = $worksheet_id;
$full_range = $tab_name . "!A1:Z";
$response = $service->spreadsheets_values->get($spreadsheetId, $full_range);
$get_values = $response->getValues();
if ($get_values) {
$row = count($get_values) + 1;
} else {
$row = 1;
}
$range = $tab_name . "!A" . $row . ":Z";
$sheet_values = $final_data;
if (!empty($sheet_values)) {
$requestBody = new Google_Service_Sheets_ValueRange([
'values' => $sheet_values
]);
$params = [
'valueInputOption' => 'USER_ENTERED'
];
$response = $service->spreadsheets_values->append($spreadsheetId, $range, $requestBody, $params);
}
}
}
}
} catch (Exception $e) {
return null;
exit();
}
}
//get all the spreadsheets
public function get_spreadsheets() {
$all_sheets = array();
try {
$client = self::getInstance();
$service = new Google_Service_Drive($client);
$optParams = array(
'q' => "mimeType='application/vnd.google-apps.spreadsheet'"
);
$results = $service->files->listFiles($optParams);
foreach ($results->files as $spreadsheet) {
if (isset($spreadsheet['kind']) && $spreadsheet['kind'] == 'drive#file') {
$all_sheets[] = array(
'id' => $spreadsheet['id'],
'title' => $spreadsheet['name'],
);
}
}
} catch (Exception $e) {
return null;
exit();
}
return $all_sheets;
}
//get worksheets title
public function get_worktabs($spreadsheet_id) {
$work_tabs_list = array();
try {
$client = self::getInstance();
$service = new Google_Service_Sheets($client);
$work_sheets = $service->spreadsheets->get($spreadsheet_id);
foreach ($work_sheets as $sheet) {
$properties = $sheet->getProperties();
$work_tabs_list[] = array(
'id' => $properties->getSheetId(),
'title' => $properties->getTitle(),
);
}
} catch (Exception $e) {
return null;
exit();
}
return $work_tabs_list;
}
/**
* Function - Adding custom column header to the sheet
* @param string $sheet_name
* @param string $tab_name
* @param array $gs_map_tags
* @since 1.0
*/
public function add_header($sheetname, $tabname, $final_header_array, $old_header) {
$client = self::getInstance();
$service = new Google_Service_Sheets($client);
$spreadsheetId = $this->getSpreadsheetId();
$work_sheets = $service->spreadsheets->get($spreadsheetId);
$field_tag_array[] = '';
if (!empty($work_sheets)) {
foreach ($work_sheets as $sheet) {
$properties = $sheet->getProperties();
$sheet_id = $properties->getSheetId();
$worksheet_id = $this->getWorkTabId();
if ($sheet_id == $worksheet_id) {
$worksheet_title = $properties->getTitle();
$field_tag = isset($_POST['gf-custom-ck']) ? $_POST['gf-custom-ck'] : array();
$field_tag_key = isset($_POST['gf-custom-header-key']) ? $_POST['gf-custom-header-key'] : "";
$field_tag_placeholder = isset($_POST['gf-custom-header-placeholder']) ? $_POST['gf-custom-header-placeholder'] : "";
$field_tag_column = isset($_POST['gf-custom-header']) ? $_POST['gf-custom-header'] : "";
if (!empty($field_tag)) {
foreach ($field_tag as $key => $value) {
$gf_key = $field_tag_key[$key];
$gf_val = (!empty($field_tag_column[$key]) ) ? $field_tag_column[$key] : $field_tag_placeholder[$key];
if ($gf_val !== "") {
$field_tag_array[$gf_key] = $gf_val;
$gravityform_tags[] = $gf_val;
}
}
}
$range = $worksheet_title . '!1:1';
$values = array(array_values(array_filter($field_tag_array)));
$count_old_header = (!empty($old_header)) ? (count($old_header)) : 0;
$count_new_header = (!empty($final_header_array)) ? (count($final_header_array)) : 0;
$data_values = array();
// If old header count is greater than new header count than empty the header
if ($count_old_header !== 0 && $count_old_header > $count_new_header) {
for ($i = 0; $i <= $count_old_header; $i++) {
$column_name = isset($final_header_array[$i]) ? $final_header_array[$i] : "";
if ($column_name !== "") {
$data_values[] = $column_name;
} else {
$data_values[] = "";
}
}
} else {
foreach ($final_header_array as $column_name) {
$data_values[] = $column_name;
}
}
$values = array($data_values);
$requestBody = new Google_Service_Sheets_ValueRange([
'values' => $values
]);
$params = [
'valueInputOption' => 'USER_ENTERED'
];
$response = $service->spreadsheets_values->update($spreadsheetId, $range, $requestBody, $params);
}
}
}
}
public function gsheet_print_google_account_email() {
try {
$google_account = get_option("cf7gf_email_account");
if ($google_account) {
return $google_account;
} else {
$google_sheet = new CF7GSC_googlesheet();
$google_sheet->auth();
$email = $google_sheet->gsheet_get_google_account_email();
return $email;
}
} catch (Exception $e) {
return false;
}
}
public function gsheet_get_google_account_email() {
$google_account = $this->gsheet_get_google_account();
if ($google_account) {
return $google_account->email;
} else {
return "";
}
}
public function gsheet_get_google_account() {
try {
$client = $this->getInstance();
if (!$client) {
return false;
}
$service = new Google_Service_Oauth2($client);
$user = $service->userinfo->get();
} catch (Exception $e) {
Gs_Connector_Utility::gs_debug_log(__METHOD__ . " Error in fetching user info: \n " . $e->getMessage());
return false;
}
return $user;
}
public static function revokeToken_auto($access_code){
$newClientSecret = get_option('is_new_client_secret_cf7gscfree');
$clientId = ($newClientSecret == 1) ? CF7GSC_googlesheet::clientId_web : CF7GSC_googlesheet::clientId_desk;
$clientSecret = ($newClientSecret == 1) ? CF7GSC_googlesheet::clientSecret_web : CF7GSC_googlesheet::clientSecret_desk;
$client = new Google_Client();
$client->setClientId( $clientId );
$client->setClientSecret( $clientSecret );
$tokendecode = json_decode($access_code);
$token = $tokendecode->access_token;
$client->revokeToken( $token );
}
}