Der Artikel im Linux-Magazin beschreibt, wie die neue Cloud-API in Sugar CRM Dropbox und Pidgin nutzen kann, um die Instant-Messaging-Kommunikation innerhalb des Customer Relationship Managements abzulegen und sie einem Kontakt oder Kunden zuordnet. Dieser Online-Plus-Artikel beschreibt, wie dabei Open Auth und die Archivierung der Dropbox-Inhalte von statten geht.
Weil Sugar dabei auch die Authentifizierung mit Open Auth [9] an Dropbox übernimmt, sollte sich der Admin damit eigentlich nicht weiter beschäftigen müssen. Allerdings gibt es einige Dropbox-spezifische Teile des Handshakes, die er hier erzwingen muss. In »ExtAPI/DropboxPidgin.php« sollte nach
public function oauthLogin() {
if(isset($_SESSION[‘eapm_oauth_secret’]) \
&& isset($_SESSION[‘eapm_oauth_token’]) \
&& isset($_REQUEST[‘oauth_token’]) && \
isset($_REQUEST[‘uid’])) {
[…]
den »oauth_verifier« zurück geben. Leider klappt das nicht so bei Dropbox, Der Callback geht im Handshake unter. Individuelle Änderungen am »oauth_callback«-Parameter sind hier nötig. Der folgende Code prüft die User-ID, um sicherzustellen, dass die erste Stufe des Handshakes geklappt hat:
$callback_url = ‘&action=oauth&record=’.\
$this->eapmBean->id;
$callback_url = $this->formatCallbackURL\
($callback_url);
$callback_url = $sugar_config[‘site_url’].’/index\
.php?module=EAPM’.urlencode($callback_url);
[…]
SugarApplication::redirect(“{$authReq}?oauth_\
token={$request_token_info[‘oauth_token’]}\
&oauth_callback=”.$callback_url);
Archivieren
Im nächsten Schritt soll ein Protokoll der Kommunikation mit dem Kunden angelegt werden. Analog zum Ajax-Aufruf, der eingangs eine Liste abrief, soll jetzt die zu definierende »ext_archiveLog«-Funktion dienen:
custom/modules/Connectors/connectors/formatters/ext/rest/dropboxpidgin/tpls/default.tpl
function archiveLog(logPath){
YAHOO.util.Connect.asyncRequest(‘POST’, ‘index.php’, {
success: function(o){
var data = YAHOO.lang.JSON.parse(o.responseText);
if (data.success == true){
alert(‘Log has been archived as a note.’);
//reload subpanel – the true forces a reload
showSubPanel(‘history’,null,true,dropboxpidginModule);
} else {
alert(‘Error archiving log: ‘+data.errorMessage);
}
document.getElementById(‘dropboxpidgin_popup_div’).style.display = ‘none’;
},
failure: function(o){
alert(‘Error archiving log’);
}
}
,”module=Connectors&action=CallConnectorFunc&source_id=ext_rest_dropboxpidgin&source_func=archiveLog&archiveModule=”+dropboxpidginModule+”&archiveRecord=”+dropboxpidginRecord+”&archivePath=”+logPath);
}
Die URL enthält hier einige wichtige Parameter: Das gesuchte Modul, die Record ID und den Pfad zum File auf Dropbox. Sobald der Server die Meldung zurückgibt, die Archivierung sei erfolgreich verlaufen, startet Sugar »showSubPanel«, was im Webfrontend die Liste unter dem entsprechenden Eintrag aktualisiert und anzeigt.
Auf der Serverseite findet hier ein Abruf der Datei bei Dropbox statt. Deren Inhalte speichert Sugar als Notiz, die mit dem Kontakt oder Eintrag verknüpft ist:
custom/include/externalAPI/DropboxPidgin/ExtAPI/DropboxPidgin.php
public function archiveLog($module, $record, $path)
{
$response = array();
try {
//get the file from Dropbox
//See https://www.dropbox.com/developers/reference/api#files-GET
$params = array();
$urlPath = ‘files/sandbox’.$path;
$response = $this->getFileRequest(“GET”, $urlPath, $params);
} catch (Exception $e) {
$GLOBALS[‘log’]->fatal($e->getMessage());
return array(‘success’=>FALSE,’errorMessage’=>$e->getMessage());
}
Eine interne Funktion ruft Dropbox auf und extrahiert die Inhalte der Datei plus einige Metadaten.
//save as a note and attached to the appropriate record
//first load the parent bean
global $beanList, $current_user;
//Generic method of loading a bean
$parent_bean = new $beanList[$_REQUEST[‘archiveModule’]];
Hier dient eine allgemeine Methode zum Laden einer “bean” (einem Datenobjekt), basierend auf dem für Sugar notwendigen Modulparameter.
require_once(‘modules/Notes/Note.php’);
$note = new Note();
$note->parent_id = $record;
//Need to capture special handling for a Contact note
if($parent_bean->module_dir == ‘Contacts’) {
$note->contact_id = $record;
}
$note->assigned_user_id = $current_user->id;
$note->parent_type = $parent_bean->module_dir;
$note->name = $path;
$note->description = $response[‘content’];
$note->save();
if(!empty($note->id)) {
return array(‘success’=>TRUE);
} else {
return array(‘success’=>FALSE,’errorMessage’=>’Archived note failed to save.’);
}
}
Der letzte Teil des Listings erstellt die Notiz und verknüpft sie mit dem Eintrag. Das Skript prüft, ob die Notiz einen ID-Eintrag besitzt und erstellt ihn bei Bedarf.




