2.5.1. Anzeigen von E-Mails einer Gruppe

In diesem Beispiel wird gezeigt, wie Elemente einer bestimmten Gruppe vom GREYHOUND Server abgerufen und angezeigt werden. Der Abruf geschieht über die RPC Funktion "GetList()" des Dienstes GhRpcItemslibRpcItems der Unit rpc_itemslib. Diese Methode erhält als ersten Parameter ein Filterobjekt (vom Typ GhRpcItemslibRpcItemFilter), welches festlegt, welche Elemente abgerufen werden sollen.
Für dieses Beispiel sollen Elemente vom Typ E-Mail abgerufen werden, deren Status "offen" ist, die in der Gruppe mit der ID 1 enthalten sind (dies ist im Beispiel in der Variablen "$groupId" festgelegt) und die weder als gelöscht, noch als Spam markiert sind.
Die Elemente sollen nach Datum absteigend sortiert abgerufen werden, sodass die neuesten Elemente am Anfang der Liste stehen. Dies wird über die weiteren Parameter der Methode "GetList()" gesteuert, wobei für die Felder, nach denen sortiert werden kann, Konstanten der Form "rpc_itemslib::iob..." bereit stehen (der Prefix "iob" steht hier für "item order by"). Für die Sortierrichtung stehen die Konstanten "rpc_itemslib::iodAscending" (aufsteigend) und "rpc_itemslib::iobDescending" (absteigend) zur Verfügung.
Die Methode "GetList" verlangt zudem eine Angabe, welche Objekteigenschaften in den Ergebnisobjekten befüllt werden sollen. Diese Angabe ist ein Set, das über die Methode "GhRpcUtils::newSet()" zusammengesetzt werden kann. Hier können beliebige der Konstanten, die mit "rpc_itemslib::lv..." beginnen, angegeben werden (der Prefix "lv" steht hier für "list value"). Reduziert man dies auf lediglich die Eigenschaften, die man für die weitere Verarbeitung benötigt, so sinkt entsprechend die Menge der Daten, die vom Server übertragen werden muss, was in einer etwas besseren Antwortzeit resultieren kann. Der Einfachheit halber wird in diesem Beispiel die Konstante "rpc_itemslib::SET_ALL" verwendet, bei der alle Optionen des Sets gesetzt sind. Es werden also im Beispiel alle Felder der Ergebnisobjekte befüllt.
Bei der Abfrage von Elementen über die Funktion "GetList()" werden immer maximal 100 Elemente auf einmal ausgeliefert. Diese Begrenzung stellt sicher, dass die Belastung des Servers und die Datenmenge, die über das Netzwerk übertragen werden muss, nicht zu groß werden. In der Praxis werden auch normalerweise nicht mehr als 100 Elemente auf einmal angezeigt, da dies die Übersichtlichkeit für den Benutzer stark reduziert.
Die Methode "GetList()" enthält einen Parameter, der angibt, ab welchem Element die Ergebnisliste beginnen soll. Der Wert 0 bedeutet, dass mit dem ersten passenden Element begonnen wird. Die Angabe 100 liefert beispielsweise die nächsten 100 Elemente (sofern genug passende Elemente vorliegen). Über diesen Parameter lässt sich also eine Blättern-Funktion realisieren oder über mehrfache Aufrufe von "GetList()" mit einem Offset in 100er Schritten mehr als 100 Elemente abholen.
Der letzte Parameter der Funktion gibt die benutzerdefinierten Felder an, die in den Ergebnisobjekten befüllt werden sollen. Die Angabe erfolgt als Array mit den IDs der gewünschten benutzerdefinierten Felder. In diesem Beispiel wird ein leerer Array übergeben, es werden also keine benutzerdefinierten Felder in den Ergebnisobjekten mitgeliefert.
In der Ausgabe der E-Mails wird in diesem Beispiel beim Betreff ein Hyperlink ausgegeben, der den Inhalt der E-Mail in einem neuen Fenster anzeigt. Hierzu dient ein separates PHP Skript, das weiter unten beschrieben ist. Die URL für den Hyperlink wird aus der URL des aktuellen Skripts erzeugt. Im Beispiel heißt das Skript zum Anzeigen der E-Mail-Liste "index.php". Der Dateiname "index.php" wird aus der aktuellen URL abgeschnitten und durch den Namen des Skriptes für die Ausgabe des Inhalts der E-Mail ersetzt ("showemail.php"). Zudem wird noch ein Parameter "id" an die URL angehängt, der die Element-ID des E-Mail Objekts beinhaltet, damit das zweite Skript weiß, den Inhalt welchen Elements es anzeigen soll. Die Verarbeitung dieser URL greift auf Funktionen der beiden Hilfsklassen GhCoreGlobals (für die URL des aktuellen Skripts) und GhCoreStrings (für das Abschneiden einer Teilzeichenkette) zurück.
index.php - Anzeigen offener E-Mails einer Gruppe:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
<?php
require_once 'ghrpc/ghrpc.php';

$client = new GhRpcClient('localhost'80false'tester''test123'); // Client-Objekt
$client->setUniqueClientIdCookieName('ghrpcexample5'); // eindeutige Client-ID

$itemService rpc_itemslib::newRpcItems($client); // Dienst für Elemente

$groupId 1// ID der Gruppe, deren Elemente abgerufen werden sollen

$filter rpc_itemslib::newRpcItemFilter(); // Filter für die Abfrage der Elemente
$filter->GroupRefs = array($groupId); // Nur Elemente dieser Gruppe zurück liefern
$filter->Kinds GhRpcUtils::newSet(rpc_itemslib::ikEmail); // Nur Elemente vom Typ E-Mail
$filter->States GhRpcUtils::newSet(rpc_itemslib::isOpen); // Nur offene E-Mails
$filter->NegativeFlags GhRpcUtils::newSet(rpc_itemslib::ifDeletedrpc_itemslib::ifSpam); // Keine gelöschten E-Mails und kein Spam

// Elemente abrufen (nach Startdatum absteigend sortiert, vom ersten Element an, und alle Element-Eigenschaften abrufen):
try
{
  
$items $itemService->GetList($filterrpc_itemslib::iobStartDaterpc_itemslib::iodDescending0rpc_itemslib::SET_ALL, array());
}
catch(
GhRpcException $exception)
{
  die(
'Die Elemente konnten nicht vom Server abgerufen werden (Fehler: ' $exception->getMessage() . ').' );
}

// Tabelle für die Ausgabe erstellen:
echo '<table border="1">';
echo 
'<tr>';
echo 
'<th>Vorgang</th>';
echo 
'<th>Betreff</th>';
echo 
'<th>Absender</th>';
echo 
'<th>Datum</th>';
echo 
'<th>Thema</th>';
echo 
'</tr>';

// Die abgerufenen Elemente ausgeben:
foreach($items as $item)
{
  echo 
'<tr>';
  echo 
'<td>' htmlspecialchars($item->Number) . '</td>'// Vorgangsnummer ausgeben

  // URL für die Anzeige des E-Mail-Inhalts erstellen:
  
$showEmailUrl GhCoreStrings::removeFromEnd(GhCoreGlobals::getScript(), '/index.php') . '/showemail.php?id=' $item->ID;

  echo 
'<td><a href="' $showEmailUrl '" target="_blank">' htmlspecialchars($item->Subject) . '</a></td>'// Betreff mit Inhaltslink ausgeben
  
echo '<td>' htmlspecialchars($item->From) . '</td>'// Absender ausgeben
  
echo '<td>' htmlspecialchars($item->StartDate->getFormatted('d.m.Y H:i:s')) . '</td>'// Datum ausgeben
  
echo '<td>' htmlspecialchars($item->TopicName) . '</td>'// Thema ausgeben
  
echo '</tr>';
}

echo 
'</table>';
Das folgende PHP Skript zeigt den Inhalt einer E-Mail an. Bei E-Mails, deren Inhalt als HTML-Seite vorliegt, wird diese direkt ausgegeben. Bei E-Mails, die als reiner Text vorliegen, wird eine rudimentäre HTML-Seite erzeugt und der Text in fester Schriftbreite ausgegeben. Eine Besonderheit, die hierbei zu beachten ist, ist die Zeichencodierung des Inhalts. Der Inhalt von Elementen liegt im GREYHOUND Server stets in der Zeichencodierung "windows-1252" vor (dies ist im Abschnitt Serververbindung beschrieben). Bei HTML-Inhalten ist diese Zeichencodierung im Kopf der Webseite bereits angegeben, sodass der Browser den Inhalt korrekt darstellt. Bei reinen Text-Inhalten erkennt der Browser nicht immer korrekt die Zeichencodierung, weswegen sie in diesem Beispiel explizit angegeben wird (über das HTML Meta-Tag "Content-Type").
Die Unterscheidung, ob es sich beim Inhalt der E-Mail um HTML oder reinen Text handelt, wird anhand der Element-Flags festgemacht. Ist in diesem Set die Option "rpc_itemslib::ifUseHtml" gesetzt, so handelt es sich bei der E-Mail um eine HTML-E-Mail, andernfalls um eine reine Text-E-Mail. Die Prüfung, ob die Option in dem Set vorhanden ist, erfolgt über die Funktion "inSet()" der Hilfsklasse GhRpcUtils.
showemail.php - Inhalt einer E-Mail anzeigen:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?php
require_once 'ghrpc/ghrpc.php';

$itemId GhCoreGlobals::getValue('id'); // Übergebene Element-ID auslesen

if(!$itemId)
  die(
'Es wurde kein Element angegeben.');

$client = new GhRpcClient('localhost'80false'tester''test123'); // Client-Objekt
$client->setUniqueClientIdCookieName('ghrpcexample5'); // eindeutige Client-ID

$itemService rpc_itemslib::newRpcItems($client); // Dienst für Elemente

$item $itemService->Get($itemIdfalse); // Element abrufen

if(!$item)
  die(
'Das Element wurde nicht gefunden.');

// Prüfen, ob das Element HTML-Inhalte hat oder nur reinen Text:
if(GhRpcUtils::inSet($item->Flagsrpc_itemslib::ifUseHtml))
  echo 
$item->Properties->Email->ViewData// HTML-Seite direkt ausgeben
else
{
  
// Text als HTML-Seite ausgeben:
  
echo '<html>';
  echo 
'<head>';
  echo 
'<title>' htmlspecialchars($item->Subject) . '</title>'// Betreff als Seitentitel ausgeben
  
echo '<meta http-equiv="Content-Type" content="text/html; charset=windows-1252" />'// Zeichencodierung festlegen
  
echo '</head>';
  echo 
'<body>';
  echo 
'<div style="font-family:monospace;">' nl2br(htmlspecialchars($item->Properties->Email->ViewData)) . '</div>';
  echo 
'</body>';
  echo 
'</html>';
}