Benutzerdefinierte Felder & API-Integration

Sie können eine unbegrenzte Anzahl an benutzerdefinierten Feldern zu einzelnen HireHop-Datensätzen (Aufträgen, Projekten, Betriebsmitteln, Prüfungen usw.) hinzufügen. Diese benutzerdefinierten Felder lassen sich nahtlos in Dokumentvorlagen einbinden. Wenn ein benutzerdefiniertes Feld in einem Datensatz vorhanden ist, wird es automatisch gefüllt; andernfalls bleibt es leer.

Derzeit werden benutzerdefinierte Felder vollständig unterstützt bei Aufträgen und Projekte unter Verwendung benutzerdefinierter JavaScript-Plugins.

Datenstruktur für benutzerdefinierte Felder

Beim Abrufen von Werten benutzerdefinierter Felder für einen aktiven Datensatz rufen Sie die Funktion _get_custom_field_value(field) auf. Sie gibt NULL zurück, wenn sie nicht festgelegt ist, einen einfachen string, oder eine strukturierte JavaScript object.

Für eine maximale Druckkontrolle in Dokumenten sollten benutzerdefinierte Felder als strukturiertes JSON-Objekt anstelle einer einfachen Zeichenkette gespeichert werden:

"field_name" :
   {
      "value"  : "The value of the field",
      "type"   : "The field type, default is text, it can also be number, currency, text, date, html and array"
      "format" : "For date type only, eg "ddd, dddddd tt" // = "Mon, 1 January 2017 12:00"
   }

Objektschlüssel & Unterstützte Formate

ParameterTypBeschreibung
WertBeliebigDie rohen Felddaten, gespeichert in einem beliebigen gültigen JavaScript-Format.
TypZeichenketteTeilt HireHop mit, wie die Daten in Dokumenten dargestellt werden sollen. Unterstützte Typen: text (Standard), number, currency, date, html und array (wird als JSON gerendert).
FormatZeichenketteNur Datumstypen. Legt die Datums-/Uhrzeitausgabeformatierung basierend auf dem Gebietsschema des Benutzers fest.

Regeln für die Datumsformatierung

Datumswerte müssen im Format yyyy-mm-dd hh:mm gespeichert werden. Sie können die folgenden Token und benutzerdefinierte Trennzeichen kombinieren:

  • dddddd – Langes Datum (z. B. 1. Januar 2026)
  • ddddd – Kurzes Datum (z. B. 01/01/2026)
  • dddd – Wochentag ausgeschrieben (z. B. Montag)
  • ddd – Wochentag abgekürzt (z. B. Mo)
  • tt – Uhrzeit (z. B. 12:36 Uhr)

Beispiel: dddd, dddddd tt ergibt “Montag, 1. Januar 2026 12:00”.

Benutzerdefinierte Felder speichern

Um aktualisierte Werte benutzerdefinierter Felder in unterstützten Bearbeitungsformularen zu speichern, verwenden Sie _save_custom_field_value(field, value).

  • Stapelverarbeitung: Alle Änderungen müssen vor dem Absenden der Formularspeicherung geschrieben werden. Neue Werte werden mit bestehenden Feldern zusammengeführt; übereinstimmende Schlüsselnamen überschreiben bestehende Werte.
  • Direkte API-Aufrufe: Beim direkten Aufrufen von Endpunkten wie /php_functions.job_save.php wird durch das Übergeben nur des custom_fields POST-Parameter aktualisieren die benutzerdefinierten Felder, während alle anderen Datensatzattribute unverändert bleiben.

Benennungs- und Druckkonventionen

  • Dokumenten-Zusammenführungs-Syntax: Stellen Sie in Dokumentvorlagen den Feldnamen einen einzelnen Unterstrich vorangestellt _. Ein benutzerdefiniertes Feld mit dem Namen field_name für einen Auftrag wird zum Beispiel zusammengeführt als job:_field_name.
  • Namensraum-Präfixe: Um Namenskonflikte bei verschiedenen Plugins oder Datensatztypen (z. B. gemeinsam genutzte Anlagen- und Testfelder) zu vermeiden, stellen Sie den Feldnamen einen eindeutigen Bezeichner voran (z. B. verwenden HireHop-Plugins hh_Field Name).
  • Groß-/Kleinschreibung: Dokumenten-Zusammenführungsetiketten sind nicht case-sensitive, aber JavaScript-Variablenverweise sind groß-/kleinschreibungsempfindlich.

Durchsuchbare benutzerdefinierte Felder

Das CUSTOM_INDEX Feld ist ein spezieller 45 Zeichen langer String-Wert (oder NULL) für benutzerdefinierte Suchen, Filterungen und Startseiten-Suchergebnisse reserviert.

Aktivieren der Startseiten-Suche

Um CUSTOM_INDEX in globale Suchspalten einzubeziehen, fügen Sie es an allSearchCols an und legen Sie das Label in Ihrem Plugin fest:

// Add CUSTOM_INDEX to search columns
if (allSearchCols.constructor === Array && doc_type == 0) {
  allSearchCols.push("CUSTOM_INDEX");
}

// Define display label if not set in language settings
if (typeof(lang["customIndexTxt"]) == "undefined" || lang["customIndexTxt"] == "") {
  lang["customIndexTxt"] = "Custom Field Name";
}

Anzeigen & Interagieren mit CUSTOM_INDEX

Blenden Sie auf Auftragsseiten das Kachelelement ein, um benutzerdefinierte Interaktionen einzubinden:

$("#job_tile_custom_index")
  .show()
  .click(function() {
    window.open("https://www.my_external_app.com?id=" + job_data["CUSTOM_INDEX"], "newwindow");
  });

Hinzufügen von CUSTOM_INDEX zum Bearbeiten von Widgets

Um Benutzern die Eingabe von CUSTOM_INDEX Werten im Auftragsbearbeitungs-Dialog zu ermöglichen, fügen Sie eine Formularzeile in das Widget ein:

if (typeof($.custom.job_edit) != "undefined") {
  $.widget("custom.job_edit", $.custom.job_edit, {
    _init_main: function() {
      this._super(arguments);
      
      // Inject custom field row into the edit table
      var table = this.default_disc.closest("table");
      var tr = $("<tr>").appendTo(table);
      
      $("<td>", { html: lang.customIndexTxt + " :" }).appendTo(tr);
      $("<input>", {
        "name": "custom_index",
        "class": "data_cell",
        "data-field": "CUSTOM_INDEX",
        "maxlength": 45
      }).appendTo($("<td>").appendTo(tr));
      
      // Adjust layout spacing
      this.job_edit_memo.height(110);
    }
  });
}

Hinweis: Referenzieren Sie dieses Feld in Dokumenten als xxx:custom_index.

Globale benutzerdefinierte Felder

Um unternehmensweite globale Einstellungen oder Zähler zu speichern, verwenden Sie die Endpunkte für globale benutzerdefinierte Felder (/php_functions/custom_fields_global_load.php und /php_functions/custom_fields_global_save.php):

$("#saving_dialog").dialog("open");

$.ajax({
  url: "/php_functions/custom_fields_global_save.php",
  type: "post",
  dataType: "json",
  data: {
    "fields": { "my_field": "any type of value" }
  },
  success: function(data) {
    $("#saving_dialog").dialog("close");
    if (typeof(data.error) !== "undefined") {
      error_message(isNaN(parseInt(data.error)) ? data.error : lang.error[data.error]);
    } else {
      // Returns JSON object containing all global custom fields
    }
  },
  error: function(jqXHR, textStatus, errorThrown) {
    $("#saving_dialog").dialog("close");
    error_message(lang.error[1] + " (" + errorThrown + ").");
  }
});

Einstellungen vs. API-benutzerdefinierte Felder

Felder erstellt in Einstellungen > Benutzerdefinierte Felder teilen genau dieselbe zugrundeliegende Datenbankabfrage wie über die API eingespeiste benutzerdefinierte Felder. Das Einrichten eines Feldes in der Benutzeroberfläche stellt lediglich einen codelosen Builder bereit; das Löschen eines in der Benutzeroberfläche erstellten benutzerdefinierten Feldes löscht keine historischen Felddaten, die über die API weiterhin zugänglich bleiben.