00001 <?php
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00032 class ilCtrl
00033 {
00034 var $target_script;
00035 var $forward;
00036 var $parent;
00037 var $save_parameter;
00038 var $return;
00039
00043 function ilCtrl()
00044 {
00045 global $ilBench;
00046
00047 $this->bench =& $ilBench;
00048 $this->transit = array();
00049
00050 $this->location = array();
00051 $this->tab = array();
00052 $this->current_node = 0;
00053
00054
00055 $this->stored_trees = array
00056 ("ilrepositorygui", "ilpersonaldesktopgui",
00057 "illmpresentationgui", "illmeditorgui",
00058 "iladministrationgui");
00059 }
00060
00070 function callBaseClass()
00071 {
00072 global $ilDB;
00073
00074 $baseClass = strtolower($_GET["baseClass"]);
00075
00076
00077 $q = "SELECT * FROM module_class WHERE LOWER(class) = ".
00078 $ilDB->quote($baseClass);
00079 $mc_set = $ilDB->query($q);
00080 $mc_rec = $mc_set->fetchRow(DB_FETCHMODE_ASSOC);
00081 $module = $mc_rec["module"];
00082 $class = $mc_rec["class"];
00083 $class_dir = $mc_rec["dir"];
00084
00085 if ($module != "")
00086 {
00087
00088 $q = "SELECT * FROM module WHERE name = ".
00089 $ilDB->quote($module);
00090
00091 $m_set = $ilDB->query($q);
00092 $m_rec = $m_set->fetchRow(DB_FETCHMODE_ASSOC);
00093 $this->module_dir = $m_rec["dir"];
00094
00095 include_once $this->module_dir."/".$class_dir."/class.".$class.".php";;
00096 }
00097 else
00098 {
00099
00100 $q = "SELECT * FROM service_class WHERE LOWER(class) = ".
00101 $ilDB->quote($baseClass);
00102
00103 $mc_set = $ilDB->query($q);
00104 $mc_rec = $mc_set->fetchRow(DB_FETCHMODE_ASSOC);
00105 $service = $mc_rec["service"];
00106 $class = $mc_rec["class"];
00107 $class_dir = $mc_rec["dir"];
00108
00109 if ($service == "")
00110 {
00111 echo "Could not find entry in modules.xml or services.xml for".
00112 $baseClass;
00113 exit;
00114 }
00115
00116
00117 $q = "SELECT * FROM service WHERE name = ".
00118 $ilDB->quote($service);
00119
00120 $m_set = $ilDB->query($q);
00121 $m_rec = $m_set->fetchRow(DB_FETCHMODE_ASSOC);
00122 $this->service_dir = $m_rec["dir"];
00123
00124 include_once $this->service_dir."/".$class_dir."/class.".$class.".php";;
00125 }
00126
00127
00128 $this->getCallStructure(strtolower($baseClass));
00129 $base_class_gui =& new $class();
00130 $this->forwardCommand($base_class_gui);
00131 }
00132
00136 function getModuleDir()
00137 {
00138 return $this->module_dir;
00139 }
00140
00152 function &forwardCommand(&$a_gui_object)
00153 {
00154 $class = strtolower(get_class($a_gui_object));
00155
00156 $nr = $this->getNodeIdForTargetClass($this->current_node, $class);
00157 if ($nr > 0)
00158 {
00159 $this->current_node = $nr;
00160 return $a_gui_object->executeCommand();
00161 }
00162 echo "ERROR: Can't forward to class $class."; exit;
00163
00164 }
00165
00166
00188 function getNodeIdForTargetClass($a_par_node, $a_class)
00189 {
00190 $class = strtolower($a_class);
00191
00192
00193 if ($class == $this->call_node[$a_par_node]["class"])
00194 {
00195 return $a_par_node;
00196 }
00197
00198
00199 foreach($this->call_node as $nr => $node)
00200 {
00201 if (($node["parent"] == $a_par_node) &&
00202 ($node["class"] == $class))
00203 {
00204 return $nr;
00205 }
00206 }
00207
00208
00209 $par = $this->call_node[$a_par_node]["parent"];
00210 if ($par != 0)
00211 {
00212 foreach($this->call_node as $nr => $node)
00213 {
00214 if (($node["parent"] == $par) &&
00215 ($node["class"] == $class))
00216 {
00217 return $nr;
00218 }
00219 }
00220 }
00221
00222
00223 while($par != 0)
00224 {
00225 if ($this->call_node[$par]["class"] == $class)
00226 {
00227 return $par;
00228 }
00229 $par = $this->call_node[$par]["parent"];
00230 }
00231
00232 echo "ERROR: Can't find target class $a_class for node $a_par_node ".
00233 "(".$this->call_node[$a_par_node]["class"].").<br>"; exit;
00234 }
00235
00241 function getCmdNode()
00242 {
00243 return $_GET["cmdNode"];
00244 }
00245
00253 function addLocation($a_title, $a_link, $a_target = "")
00254 {
00255 $this->location[] = array("title" => $a_title,
00256 "link" => $a_link, "target" => $a_target);
00257 }
00258
00264 function getLocations()
00265 {
00266 return $this->location;
00267 }
00268
00277 function addTab($a_lang_var, $a_link, $a_cmd, $a_class)
00278 {
00279 $a_class = strtolower($a_class);
00280
00281 $this->tab[] = array("lang_var" => $a_lang_var,
00282 "link" => $a_link, "cmd" => $a_cmd, "class" => $a_class);
00283 }
00284
00290 function getTabs()
00291 {
00292 return $this->tab;
00293 }
00294
00295
00314 function getCallStructure($a_class, $a_nr = 0, $a_parent = 0)
00315 {
00316 global $ilDB;
00317
00318 $a_class = strtolower($a_class);
00319
00320 if (in_array($a_class, $this->stored_trees))
00321 {
00322 $q = "SELECT * FROM ctrl_structure WHERE root_class = ".
00323 $ilDB->quote($a_class);
00324 $set = $ilDB->query($q);
00325 $rec = $set->fetchRow(DB_FETCHMODE_ASSOC);
00326 $this->call_node = unserialize($rec["call_node"]);
00327 $this->forward = unserialize($rec["forward"]);
00328 $this->parent = unserialize($rec["parent"]);
00329 $this->root_class = $a_class;
00330 }
00331 else
00332 {
00333 $this->readCallStructure($a_class, $a_nr, $a_parent);
00334 }
00335 }
00336
00341 function storeCommonStructures()
00342 {
00343 global $ilDB;
00344
00345 $q = "DELETE FROM ctrl_structure";
00346 $ilDB->query($q);
00347
00348 foreach ($this->stored_trees as $root_gui_class)
00349 {
00350 $this->call_node = array();
00351 $this->forward = array();
00352 $this->parent = array();
00353 $this->readCallStructure($root_gui_class);
00354 $q = "INSERT INTO ctrl_structure (root_class, call_node, forward, parent) VALUES (".
00355 $ilDB->quote($root_gui_class).",".
00356 $ilDB->quote(serialize($this->call_node)).",".
00357 $ilDB->quote(serialize($this->forward)).",".
00358 $ilDB->quote(serialize($this->parent)).")";
00359 $ilDB->query($q);
00360 }
00361 }
00362
00366 function readCallStructure($a_class, $a_nr = 0, $a_parent = 0)
00367 {
00368 global $ilDB;
00369
00370 $a_class = strtolower($a_class);
00371
00372 $a_nr++;
00373
00374
00375 $this->call_node[$a_nr] = array("class" => $a_class, "parent" => $a_parent);
00376
00377
00378 $q = "SELECT * FROM ctrl_calls WHERE parent=".
00379 $ilDB->quote(strtolower($a_class)).
00380 " ORDER BY child";
00381
00382 $call_set = $ilDB->query($q);
00383
00384 $a_parent = $a_nr;
00385 while($call_rec = $call_set->fetchRow(DB_FETCHMODE_ASSOC))
00386 {
00387 $a_nr = $this->readCallStructure($call_rec["child"], $a_nr, $a_parent);
00388 $forw[] = $call_rec["child"];
00389 }
00390
00391
00392 $this->forwards($a_class, $forw);
00393
00394
00395
00396 $this->root_class = $a_class;
00397 return $a_nr;
00398 }
00399
00400
00409 function forwards($a_from_class, $a_to_class)
00410 {
00411 $a_from_class = strtolower($a_from_class);
00412
00413 if (is_array($a_to_class))
00414 {
00415 foreach($a_to_class as $to_class)
00416 {
00417 $this->forward[$a_from_class][] = strtolower($to_class);
00418 $this->parent[strtolower($to_class)][] = $a_from_class;
00419 }
00420 }
00421 else
00422 {
00423 $this->forward[strtolower(get_class($a_obj))][] = strtolower($a_to_class);
00424 $this->parent[strtolower($a_to_class)][] = strtolower(get_class($a_obj));
00425 }
00426 }
00427
00428
00448 function saveParameter(&$a_obj, $a_parameter)
00449 {
00450 if (is_array($a_parameter))
00451 {
00452 foreach($a_parameter as $parameter)
00453 {
00454 $this->save_parameter[strtolower(get_class($a_obj))][] = $parameter;
00455 }
00456 }
00457 else
00458 {
00459 $this->save_parameter[strtolower(get_class($a_obj))][] = $a_parameter;
00460 }
00461 }
00462
00463
00488 function setParameter(&$a_obj, $a_parameter, $a_value)
00489 {
00490 $this->parameter[strtolower(get_class($a_obj))][$a_parameter] = $a_value;
00491 }
00492
00493
00503 function setParameterByClass($a_class, $a_parameter, $a_value)
00504 {
00505 $this->parameter[strtolower($a_class)][$a_parameter] = $a_value;
00506 }
00507
00508
00515 function clearParameters(&$a_obj)
00516 {
00517 $this->clearParametersByClass(strtolower(get_class($a_obj)));
00518 }
00519
00526 function clearParametersByClass($a_class)
00527 {
00528 $this->parameter[strtolower($a_class)] = array();
00529 }
00530
00539 function getNextClass()
00540 {
00541
00542 $cmdNode = $this->getCmdNode();
00543 if ($cmdNode == "")
00544 {
00545 return false;
00546 }
00547 else
00548 {
00549 if ($this->current_node == $cmdNode)
00550 {
00551
00552
00553 return "";
00554 }
00555 else
00556 {
00557 $path = $this->getPathNew($this->current_node, $cmdNode);
00558
00559 return $this->call_node[$path[1]]["class"];
00560 }
00561 }
00562 }
00563
00570 function lookupClassPath($a_class_name)
00571 {
00572 global $ilDB;
00573 $a_class_name = strtolower($a_class_name);
00574
00575 $q = "SELECT * FROM ctrl_classfile WHERE class = ".$ilDB->quote($a_class_name);
00576
00577 $class_set = $ilDB->query($q);
00578 $class_rec = $class_set->fetchRow(DB_FETCHMODE_ASSOC);
00579
00580 return $class_rec["file"];
00581 }
00582
00591 function getClassForClasspath($a_class_path)
00592 {
00593 $path = pathinfo($a_class_path);
00594 $file = $path["basename"];
00595 $class = substr($file, 6, strlen($file) - 10);
00596
00597 return $class;
00598 }
00599
00608 function getPathNew($a_source_node, $a_target_node)
00609 {
00610
00611 $path_rev = array();
00612 $c_target = $a_target_node;
00613 while ($a_source_node != $c_target)
00614 {
00615 $path_rev[] = $c_target;
00616 $c_target = $this->call_node[$c_target]["parent"];
00617 if(!($c_target > 0))
00618 {
00619 echo "ERROR: Path not found. Source:".$a_source_node.
00620 " (".$this->call_node[$a_source_node]["class"].")".
00621 ", Target:".$a_target_node.
00622 " (".$this->call_node[$a_target_node]["class"].")";
00623 exit;
00624 }
00625 }
00626 if ($a_source_node == $c_target)
00627 {
00628 $path_rev[] = $c_target;
00629 }
00630 $path = array();
00631 for ($i=0; $i<count($path_rev); $i++)
00632 {
00633 $path[] = $path_rev[count($path_rev) - ($i + 1)];
00634 }
00635
00636 foreach($path as $node)
00637 {
00638
00639 }
00640 return $path;
00641 }
00642
00643
00649 function setTargetScript($a_target_script)
00650 {
00651 $this->target_script = $a_target_script;
00652 }
00653
00654
00660 function getTargetScript()
00661 {
00662 return $this->target_script;
00663 }
00664
00665
00669 function getCmd($a_default_cmd = "")
00670 {
00671 $cmd = $_GET["cmd"];
00672 if($cmd == "post")
00673 {
00674 $cmd = @key($_POST["cmd"]);
00675 }
00676 if($cmd == "")
00677 {
00678 $cmd = $a_default_cmd;
00679 }
00680 return $cmd;
00681 }
00682
00693 function setCmd($a_cmd)
00694 {
00695 $_GET["cmd"] = $a_cmd;
00696 }
00697
00708 function setCmdClass($a_cmd_class)
00709 {
00710 $a_cmd_class = strtolower($a_cmd_class);
00711
00712 $nr = $this->getNodeIdForTargetClass($this->current_node, $a_cmd_class);
00713 $_GET["cmdClass"] = $a_cmd_class;
00714 $_GET["cmdNode"] = $nr;
00715 }
00716
00720 function getCmdClass()
00721 {
00722 return strtolower($_GET["cmdClass"]);
00723 }
00724
00730 function getFormAction(&$a_gui_obj)
00731 {
00732 $script = $this->getFormActionByClass(strtolower(get_class($a_gui_obj)));
00733 return $script;
00734 }
00735
00741 function getFormActionByClass($a_class)
00742 {
00743 $a_class = strtolower($a_class);
00744
00745 $script = $this->getLinkTargetByClass($a_class, "post");
00746 return $script;
00747 }
00748
00749 function redirect(&$a_gui_obj, $a_cmd = "")
00750 {
00751 global $ilBench;
00752
00753
00754 $script = $this->getLinkTargetByClass(strtolower(get_class($a_gui_obj)), $a_cmd);
00755 if (is_object($ilBench))
00756 {
00757 $ilBench->save();
00758 }
00759 ilUtil::redirect($script);
00760 }
00761
00762
00769 function redirectByClass($a_class, $a_cmd = "")
00770 {
00771
00772
00773
00774
00775 $script = $this->getLinkTargetByClass($a_class, $a_cmd);
00776
00777 ilUtil::redirect($script);
00778 }
00779
00780
00789 function getLinkTarget(&$a_gui_obj, $a_cmd = "")
00790 {
00791
00792 $script = $this->getLinkTargetByClass(strtolower(get_class($a_gui_obj)), $a_cmd);
00793 return $script;
00794 }
00795
00796
00806 function getLinkTargetByClass($a_class, $a_cmd = "", $a_transits = "", $a_prepend_transits = false)
00807 {
00808
00809
00810
00811
00812 $script = $this->getTargetScript();
00813 $script = $this->getUrlParameters($a_class, $script, $a_cmd, $transits);
00814
00815
00816
00817 return $script;
00818 }
00819
00823 function setReturn(&$a_gui_obj, $a_cmd)
00824 {
00825 $script = $this->getTargetScript();
00826 $script = $this->getUrlParameters(strtolower(get_class($a_gui_obj)), $script, $a_cmd);
00827
00828 $this->return[strtolower(get_class($a_gui_obj))] = $script;
00829 }
00830
00834 function setReturnByClass($a_class, $a_cmd)
00835 {
00836
00837 $a_class = strtolower($a_class);
00838
00839 $script = $this->getTargetScript();
00840 $script = $this->getUrlParameters($a_class, $script, $a_cmd);
00841
00842 $this->return[strtolower($a_class)] = $script;
00843 }
00844
00848 function returnToParent(&$a_gui_obj, $a_anchor = "")
00849 {
00850 $script = $this->getParentReturn($a_gui_obj);
00851
00852 $script = ilUtil::appendUrlParameterString($script,
00853 "redirectSource=".strtolower(get_class($a_gui_obj)));
00854 if ($a_anchor != "")
00855 {
00856 $script = $script."#".$a_anchor;
00857 }
00858 ilUtil::redirect($script);
00859 }
00860
00861
00867 function getRedirectSource()
00868 {
00869 return $_GET["redirectSource"];
00870 }
00871
00875 function getParentReturn(&$a_gui_obj)
00876 {
00877 return $this->getParentReturnByClass(strtolower(get_class($a_gui_obj)));
00878 }
00879
00880
00881 function getParentReturnByClass($a_class)
00882 {
00883 $a_class = strtolower($a_class);
00884 $ret_class = $this->searchReturnClass($a_class);
00885
00886 if($ret_class)
00887 {
00888
00889 return $this->return[$ret_class];
00890 }
00891 }
00892
00896 function searchReturnClass($a_class)
00897 {
00898
00899 $a_class = strtolower($a_class);
00900
00901 $nr = $this->getNodeIdForTargetClass($this->current_node, $a_class);
00902 $path = $this->getPathNew(1, $nr);
00903
00904 for($i = count($path)-2; $i>=0; $i--)
00905 {
00906
00907
00908 if ($this->return[$this->call_node[$path[$i]]["class"]] != "")
00909 {
00910 return $this->call_node[$path[$i]]["class"];
00911 }
00912 }
00913
00914 return false;
00915 }
00916
00917 function getUrlParameters($a_class, $a_str, $a_cmd = "", $a_transits = "")
00918 {
00919
00920
00921
00922 $params = $this->getParameterArrayByClass($a_class, $a_cmd, $a_transits);
00923
00924 foreach ($params as $par => $value)
00925 {
00926 $a_str = ilUtil::appendUrlParameterString($a_str, $par."=".$value);
00927 }
00928
00929 return $a_str;
00930 }
00931
00932 function appendTransitClasses($a_str)
00933 {
00934 if (is_array($_GET["cmdTransit"]))
00935 {
00936 reset($_GET["cmdTransit"]);
00937 foreach ($_GET["cmdTransit"] as $transit)
00938 {
00939 $a_str = ilUtil::appendUrlParameterString($a_str, "cmdTransit[]=".$transit);
00940 }
00941 }
00942 return $a_str;
00943 }
00944
00945 function getTransitArray()
00946 {
00947 $trans_arr = array();
00948 if (is_array($_GET["cmdTransit"]))
00949 {
00950 reset($_GET["cmdTransit"]);
00951 foreach ($_GET["cmdTransit"] as $key => $transit)
00952 {
00953 $trans_arr["cmdTransit[".$key."]"] = $transit;
00954 }
00955 }
00956 return $trans_arr;
00957 }
00958
00959 function addTransit($a_class)
00960 {
00961 $a_class = strtolower($a_class);
00962 $_GET["cmdTransit"][] = $a_class;
00963 }
00964
00965 function getParameterArray(&$a_gui_obj, $a_cmd = "", $a_incl_transit = true)
00966 {
00967 $par_arr = $this->getParameterArrayByClass(strtolower(get_class($a_gui_obj)), $a_cmd,
00968 $trans_arr);
00969
00970 return $par_arr;
00971 }
00972
00976 function getParameterArrayByClass($a_class, $a_cmd = "", $a_transits = "")
00977 {
00978
00979 if ($a_class == "")
00980 {
00981 return array();
00982 }
00983
00984 if (!is_array($a_class))
00985 {
00986 $a_class = array($a_class);
00987 }
00988
00989 $nr = $this->current_node;
00990 foreach ($a_class as $class)
00991 {
00992
00993 $class = strtolower($class);
00994 $nr = $this->getNodeIdForTargetClass($nr, $class);
00995 $target_class = $class;
00996
00997 }
00998
00999 $path = $this->getPathNew(1, $nr);
01000 $params = array();
01001
01002
01003 foreach($path as $node_id)
01004 {
01005 $class = $this->call_node[$node_id]["class"];
01006 if (is_array($this->save_parameter[$class]))
01007 {
01008 foreach($this->save_parameter[$class] as $par)
01009 {
01010 $params[$par] = $_GET[$par];
01011 }
01012 }
01013
01014 if (is_array($this->parameter[$class]))
01015 {
01016 foreach($this->parameter[$class] as $par => $value)
01017 {
01018 $params[$par] = $value;
01019 }
01020 }
01021 }
01022
01023 if ($a_cmd != "")
01024 {
01025 $params["cmd"] = $a_cmd;
01026 }
01027
01028 $params["cmdClass"] = $target_class;
01029 $params["cmdNode"] = $nr;
01030 $params["baseClass"] = $_GET["baseClass"];
01031
01032 return $params;
01033 }
01034
01035
01036 }
01037 ?>