|
![]() | Vytváření aplikací 602XML+602SQL+PHP | ![]() | Vytváření aplikací 602XML+602SQL+PHP |
Stránka s příklady navazuje na rozbor situace uvedený zde.
Uživatel odešle formulář, z něhož skript potřebuje pro další činnost hodnotu elementu ID_PRODEJCE a DATUM. Použije se vhodně navržený analytický importní DAD (vedoucí pouze do klientských proměnných _ID_PRODEJCE a _DATUM) a XMLAPI funkce wb_import_from_XML_buffer.
... $xml_data = $GLOBALS["HTTP_RAW_POST_DATA"]; // PHP globální proměnná obsahující XML data $hostvars=array( // první proměnná se jmenuje _id_prodejce "_id_prodejce" => array( // je typu Integer "type" => ATT_INT32, // je to OUT proměnná "out" => TRUE, "value" => null ), // druhá proměnná se jmenuje _datum "_datum" => array( // je typu Date "type" => ATT_DATE, "out" => TRUE, "value" => null ) ); wb_import_from_XML_buffer($connection, "*prodejce_imp_prom", $xml_data, $hostvars); if($hostvars["_id_prodejce"]["value"]==null){ // proměnna se nenaplnila echo ' Id nebylo zadano.'; // vypsat na std. vystup info pro 602XML Filler exit; // nema cenu dal pokracovat } ...
DAD prodejce_imp_prom pro tento příklad musí být navržen takto:
Poměrně běžnou situací je potřeba v rámci jediného HTTP požadavku Filleru XML data odeslat i přijmout nová (tedy z hlediska 602SQL jedním DADem přijmout a druhým odeslat). Typicky se jedná o situaci, kdy uživatel vybere např. z číselníku unikátní záznam a tlačítkem doplní záhlaví formuláře hodnotami z tohoto záznamu a dále s formulářem pracuje.
Ze zadání je zřejmé, že na straně 602SQL jsou třeba dva DADy, první - analytický vedoucí do proměnných, který přijme XML od Filleru, vytáhne z dat unikátní hodnotu a uloží do proměnné, zavolá druhý (syntetický výstupní) DAD, který je parametrizován právě touto proměnnou a výstup tohoto DADu se vrátí do Filleru, který se těmito daty překreslí.
Pro tento typický případ existuje postup, jak výsledku dosáhnout bez zbytečného programování předávání parametrů uvnitř skriptu (které je samozřejmě také možné). Technologie DAD dovoluje vytvořit tzv. zřetězený DAD, tedy dvojici DADů, která vyhovuje výše uvedenému zadání. Jako URL požadavku lze pak využít 602SQL WebXML rozhraní ve tvaru:
http[s]://<host_name>/[<path>/]602.php/<server_name>/<schema_name>/DAD/dad_1
kde dad_1 je jméno prvního DADu z dvojice tvořící zřetězený DAD.
Uživatel odešle formulář s daty, která se mají naimportovat do tabulek databáze. Použije se XMLAPI funkce wb_import_from_XML a vhodně navržený analytický importní DAD.
... $xml_data = $GLOBALS["HTTP_RAW_POST_DATA"]; // PHP globální proměnná obsahující XML data if (( @wb_import_from_XML($connection,'*prodejce_vstup',$xml_data)) !== FALSE){ print 'Export OK'; } else { print 'Export failed!'; };
Skript na základě nějakých proměnných (např. _id_prodejce a _datum) sestaví dotaz, ten se použije jako zdroj dat pro exportní DAD a data se vrátí.
... $sqlstmt = 'SELECT * FROM Prodejci, Prodej WHERE Prodejci.id_prodejce=Prodej.id_prodejce AND id_prodejce='.strval($hostvars["_id_prodejce"]["value"]).' AND prodej.datum='.strval(date("d.m.Y",$hostvars["_datum"]["value"])) ; $res = wb_exec($connection,$sqlstmt); if ($res) // v $res je číslo kurzoru { print(wb_export_to_XML_buffer($connection,'*dadexport_prod',$res)); // poslat XML výstup funkce do Filleru close($res); // zavřít kurzor } else { echo 'Chyba pri otevirani dotazu...'; }
Totéž, ale dotaz se nesestaví v PHP jako řetězec ale použijí se PSQL funkce.
... $psqlstmt = 'SELECT * FROM Prodejci, Prodej WHERE Prodejci.id_prodejce=Prodej.id_prodejce AND id_prodejce=? AND prodej.datum=?' ; $psql=wb_psql_prepare($connection,$psqlstmt); wb_psql_send_param($psql, 0 /*první parametr*/, $hostvars["_id_prodejce"]["value"] /*hodnota parametru*/); wb_psql_send_param($psql, 1 /*druhý parametr*/, $hostvars["_datum"]["value"] /*hodnota parametru*/); $res = wb_psql_execute($psql); if ($res) // v $res je číslo kurzoru { print(wb_export_to_XML_buffer($connection,'*dadexport_prod',$res)); // poslat XML výstup funkce do Filleru close($res); // zavřít kurzor } else { echo 'Chyba pri otevirani dotazu...'; }
Příkladem může být podání žádosti - po vyplnění se žádost odešle a do Filleru se vrátí formulář obsahující informaci o uložení a číslo, pod jakým je žádost evidována. Při vložení žádosti se pomocí sekvence přidělí unikátní číslo, které si skript přečte a použije pro získání tohoto záznamu pro odpověď. Tímto záznamem naplní formulář (bez porušení digitálního podpisu formuláře - funkce wb_get_XML_form) a vrátí jej. Formulář je uložen jako objekt v aplikaci.
$xml_data = $GLOBALS["HTTP_RAW_POST_DATA"]; if (( @wb_import_from_XML_buffer($connection,'*zadost_vstup',$xml_data)) !== FALSE){ $seq_cur = -1; // bude obsahovat unikátní číslo přidělené sekvencí if (( wb_exec($connection, 'SET :>seq_cur = zadosti_seq.currval')) !== FALSE) { $sql1 = 'SELECT jmeno||" "||prijmeni AS jmeno,rc,datum,stav,cis_jed FROM Zadosti_tab WHERE id='.strval($seq_cur); $curs = wb_exec($connection,$sql1); if (( $new_xml_data = @wb_export_to_xml_buffer($connection, '*zadost_vystup', $curs, NULL)) !== FALSE ) { if (( $xmlform = @wb_get_xml_form($connection, '*zadost_odpoved', $new_xml_data)) !== FALSE) { print $xmlform; // poslat do Filleru } else Send_error_form(5) ; } else Send_error_form(4) ; } else Send_error_form(3) ; } else Send_error_form(2) ; function Send_error_form($err_num){ //poslat form Chybovy_form (obsahující jen 2 proměnné) do Filleru global $connection; if (( $err_xml_data = @wb_export_to_xml_buffer($connection, '*err_dad', NULL, array( "err_num" => array("type" => ATT_INT32,"out" => FALSE,"value" => $err_num), "err_date" => array("type" => ATT_DATE ,"out" => FALSE,"value" => time() ) ) )) !== FALSE ) { if (( $xmlform = wb_get_xml_form($connection,'*Chybovy_form',$err_xml_data)) !== FALSE) { print $xmlform; exit; }; } };
Jako předešlý odstavec, ale formulář je uložen jako hodnota sloupce typu CLOB v tabulce (nikoliv tedy jako objekt typu XML Formulář) - např. když databáze slouží jako sklad formulářů. Skript dostane unikátní číslo indexu, aby šlo najít vhodný záznam s CLOBem, otevře kurzor a přečte celý obsah CLOBu a ten vrátí do výstupního proudu. Je třeba nastavit HTTP hlavičku, aby browsery poznaly, že mají vyvolat dialog pro otevření 602XML Filleru.
$id_z = $GLOBALS["id"]; $cursor = wb_exec($connection, "SELECT XML_source, CHAR_LENGTH(XML_source) AS clob_length FROM D_root WHERE id_zadanky=".strval($id_z)); wb_fetch_row($cursor); // načíst první (zde jediný) záznam kurzoru $clob_length=wb_result($cursor,2); // zjistit délku CLOBu wb_longreadlen($cursor, $clob_length);// nastavit délku čtecího bloku $xml_source_clob = wb_result($cursor,1); // přečíst CLOB wb_binmode($cursor, WB_PASSTHRU); // nastavit vhodný režim práce s CLOBy // nastavit HTTP hlavičku požadavku () header("Content-type: text/xml charset=UTF-8;"); header("Cache-control: private"); header("Content-Disposition: attachment; filename=zadanka.fo"); print $xml_source_clob; // poslat XML text s formulářem na std. výstup skriptu wb_close($cursor); // zavřít otevřený kurzor (nepovinné, ale slušné)
Předešlý příklad lze upravit tak, aby formulář se odesílal do Filleru s jinými daty. K tomu slouží druhá podoba funkce wb_get_XML_form, kde je možné předat odkaz na formulář nejen jako jméno objektu, ale i přímo jako zdrojový XML text. Jedná se tedy o kombinaci dvou posledních příkladů:
... // přečíst CLOB $xml_source_clob = wb_result($cursor,1); ... $new_xml_data = wb_export_to_xml_buffer($connection, '*zadost_vystup', $curs, NULL); // přečíst XML formulář s daty $xmlform = wb_get_xml_form($connection, $xml_source_clob, $new_xml_data); // poslat XML text s formulářem na std. výstup skriptu print $xml_source_clob; ...
Zkomprimovaný formulář je uložen jako hodnota sloupce typu BLOB v tabulce (jsou to binární data, ne text).
... $sid = ...; $sql = 'SELECT zfo FROM Access WHERE id=?'; $psql = wb_psql_prepare($connection, $sql); $res = wb_psql_execute($psql, $sid); wb_fetch_row($res, 1); // načíst první řádek odpovědi $zfo_name = "pokus.zfo" ; wb_binmode($res2, WB_PASSTHRU); // nastavit režim práce s LOB header("Content-type: application/xml "); // pro browsery není podstatné header("Cache-control: private"); header("Content-Disposition: attachment; filename=$zfo_name"); wb_result($res, 'zfo'); // výstup binárních dat na std. výstup skriptu
Tento postup samozřejmě funguje i pro odeslání FO.
V mnoha případech stačí, když uživatel po odeslání požadavku obdrží textovou informaci o výsledku, obvykle importu dat do tabulek databáze. V nejjednodušším případě, kdy se provádí pouze jediný import jedním DADem a požadavek je zadán pomocí 602SQL WebXML rozhraní (.../Schema/DAD/JménoDADu...), lze text vrácený při úspěchu a text vrácený při neúspěchu zadat přímo do definice DADu. Není třeba řešit kódování, funguje i diakritika. Texty jsou pevné a nelze je žádným způsobem modifikovat.
Provádí-li složitější akce PHP skript, i ten může vracet textový výsledek akce. Velkou výhodou je, že text je možné vytvářet či modifikovat za běhu skriptu a tím reagovat na určité stavy v datech či databázi.
Výstupní text musí být v kódování UTF-8 a musí být obalen minimálně tagy <HTML> a <BODY> a musí být HTML validní.
... echo '<html><body> <font style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 10pt;">'; include './db.php'; $raw_data = $GLOBALS["HTTP_RAW_POST_DATA"]; if($raw_data==""){ echo 'Odesílání dat selhalo.'; //text musí být v UTF-8, je-li tam diakritika!! echo ' </font> </body></html>'; exit; } ... if($vysledek == 1) { echo '<b>Zpráva o prodeji byla úspěšně uložena v databázi.</b><br><br> Byla to první zpráva od <b>nového</b> prodejce.'; } elseif( $vysledek == 2) { echo '<b>Zpráva o prodeji byla úspěšně uložena v databázi.</b><br><br> Byla to další zpráva od prodejce již uloženého v databázi.'; ...}; echo ' </font> </body></html>';
![]() | Vytváření aplikací 602XML+602SQL+PHP | ![]() | Vytváření aplikací 602XML+602SQL+PHP |