Dokumente/Notizen im Vtiger einem Eintrag über den Webservice erstellen

Hy!

Da sich bei Version 5.3 vom vTiger CRM momentan noch relativ wenig tut und die Entwickler für Ende des Jahres einen Release Candidate angekündigt haben, habe ich wiedermal ein Problem selbst gelöst.

Meine Aufgabe war es, die folgende Frage zu lösen: „Warum kann ich kein Dokument über den Webservice mit einem anderem Eintrag verbinden?“

Gesagt getan, hab ich den Sourcecode durchwühlt. Immer auf der Suche nach einem Anhaltspunkt, warum das Feld „parent_id“ über den Webservice nicht ausgewertet wird, welches eigentlich für diesen Zusammenhang verantwortlich ist.

Schuld daran ist der Umstand, dass auch der Anwender diesen Zusammenhang nicht setzen kann, wenn er ein Dokument erstellt. Erst in einem zweiten Schritt wäre dies möglich.
Aber auch dieser zweite Schritt ist über den WS leider nicht möglich.

Da der Lösung des Problems eigentlich nicht besonders viel Zeit zugedacht wurden ist, (Warum sollte diese Verbindung auch nicht funkionieren?) musste es schnell gehen.
Da ich nicht erst suchen wollte, wie ich ein Feld erstellen kann, welches eine Verbindung aufbaut und vom WS genutzt werden kann, habe ich mich für eine relativ schnelle, allerdings wahrscheinlich SEHR unsaubere Lösung entschieden.
Daher möchte ich mich schon vorher für dafür entschuldigen, was ich da getan habe. 😉

Nun also zur Lösung:

Es sind nur zwei Schritte notwendig:

/modules/Documents/Documents.php [Line ~27]

Suche:

var $tab_name = Array('vtiger_crmentity','vtiger_notes');
var $tab_name_index = Array('vtiger_crmentity'=>'crmid','vtiger_notes'=>'notesid');

Daraus machen wir:

var $tab_name = Array('vtiger_crmentity','vtiger_notes','vtiger_senotesrel');
var $tab_name_index = Array('vtiger_crmentity'=>'crmid','vtiger_notes'=>'notesid','vtiger_senotesrel'=>'notesid');

/data/CRMEntity.php [Line ~61]

Suche:

if($table_name == "vtiger_crmentity")
{
    $this->insertIntoCrmEntity($module,$fileid);

} else {

    $this->insertIntoEntityTable($table_name, $module,$fileid);
}

Daraus machen wir:

if($table_name == "vtiger_crmentity")
{
     $this->insertIntoCrmEntity($module,$fileid);

/** Added by SWarnat (2011-09-16) **/
} elseif($module == "Documents" && $table_name == "vtiger_senotesrel" && !empty($this->column_fields["parentid"])) {
    $sql = "INSERT INTO vtiger_senotesrel SET crmid = '".intval(substr($this->column_fields["parentid"],2))."', notesid = '".(int)$this->id."'";
    $this->db->query($sql);
} else {
/** ENDE changed by SWarnat**/
    $this->insertIntoEntityTable($table_name, $module,$fileid);
}

Ich hoffe ich konnte euch trotz der Art und weise, wie es implementiert wurde, etwas helfen. Das Hauptziel wurde erreicht und ich kann jetzt über den Webservice in dem Feld parent_id ein Record im Format „<tabid>x<recordid>“ übergeben, welches auch genutzt wird.

Getestet habe ich es allerdings nur mit externen Dokumenten, welche ich extern über eine URL aufrufen kann. Bei internen Dokumenten kommen wir dann wahrscheinlich doch endgültig an die Grenze des WS.

Ich bin natürlich offen gegenüber anderen Lösungswegen, welche es sicherlich gibt.

Weiterhin viel Spaß mit dem Tiger!

Stefan

Schreibe einen Kommentar