CopyrightIBMCorporation2006TrademarksBuildingPHP-basedUIsforIBMLotusDominoPage1of14BuildingPHP-basedUIsforIBMLotusDominoAndreiKouvchinnikovMay09,2006DiscoverhowyoucaninteractwithLotusDominodatabasesfromWebapplicationscreatedinthePHPprogramminglanguage.
LearnhowtoaccessDominoapplicationsfromPHPpagesusingaCOMobject,theLotusNotesAPI,andXML.
Inthisarticle,youlearnhowtointeractwithIBMLotusDominodatabasesfromWebapplicationscreatedwiththePHPprogramminglanguage.
YoualsolearnhowtoaccessDominoapplicationsfromPHPpagesusingaCOMobject,theIBMLotusNotesapplicationprogramminginterface(API),andXML.
CodeexamplesforeachmethodareincludedintheDownloadssection.
TheXMLmethodalsohasadownloadableexampleapplicationwithasimpleWebinterfacetoanIBMLotusDominomaildatabase(seefigure1).
Figure1.
ExampleofaPHPuserinterfacetoamaildatabasePHPisapowerfulembeddedscriptinglanguage.
ItisfreetouseandpopularfordevelopingdynamicWebapplications.
PHPcodeisn'tcompiled;rather,it'sinterpretedatruntime.
MuchofitssyntaxisborrowedfromtheC,Java,andPerlprogramminglanguages.
YoucanaddPHPasaCommonGatewayInterface(CGI)enginetomostWebservers.
ItevenworksintheMicrosoftWindowsandLinuxoperatingsystems.
Inaddition,morethan50percentofWebhostingcompanieshavePHP-enabledservers.
WithsuchwidespreadPHPtechnology,yousimplycannotaffordtoremainunfamiliarwithit.
WorkingwithPHPYouincludePHPcodeinWebpageswiththehelpofspecialtags.
AllPHPcodebeginswiththetag:developerWorksibm.
com/developerWorks/BuildingPHP-basedUIsforIBMLotusDominoPage2of14TheWebserverinterpretsthissimpleexampleandtranslatesittofollowingHTMLoutput:HelloWorld!
PHPWebpagescaninteractwithDominodatabasesinseveralways.
ThechoiceofintegrationmethoddependsonwhichoperatingsystemyouusetorunPHP,thesecurityrestrictionsinplacebetweenPHPandyourDominoservers,andwhatyouareallowedtoinstallonthePHPserver.
Themethodsdescribedinthisarticleare:COMobjectsTheNotesAPIXMLthroughtheWebRunningPHPcodeofflineAlthoughPHPisprimarilyintendedtorunonaWebserverandisnotforstandaloneapplications,youcanrunitfromthecommandlineasashellscriptingtoolsimilartoMicrosoftVisualBasicScriptingEdition(VBScript).
ThisfeaturecanbeusefulforofflinetestingbeforeputtingthefilesontheWebserver.
AccessingLotusDominoThreemethodsareavailableforaccessingaDominodatabase:throughCOMobjects,throughtheNotesAPI,andthroughXML.
AccessLotusDominousingDominoCOMobjectsTheeasiestandmostfast-forwardmethodofaccessinginformationstoredinDominodatabasesisthroughDominoCOMobjects.
UsingCOMfromPHPisn'tmuchmoredifficultthandoingsofromLotusScript.
Thefollowingcodeexampleshowshowtoprintthefieldvaluesofallthedocumentsinaview.
Initialize();//ShowthenameofthecurrentNotesuserprint"Currentuser:".
$session->CommonUserName.
"\n\n";//Getdatabasehandle$db=$session->getDatabase("","mailtest.
nsf");//Getviewhandleusingpreviouslyreceiveddatabasehandle.
//Notethatthereservedcharacterintheviewnamemustbe\-escaped$view=$db->getView("(\$Drafts)");ibm.
com/developerWorks/developerWorksBuildingPHP-basedUIsforIBMLotusDominoPage3of14//Getfirstdocumentinviewusingpreviouslyreceivedviewhandle$doc=$view->getFirstDocument();//Loopuntilalldocumentsinviewareprocessedwhile(is_object($doc)){//Gethandletoafieldcalled"Subject"$field=$doc->GetFirstItem("Subject");//Gettextvalueofthefield$fieldvalue=$field->text;//Showthevalueofthefieldprint"Subject:".
$fieldvalue.
"\n";//Getnextdocumentintheview$doc=$view->getNextDocument($doc);}//Releasethesessionobject$session=null;>Figure2showstheoutputfromrunningthisCOMobjectfromthecommandline.
Figure2.
ResultofrunningCOMobjectcodeatacommandpromptUsingCOMobjectsiseasy,buttherearesomedisadvantagesthatmakeCOMratherlimited.
ThemaindisadvantageisthatyoumusthaveLotusNotesclientsoftwareinstalledonthePHPserver.
Ifyou'reusingaWebhostingcompanyforyourPHPapplications,thereisn'tmuchyoucandotoconvincethehostingcompanytoinstallaNotesclientjustforpurposesofyourPHPWebsite.
IfyouhaveyourownPHPserverorperhapsPHPandDominoserversonthesamecomputer,youshouldhavenoproblemssettingupCOMaccesstotheDominoserver.
AnotherissuethatlimitsCOMuseisthatCOMobjectsaresupportedonlyontheWindowsplatform.
ConsideringthatmostPHPserversrunontheLinuxplatform,thisrequirementconsiderablyreducesthenumberofavailableserversthatcanhostyourCOMsolution,evenifyouhavefulladministrativecontrolforthoseservers.
AccessLotusDominothroughanAPIAnalternativetoCOMaccessistousetheLotusNotes/DominoCAPI.
Theoretically,youcanusethissolutiononoperatingsystemsotherthanWindows.
WerecommendthatonlydeveloperswhohavealotofexperienceinC/C++programminguseit(ifyouhaveareasonfornotusingaCOMinterfaceorXML).
ThefunctionalityprovidedinthesampleAPIsolutionislimited,andyoumustbasicallywriteyourowncodeintheCprogramminglanguagetoaccomplishmosttasks.
developerWorksibm.
com/developerWorks/BuildingPHP-basedUIsforIBMLotusDominoPage4of14ThesamplelibraryprovidesagoodexampleforcreatingPHPextensions.
Itcomesonlyassourcecode,andyoumusthavetheVisualCcompilerandtheDominoCAPItoolkittocompilethecode.
Foryourconvenience,we'vecompiledthesourcecodeintoaDLLfileandincludeditintheDownloadssection.
YoucanactivatetheNotesextensionbyaddingthefollowinglinetothephp.
iniconfigurationfile:extension=php5_notes.
dllThefollowingcodeexampleshowshowtousethistechniqueafteryouproducetherequiredDLL.
Figure3showstheoutputfromrunningtheAPIcodefromthecommandline.
Figure3.
OutputoftheAPIcodeAccessLotusDominousingXMLUsingXMLtointeractwithDominodatabasesisthemostcompatiblesolution.
Itdoesn'trequireanyspecialadjustmentsorinstallationsonthePHPWebserver,anditworksonalloperatingsystems.
Inouropinion,it'sthebestapproachinmostcases.
IntheXMLsolutioninthisarticle,youusetechniquesthataremostlikelytoworkinthemajorityofconfigurations.
Asanexample,youcreateaPHPinterfacetoastandardDominomaildatabase.
TheonlymodificationmadeintheDominoenvironmentisaLotusScriptagentusedtoviewfieldsfromthemaildocuments.
YouusethesameagenttoparsetheXMLandtocreateandsendmail.
ibm.
com/developerWorks/developerWorksBuildingPHP-basedUIsforIBMLotusDominoPage5of14ToviewtheInboxfolderfromthemaildatabase,completethesesteps:1.
AsktheuserforhisorherNotesusernameandpassword.
2.
SendaloginrequesttotheDominodatabaseusingtheusernameandpasswordprovided(seefigure4).
Figure4.
LoginscreeninthePHPsampleapplication3.
Fromtheloginresponse,getasessioncookie.
(YouneedthiscookieforsubsequentrequeststotheDominodatabase.
)4.
MakearequesttotheDominoserverfortheXMLsourceoftheInboxfolder,usingtheReadViewEntriesURLcommand.
ThiscommandreturnsthecontentoftheviewpresentedinXMLforminsteadofreturningHTML.
YoutellDominoyouridentitybyappendingasessioncookietotherequestheaders.
5.
OnthereceivedXML-formattedviewcontent,usePHP'sXMLparsertofinddocumentsandfields.
6.
WhentheXMLparserhasprocessedthewholedocument,constructtheHTMLcode,andprinttothebrowser.
Tomakeamailmessageaclickablelink,usetheUNIDattributeofeachdocumentnode.
ToaccessDominodatabases,youneedfunctionalitybothtogetaWebpagefromtheDominoserverandtoparsetheXML.
Youmustalsoassumethefollowingforpurposesofthedemoapplication:TheDominoserverisversion6orlater;otherwise,youcan'tuseLotusScript'sXML-parsingfunctionality.
(ThisLotusScriptagentisdiscussedinmoredetaillater.
)ThePHPWebserverallowsoutgoingWebrequests.
TheDominoserverisaccessiblefromthePHPWebserverbyeithertheInternetoranintranet.
Note:Ifyoucan'taccesstheDominoserverfromtheInternet,youmayneedtoadjustyourfirewallconfigurationtoallowtrafficfromthePHPserver.
PHPfunctionsforreadingWeb-basedDominofilesPHPhasseveralfunctionsforretrievingWeb-basedcontent.
ThesefunctionswereincludedinPHPfromtheinception,butadministratorshaven'talwaysactivatedthem.
ThefollowingfunctionscanretrieveafilefromtheWeb:developerWorksibm.
com/developerWorks/BuildingPHP-basedUIsforIBMLotusDominoPage6of14file_get_contents().
Thisfunctioniseasytouse,anditsupportsboththeGETandPOSTrequesttypes.
Withfile_get_contents(),yougetthewholeWebfileatonceasastring.
fopen().
ThismethodreadstheWebfileinchunks.
file().
ThismethodreadsthewholeWebfileandseparatesthefile'scontentlinebyline.
It'sakindofcross-overbetweenfile_get_contents()andfopen().
fsockopen().
ThisfunctionhasthegreatestchanceofbeingactivatedonthehostingWebserver.
Themaindifferencebetweenthisandotherfunctionsisthatwithfsockopen(),youmustcreatethewholeWebrequestbyyourselfinsteadofsettingdifferentparameters.
CURL.
TheClientURLLibrary(CURL)hasthemostadvancedfunctionality.
UsingCURL,youcanconnecttoandcommunicatewithmanydifferenttypesofserverswithmanydifferenttypesofprotocols.
CURLcurrentlysupportsHTTP,HTTPS,FTP,Gopher,Telnet,DICT,File,andLDAP.
Italsosupportsproxies,cookies,andauthentication.
Unfortunately,CURLisoftendisabledbyWebhostingcompanies.
Note:Intheexampleapplicationinthisarticle,youusethefile_get_contents()functionexclusively.
ObtainingtheDominosessioncookieisanimportantpartoftheprocess,andyoucanusethesamecodeinotherDomino-relatedapplications.
Forexample,youcanretrieveacookieforloggingintotheIBMLotusSametimeserverusingSTLinks.
YougetthesessioncookiebysendingaPOSTrequesttotheDominoserver.
Inthatrequest,youincludeyourusernameandpassword.
TheresponsefromtheservercontainsacookiethatyouuseinsubsequentrequeststotheDominoserver.
Byincludingasessioncookie,theDominoserverthinksthatyourscriptisactuallyahumanuserwhorecentlyloggedinandisnowaccessingthedatabase.
YouusethePOSTmethodinsteadoftheGETmethodbecauseURLsoftheGETmethodareloggedintheDominolog,andanyonewhoaccessesthelogcanseetheusernameandpasswordinplaintext.
WiththePOSTmethod,usernamesandpasswordsaren'tpartoftheURL;therefore,theyaren'tvisibleinregularlogs.
YoucanfindtheDominosessioncookieintheSet-Cookieresponseheader.
ThesessioncookieiscalledeitherDomAuthSessIdorLtpaToken.
YouusethenameLtpaTokenwhentheDominoserverisconfiguredforsinglesign-on(SSO).
Youdon'tactuallycarewhatthecookienameis;yousimplysavethewholecookiestring.
Thefollowingcodeexampleshowshowtoretrievethecookie.
$req="username=john+doe&password=john123";$opts=array("http"=>array("method"=>"POST","content"=>$req,"header"=>"Accept-language:en\r\n".
"User-Agent:Mozilla/4.
0(compatible;MSIE6.
0;WindowsNT5.
1)\r\n"));$context=stream_context_create($opts);if(!
($fp=fopen("http://server.
com/maildb.
nsflogin","r",false,$context))){ibm.
com/developerWorks/developerWorksBuildingPHP-basedUIsforIBMLotusDominoPage7of14die("CouldnotopenloginURL");}$meta=stream_get_meta_data($fp);for($j=0;isset($meta["wrapper_data"][$j]);$j++){if(strstr(strtolower($meta["wrapper_data"][$j]),'set-cookie')){$cookie=substr($meta["wrapper_data"][$j],12);break;}}fclose($fp);$_SESSION["DominoCookie"]=$cookie;Inthecodeline$req="username=john+doe&password=john123",youprovideavalidusernameandpasswordtobeusedforloggingintotheDominoserver.
Then,yousetupadditionaloptions,suchasthePOSTmethodtypeandotherheaders.
Afterthat,youapplyyouradditionaloptionstotheoutgoingHTTPrequest:fopen("http://server.
com/mydb.
nsflogin","r",false,$context)FromtheresponseyoureceivefromtheDominoserver,yougetalltheheadersusingthestream_get_meta_data($fp)functionandloopthroughtheheadersuntilyoufindtheonethatcontainstheSet-Cookiestring.
Afterthat,yousavethecookiebystoringitinsideasessionvariable:$_SESSION["DominoCookie"]=$cookie$_SESSIONholdsthecookievalueuntilyouclosetheWebbrowser.
Now,youapplythecookietoyournextrequest,whichretrievestheInboxview/folderfromaDominomaildatabase.
$opts=array('http'=>array('method'=>"GET",'header'=>"Accept-language:en\r\n".
"User-Agent:Mozilla/4.
0(compatible;MSIE6.
0;WindowsNT5.
1)\r\n".
"Cookie:".
$_SESSION["DominoCookie"].
"\r\n"));$context=stream_context_create($opts);$xml=file_get_contents("http://server.
com/maildb.
nsf/(\$Inbox)ReadViewEntries",false,$context);Thistime,youusetheGETmethodtodownloadaWebpageinsteadofthePOSTmethod.
Thismethodisspecifiedwiththe'method'=>"GET"lineintheHTTPoptionsarray.
Insteadofreadingonlyheaders,youreadthewholeresponseusingthefile_get_contents(URL,false,context)function.
TheresultofthisoperationisalongXMLstringcontainingallthecolumnsfromtheInboxview.
Youappendthesessioncookietotheheaderwith:"Cookie:".
$_SESSION["DominoCookie"].
"\r\n"developerWorksibm.
com/developerWorks/BuildingPHP-basedUIsforIBMLotusDominoPage8of14AfteryoureceivetheXMLdata,youcanprocessitinthePHPXMLparser.
Then,youcreateyourownuserinterfacefortheInboxview.
PHPfunctionsforprocessingXMLInPHP,justasintheLotusScriptandJavaprogramminglanguages,therearetwowaysofprocessingXMLcode:theSimpleAPIforXML(SAX)andtheDocumentObjectModel(DOM).
SAXisanevent-basedprogrammingmodel,andit'sincludedandenabledbydefaultinmostPHPWebservers.
TheDOMextensionmustbeactivatedbytheWebserver'sadministrator.
AlthoughDOMismucheasiertoprogramwith,intheseexamples,youusetheSAXparserbecauseyouwanttoachievemaximumcompatibilitywithmostPHPconfigurations.
TechniquessimilartoprocessingDominoviewscan--withsmallmodifications--beusedforprocessingotherXMLsources,suchasRSSfeedsandevenWebservices.
ThefollowingcodeexampleshowstheXMLsourceoftheInboxviewcontainingonedocument.
00DonaldDuck17820060402T205929,52+0220060402T205929,52+028230seenMickeyAsyoucansee,documentsintheXMLsourcearepresentedwiththetag,andcolumns(fields)arepresentedwithtags.
Thedocument'sUniversalIDisavailableasanattributeofthenode.
ibm.
com/developerWorks/developerWorksBuildingPHP-basedUIsforIBMLotusDominoPage9of14Allyouneedtodoisdetermineawaytoprogrammaticallyfindthevaluesbetweenthosetagstogetallthedatayouneed.
Soundseasy,anditiseasytoaccomplish,too.
First,initiatetheXMLparserobjectusingthexml_parser_createfunction:$xml_parser=xml_parser_create();Then,setcallbackfunctions,whichareresponsibleforhandlingthestartandendofXMLelements.
Thesefunctionsareidentifiedtotheprocessorthroughtheuseofthexml_set_element_handlerandxml_set_character_data_handlerfunctions.
Eachfunctionacceptstheparserhandleandthenamesofthecallbackfunctions:xml_set_element_handler($xml_parser,"startElement","endElement");xml_set_character_data_handler($xml_parser,"textData");YoumustaddthestartElement,endElement,andtextDatafunctionstoyourPHPcode:functionstartElement($parser,$name,$attributes){switch($name){case"VIEWENTRY":$main="VIEWENTRY";if($attributes["UNID"]!
=""){$current_doc=$attributes["UNID"];$unids[$doc_counter]=$current_doc;}break;case"ENTRYDATA":$main="ENTRYDATA";if($attributes["COLUMNNUMBER"]!
=""){$current_column=$attributes["COLUMNNUMBER"];}break;case"DATETIME":$main="DATETIME";break;default:break;}}functionendElement($parser,$name){if($name=="VIEWENTRY"){$doc_counter++;//increasedocumentcounterby1}$current_column="";}functiontextData($parser,$data){switch($main){case"ENTRYDATA":if(isset($doc_coll[$current_doc][$main])){$doc_coll[$current_doc][$main][$current_column].
="$data";}else{$doc_coll[$current_doc][$main][$current_column]="$data";}break;case"DATETIME":if(isset($doc_coll[$current_doc][$main])){$doc_coll[$current_doc][$main].
="$data";}else{$doc_coll[$current_doc][$main]="$data";developerWorksibm.
com/developerWorks/BuildingPHP-basedUIsforIBMLotusDominoPage10of14}break;case"VIEWENTRY":break;}}So,let'sseehowitworks.
WhentheXMLparsergoesthroughtheXMLsourceandfindsthatanewelementisstarted,ittriggersthestartElementfunction,whichyouspecifiedasacallbackfunction.
Inthiscase,suchastartingelementnameis.
Nowyouknowthatthecurrentelementbeingprocessedisanewcolumn,soyoucansetthe$current_columnvariabletothenumberofthecolumn.
Inthiscase,columnsrepresentfields:case"ENTRYDATA":$main="ENTRYDATA";if($attributes["COLUMNNUMBER"]!
=""){$current_column=$attributes["COLUMNNUMBER"];}break;Afterthat,theparserfindsthetextinsidethenodeandsendsittothetextDatafunctionthatyouspecifiedasacallbackfunction.
Thepurposeofthisfunctionistoallowyoutopopulateanarraywithvaluesinsidethenode:switch($main){case"ENTRYDATA":if(isset($doc_coll[$current_doc][$main])){$doc_coll[$current_doc][$main][$current_column].
="$data";}else{$doc_coll[$current_doc][$main][$current_column]="$data";}break;UsingtheXMLsourceexample,the$doc_coll[$current_doc][$main][$current_column]="$data"codelineis:$doc_coll["38B16601EC8B42BAC12571440068335C"]["ENTRYDATA"]["8"]="seenMickey"ThismeansthattheeighthcolumnintheInboxviewforthedocumentwithUniversalID38B16601EC8B42BAC12571440068335Cis"seenMickey",whichhappenstobethesubjectofthemailmessage.
TheXMLparseris"smart"andknowsthatifanelementisstarted,itmustbefinishedsomewhere.
So,whenitfindstheendoftheelement,itsignalsyoubytriggeringtheendElementfunction(that'sright:thesamefunctionnameyouspecifiedasyoursecondcallbackfunction).
Inthatfunction,youresetthecolumnnumberbecauseitisn'tneededanymore.
Youalsocheckwhetherthedocumentcountermustbeincreased.
Youusethe$doc_countervariableasacounterforthearraythatstoresUniversalIDs.
YoumuststoreUniversalIDsmainlyforthepurposeofaddinglinkstothemaildocuments.
WhenyouknowthattheVIEWENTRYelementhasended,itmeansthatanewUniversalIDiscomingnext,andibm.
com/developerWorks/developerWorksBuildingPHP-basedUIsforIBMLotusDominoPage11of14youhadbetterincreasethecurrentarraynumberby1tokeepthe$doc_colland$unidsarraysintact:if($name=="VIEWENTRY"){$doc_counter++;}$current_column="";Ifyoudownloadthesampleapplicationandrunitonyourownserver,yourversionoftheDominomaildatabasemayhavedifferentplacementofcolumnsinthemailviews.
Ifso,youmustadjustthecolumnnumbersinthePHPcode(docfunctions.
php).
ThesamplePHPapplicationandtheLotusScriptagentThissectionisaboutaDominoagentcalledProcessDocWebAction,whichisincludedaspartofthesampleapplicationyoucandownloadwiththisarticle.
TheagentisprogrammedinLotusScriptandusestheDOMtoparseincomingXMLrequests.
BecauseitusesthenewXMLscriptclasses,youcanusetheapplicationonDominorelease6andrelease7servers,butnotonrelease5servers.
TherequeststhatthisagenthandlesareinitiatedfromthesamplePHPapplicationandcanbeofthefollowingtypes:CreateandsendamailmessageSaveanexistingmaildocumentSaveanewmaildocumentasdraftRequestinformationaboutthelocationofauser'sfileAdummyPingrequesttomakesurethatauserisstillloggedinTodeploytheagent,completethesesteps:1.
Copyallthetextfromthexmlagent.
lssfile.
2.
Createanewagentinadatabaseofyourchoice.
3.
Setthepropertiesoftheagentto"RunasWebuser"andthetargettoNone.
4.
Pastethecopiedcodeintothisnewagent.
5.
NametheagentProcessDocWebAction,andthensaveit.
6.
InthePHPfile(dominomail.
php),pointtotheURLlocationofthedatabaseinwhichtheagentresides.
OneofourmainprioritiesduringthecreationofthePHPsampleapplicationwastoensurethatitworkedonallstandardmaildatabaseswithoutdesignmodifications.
That'swhythisapplicationdoesn'trequireanychangestothemaildatabasedesign.
YoucanplacetheagentforprocessingtheXMLoutsidetheuser'smaildatabase,andthesameagentcanbeusedforservingallusers.
Whenauserauthenticatesforthefirsttime,thePHPapplication,afterretrievingthesessioncookie,asksthisagentforthelocationoftheuser'smailfile.
Theagentknowswhotheinvokeroftheagentisbecausetheagentisrunningwiththe"RunasWebuser"propertyactivated.
AfterdeveloperWorksibm.
com/developerWorks/BuildingPHP-basedUIsforIBMLotusDominoPage12of14thisinitialrequest,thepathtotheuser'smaildatabaseissavedforre-useuntiltheuserclosestheWebbrowserorthesessionexpires.
AuserisalwaysauthenticatedusingrealDominoauthentication.
TheusercannotaccessanyresourcesheorshecannotaccessusingaWebbrowserclient,eveniftheusercouldmodifythePHPsourcecodeontheWebserver.
ConclusionIfyou'reaDominodeveloperoradministratorandyourDominoserverisn'taccessiblefromtheInternet,youcanstillgiveusersawaytoaccessdatastoredinDominodatabasesandallowthemtoreadandwriteemailmessages.
UsingtheXMLtechniquesdescribedinthisarticleandappliedinthesampleapplication,youcaneasilyimplementDominoauthenticationinyourownPHPapplicationstoverifyloginsagainsttheDominoDirectory.
Thereisnooverridingofauser'saccessrightsintheWeb-basedXMLsolution;theuserisusinghisorherowncredentialsineachoperation.
Thisensuresthatuserscannotaccessunauthorizeddata.
Tofurtherincreasesecurity,youcanimplementloggingoffailedloginattempts.
ibm.
com/developerWorks/developerWorksBuildingPHP-basedUIsforIBMLotusDominoPage13of14DownloadableresourcesDescriptionNameSizeSourcecodeofPHPapplicationphp_app_sample.
zip10KBLotusScriptagentusedforprocessingXMLxmlagent.
zip2KBCompiledversionofNotesAPIextensionphp_notes_dll.
zip21KBdeveloperWorksibm.
com/developerWorks/BuildingPHP-basedUIsforIBMLotusDominoPage14of14RelatedtopicsdeveloperWorksarticle,"ReadingandwritingtheXMLDOMwithPHP"PHPWebsitePHP:XMLParserFunctionsTryalivedemoofthePHPinterfacedemotoaDominomaildatabase.
DownloadatrialversionofLotusNotes7fromdeveloperWorks.
DownloadatrialversionofLotusDomino7fromdeveloperWorks.
DownloadthesourcecodeoftheNotesAPIextensionforPHPfromthePHPExtensionCommunityLibrary(PECL)site.
CopyrightIBMCorporation2006(www.
ibm.
com/legal/copytrade.
shtml)Trademarks(www.
ibm.
com/developerworks/ibm/trademarks/)
易探云服务器怎么样?易探云是国内一家云计算服务商家,致力香港云服务器、美国云服务器、国内外服务器租用及托管等互联网业务,目前主要地区为运作香港BGP、香港CN2、广东、北京、深圳等地区。目前,易探云推出的国内云服务器优惠活动,国内云服务器2核2G5M云服务器低至330元/年起;成都4核8G/200G硬盘/15M带宽,仅1888元/3年起!易探云便宜vps服务器配置推荐:易探云vps云主机,入门型云...
易探云香港vps主机价格多少钱?香港vps主机租用费用大体上是由配置决定的,我们选择香港vps主机租用最大的优势是免备案vps。但是,每家服务商的机房、配置、定价也不同。我们以最基础配置为标准,综合比对各大香港vps主机供应商的价格,即可选到高性能、价格适中的香港vps主机。通常1核CPU、1G内存、2Mbps独享带宽,价格在30元-120元/月。不过,易探云香港vps主机推出四个机房的优惠活动,...
ihostart怎么样?ihostart是一家国外新商家,主要提供cPanel主机、KVM VPS、大硬盘存储VPS和独立服务器,数据中心位于罗马尼亚,官方明确说明无视DMCA,对版权内容较为宽松。有需要的可以关注一下。目前,iHostART给出了罗马尼亚vps的优惠信息,罗马尼亚VPS无视DMCA、抗投诉vps/2核4G内存/40GB SSD/100M端口月流量2TB,€20/年。点击直达:ih...
file_get_contents为你推荐
支持ipad支持ipad请务必阅读正文之后的免责条款部分支持ipadcss3圆角怎样用css实现圆角矩形?traceroute网络管理工具traceroute是什么程序fusionchartsfusioncharts怎么生成图片至excelicloudiphone自己用icloud把iPhone抹掉了.激活却不是自己的id怎么破如何用itunes备份如何使用iTunes最新版进行备份?急!!迅雷下载速度迅雷下载快慢和什么有关
过期域名查询 过期域名抢注 arvixe 主机点评 typecho 申请网页 双12 四川电信商城 双线空间 中国联通宽带测速 群英网络 阿里云邮箱申请 带宽测试 789电视剧网 服务器防御 开心online zcloud 碳云 cdn加速技术 最新优惠 更多