Funktionsweise von Webhooks in HireHop

HireHop kann eine Nachricht mit Daten an andere Apps senden, wenn bestimmte Ereignisse innerhalb von HireHop ausgelöst werden. Diese Nachricht wird als Webhook bezeichnet, der die relevanten Daten automatisch an die gewünschte Stelle verschiebt.

WebhooksWas ist ein Webhook?

Ein Webhook sendet/pusht eine Nachricht mit an die Nachricht angehängten Daten, wenn bestimmte Dinge in HireHop passieren (ein Ereignis). Webhooks werden über HTTP gesendet (ruft eine Webadresse auf) und sind eine Möglichkeit, Daten in Echtzeit an andere Anwendungen zu senden. Webhooks liefern die relevanten Daten an bestimmte Anwendungen, während sie passieren, was bedeutet, dass die empfangende Anwendung Daten unmittelbar nach dem Ereignis erhält, was weitaus effizienter und schneller ist als das Abfragen von Datenänderungen.

HireHop-Webhooks können verwendet werden, um direkt mit anderen Apps zu kommunizieren oder an einen Konnektor wie Zapier gesendet werden, der die Daten formatieren und alle erforderlichen API-Rückrufe an HireHop oder an eine andere Anwendung durchführen kann.

Einrichten eines Webhooks

Gehen Sie in HireHop zu „Einstellungen“, klicken Sie dann auf die Registerkarte „Unternehmenseinstellungen“ und die Schaltfläche „Webhooks“ oben auf der Seite. Klicken Sie im Popup-Fenster auf die Schaltfläche „Neu“ und fügen Sie die URL hinzu, an die die Webhook-Nachricht gesendet werden soll, und wählen Sie jeden Webhook aus, auf den die URL antworten soll. Sie können beliebig viele Webhooks hinzufügen, sollten sie jedoch auf die notwendigen beschränken, auf die die jeweilige URL reagiert.

Ein HireHop-Webhook sendet Daten als JSON an Ihren URL-Endpunkt und enthält die folgenden oder ähnliche Daten.

{
    "time": "2022-03-29 07:50:42",
    "user_id": 1,
    "user_name": "John Smith",
    "user_email": "john@email.com",
    "company_id": 1,
    "export_key": "22u43mrjwe7u",
    "event": "invoice.status.updated",
    "data": { ... },
    "changes": {
        "FELDNAME": {
            "from": "alt",
            "to": "neu"
        }, ...
    }
}

Im obigen JSON-Beispiel sind die folgenden Felder:

  • time“ ist die UTC-Zeit und das Datum, an dem der Webhook gesendet wurde.
  • user_id“ ist die ID des Benutzers, der das Auslösen des Ereignisses verursacht hat.
  • user_name“ ist der Name ihres Benutzers.
  • company_id“ ist die eindeutige Nummernkennung des Unternehmens, für das der Benutzer arbeitet.
  • export_key“ ist der Wert des Exportschlüssels in den Unternehmenseinstellungen, der als Sicherheitsüberprüfung verwendet werden kann.
  • event“ ist der Name des ausgelösten Webhook-Ereignisses.
  • data“ sind die Daten, die sich auf das Webhook-Ereignis beziehen.
  • changes“ sind die Felder, die sich geändert haben, dh das, was sie waren, zu dem, wozu sie geändert wurden.

HireHop wartet nicht auf eine Antwort von der aufgerufenen URL oder meldet einen HTTP-Fehler beim Aufruf.

Beispiel-PHP-Code für einen URL-Endpunkt zum Erfassen der Webhook-Daten wäre:

<?php
	// Lesen Sie die JSON-Daten
	$postdata = file_get_contents('php://input');
	// Konvertieren Sie JSON-Daten in ein Objekt
	$data_str = json_decode($postdata);
?>

 

Posted in API

HireHop Rest API – Erste Schritte

HireHop baut auf einer API auf, was bedeutet, dass Sie alles, was Sie von HireHop sehen, auch mit der umfangreichen API erreichen können. Um auf die Rest-API zuzugreifen, benötigen Sie lediglich ein Benutzertoken, das als GET oder POST auf den entsprechenden URL-Endpunkt angewendet wird.

API-Token

Um ein API-Token zu generieren, gehen Sie zur Seite „Einstellungen“ und wählen Sie die Registerkarte „Benutzer“. Wählen oder erstellen Sie einen Benutzer, klicken Sie dann, während dieser bestimmte Benutzer ausgewählt ist, auf die Schaltfläche „Menü“ und dann auf die Option „API-Token“, um ein Token zu generieren. Der Token wird dann angezeigt und kann mit der Schaltfläche Kopieren in die Zwischenablage kopiert werden.

Das Token wird ungültig, wenn Sie die E-Mail-Adresse oder das Passwort des ausgewählten Benutzers ändern oder sich anschließend bei diesem Benutzer anmelden. Um dies zu verhindern, sollten Sie einen dedizierten API-Benutzer erstellen und ihm aus Sicherheitsgründen die entsprechenden Berechtigungen erteilen, um ihn auf alles einzuschränken, für das Sie die API nicht verwenden.

Aus Sicherheitsgründen sollten Sie das Token nicht im Frontend-JavaScript-Code verwenden, es sollte nur serverseitig verwendet werden. Wenn ein Hacker den Token erhält, kann er Ihre Daten auf HireHop ändern und darauf zugreifen, also halten Sie Ihren Token geheim. Wenn Ihr Token durchgesickert ist, ändern Sie einfach das Passwort des API-Benutzers und generieren Sie einen neuen Token.

Verwenden eines Tokens

Ein Token sollte als GET- oder POST-Parameter festgelegt werden, der als „Token“ bezeichnet wird. Um beispielsweise Jobdaten für Jobnummer 52 zu laden, ruft HireHop den API-Endpunkt auf:

https://myhirehop.com/php_functions/job_refresh.php?job=52

Wenn Sie denselben Endpunkt mit einem Token aufrufen möchten, lautet die URL:

https://myhirehop.com/php_functions/job_refresh.php?job=52&token=dqwejk5GVT65909bHHBN7922pq5hxjm%207hmn

Bitte denken Sie daran, dass Sie bei der Übergabe des Tokens über GET (ein URL-Parameter wie oben) den Token zuerst mit einem Tool wie https://meyerweb.com/eric/tools/dencoder codieren müssen.

Buchungsdaten

Um Daten in HireHop zu erstellen oder zu bearbeiten, müssen Sie einen POST verwenden. Beim Veröffentlichen von Daten sollten Sie nur die Felder setzen, die Sie ändern möchten, um beispielsweise einen Job über den Endpunkt https://myhirehop.com/php_functions/job_save.php zu erstellen oder zu bearbeiten, indem Sie den Parameter „job“ auf „0“ setzen “ oder weglassen wird ein neuer Job erstellt, alles andere ändert die entsprechende Jobnummer. Um den Firmennamen in der Stellennummer 52 zu bearbeiten, sollten die Stellendaten wie folgt lauten:

{
"job" : 52,
"name" : "New Name",
"token" : "dqwejk5GVT65909bHHBN7922pq5hxjm=-7hmn"
}

API-Endpunkte

Viele API-Endpunkte sind in der API-Dokumentation dokumentiert, viele weitere werden folgen.  Um den Endpunkt für eine Aufgabe einzurichten, verwenden Sie in der HireHop-Anwendung die Browserkonsole, um die Netzwerkaufrufe und die eingestellten Parameter zu überprüfen. Eine ausführliche Anleitung zu den URL-Endpunkten wird in Kürze veröffentlicht.

Ratenbegrenzungen

HireHop erlaubt jedem Benutzer 60 Verbindungsanfragen innerhalb von 1 Minute. Wenn mehr als 60 vorhanden sind, wird der Fehler „Sicherheitswarnung, zu viele Transaktionen“ (327) zurückgegeben.

Posted in API

Domänenübergreifende Schriftarten (Cross Domain Fonts) CORS – CSS font-face wird nicht geladen

Viele Benutzer haben einige erstaunliche Dokumente für die Verwendung in HireHop erstellt, die HTML5-, JavaScript- und CSS-Funktionen verwenden. Für diese Dokumente benötigen Benutzer manchmal eine spezielle Schriftart, die sie auf ihrem Server speichern. Manchmal scheint die Schriftart jedoch nicht im HireHop-Dokument zu funktionieren. Der Grund dafür liegt in den CORS-Einschränkungen (Cross-Origin Resource Sharing – CORS) in Browsern.

Nicht in Dokumente und Webseiten geladene Schriftarten

Die meisten Webbrowser erlauben keine domänenübergreifenden Anforderungen. Dies liegt an derselben Ursprungssicherheitsrichtlinie. Das Ergebnis ist, dass bei Verwendung von Web-Schriftarten aus einer anderen Domäne manchmal Fehler auftreten können und die Schrift nicht auf der Webseite (oder in HireHop-Dokumenten) geladen wird. Grundsätzlich werden aus Sicherheitsgründen einige Dateien als „nicht kennzeichnungspflichtig“ für verschiedene Domänen vom Server, auf dem sie gehostet werden, „markiert“, sodass der folgende typische Code möglicherweise nicht funktioniert:

<style type="text/css">
@font-face {
    font-family: "OpenSans";
    src: url("https://my_server.com/fonts/OpenSans.woff2") format("woff2");
}
html, body{
    font: normal 16px OpenSans, sans-serif;
}
</style>

Die Lösung

Um Ursprungsübergreifende Einschränkungen für Ihre Schriftarten festzulegen, muss die Antwort vom Remoteserver, auf dem die Schriftdateien gehostet werden, den Header Access-Control-Allow-Origin in der Schriftartdatei enthalten.

Wenn Sie Schriftarten wie Typekit oder Google Fonts oder Content-Delivery-Netzwerke wie BootstrapCDN, CdnJS oder JsDelivr verwenden, um Ihre bevorzugten Schriftarten zu laden, müssen Sie nichts tun, da der Header Access-Control-Allow-Origin lautet bereits in ihrem Antwortheader gesendet.

Apache

Fügen Sie zum Konfigurieren eines Apache-Webservers den folgenden Code in die Datei httpd.conf oder .htaccess ein.

  1. Fügen Sie die MIME-Header in Apache hinzu:
    AddType application/vnd.ms-fontobject    .eot
    AddType application/x-font-opentype      .otf
    AddType image/svg+xml                    .svg
    AddType application/x-font-ttf           .ttf
    AddType application/font-woff            .woff
    AddType application/font-woff2           .woff2
    
  2. Aktivieren Sie CORS (Cross-Origin Resource Sharing) in Apache für die MIME-Typen:
    <IfModule mod_headers.c>
      <FilesMatch ".(eot|otf|svg|ttf|woff|woff2?)$">
        Header set Access-Control-Allow-Origin "*"
      </FilesMatch>
    </IfModule>
    

NGINX

Fügen Sie zum Konfigurieren eines NGINX-Webservers den folgenden Code in die Datei /etc/nginx/nginx.conf oder in Ihre benutzerdefinierte Datei /etc/nginx/conf.d/custom.conf ein.

  1. Fügen Sie die MIME-Header unter NGINX hinzu:
    application/vnd.ms-fontobject    eot;
    application/x-font-opentype      otf;
    image/svg+xml                    svg;
    application/x-font-ttf           ttf;
    application/font-woff            woff;
    application/font-woff2           woff2;
    
  2. Aktivieren Sie CORS (Cross-Origin Resource Sharing) unter NGINX für die MIME-Typen:
    location ~* .(eot|otf|svg|ttf|woff|woff2)$ {
        add_header Access-Control-Allow-Origin *;
    }
    

IIS

Fügen Sie zum Konfigurieren von Microsoft IIS den folgenden Code zum Block web.config system.webServer hinzu.

  • Aktivieren Sie CORS (Cross-Origin Resource Sharing) in IIS
    <system.webServer>
      <httpProtocol>
        <customHeaders>
          <add name="access-control-allow-origin" value="*" />
          <add name="access-control-allow-headers" value="content-type" />
        </customHeaders>
      </httpProtocol>
    </system.webServer>
    

PHP

Wenn Sie die Servereinstellungen nicht ändern können, können Sie jederzeit PHP verwenden, um die Schriftartdatei bereitzustellen.

  • Verwenden Sie eine Server-Skriptdatei anstelle einer physischen Schriftartdatei
    <style type="text/css">
    @font-face {
        font-family: 'OpenSans';
        src: url('https://my_server.com/fonts/OpenSans.php') format('woff2');
    }
    html, body{
        font: normal 16px OpenSans, sans-serif;
    }
    </style>
    
  • So beheben Sie domänenübergreifende @ font-face-Probleme mit PHP beim Erstellen der folgenden Datei und nennen sie „OpenSans.php“.
    <?php
    // fonts.php
    header('Access-Control-Allow-Origin: *');
    header('Content-Type: application/font-woff2');
    echo @file_get_contents('/fonts/OpenSans.woff2');
    ?>
    
Posted in API

Anpassung und Anpassung von Widgets – HireHop API NoHTML Framework

HireHop ist vollständig anpassbar, Sie können sogar benutzerdefinierte Felder hinzufügen, alles mithilfe der HireHop-JavaScript-Injektionsmethode, bei der von Ihnen geschriebene JavaScript-Dateien in HireHop-Seiten eingefügt werden. Wenn Sie sich die Seitenquelle einer HireHop -Seite ansehen, sehen Sie <!– PLUGINS –>, hier wird das JavaScript für Ihre Plugins eingefügt.

HireHop wurde von Grund auf aufgebaut und hat unser eigenes Framework entwickelt, das wir NoHTML nennen. Dabei wurden vorhandene Technologien und Methoden zusammengeführt, um ein Framework zu erstellen, das einfach zu verwenden und erweiterbar ist und ein schnelles Laden von Seiten auch bei langsamen Internetverbindungen ermöglicht.

Abgesehen vom Hauptteil der Seite werden die Hauptteile von HireHop dynamisch auf dem Client-Rechner mit JavaScript und jQuery-Widgets erstellt, ähnlich wie REACT und JSX, aber einfacher und natürlich mit dem bekannten jQuery-Framework. Wenn Sie beispielsweise eine Jobseite laden und die Seite überprüfen (drücken Sie F12 für den Objektinspektor des Browsers), sehen Sie unten auf der Seite ein <div>-Element, das wie folgt strukturiert ist:

<div id=“notes_tab„></div>

Wie Sie sehen können, ist <div> nur ein leeres div-Element. Wenn Sie auf die Registerkarte „Notizen“ klicken, wird das obige Element plötzlich mit Elementen gefüllt. Wenn Sie sich den Inspektor Ihres Browsers ansehen, werden Sie auch feststellen, dass die einzigen Daten, die vom Server geladen wurden, JSON waren und nicht der Code im Notizen-Tab. Der Notizen-Tab wurde dynamisch auf dem Client-Rechner mit einem benutzerdefinierten jQuery UI Widget namens $.notes() (intern $.custom.notes genannt) erstellt, das in der Datei /js/notes.js definiert ist, und dieses Widget verwendet ein Ajax Aufruf an den Server, um die Daten zum Auffüllen abzurufen.

Alle Widget-Dateien auf HireHop sind aus Geschwindigkeitsgründen komprimiert. Um jedoch die erweiterte Quelle anzuzeigen, fügen Sie einfach eine .MAX am Ende des Dateinamens hinzu, z. B. /js/notes.MAX.js.

Um JavaScript in Ihre Webseiten einzufügen, gehen Sie zu Einstellungen->Unternehmenseinstellungen und fügen Sie in Plugins die URL Ihrer JavaScript-Datei hinzu, die sich auf einem https-Server befinden sollte. Sie können mehrere URLs hinzufügen, die Sie mit einem „;“ trennen können. (Semikolon). Alle URLs müssen zu einer sicheren https-Domain führen.

Erweitern eines Widgets

Da es sich um jQuery-UI-Widgets handelt, können Sie eine Art objektorientierte Programmiertechnik verwenden, um Teile der HireHop-Widgets zu überschreiben. Zum Beispiel werden wir ein kleines Plugin erstellen, das ein Span-Element mit dem Wort Hello nach der Schaltfläche Aktualisieren im Notizen-Widget hinzufügt.

Erstellen Sie zunächst eine JavaScript-Datei auf Ihrem Webserver und fügen Sie den folgenden Code hinzu:

$(document).ready(function(){
// Überprüfen Sie, ob das Notizen-Widget vorhanden ist
if(typeof($.custom.notes)!=“undefined“ && hh_api_version<=1) {
// Notizen-Widget neu definieren
$.widget(„custom.notes“, $.custom.notes, {
_init_main: function() {
// Rufen Sie das alte _init_main . auf
this._super(arguments);
// Fügen Sie nach dem Aktualisieren-Button ein Hallo hinzu
$(„<span>„,{ html:“Hallo“ }).insertAfter(this.btnRefresh);
},
// Fügen Sie dem Widget sogar Ihre eigenen neuen Funktionen hinzu, wenn Sie möchten

new_function_name: function() { }
});
}
});

Der obige Code ist in einer Datei unter https://s.myhirehop.com/plugins/demo.js.

Den obigen Code Zeile für Zeile erklären:

$(document).ready(function(){
Zuerst warten wir, bis das Dokument fertig ist und alle Seitenelemente und JavaScript-Dateien geladen sind. In diesem Fall ist dies nicht erforderlich, da die Datei /js/notes.js vor dem Plugin-Skript geladen wird. Für dieses Beispiel haben wir sie jedoch als Referenz belassen.

if(typeof($.custom.notes)!=“undefined“ && hh_api_version<=1) {
Als nächstes testen wir, ob das Notizen-Widget definiert wurde, wenn ja, werden wir einen Teil davon überschreiben. Hier testen wir auch die HireHop-API-Version, die der Benutzer verwendet. Wenn neue Versionen von HireHop veröffentlicht werden, hat der Benutzer die Möglichkeit, sie zu verwenden, und dies stellt sicher, dass Ihr Plugin mit dieser Version kompatibel ist.

$.widget(„custom.notes“, $.custom.notes, {
Hier initiieren wir das Zusammenführen eines neuen JavaScript-Objekts, das Funktionen enthält, in das Notizen-Widget.

_init_main: function() {
Wird eine Funktion gleich wie eine vorhandene benannt, wird diese überschrieben.

this._super(arguments);
Dies ruft die geerbte Funktion auf, die die Funktion ist, die wir überschreiben.

$(„<span>“,{ html:“ Hello“ }).insertAfter(this.btnRefresh);
Anschließend fügen wir ein einfaches Span-Element hinzu, das das Wort „Hallo“ hinter der Schaltfläche „Aktualisieren“ enthält. Sie können auch  $(„<span> Hello</span>“).insertAfter(this.btnRefresh); verwenden. Um Elemente zu adressieren, sollten Sie immer die den Elementen zugewiesenen Variablen verwenden und niemals die Element-IDs, da die meisten IDs auf HireHop dynamisch erstellt werden und bei jeder Instanz unterschiedlich sind. Wenn die Element-ID Zahlen enthält oder nicht gut benannt ist, verwenden Sie sie auf keinen Fall.

new_function_name: function() { }
Schließlich macht dies nichts und ist für das, was wir tun müssen, nicht erforderlich, es zeigt nur, dass Sie sogar Ihre eigenen Funktionen in das Widget einfügen können.

Wenn Sie die HireHop-Seite neu laden, sehen Sie nach der Schaltfläche „Aktualisieren“ das Wort „Hallo“, wenn Sie alles richtig gemacht haben.

Versionierung

Ein großer Vorteil der Verwendung des HireHopNoHTML-Frameworks besteht darin, dass das gesamte JavaScript zwischengespeichert wird, was zu einem schnellen Laden der Seite führt, da der Browser die JavaScript-Dateien in seinem Cache verwendet. Dies kann problematisch sein, wenn Sie Ihr Plugin aktualisieren, da alle Benutzer, die es verwenden, ihre Browser nicht die aktualisierte Version herunterladen, sondern stattdessen ihre zwischengespeicherte Version verwenden, es sei denn, sie löschen ihren Browser-Cache.

Um dies zu umgehen, können Sie beim Hinzufügen Ihrer JavaScript-URLs zu den Plug-in-Optionen einen Versionierungsparameter verwenden, z. B. für https://www.mywebsite.com/plugin.js geben Sie ihn als https://www.mywebsite.com/plugin.js?v=1. Nach einem Update können Sie es in https://www.mywebsite.com/plugin.js?v=2 ändern, wodurch alle Browser gezwungen werden, die JavaScript-Datei von Ihrem Server neu zu laden. Wenn Sie keinen Server zum Speichern des Codes haben, können Sie jederzeit GIST oder Google Open Source verwenden.

Arbeitsdemo

Wenn Sie in Ihren Plugins unter „Einstellungen->Unternehmenseinstellungen“ den Pfad „https://myhirehop.com/plugins/navigation_menu.js“ hinzufügen, sehen Sie oben rechts auf Ihrem Bildschirm ein Navigations-Kontextmenü. Wenn Sie sich den Quellcode ansehen, können Sie sehen, wie dieses grundlegende Plugin funktioniert.

Bitte beachte, dass Plugins aus Sicherheitsgründen nicht auf der Einstellungsseite geladen werden und nur geladen werden, wenn du ein kostenpflichtiges Abonnement hast.

Posted in API

Custom Fields – HireHop API

You can have an unlimited number of custom fields in HireHop specific to each record, a record being a job, project, test/service, asset, etc.  All custom fields can be used in documents, as long as they exist, otherwise they will just be blank.

Currently custom fields are only fully supported in Jobs and Projects. Custom fields can only be used using plugins.

Custom Fields Structure

When fetching a custom field for the currently edited record, there is a function called _get_custom_field_value(field) which will return NULL if the field is not set, a string, or a JavaScript object, depending on how you saved it.

You probably should save custom fields as a JavaScript object (like JSON) in the following format for more printing control, as if it is just a string, HireHop will treat it as a string:

"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, January 1 2017 12:00"
}

  • value is the value of the field in any format.
  • type tells HireHop how the field should be treated when merging it into a document. An array field will be displayed as JSON.
  • format tells HireHop how to format the field in the document, currently only available dates and is dependent on the users settings and how their date and time formats are set:
    • dddddd for a long date (like January 1 2018)
    • ddddd for a short date (like 01/01/2018)
    • dddd for the day of the week (like Monday)
    • ddd for the short day of the week (like Mon)
    • tt for the time (like 12:36 am).

The format part is only needed for dates and if it is not set, nothing will show.  You can merge formats together and add separators, for instance you can use dddd, dddddd tt which will give „Monday, January 1 2018 12:00“ if the user has set a date order as day month year. The value for a date type must be stored in the yyyy-mm-dd hh:mm format.

If you just save the field as a string and not a JavaScript object, that’s fine, HireHop will just treat it as a string.  Saving your custom fields as a JavaScript object will give you greater control, especially when HireHop prints them in a document.

Saving The Custom Fields

On all edit forms that support custom fields, there is a function called _save_custom_field_value(field, value).  This stores your fields to be saved later.  If you can’t find the function, please contact us.

Please note, that all changes must be written prior to saving.

When the custom fields are saved, they are merged with the existing fields, and any new fields passed with the same name as any existing ones, the new values will be set.

When saving the custom fields, for example using /php_functions.job_save.php directly as an API call, only parameters set will be updated, so if you only set the custom_fields post parameter, only the custom fields will change, all the other fields will stay as is.

Printing Custom Fields

All custom fields can be incorporated into documents just like normal fields and are prefixed with a single „_“ (underscore) character.  For example, for a custom field in a job called „field_name“, you would load it by using the merge field „job:_field_name„.

Naming Custom Fields

Some custom fields in documents merge fields together, for example tests merge with an asset in some document fields, so be careful not to use the same field name in an asset and a test.  Also, other plugins maybe added in the future written by yourself or from another source, so add a prefix that denominates you, for example plugins written HireHop by use the „hh_“ prefix, so a field written in a plugin by us might be called „hh_NewName“.  Field names in document merges are not case sensitive, but they obviously are in JavaScript.

Searchable Custom Field

There is an additional field called CUSTOM_INDEX, that can be used for searching, filtering and listed in search results.  The field is a 45 character string value that can be set to NULL. To enable the field to be shown in the search results on the home page, change the allSearchCols global JavaScript variable by adding CUSTOM_INDEX to it:

if(allSearchCols.constructor===Array && doc_type==0 ) {
allSearchCols.push("CUSTOM_INDEX");
}

There is also a language setting for the custom field displayed name:

if(typeof(lang["customIndexTxt"])=="undefined" || lang["customIndexTxt"]=="") {
lang["customIndexTxt"] = "Custom field name";
}

The reason for the testing for undefined or blank above is just in case the user has set it in the language.

You can use the custom searchable field in the page by adding a lookup in the page or the editor.  On jobs there is a hidden tile that displays the  CUSTOM_INDEX field and can be shown and utilised like so in a plugin:

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

To save the CUSTOM_INDEX field in the relevant edit widget, using a custom plugin you can add a form element into the edit widget, for example like so:

// This adds the CUSTOM_INDEX field into the job edit widget
if(typeof($.custom.job_edit)!="undefined") {
// Redefine job_edit, move name to after telephone
$.widget("custom.job_edit", $.custom.job_edit, {
_init_main: function() {
// Call the old _init_main
this._super(arguments);
// Add an extra edit in the job edit
var table = this.default_disc.closest("table");
var tr = $("<tr>").appendTo( table);
$("<td>", { html: lang.customIndexTxt+ " :" }).appendTo(tr);
$("<input>", {
"name" : "custom_index", // Parameter to pass when saving
"class" : "data_cell",   // Setting class to data_cell tells HireHop it is a standard data field
"data-field" : "CUSTOM_INDEX", // Name of the field
"maxlength" : 45         // The CUSTOM_INDEX has a maximum length of 45 characters
})
.appendTo( $("<td>").appendTo(tr) );
// Change the memo height to compensate
this.job_edit_memo.height(110);
}
});
}

The CUSTOM_INDEX field is called xxx:custom_index in the document and is passed as a string into the document.

Global Custom Fields

Occasionally you might want to store a global counter, etc. for the whole company.  To read and store global custom fields use /php_functions/custom_fields_global_load.php and /php_functions/custom_fields_global_save.php.  Saving the data, you need to pass either a json string or json array:

$("#saving_dialog").dialog("open");
// This adds the CUSTOM_INDEX field into the job edit widget
$.ajax({
url: "/php_functions/custom_fields_global_save.php",
type: "post",
dataType: "json",
data: {
"fields":{"my_field":"any type of value"}
// or a json string
// "field":'{"my_field":"any type of value"}'
},
success: function(data)
{
$("#saving_dialog").dialog("close");
// HireHop reported an error
if(typeof(data.error) !== "undefined")
error_message(isNaN(parseInt(data.error)) ? data.error : lang.error[data.error]);
else
{
// All good, "data" is a javascript object (JSON) of all global custom fields
}
},
// Handle an http error
error: function(jqXHR, textStatus, errorThrown)
{
$("#saving_dialog").dialog("close");
error_message(lang.error[1]+" ("+errorThrown+").");
}
});

Posted in API