Das Notes Forum

Domino 9 und frühere Versionen => ND6: Entwicklung => Thema gestartet von: inu am 05.07.06 - 07:34:23

Titel: PHP-Zugriff auf Notes
Beitrag von: inu am 05.07.06 - 07:34:23
Hallo Leute,

es ist mir mittlerweile gelungen, mittels PHP und der COM-Schn ittstelle auf Notes-Datenbestände zuzugreifen.
Wie jedoch kann man neue Dokumente erstellen? Oder vorhandene ändern?

Vielen Dank
Titel: Re: PHP-Zugriff auf Notes
Beitrag von: Thomas Schulte am 05.07.06 - 08:28:31
Indem man die für die COM Schnittstelle beschriebenen Methoden benutzt!
Titel: Re: PHP-Zugriff auf Notes
Beitrag von: m3 am 05.07.06 - 08:46:35
Php? Brrrrrr.
Titel: Re: PHP-Zugriff auf Notes
Beitrag von: Thomas Schulte am 05.07.06 - 09:12:41
Doch das geht schon und wir setzen es "erfolgreich" seit 4 Jahren ein, aber in einem neuen Projekt würde ich auf Notes 7 und Web Services setzen.
Titel: Re: PHP-Zugriff auf Notes
Beitrag von: m3 am 05.07.06 - 09:15:09
Thomas, das glaub ich Dir schon, dass das geht. Wenn man die richtigen Leute hat, geht das sogar sehr gut. PHP leidet bei mir darunter, dass 95% des PHP-Codes, den man so Online findet unter aller Sau ist, weil sich Hinz und Kunz berufen fühlen PHP-Code zu schreiben, ohne eine Ahnung vom Programmieren zu haben.
Daher ist PHP bei mir prinzipiell "brrrrrrrrrrrrrr". ;)
Titel: Re: PHP-Zugriff auf Notes
Beitrag von: Thomas Schulte am 05.07.06 - 09:22:25
@m3
Was Hinz und Kunz angeht stimm ich dir zu. Und was die Qualität des zu findenden Codes angeht auch. Aber das war ja hier nicht die Frage.
Titel: Re: PHP-Zugriff auf Notes
Beitrag von: m3 am 05.07.06 - 09:41:24
Aber die Qualität der Frage lässt auf den Code schließen ..... ;)
Titel: Re: PHP-Zugriff auf Notes
Beitrag von: inu am 05.07.06 - 11:12:48
@Thomas Schulte:

die beschriebenen Methoden benutzen ist gut. Ich komme aber dennoch nicht weiter. Momentan habe ich folgendes:

$NotesSession   =   new COM("Lotus.NotesSession");
$NotesSession->Initialize("kennwort");
$lvar_dbdirectory   =   $NotesSession->GetDBDirectory("servername");
if (!is_null($lvar_dbdirectory))
{      $db1  = $NotesSession->GetDatabase("servername","test.nsf");
   $doc  = $db1->CreateDocument();
   $doc->Save(true,true);
}


dieses CreateDocument() bzw Save() scheint nicht zu laufen. Zumindest erhalte ich kein neues Dokument. Welche Methode zum Belegen eines Feldes könnte ich benutzen? So wie in Lotus Script : "... doc.feldname = "irgendwas" funktioniert das offensichtlich nicht ...

Vielen Dank
Titel: Re: PHP-Zugriff auf Notes
Beitrag von: m3 am 05.07.06 - 11:15:50
ReplaceItemValue ?
Die Notes-Hilfe zu "NotesDocument" ist da sehr hilfreich.

Kommt er ins IF überhaupt hinein?
Titel: Re: PHP-Zugriff auf Notes
Beitrag von: inu am 05.07.06 - 11:17:45
@m3: ja, er kommt ins IF rein.
Titel: Re: PHP-Zugriff auf Notes
Beitrag von: Lossa am 05.07.06 - 11:18:05
doc.irgendwas

Ist extended Properties und funktionier nicht mit COM.

Benutze ausschliesslich Methoden und orginal Properties in der Hilfe wird auch angegeben wenn die Methode nicht in COM nutzbar ist.
Titel: Re: PHP-Zugriff auf Notes
Beitrag von: m3 am 05.07.06 - 11:20:18
$doc->Form='Maskenname';
sollte funktionieren. Zumindest mit Perl klappt das so.
Titel: Re: PHP-Zugriff auf Notes
Beitrag von: Thomas Schulte am 05.07.06 - 11:24:22
Hier ein rudimentäres Beispiel für so was.
Code
function CreateAndSaveNotesDocument ( &$Order)
    {   global $myConfig;
        
        # COM Session aufbauen
        $session = @new COM( "Lotus.NotesSession" );
        if (!$session) 
        {
            $this->lotuslog( "Leider konnte keine Verbindung zum Server hergestellt werden");
            return false;
        }
        $session->Initialize();
        # Object Model aufbauen um die Ansicht nach Länderkennzeichen/Masken zu holen
        #
        if ('' == $myConfig->sLotusDB) $myConfig->sLotusDB = 'InputDokumente.nsf';
        $dbInput = $session->getDatabase( "", $myConfig->sLotusDB ); // "InputDokumente.nsf"
        if( !$dbInput ) {
            $this->lotuslog( "Leider wurde die Datenbank für die Verarbeitung nicht gefunden");
            return false;
        }
        # erstelle ein neues dokument in der Notes Datenbank
        $docinput = $dbInput->createDocument();
        if( !$docinput ) {
            $this->lotuslog( "Leider konnte kein Dokument erstellt werden");
            return false;
        }
        # die Form wird gebraucht um dem Dokument die richtige Struktur zuweisen zu können
        $wert = $this->setItemValueString($docinput, "Form", "frmFormName");
        # ab hier sind es die einzelnen Felder die befüllt werden müssen
        # die Felder müssen aus der entsprechenden Maske beim verlassen befüllt werden
        # Anschrift des Kunden
        $wert = $this->setItemValueString($docinput, "txtGeschlecht", $Geschlecht);
        $wert = $this->setItemValueString($docinput, "txtKundennummer", $Kundennummer);
        und so weiter
        .
        .
        .

        # speichere das dokument ab
        $gespeichert = $docinput->save(true,true);
        return true;
    }
Titel: Re: PHP-Zugriff auf Notes
Beitrag von: inu am 05.07.06 - 12:06:38
Danke erst einmal. Werde das nachher gleich mal testen.
Titel: Re: PHP-Zugriff auf Notes
Beitrag von: inu am 06.07.06 - 08:13:01
@Thomas Schulte: Dieses Beispiel scheint einer Klasse zu entstammen. Ist diese Klasse irgendwo im Internet verfügbar, wo man sich die eine oder andere Anregung noch holen kann?

Vielen Dank
Titel: Re: PHP-Zugriff auf Notes
Beitrag von: Thomas Schulte am 06.07.06 - 08:25:00
Nein ist sie nicht. Das ist Bestandteil eines Shops den wir aufgebaut haben.
Titel: Re: PHP-Zugriff auf Notes
Beitrag von: inu am 06.07.06 - 09:13:38
mmh,

mir kommt die Zeile:

$wert = $this->setItemValueString($docinput, "Form", "frmFormName");

etwas seltsam vor. Was verbirgt sich denn hinter "setItemValueString"?
Titel: Re: PHP-Zugriff auf Notes
Beitrag von: Thomas Schulte am 06.07.06 - 13:28:03
Ich gebs zu die hab ich vergessen.
Code
    function setItemValueString( $doc, $field, $replacevalue) {
        if ( isset($replacevalue)) {
            $value = $doc->replaceItemValue($field, $replacevalue);
        } else {
            # wenn das übergebene Feld nicht vorhanden ist übergebe einen leeren String
            $value = $doc->replaceitemvalue($field, " ");
        }
        return $value[0];
    }
Titel: Re: PHP-Zugriff auf Notes
Beitrag von: inu am 06.07.06 - 14:09:34
@T. Schulte:

Danke,

beim Ausführen der Zeile "$value = $doc->replaceItemValue($field, $replacevalue);" erhalte ich einen Fehler "Error Notification". Scheint Igrendwie nicht zu gehen. Für $field habe ich "Form" eingesetzt...

:'(
Titel: Re: PHP-Zugriff auf Notes
Beitrag von: m3 am 06.07.06 - 14:26:44
$value = $doc->replaceItemValue(Form, $replacevalue);
oder
$value = $doc->replaceItemValue("Form", $replacevalue);

Welche Fehlermeldung kommt?
Titel: Re: PHP-Zugriff auf Notes
Beitrag von: inu am 06.07.06 - 15:08:15
Ich teste das ganze auf einem Windows-PC. Entwickeln tu' ich das ganze unter Zend Studio. Dort erhalte ich beim debuggen ein kleines Fenster (siehe Anhang).

Im Browser selbst erhalte ich zwar keine Fehlermeldung. Aber auf Grund von eigefügten Debugausgaben sehe ich, dass hier bestimmte Sachen nicht ausgeführt werden.

Titel: Re: PHP-Zugriff auf Notes
Beitrag von: m3 am 06.07.06 - 15:14:59
Na wenn Dir die Notes-Applikation abschmiert hats aber gröber was.
Titel: Re: PHP-Zugriff auf Notes
Beitrag von: inu am 06.07.06 - 15:22:00
selbst wenn ich nach dem "createdocument" gleich ein "$ergebnis = $docinput->save(true,true)" aufrufe, wird $ergebnis auf FALSE gesetzt.

 :'(
Titel: Re: PHP-Zugriff auf Notes
Beitrag von: Thomas Schulte am 06.07.06 - 15:25:10
Da gibt es dann im Data Verzeichnis ein Unterverzeichnis IBM_TECHNICAL_SUPPORT und da stehen dann nsd_* Files drin. Die "können" einen Hinweis auf die Fehlerursache geben.
Titel: Re: PHP-Zugriff auf Notes
Beitrag von: inu am 06.07.06 - 15:42:08
diese Logdatei ist ellenlang. Ich hab mal durchgeschaut. Den Großteil des Inhalts nimmt eine Auflistung von Dateien ein. So richtig eine Fehlermeldung erkennen kann ich nicht. Aber das muss bei dieser Datei wohl nichts heißen...
Titel: Re: PHP-Zugriff auf Notes
Beitrag von: Thomas Schulte am 06.07.06 - 15:57:26
Such mal nach FATAL
Titel: Re: PHP-Zugriff auf Notes
Beitrag von: inu am 06.07.06 - 16:08:54
"FATAL" gibt es nicht!
Titel: Re: PHP-Zugriff auf Notes
Beitrag von: inu am 06.07.06 - 16:46:08
zusätzlicher Hinweis: das ganze läuft auf einem Domino-Server der Version 6.5.5
Titel: Re: PHP-Zugriff auf Notes
Beitrag von: Thomas Schulte am 06.07.06 - 16:46:54
Das gibt es nicht, das es kein FATAL gibt wenn du einen NSD Report hast.
Titel: Re: PHP-Zugriff auf Notes
Beitrag von: inu am 06.07.06 - 16:52:54
ich habe doch extra über die Suchfunktion die Datei durchsucht. Da gibt es kein "FATAL".
Titel: Re: PHP-Zugriff auf Notes
Beitrag von: inu am 06.07.06 - 17:00:29
Zusatzfrage: Reicht es, wenn auf dem Apache-Server lediglich ein Notes-Client installiert ist, der dann wiederum auf den eigentlichen Domino-Server zugreift? Ich möchte ungern beide DB-Server auf der gleichen physischen Maschine laufen lassen
Titel: Re: PHP-Zugriff auf Notes
Beitrag von: Thomas Schulte am 06.07.06 - 17:03:52
Hab ich noch nie ausprobiert. Bei uns laufen beide Server auf der gleichen Maschine. Wobei ich das so ohnehin nicht mehr machen würde. In der nächsten Version werden wir die COM Schnittstelle durch Webservices ersetzen.
Titel: Re: PHP-Zugriff auf Notes
Beitrag von: inu am 06.07.06 - 17:07:13
Warum durch Webservices ersetzen?
Titel: Re: PHP-Zugriff auf Notes
Beitrag von: Thomas Schulte am 06.07.06 - 17:17:35
Wir haben mit der COM Schnittstelle von PHP aus gemischte Erfahrungen gemacht. Teilweise brachen bei Releasewechseln bei PHP oder Zendt (das kann übrigens auch ein Grund für deine Fehler sein), die COM Verbindungen zum Domino Server im Viertelstundentakt weg. Im Moment haben wir wieder einmal einen Status erreicht wo es langt den kompletten Server einmal am Tag runterzufahren. Lebt er länger als 24 Stunden ist plötzlich die COM Schnittstelle aus dem Shop heraus nicht mehr verfügbar. Spricht man die Schnittstelle dann z.B. über ein VB Programm direkt an reagiert der Server noch. Das Problem ist aber nicht der Server, sondern eigentlich immer PHP oder Zendt.
Titel: Re: PHP-Zugriff auf Notes
Beitrag von: inu am 06.07.06 - 17:19:51
Nun habe ich keinerlei Erfahrungen mit WebServices. Lohnt sich der Umstieg? Wo kann man da was nachlesen? Wie wird das programmiert? Kann ich dann von PHP dort zugreifen?
Titel: Re: PHP-Zugriff auf Notes
Beitrag von: Thomas Schulte am 06.07.06 - 18:08:25
V7, Ja das lohnt sich. Wie steht im Online Handbuch des Domino Designers, wie du das aus PHP ansprichst, da musst du bei PHP nachschauen.
Titel: Re: PHP-Zugriff auf Notes
Beitrag von: ata am 10.07.06 - 07:38:22
PHP ist case-sensitiv - in der Funktion setItemValueString von Thomas sind zwei unterschiedliche Schreibweisen enthalten für ReplaceItemValue - ist das in deinem Code schon berücksichtigt?

Toni
Titel: Re: PHP-Zugriff auf Notes
Beitrag von: flaite am 10.07.06 - 10:36:31
PHP ist case-sensitiv -

IMNSHO sind Probleme mit solchen Integrations-Basis-Architekturen wie COM oft nicht mit Trivial-Erklärungen wie case-sensitive aus der Welt geschafft.
Com ist einfach eine Integrationstechnologie mit einer Menge an gotchas.
Com ist eine MS-Technologie und eine Motivation von .NET ist ja gerade, einen Großteil der Entwickler von den Komplexitäten von .Com zu schützen (oder so ähnlich).
Die Statements von Thomas Schulte bestätigen eigentlich alle meine Ängste bezüglich .COM und ich hab damit auch schon gearbeitet (und bin in merkwürdige Probleme gekommen).

Theoretisch gibt es in Notes über Java eine Menge an weiteren Remoting-Integrationsmöglichkeiten. 
Ich hab darüber in der letzten Woche eine Menge herumevaluiert und hab mich jetzt für SOAP mit Axis Webservices entschieden.
Die Alternativen wäre mehr low-level xml gewesen und auch das könnte man für eine Notes - > PHP Integration nutzen.
Man braucht dafür ja keine SOAPx.x Umgebung.

Aus Notes wird ein xml gebaut.
Das xml wird an einen PHP Server geschickt.
Der PHP Server macht mit den einkommenden Daten etwas
und schickt ein xml an Domino zurück
Domino macht aus den xml-Daten etwas. 

Dafür braucht es natürlich http, ssl, xml, http-Programmierung in Domino, xml Programmierung in Domino, xml Programmierung in PHP Kenntnisse. Und die können auch nicht an einem Nachmittag erworben werden, da zu umfangreich. Das ist mehr so eine langfrist Sache.

Ich hab mich für SOAP mit Axis entschieden wg. der besseren Toolunterstützung und weil es hier eine für mich noch unübersichtliche Menge (bin neu hier) von Projekten mit IBM Tools gibt und ich glaub das die SOAP besser unterstützen als REST.

Trotzdem find ich die REST-Architektur interessant.
http://www.xmlmagazin.de/itr/online_artikel/show.php3?id=209&nodeid=69

Gruß Axel
Titel: Re: PHP-Zugriff auf Notes
Beitrag von: flaite am 11.07.06 - 09:29:22
Für Webservices haben Microsoft, IBM und einige andere zusammen verschiedene Versionen des SOAP Standards verabschiedet. SOAP ist weit verbreitet aber unter Programmierern nicht sehr beliebt.
SOAP ist sehr komplex und vielschichtig.
Natürlich gibt es automatisierte Tools. Aber es ist so wie es immer ist -> Es treten Probleme auf und um mit denen fertig zu werden, sollte man die unterliegende Technologie verstehen.
Die Webservices von Lotus selbst basieren auf der open Source Webservices Implementierung Axis. Genauer Axis 1. Es gibt mit Axis 2 einen ganz neuen Ansatz in apache. Das kommerzielle Systinet gilt als deutlich ausgereifter und besser. Würde IBM Systinet kaufen, ginge das sicher groß durch die Presse. Aber so ist eben openSource Apache Axis zukunftsweisend und das Maß aller Dinge.

In Deutsch gibt es für Axis Webservices das leicht veraltete "Java Web Services mit Apache Axis" (2004). Ich les das gerade. Es ist ganz bestimmt nicht einfach (liegt am Thema) und ich mache Webservices/Axis nicht zum erstenmal.

Grundsätzlich machts aber Sinn und man kriegt damit auch etwas zu Wege.