Avatar billede fhansen Praktikant
17. februar 2011 - 17:15 Der er 3 kommentarer og
1 løsning

Objects og cloning

Hejsa.

Jeg har siddet og bokset med et script der skal oprette en større mængde fakturaer i e-conomics.dk

Jeg skal bruge en funktion kalder CurrentInvoiseLines_CreateFromDataArray se mere her https://www.e-conomic.com/secure/api1/EconomicWebservice.asmx?op=CurrentInvoiceLine_CreateFromDataArray

Mit script fungere hvis jeg kun opretter en fakturalinie, men derudover går det galt, jeg får flg. fejlmeddelse Economic.Api.Exceptions.SchemaException(E00500): The 'id' attribute is not declared. {id=1335783046}.

Problemet opstår ved at XML laver et ref. til det første object, som skulle betyde at de efterfølgende objecter ikke har en ide.

Jeg kan på e-conomics forum se sat flere har haft disse problemer, men jeg kan ikke se hvordan de har løst problemet.

Jeg vil lige sige at jeg har brugt det samme script til at oprette selve fakturaen, og det fungere uden problem. https://www.e-conomic.com/secure/api1/EconomicWebservice.asmx?op=CurrentInvoice_CreateFromDataArray

Mit script ser således ud...

<?
class lines
{
    static $ids = 0;
    public $id;

    public function __construct() {
        $this->id = ++self::$ids;
    }

    public function __clone() {
        $this->id = ++self::$ids;
    }
}

try
            {
            $wsdlUrl = 'https://www.e-conomic.com/secure/api1/EconomicWebservice.asmx?WSDL';
       
            $eco = new SoapClient($wsdlUrl, array("trace" => 1, "exceptions" => 1));           
   
            $eco->Connect(array(
                'agreementNumber' => *****,
                'userName'        => *****,
                'password'        => *****));   
               
            }
            catch(Exception $exception)
            {
                print("<p><b>Kunne ikke oprette forbindelse</b></p>");
            }   
           
            $i = 1;   
            $invoiceArray= array();   
            $invoicelineArray= array();   
            $lineArray= array();
            $dataLine = array();
            $CurrentInvoiceLineData = new lines();
                       
                while($berth = mysql_fetch_assoc($bresult)):                       
               
                    $invoice = new stdClass;
                    $invoice-> Id = $i ;
                    $invoice-> Number = $i ;
                                $CurrentInvoiceLineData->Handle =$invoice;
                                $CurrentInvoiceLineData->Number = $i;
                                //$CurrentInvoiceLineData->Id = $i;
                                $CurrentInvoiceLineData->InvoiceHandle = array('Id' =>$Invoiceno);
                                $CurrentInvoiceLineData->Description = $description.' '.$ProductData->Name;
                                $CurrentInvoiceLineData->DeliveryDate = date('Y-m-d\TH:i:s');
                                $CurrentInvoiceLineData->UnitHandle = $ProductData->UnitHandle;
                                $CurrentInvoiceLineData->ProductHandle = $productHandle;
                                $CurrentInvoiceLineData->Quantity = 1;
                                $CurrentInvoiceLineData->UnitNetPrice = $ProductData->SalesPrice;
                                $CurrentInvoiceLineData->DiscountAsPercent = 0;
                                $CurrentInvoiceLineData->UnitCostPrice = 0.00;
                                $CurrentInvoiceLineData->TotalNetAmount = 1;
                                $CurrentInvoiceLineData->TotalMargin = 100;
                                $CurrentInvoiceLineData->MarginAsPercent = 100;
                                $CurrentInvoiceLineData->DepartmentHandle = NULL;
                                $CurrentInvoiceLineData->DistributionKeyHandle = NULL;   
   
                    $dataLine['dataArray'][] = clone $CurrentInvoiceLineData;

                $i++;
                endwhile;             
                $Invoiceno++;   
               
            $eco->CurrentInvoiceLine_CreateFromDataArray( $dataLine );
?>

Hjælp.. jeg troede lige jeg havde styr på class
Avatar billede cronaldo Nybegynder
18. februar 2011 - 17:03 #1
Er det meningen, der skal være mellemrum her:

$invoice-> Id = $i ;
$invoice-> Number = $i ;
Avatar billede fhansen Praktikant
18. februar 2011 - 17:48 #2
Øhmmm, har det en betydning ? det vidste jeg ikke, men jeg får nu stadig samme fejl.

Jeg har taget en print_r(), den ser således ud, jeg har fjernet lidt af printet og erstattet med ...

Array ( [dataArray] => Array ( [0] => lines Object ( [id] => 2 [Handle] => stdClass Object ( [Id] => 2 [Number] => 2 ) [Number] => 2 [InvoiceHandle] => Array ( [Id] => 15 )...) [1] => lines Object ( [id] => 3 [Handle] => stdClass Object ( [Id] => 3 [Number] => 3 ) [Number] => 3 [InvoiceHandle] => Array ( [Id] => 16 )...) [2] => lines Object ( [id] => 4 [Handle] => stdClass Object ( [Id] => 3 [Number] => 3 ) [Number] => 3 [InvoiceHandle] => Array ( [Id] => 16 )...  ) ) )

Jeg har fået nedenstående råd fra e-conomics

Dette er et SOAP problem.

Problemet stammer fra den måde hvorpå php serialiserer XML.



Såfremt man serialiserer det samme php-objekt til samme xml-dokument 2 gange, da bliver anden serialisering blot et tomt tag, med en attribut href="#ref1", mens den første serialisering får tilføjet en attribut "id="ref1".

Det er fx. et problem hvis man anvender den samme instans af et handle flere gange.



Det var kilden til fejlen "The 'id' attribute is not declared".



Løsningen er aldrig at serialisere det samme objekt to gange, men i stedet at anvende php's "clone" keyword til at lave en shallow copy.

Fejlen må ligge i min cloning efter ecnomics at dømme
Avatar billede arne_v Ekspert
19. februar 2011 - 02:47 #3
Mellemrummene ser ikke så pæne ud, men de har ikke nogen betydning for udførslen.
Avatar billede fhansen Praktikant
27. februar 2011 - 23:31 #4
Jeg kan vist godt lukke denne, måske jeg ikke formuleret mig ordenligt
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester