Entwickler, der außergewöhnliche CRM- und Laravel-Lösungen liefert

Als erfahrener Entwickler spezialisiere ich mich auf Laravel- und Vue.js-Entwicklung, die Implementierung von Vtiger CRM sowie auf vielfältige WordPress-Projekte. Meine Arbeit zeichnet sich durch kreative, dynamische und benutzerzentrierte Weblösungen aus, die individuell an die Bedürfnisse meiner Kunden angepasst werden.

Das VtigerCRM-API bietet umfangreiche Möglichkeiten zur Datenabfrage, hat jedoch eine Lücke: Standardmäßig lassen sich weder Avatare (z. B. von Kontakten) noch angehängte Dokumente abrufen. In diesem Artikel zeigen wir, wie Sie diese Funktionalität durch gezielte Anpassungen nachrüsten.

Bilder und Dokumente im VtigerCRM-API integrieren – Eine Schritt-für-Schritt-Anleitung

Das VtigerCRM-API bietet umfangreiche Möglichkeiten zur Datenabfrage, hat jedoch eine Lücke: Standardmäßig lassen sich weder Avatare (z. B. von Kontakten) noch angehängte Dokumente abrufen. In diesem Artikel zeigen wir, wie Sie diese Funktionalität durch gezielte Anpassungen nachrüsten.

Problemstellung

Die Kernklassen Vtiger_Record_Model (Methoden getImageDetails() und getFileDetails()) liefern zwar Dateiinformationen, doch das Standard-API gibt diese nicht aus. Eine Integration erfordert:

  1. Systemfelder für Avatare/Dokumente
  2. API-Erweiterung zur automatischen Datenanreicherung

Schritt 1: Systemfelder anlegen

Erstellen Sie versteckte Felder im Zielmodul (z. B. Contacts):

FeldnameZweck
image_avatarSpeichert Avatar-URL
images_listListe der Dokumente

Codebeispiel (PHP-Skript):

<?php
// Skript: modules/Contacts/addSystemFields.php
$Vtiger_Utils_Log = true;
chdir('../');
require_once('vtlib/Vtiger/Module.php');

$module = Vtiger_Module::getInstance('Contacts');
if ($module) {
    $block = Vtiger_Block::getInstance('LBL_CUSTOM_INFORMATION', $module);
    if ($block) {
        // Avatar-Feld hinzufügen
        $field = new Vtiger_Field();
        $field->name = 'image_avatar';
        $field->label = 'LBL_AVATAR';
        $field->column = 'image_avatar';
        $field->columntype = 'VARCHAR(255)';
        $field->uitype = 1; // Textfeld
        $block->addField($field);

        // Dokumenten-Feld hinzufügen
        $field = new Vtiger_Field();
        $field->name = 'images_list';
        $field->label = 'LBL_DOCUMENTS';
        $field->column = 'images_list';
        $field->columntype = 'TEXT'; // Für JSON-Daten
        $field->uitype = 21; // Textbereich
        $block->addField($field);
    }
}
?>

Schritt 2: Systemblock ausblenden

Verstecken Sie den Block "System Information" für Benutzer:

Datei: modules/Vtiger/models/Block.php

// In Klasse Vtiger_Block_Model
public const SYSTEM_INFORMATION_LABEL = 'System Information';

public static function getAllForModule(...) {
    foreach ($blockObjects as $blockObject) {
        if ($blockObject->label === self::SYSTEM_INFORMATION_LABEL) {
            continue; // Block überspringen
        }
        // ... Originalcode
    }
}

Schritt 3: Serviceklasse erstellen

Datei: modules/Vtiger/services/ImageReceiver.php

<?php
class Vtiger_ImageReceiver_Service {
    const AVATAR_FIELD = 'image_avatar';
    const DOCUMENTS_FIELD = 'images_list';

    public function getAvatar(int $recordId): array {
        $recordModel = Vtiger_Record_Model::getInstanceById($recordId);
        return $recordModel->getImageDetails() ?? [];
    }

    public function getDocuments(int $recordId): array {
        $recordModel = Vtiger_Record_Model::getInstanceById($recordId);
        return $recordModel->getFileDetails() ?? [];
    }
}
?>

Schritt 4: API-Response erweitern

Datei: include/Webservices/DataTransform.php

// Nach require_once-Anweisungen:
require_once 'modules/Vtiger/services/ImageReceiver.php';

// In Funktion sanitizeDataWithColumn():
if (isset($row['image_avatar'])) {
    $service = new Vtiger_ImageReceiver_Service();
    $newRow['avatar'] = $service->getAvatar($row['id']);
}

if (isset($row['images_list'])) {
    $service = new Vtiger_ImageReceiver_Service();
    $newRow['documents'] = $service->getDocuments($row['id']);
}

Ergebnis im API-Response

{
    "id": "123",
    "firstname": "Max",
    "lastname": "Mustermann",
    "avatar": [
        {
            "url": "https://example.com/storage/avatar.png",
            "name": "avatar.png"
        }
    ],
    "documents": [
        {
            "name": "Vertrag.pdf",
            "url": "https://example.com/storage/vertrag.pdf"
        }
    ]
}

Bonus: Automatisierung per Skript

Das im Artikel beschriebene Skript addImagesListField.php fügt das Dokumentenfeld per CLI hinzu – ideal für DevOps-Pipelines.


Fazit
Mit diesen Anpassungen integrieren Sie Dateien nahtlos ins API. Beachten Sie:

  • Caching: Bei hohem Traffic empfiehlt sich ein CDN für Dateien.
  • Sicherheit: Validieren Sie Zugriffe via API-Tokens.

Bei Fragen oder Anpassungswünschen kontaktieren Sie uns gerne!

📌 Tipp: Testen Sie Änderungen stets in einer Staging-Umgebung vor dem Produktiveinsatz.