©Sergey Emelyanov 2025 | Alle Rechte vorbehalten
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.
Die Kernklassen Vtiger_Record_Model
(Methoden getImageDetails()
und getFileDetails()
) liefern zwar Dateiinformationen, doch das Standard-API gibt diese nicht aus. Eine Integration erfordert:
Erstellen Sie versteckte Felder im Zielmodul (z. B. Contacts):
Feldname | Zweck |
---|---|
image_avatar | Speichert Avatar-URL |
images_list | Liste 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);
}
}
?>
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
}
}
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() ?? [];
}
}
?>
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']);
}
{
"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"
}
]
}
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:
Bei Fragen oder Anpassungswünschen kontaktieren Sie uns gerne!
📌 Tipp: Testen Sie Änderungen stets in einer Staging-Umgebung vor dem Produktiveinsatz.
©Sergey Emelyanov 2025 | Alle Rechte vorbehalten