Re: [PHP] COM - Assigning to method.
[email protected] (Přemysl Fiala)
| Newsgroups | php.general |
|---|---|
| Organization | Laboratory Imaging |
| Message-ID | <[email protected]> |
Hello, did you tried var_dump or print_r the $oBank object to see his structure ? Also you can try: $BANK_fld_BRANCH_NAME = 22; $oBank->$BANK_fld_BRANCH_NAME = 'something'; Premek. On Mon, 15 Jul 2013 10:21:48 +0200, Adam Nicholls <[email protected]> wrote: > Hi Andrew > > Thanks for this. > > But I'm still getting errors. I think I need to explain a bit more. > > Unfortunately there isn't a PHP API for this application I'm trying to > interact with, my goal really is to be able to expose the COM > functionality over a web-service such as SOAP so I can use it in a > CMS. The application I'm trying to integrate with is Blackbuad's > Raiser's Edge - API documentation here: > https://www.blackbaud.com/files/support/guides/re7ent/api.pdf > > I think part of the problem is that the field names are also > represented by an integer. So to get data out I would do: > > $oBank->Fields(22); // which maps to BANK_fld_BRANCH_NAME. > > When I do: > > $oBank->22 = 'blah blah'; > > I get an error because a property can't be numeric, it has to start as > alpha character. If I use: > > $oBank->BANK_fld_BRANCH_NAME = 'blah blah blah'; > > I get the following error: > > Fatal error: Uncaught exception 'com_exception' with message 'Unable > to lookup `BANK_fld_BRANCH_NAME': Unknown name. > > I've also tried using your Value property returned by Fields(): > > $oBank->Fields(22)->Value = 'Blah Blah blah blah'; > > Which I then get: > PHP Warning: Creating default object from empty value in [C:\Users....] > Fatal error: Call to undefined method variant::Save() > > Soo seems nearly impossible to implement a safe way to write to the COM > API. > > > At the moment, I'm still in the scoping/prototype stage of my project, > so I'm beginning to think that using this COM API for this project is > a no-go, which is unfortunate. I'm also guessing even if we did > implement this API, exposing it as a Web Service is going to be tricky > for performance sake (given that I've read that COM doesn't > multithread very well??) > > Many Thanks > Adam. > > On 14 July 2013 22:16, Andrew Ballard <[email protected]> wrote: >> On Sun, Jul 14, 2013 at 3:18 PM, Adam Nicholls <[email protected]> >> wrote: >>> >>> Richard - I've tried that I get an error about it not being defined as >>> property of the object. >>> >>> Andrew - do you mean try using the method Richard has shown? >>> >>> Cheers >>> Adam. >>> >>> On 13 July 2013 17:11, Richard Quadling <[email protected]> wrote: >>> > >>> > >>> > >>> > On 13 July 2013 01:24, Andrew Ballard <[email protected]> wrote: >>> >> >>> >> On Jul 12, 2013 4:53 AM, "Adam Nicholls" <[email protected]> >>> wrote: >>> >> > >>> >> > Hi Guys/Gals, >>> >> > >>> >> > I'm doing some integration work with a COM API and according to >>> their >>> >> > documentation to save data in the API, you have to assign to the >>> >> > method. >>> >> > >>> >> > This is their example in Visual Basic: >>> >> > >>> >> > >>> >> >>> >> >>> ------------------------------------------------------------------------------------- >>> >> > Set oBank = New CBank >>> >> > oBank.Init Application.SessionContext >>> >> > With oBank >>> >> > .Fields(BANK_fld_ACCOUNT_NAME) = "Test account" >>> >> > .Fields(BANK_fld_ACCOUNT_NO) = "12345" >>> >> > .Fields(BANK_fld_BANK) = "Bank of the Nation" >>> >> > .Fields(BANK_fld_BRANCH_NAME) = "State Street Branch" >>> >> > End With >>> >> > oBank.Save >>> >> > >>> >> >>> >> >>> ------------------------------------------------------------------------------------- >>> >> > >>> >> > Obviously in PHP is isn't possible to assign to a method in this >>> way >>> >> > (thats what parameters are for!) So I'm at a bit of a loose end. >>> I'm >>> >> > wondering if anyone else has come across this? Or am I missing >>> >> > something obvious in PHP's implementation of the COM that allows >>> me to >>> >> > work around this? >>> >> > >>> >> > My PHP Code is looks like this: >>> >> > >>> >> >>> >> >>> ------------------------------------------------------------------------------------- >>> >> > $API = new COM('API7.API'); >>> >> > $API->Init($SerialNo, $Login, '', 1, '', 1); >>> >> > $API->SignOutOnTerminate = True; >>> >> > >>> >> > $Record = new COM("Data.Record"); >>> >> > $Record->Init($API->SessionContext); >>> >> > >>> >> > $Record->Fields('BANK_fld_ACCOUNT_NAME') = 'Test >>> Account';//doesn't work >>> >> > >>> >> >>> >> >>> ------------------------------------------------------------------------------------- >>> >> > >>> >> > I've also tried (below) but the API says wrong number of >>> parameters >>> >> > $Record->Fields('BANK_fld_ACCOUNT_NAME', 'Test Account'); >>> >> > >>> >> > I've also tried something crazy like this (below) but that >>> overwrites >>> >> > the $Record object. >>> >> > $_R = &$Record->Fields('BANK_fld_ACCOUNT_NAME'); >>> >> > $_R = 'Test Account'; >>> >> > >>> >> > >>> >> > Any ideas? Is it possible? >>> >> > >>> >> > >>> >> > Many Thanks >>> >> > Adam Nicholls >>> >> > >>> >> >>> >> That example isn't assigning values to method return value. Fields >>> is a >>> >> collection of ADO Field objects. The default property of a Field >>> object is >>> >> its Value property, so the shorthand is simply assigning the values >>> of the >>> >> variables to the value of each field in a record within a Recordset. >>> >> >>> >> Andrew >>> > >>> > >>> > So .. >>> > >>> > $oBank->BANK_fld_ACCOUNT_NAME = "Test account"; >>> > >>> > sort of thing. >>> > >>> > -- >>> > Richard Quadling >>> > Twitter : @RQuadling >>> >>> >>> >>> -- >>> Adam Nicholls >> >> Richard has the general idea correct, but as I recall it is a little >> more involved because it's COM. I've never done that much with COM in >> PHP because it was always such a pain. The example you posted probably >> used to require com_set() in PHP 4, although it looks like that has >> been deprecated in favor of a more typical OO syntax in PHP 5. Is >> there any chance there is a PHP version of the library that you can >> work with to avoid COM? If not, hopefully what follows will help start >> you on the right direction. >> >> A more explicit version of your original VBScript example looks like >> this: >> >> Set oBank = New CBank >> oBank.Init Application.SessionContext >> >> Set oField = oBank.Fields(BANK_fld_ACCOUNT_NAME) >> oField.Value = "Test account" >> Set oField = oBank.Fields(BANK_fld_ACCOUNT_NO) >> oField.Value = "12345" >> Set oField = oBank.Fields(BANK_fld_BANK) >> oField.Value = "Bank of the Nation" >> Set oField = oBank.Fields(BANK_fld_BRANCH_NAME) >> oField.Value = "State Street Branch" >> >> oBank.Save >> >> >> I'm not familiar with your CBank COM class, but the rest of it looks >> like it is similar to the COM('ADODB.Recordset'). If so, a rough >> translation of your original example should resemble this: >> >> <?php >> // I'm not familiar with this object, so I'm guessing on the call to >> instantiate it here. >> $oBank = new COM('CBank'); >> >> /** >> Application.SessionContext in the original refers to an object that is >> global to every request in an application. PHP does not have such a >> global registry, so I'm not sure where you're $config needs to come >> from. >> */ >> $oBank->Init($config); >> >> /** >> I am assuming that BANK_fld_ACCOUNT_NAME and such are constant names >> that were already defined with the names of the actual column names in >> a recordset returned by $oBank. >> */ >> $oBank->Fields(BANK_fld_ACCOUNT_NAME)->Value = "Test account"; >> $oBank->Fields(BANK_fld_ACCOUNT_NO)->Value = "12345"; >> $oBank->Fields(BANK_fld_BANK)->Value = "Bank of the Nation"; >> $oBank->Fields(BANK_fld_BRANCH_NAME)->Value = "State Street Branch"; >> >> $oBank->Save(); >> >> ?> >> >> I don't know if you could leave out the ->Value part of the syntax in >> PHP like you can in the VBScript example you posted. If so, then >> Richard's syntax would have been pretty close: >> >> $oBank->Fields(BANK_fld_BRANCH_NAME) = "State Street Branch"; >> >> Andrew > >