Eesti riik pakub võimalust saata oma dokumente teistele asutustele või omavalitsustele üle X-Tee.
Selleks on koostatud aegunud ja väga kehvasti loetav DHX süsteem, mis on ehitatud Java peale.
DHX Java teeke või DHX adapterserverit ei õnnestunud käima saada.
Dokumendi saatmine kasutades PHP Curl moodulit
Esmalt on eelduseks, et on sõlmitud X-Tee leping ja on olemas ka turvaserver.
Eelnevalt koostatud sertifikaate hoiustavad failid server.pem ja testKeystore.jks
Lisaks võib vaja olla ka dokumendi saajaga kokkulepet dokumendi vastuvõtmiseks.
Näidises saadame eelnevalt digitaalselt allkirjastatud dokumendi nimega testdoc.asice
1. Faili lugemine serverist (testdoc.asice)
Fail nimega testdoc.asice asub loodava PHP failiga samas asukohas või vajadusel muuta $file viide.
$file='testdoc.asice';
Fail loetakse sisse ja pakitakse gzip kujul kokku.
2. Saatja ja saaja andmed
2.1 Saaja
Saaja andmed on võimalik leida kataloogist
https://x-tee.ee/catalogue/ee-test
Näiteks EE/GOV/<registrikood>/DHX/sendDocument või EE/COM/<registrikood>/DHX/sendDocument
Meie kasutame oma näidises ee-test/COM/12345678/DHX/sendDocument
'xRoadInstance'=>'ee-test', 'memberClass'=>'COM', 'memberCode'=>'12345678', 'subsystemCode'=>'DHX', 'serviceCode'=>'sendDocument', 'serviceVersion'=>'v1' );
'Name'=>'Registrite ja Infosüsteemide Keskus', 'OrganisationCode'=>'14552803', 'Residency'=>'EE' );
$recipient muutuja võib lugeda kokku $service muutujaga. OrganisationCode ja memberCode on samad.
2.2 Saatja
Eelnevalt X-Tee liikmeks registreerimisel saadud andmed
'xRoadInstance'=>'ee-test', 'memberClass'=>'COM', 'memberCode'=>'87654321', 'subsystemCode'=>'DHX-87654321' );
$client ja $sender võib kokku üheks lugeda. OrganisationCode ja memberCode on samad.
'Name'=>'Juhan Pääsuke', 'GivenName'=>'Juhan', 'Surname'=>'Pääsuke', 'PersonalIdCode'=>'EE38511026032', 'Residency'=>'EE', 'Phone'=>'37250000000', 'Email'=>'juhan.paasuke@domeen.ee', 'WebPage'=>'', 'MessagingAddress'=>'', 'Country'=>'Eesti', 'County'=>'Harju maakond', 'LocalGovernment'=>'Tallinn', 'PostalCode'=>'10148' );
'Name'=>'Juhan Pääsuke', 'GivenName'=>'Juhan', 'Surname'=>'Pääsuke', 'PersonalIdCode'=>'EE38511026032', 'Residency'=>'EE', 'Phone'=>'37250000000', 'Email'=>'juhan.paasuke@domeen.ee', 'WebPage'=>'', 'MessagingAddress'=>'', 'Country'=>'Eesti', 'County'=>'Harju maakond', 'LocalGovernment'=>'Tallinn', 'PostalCode'=>'10148' );
$recordCreator ja $recordSender võib kokku üheks lugeda.
2.3 Meta
'RecordType'=>'Kiri', 'RecordTitle'=>'', 'RecordLanguage'=>'EE', 'AccessConditionsCode'=>'Avalik' );
2.4 Turvaserver
Oma turvaserveri asukoht
$soapUrl='https://turvaserver.domeen.ee/cgi-bin/cproxy/sendDocument';
3. Kapsel
Kapsel on ümbriku sees saadetav manus. Kapsli sees on omakorda saadetava faili gzip ja seejärel base64 kodeeringus sisu.
Meie saadame kapsli sees allkirjastatud faili nimega testdoc.asice, mille sees on omakorda lõplik saadetav dokument.
$capsule_xml='<?xml version="1.0" encoding="utf-8"?> <DecContainer xmlns="http://www.riik.ee/schemas/deccontainer/vers_2_1/"> <Transport> <DecSender> <OrganisationCode>'.$sender['OrganisationCode'].'</OrganisationCode> <PersonalIdCode>'.$recordSender['PersonalIdCode'].'</PersonalIdCode> </DecSender> <DecRecipient> <OrganisationCode>'.$recipient['OrganisationCode'].'</OrganisationCode> </DecRecipient> </Transport> <RecordCreator> <Person> <Name>'.$recordCreator['Name'].'</Name> <GivenName>'.$recordCreator['GivenName'].'</GivenName> <Surname>'.$recordCreator['Surname'].'</Surname> <PersonalIdCode>'.$recordCreator['PersonalIdCode'].'</PersonalIdCode> <Residency>'.$recordCreator['Residency'].'</Residency> </Person> <ContactData> <Adit>1</Adit> <Phone>'.$recordCreator['Phone'].'</Phone> <Email>'.$recordCreator['Email'].'</Email> <WebPage>'.$recordCreator['WebPage'].'</WebPage> <MessagingAddress>'.$recordCreator['MessagingAddress'].'</MessagingAddress> <PostalAddress> <Country>'.$recordCreator['Country'].'</Country> <County>'.$recordCreator['County'].'</County> <LocalGovernment>'.$recordCreator['LocalGovernment'].'</LocalGovernment> <AdministrativeUnit></AdministrativeUnit> <SmallPlace></SmallPlace> <LandUnit></LandUnit> <Street></Street> <HouseNumber></HouseNumber> <BuildingPartNumber></BuildingPartNumber> <PostalCode>'.$recordCreator['PostalCode'].'</PostalCode> </PostalAddress> </ContactData> </RecordCreator> <RecordSenderToDec> <Person> <Name>'.$recordSender['Name'].'</Name> <GivenName>'.$recordSender['GivenName'].'</GivenName> <Surname>'.$recordSender['Surname'].'</Surname> <PersonalIdCode>'.$recordSender['PersonalIdCode'].'</PersonalIdCode> <Residency>'.$recordSender['Residency'].'</Residency> </Person> <ContactData> <Adit>1</Adit> <Phone>'.$recordSender['Phone'].'</Phone> <Email>'.$recordSender['Email'].'</Email> <WebPage>'.$recordSender['WebPage'].'</WebPage> <MessagingAddress>'.$recordSender['MessagingAddress'].'</MessagingAddress> <PostalAddress> <Country>'.$recordSender['Country'].'</Country> <County>'.$recordSender['County'].'</County> <LocalGovernment>'.$recordSender['LocalGovernment'].'</LocalGovernment> <AdministrativeUnit></AdministrativeUnit> <SmallPlace></SmallPlace> <LandUnit></LandUnit> <Street></Street> <HouseNumber></HouseNumber> <BuildingPartNumber></BuildingPartNumber> <PostalCode>'.$recordSender['PostalCode'].'</PostalCode> </PostalAddress> </ContactData> </RecordSenderToDec> <Recipient> <Organisation> <Name>'.$recipient['Name'].'</Name> <OrganisationCode>'.$recipient['OrganisationCode'].'</OrganisationCode> <Residency>'.$recipient['Residency'].'</Residency> </Organisation> </Recipient> <RecordMetadata> <RecordGuid>'.generateId(array(8,4,4,4,12)).'</RecordGuid> <RecordType>'.$recordMetadata['RecordType'].'</RecordType> <RecordOriginalIdentifier>'.generateNumberId(6).'</RecordOriginalIdentifier> <RecordDateRegistered>'.date('Y-m-d\TH:i:s').'</RecordDateRegistered> <RecordTitle>'.$recordMetadata['RecordTitle'].'</RecordTitle> <RecordLanguage>'.$recordMetadata['RecordLanguage'].'</RecordLanguage> </RecordMetadata> <Access> <AccessConditionsCode>'.$recordMetadata['AccessConditionsCode'].'</AccessConditionsCode> </Access> <File> <FileGuid>'.generateId(array(8,4,4,4,12)).'</FileGuid> <RecordMainComponent>1</RecordMainComponent> <FileName>'.basename($file).'</FileName> <MimeType>application/vnd.etsi.asic-e+zip</MimeType> <FileSize>'.filesize($file).'</FileSize> <ZipBase64Content>'.base64_encode($gzdata).'</ZipBase64Content> </File> <RecordTypeSpecificMetadata /> <DecMetadata> <DecId>'.generateNumberId(5).'</DecId> <DecFolder>/</DecFolder> <DecReceiptDate>'.date('Y-m-d\TH:i:s').'</DecReceiptDate> </DecMetadata> </DecContainer>';
Kapsli sees on id nimetuste loomiseks kasutatud suvalist genereerimist, mis tuleks hiljem asendada õigete id väärtustega. ID väärtused peavad valideeruma vastu
[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}
Kogu saadetav kapsel peab valideeruma vastu DVK 2.1 Kapsel.xsd
Kapsel.xsd ja rohkem infot leitav aadressilt
https://varamu.riha.ee/#Elektroonilise_andmevahetuse_metaandmed
4. Ümbrik
Ümbrikus määrame ära kirja saaja ja saatja.
$envelope='<?xml version="1.0" encoding="utf-8" ?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> <SOAP-ENV:Header> <ns4:protocolVersion xmlns:ns2="http://dhx.x-road.eu/producer" xmlns:ns3="http://x-road.eu/xsd/identifiers" xmlns:ns4="http://x-road.eu/xsd/xroad.xsd" xmlns:ns5="http://www.riik.ee/schemas/deccontainer/vers_2_1/">4.0</ns4:protocolVersion> <ns4:id xmlns:ns2="http://dhx.x-road.eu/producer" xmlns:ns3="http://x-road.eu/xsd/identifiers" xmlns:ns4="http://x-road.eu/xsd/xroad.xsd" xmlns:ns5="http://www.riik.ee/schemas/deccontainer/vers_2_1/">64a3ddbd-1620-42c4-b2fe-60b854c2f32f</ns4:id> <ns4:client xmlns:ns2="http://dhx.x-road.eu/producer" xmlns:ns3="http://x-road.eu/xsd/identifiers" xmlns:ns4="http://x-road.eu/xsd/xroad.xsd" xmlns:ns5="http://www.riik.ee/schemas/deccontainer/vers_2_1/" ns3:objectType="SUBSYSTEM"> <ns3:xRoadInstance>'.$client['xRoadInstance'].'</ns3:xRoadInstance> <ns3:memberClass>'.$client['memberClass'].'</ns3:memberClass> <ns3:memberCode>'.$client['memberCode'].'</ns3:memberCode> <ns3:subsystemCode>'.$client['subsystemCode'].'</ns3:subsystemCode> </ns4:client> <ns4:service xmlns:ns2="http://dhx.x-road.eu/producer" xmlns:ns3="http://x-road.eu/xsd/identifiers" xmlns:ns4="http://x-road.eu/xsd/xroad.xsd" xmlns:ns5="http://www.riik.ee/schemas/deccontainer/vers_2_1/" ns3:objectType="SERVICE"> <ns3:xRoadInstance>'.$service['xRoadInstance'].'</ns3:xRoadInstance> <ns3:memberClass>'.$service['memberClass'].'</ns3:memberClass> <ns3:memberCode>'.$service['memberCode'].'</ns3:memberCode> <ns3:subsystemCode>'.$service['subsystemCode'].'</ns3:subsystemCode> <ns3:serviceCode>'.$service['serviceCode'].'</ns3:serviceCode> <ns3:serviceVersion>'.$service['serviceVersion'].'</ns3:serviceVersion> </ns4:service> </SOAP-ENV:Header> <SOAP-ENV:Body> <ns3:sendDocument xmlns:ns2="http://www.riik.ee/schemas/deccontainer/vers_2_1/" xmlns:ns3="http://dhx.x-road.eu/producer" xmlns:ns4="http://x-road.eu/xsd/identifiers" xmlns:ns5="http://x-road.eu/xsd/xroad.xsd"> <ns3:DHXVersion>1.0</ns3:DHXVersion> <ns3:consignmentId>'.generateId(array(8,4,4,4,12)).'</ns3:consignmentId> <ns3:documentAttachment>cid:'.$attachment_id.'</ns3:documentAttachment> </ns3:sendDocument> </SOAP-ENV:Body> </SOAP-ENV:Envelope>';
5. Saatmine - Curl swaRef
$documentAttachment='--'.$boundary."\n". 'Content-Type: text/xml; type="text/xml"; charset=utf-8'."\n". 'Content-ID: <soapPart>'."\n"."\n". $envelope."\n". '--'.$boundary."\n". 'Content-Type: text/xml; charset=UTF-8'."\n". 'Content-Encoding: gzip'."\n". 'Content-Transfer-Encoding: base64'."\n". 'Content-ID: <'.$attachment_id.'>'."\n"."\n". $attachment_base64_gzip."\n". '--'.$boundary.'--'; //$documentAttachment=str_ireplace("\x0D","",$documentAttachment);//Remove ^M (Windows cariage return) if needed
Curl headers
'MIME-Version: 1.0', 'Content-Type: Multipart/Related; start-info="text/xml"; type="text/xml"; start="<soapPart>"; charset="utf-8"; boundary="'.$boundary.'"', 'Cache-Control: no-cache', 'Pragma: no-cache', 'SOAPAction: ""', );
Curl - Saadame ümbriku koos manusega ja saame vastu xml kujul vastuse.
Vastuse kuvamine saajalt
echo '<h1>Vastus</h1>'; echo '<pre style="padding:10px;margin:5px;background-color:yellow;white-space:pre-wrap;">'.htmlspecialchars($response).'</pre>';
Kogu süsteem koos
<?php $file='testdoc.asice'; 'xRoadInstance'=>'ee-test', 'memberClass'=>'COM', 'memberCode'=>'12345678', 'subsystemCode'=>'DHX', 'serviceCode'=>'sendDocument', 'serviceVersion'=>'v1' ); 'xRoadInstance'=>'ee-test', 'memberClass'=>'COM', 'memberCode'=>'87654321', 'subsystemCode'=>'DHX-87654321' ); 'Name'=>'Registrite ja Infosüsteemide Keskus', 'OrganisationCode'=>'12345678', 'Residency'=>'EE' ); 'Name'=>'Juhan Pääsuke', 'GivenName'=>'Juhan', 'Surname'=>'Pääsuke', 'PersonalIdCode'=>'EE38511026032', 'Residency'=>'EE', 'Phone'=>'37250000000', 'Email'=>'juhan.paasuke@domeen.ee', 'WebPage'=>'', 'MessagingAddress'=>'', 'Country'=>'Eesti', 'County'=>'Harju maakond', 'LocalGovernment'=>'Tallinn', 'PostalCode'=>'10148' ); 'Name'=>'Juhan Pääsuke', 'GivenName'=>'Juhan', 'Surname'=>'Pääsuke', 'PersonalIdCode'=>'EE38511026032', 'Residency'=>'EE', 'Phone'=>'37250000000', 'Email'=>'juhan.paasuke@domeen.ee', 'WebPage'=>'', 'MessagingAddress'=>'', 'Country'=>'Eesti', 'County'=>'Harju maakond', 'LocalGovernment'=>'Tallinn', 'PostalCode'=>'10148' ); 'RecordType'=>'Kiri', 'RecordTitle'=>'', 'RecordLanguage'=>'EE', 'AccessConditionsCode'=>'Avalik' ); $soapUrl='https://turvaserver.domeen.ee/cgi-bin/cproxy/sendDocument'; $capsule_xml='<?xml version="1.0" encoding="utf-8"?> <DecContainer xmlns="http://www.riik.ee/schemas/deccontainer/vers_2_1/"> <Transport> <DecSender> <OrganisationCode>'.$sender['OrganisationCode'].'</OrganisationCode> <PersonalIdCode>'.$recordSender['PersonalIdCode'].'</PersonalIdCode> </DecSender> <DecRecipient> <OrganisationCode>'.$recipient['OrganisationCode'].'</OrganisationCode> </DecRecipient> </Transport> <RecordCreator> <Person> <Name>'.$recordCreator['Name'].'</Name> <GivenName>'.$recordCreator['GivenName'].'</GivenName> <Surname>'.$recordCreator['Surname'].'</Surname> <PersonalIdCode>'.$recordCreator['PersonalIdCode'].'</PersonalIdCode> <Residency>'.$recordCreator['Residency'].'</Residency> </Person> <ContactData> <Adit>1</Adit> <Phone>'.$recordCreator['Phone'].'</Phone> <Email>'.$recordCreator['Email'].'</Email> <WebPage>'.$recordCreator['WebPage'].'</WebPage> <MessagingAddress>'.$recordCreator['MessagingAddress'].'</MessagingAddress> <PostalAddress> <Country>'.$recordCreator['Country'].'</Country> <County>'.$recordCreator['County'].'</County> <LocalGovernment>'.$recordCreator['LocalGovernment'].'</LocalGovernment> <AdministrativeUnit></AdministrativeUnit> <SmallPlace></SmallPlace> <LandUnit></LandUnit> <Street></Street> <HouseNumber></HouseNumber> <BuildingPartNumber></BuildingPartNumber> <PostalCode>'.$recordCreator['PostalCode'].'</PostalCode> </PostalAddress> </ContactData> </RecordCreator> <RecordSenderToDec> <Person> <Name>'.$recordSender['Name'].'</Name> <GivenName>'.$recordSender['GivenName'].'</GivenName> <Surname>'.$recordSender['Surname'].'</Surname> <PersonalIdCode>'.$recordSender['PersonalIdCode'].'</PersonalIdCode> <Residency>'.$recordSender['Residency'].'</Residency> </Person> <ContactData> <Adit>1</Adit> <Phone>'.$recordSender['Phone'].'</Phone> <Email>'.$recordSender['Email'].'</Email> <WebPage>'.$recordSender['WebPage'].'</WebPage> <MessagingAddress>'.$recordSender['MessagingAddress'].'</MessagingAddress> <PostalAddress> <Country>'.$recordSender['Country'].'</Country> <County>'.$recordSender['County'].'</County> <LocalGovernment>'.$recordSender['LocalGovernment'].'</LocalGovernment> <AdministrativeUnit></AdministrativeUnit> <SmallPlace></SmallPlace> <LandUnit></LandUnit> <Street></Street> <HouseNumber></HouseNumber> <BuildingPartNumber></BuildingPartNumber> <PostalCode>'.$recordSender['PostalCode'].'</PostalCode> </PostalAddress> </ContactData> </RecordSenderToDec> <Recipient> <Organisation> <Name>'.$recipient['Name'].'</Name> <OrganisationCode>'.$recipient['OrganisationCode'].'</OrganisationCode> <Residency>'.$recipient['Residency'].'</Residency> </Organisation> </Recipient> <RecordMetadata> <RecordType>'.$recordMetadata['RecordType'].'</RecordType> <RecordOriginalIdentifier>'.generateNumberId(6).'</RecordOriginalIdentifier> <RecordTitle>'.$recordMetadata['RecordTitle'].'</RecordTitle> <RecordLanguage>'.$recordMetadata['RecordLanguage'].'</RecordLanguage> </RecordMetadata> <Access> <AccessConditionsCode>'.$recordMetadata['AccessConditionsCode'].'</AccessConditionsCode> </Access> <File> <RecordMainComponent>1</RecordMainComponent> <MimeType>application/vnd.etsi.asic-e+zip</MimeType> </File> <RecordTypeSpecificMetadata /> <DecMetadata> <DecId>'.generateNumberId(5).'</DecId> <DecFolder>/</DecFolder> </DecMetadata> </DecContainer>'; $envelope='<?xml version="1.0" encoding="utf-8" ?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> <SOAP-ENV:Header> <ns4:protocolVersion xmlns:ns2="http://dhx.x-road.eu/producer" xmlns:ns3="http://x-road.eu/xsd/identifiers" xmlns:ns4="http://x-road.eu/xsd/xroad.xsd" xmlns:ns5="http://www.riik.ee/schemas/deccontainer/vers_2_1/">4.0</ns4:protocolVersion> <ns4:id xmlns:ns2="http://dhx.x-road.eu/producer" xmlns:ns3="http://x-road.eu/xsd/identifiers" xmlns:ns4="http://x-road.eu/xsd/xroad.xsd" xmlns:ns5="http://www.riik.ee/schemas/deccontainer/vers_2_1/">64a3ddbd-1620-42c4-b2fe-60b854c2f32f</ns4:id> <ns4:client xmlns:ns2="http://dhx.x-road.eu/producer" xmlns:ns3="http://x-road.eu/xsd/identifiers" xmlns:ns4="http://x-road.eu/xsd/xroad.xsd" xmlns:ns5="http://www.riik.ee/schemas/deccontainer/vers_2_1/" ns3:objectType="SUBSYSTEM"> <ns3:xRoadInstance>'.$client['xRoadInstance'].'</ns3:xRoadInstance> <ns3:memberClass>'.$client['memberClass'].'</ns3:memberClass> <ns3:memberCode>'.$client['memberCode'].'</ns3:memberCode> <ns3:subsystemCode>'.$client['subsystemCode'].'</ns3:subsystemCode> </ns4:client> <ns4:service xmlns:ns2="http://dhx.x-road.eu/producer" xmlns:ns3="http://x-road.eu/xsd/identifiers" xmlns:ns4="http://x-road.eu/xsd/xroad.xsd" xmlns:ns5="http://www.riik.ee/schemas/deccontainer/vers_2_1/" ns3:objectType="SERVICE"> <ns3:xRoadInstance>'.$service['xRoadInstance'].'</ns3:xRoadInstance> <ns3:memberClass>'.$service['memberClass'].'</ns3:memberClass> <ns3:memberCode>'.$service['memberCode'].'</ns3:memberCode> <ns3:subsystemCode>'.$service['subsystemCode'].'</ns3:subsystemCode> <ns3:serviceCode>'.$service['serviceCode'].'</ns3:serviceCode> <ns3:serviceVersion>'.$service['serviceVersion'].'</ns3:serviceVersion> </ns4:service> </SOAP-ENV:Header> <SOAP-ENV:Body> <ns3:sendDocument xmlns:ns2="http://www.riik.ee/schemas/deccontainer/vers_2_1/" xmlns:ns3="http://dhx.x-road.eu/producer" xmlns:ns4="http://x-road.eu/xsd/identifiers" xmlns:ns5="http://x-road.eu/xsd/xroad.xsd"> <ns3:DHXVersion>1.0</ns3:DHXVersion> <ns3:documentAttachment>cid:'.$attachment_id.'</ns3:documentAttachment> </ns3:sendDocument> </SOAP-ENV:Body> </SOAP-ENV:Envelope>'; $documentAttachment='--'.$boundary."\n". 'Content-Type: text/xml; type="text/xml"; charset=utf-8'."\n". 'Content-ID: <soapPart>'."\n"."\n". $envelope."\n". '--'.$boundary."\n". 'Content-Type: text/xml; charset=UTF-8'."\n". 'Content-Encoding: gzip'."\n". 'Content-Transfer-Encoding: base64'."\n". 'Content-ID: <'.$attachment_id.'>'."\n"."\n". $attachment_base64_gzip."\n". '--'.$boundary.'--'; //$documentAttachment=str_ireplace("\x0D","",$documentAttachment);//Remove ^M (Windows cariage return) if needed 'MIME-Version: 1.0', 'Content-Type: Multipart/Related; start-info="text/xml"; type="text/xml"; start="<soapPart>"; charset="utf-8"; boundary="'.$boundary.'"', 'Cache-Control: no-cache', 'Pragma: no-cache', 'SOAPAction: ""', ); echo '<h1>Header</h1>'; echo '<pre style="padding:10px;margin:5px;background-color:greenyellow;white-space:pre-wrap;">'.htmlspecialchars(curl_getinfo($ch, CURLINFO_HEADER_OUT)).'</pre>'; echo '<h1>Ümbrik</h1>'; echo '<pre style="padding:10px;margin:5px;background-color:aquamarine;white-space:pre-wrap;">'.htmlspecialchars($documentAttachment).'</pre>'; echo '<h1>Soap headers</h1>'; echo '<pre style="padding:10px;margin:5px;background-color:antiquewhite;white-space:pre-wrap;">'; echo'</pre>'; echo 'Took ', $info['total_time'], ' seconds to send a request to ', $info['url'], "\n"; } echo '<h1>Vastus</h1>'; echo '<pre style="padding:10px;margin:5px;background-color:yellow;white-space:pre-wrap;">'.htmlspecialchars($response).'</pre>'; echo '<h1>Kapsel/Manus/capsule</h1>'; function generateId($set){ $letters=array('0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','A','B','C','D','E','F'); foreach($set as $v){ $str=''; for($i=0;$i<$v;$i++){ } } } function generateNumberId($l){ $str=''; for($i=0;$i<$l;$i++){ } return $str; } ?>
Lisa kommentaar