<?php

/*

  Ukazkovy jednoduchy klient Webovych sluzeb v PHP
  
  Autor: Lukas Valenta, CIV, ZCU (lvalenta@civ.zcu.cz)
  
  Popis funkce:
  
    Aplikace ukazuje, jak lze snadno ziskavat z PHP scriptu data ze STAGu prostrednictvim
    webovych sluzeb nad IS/STAG. Script si stahne XML soubor z webove sluzby a pak
    jej transformuje do (x)HTML pomoci XSLT transformace. Na ukazku je implementovan
    seznam pracovist/kateder, kde lze kliknout na pracoviste -> zobrazi se seznam
    predmetu tohoto pracoviste -> kliknutim na predmet se zobrazi detailni informace o nem.
    
  Pozadavky:
  
    K behu aplikace je potreba PHP 5 (urcite by slo zprovoznit i na PHP 4, jen na nem nebylo
    testovano) a PHP modul XSL (php_xsl.dll / php_xsl.so).

*/

// pokud bezi toto PHP v ramci serveru webovych sluzeb, je zajisteno primo nastaveni promenne WS_SERVER
// pokud budete chtit provozovat nekde samostatne, musite zde zadat presnou adresu na server WS
    define("WS_URL", $GLOBALS["_ENV"]["WS_SERVER"].(substr($GLOBALS["_ENV"]["WS_SERVER"], 0, 5) == 'https' ? ":443" : ":80")."/ws/services/rest2/");

    define("XSLT_DIR", "xsl/");

    define("HIERARCHIE_PRACOVIST", "ciselniky/getSeznamPracovist");
    define("HIERARCHIE_PRACOVIST_XSL", "hierarchie_pracovist.xsl");

    define("PRACOVISTE", "predmety/getPredmetyByKatedra");
    define("PRACOVISTE_XSL", "predmety_katedry.xsl");

    define("PREDMET", "predmety/getPredmetInfo");
    define("PREDMET_XSL", "predmet.xsl");

/* Vrati vystup zadane webove sluzby */
function getServiceResult($serviceURL) {

    $res = file_get_contents(WS_URL.$serviceURL);
    if ($res !== false && (strpos($res, "faultstring") !== false || substr($res, 0, 6) == '<html>')) {
        echo "<div class=\"xg_msgFromServerError\">$res</div>";
    }
    if ($res === false || strlen($res) == 0) {
        echo "<div class=\"xg_msgFromServerError\">Chyba, webova sluzba nevratila nic a/nebo vratila neznamou chybu. Jste spravne prihlaseni?</div>";
    }
    return $res;

}

/* Provede XSLT transformaci zadaneho vstupniho XML */
function transformXSLT(&$input, $xslFile, $params = false) {

   $xslDoc = new DOMDocument();
   $xslDoc->load(XSLT_DIR.$xslFile);

   $xmlDoc = new DOMDocument();
   $xmlDoc->loadXML($input);

   $proc = new XSLTProcessor();
   
   /* Pridame parametry transformace, je-li potreba */
   if ($params !== FALSE) {
     foreach ($params as $param) {
       $proc->setParameter( "", $param["name"], $param["value"] );
     }
   }
   
   $proc->importStylesheet($xslDoc);
   
   return $proc->transformToXML($xmlDoc);    

}

/* Stazeni vystupu webove sluzby a jeho transformace */ 
function processAndTransformService($serviceURL, $xslFile, $params = false) {

    return transformXSLT( getServiceResult($serviceURL), $xslFile, $params );

}
    
/*   ---------------------------------------
      Zde zacina "hlavni program"
*/

    $screen = isset($_GET["screen"]) ? $_GET["screen"] : "main";

    /* podle vybrane obrazovky stahnu pozadovana data a zobrazim je */    
    if ($screen == "main") {
    
        /* hlavni obrazovka - seznam pracovist */
        echo processAndTransformService( HIERARCHIE_PRACOVIST."?typPracoviste=%25&zkratka=%25&nadrazenePracoviste=%25", HIERARCHIE_PRACOVIST_XSL );
    } else if ($screen == "pracoviste") {
    
        /* seznam predmetu pracoviste */
        $pracZkr = $_GET["pracZkr"];
    
        $params = array();
        $params[] = array("name"=>"pracZkr", "value" => $pracZkr);
        
        echo processAndTransformService( PRACOVISTE."?katedra=".$pracZkr, PRACOVISTE_XSL, $params );
    } else if ($screen == "predmet") {
    
        /* informace o predmetu */
        $pracZkr = $_GET["pracZkr"];
        $zkrPredm = $_GET["zkrPredm"];
    
        $params = array();
        $params[] = array("name"=>"pracZkr", "value" => $pracZkr);
        $params[] = array("name"=>"zkrPredm", "value" => $zkrPredm);
        
        echo processAndTransformService( PREDMET."?katedra=".$pracZkr."&zkratka=".$zkrPredm, PREDMET_XSL, $params );
    }


?>