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
00049
00050 $this->init();
00051
00052
00053 $this->stored_trees = array
00054 ("ilrepositorygui", "ilpersonaldesktopgui",
00055 "illmpresentationgui", "illmeditorgui",
00056 "iladministrationgui");
00057 }
00058
00062 function init()
00063 {
00064 $this->transit = array();
00065 $this->forward = array();
00066 $this->forwards = array();
00067 $this->parent = array();
00068 $this->save_parameter = array();
00069 $this->parameter = array();
00070 $this->return = "";
00071 $this->location = array();
00072 $this->tab = array();
00073 $this->current_node = 0;
00074 $this->module_dir = "";
00075 $this->service_dir = "";
00076 $this->call_node = array();
00077 $this->root_class = "";
00078 }
00079
00089 function callBaseClass()
00090 {
00091 global $ilDB;
00092
00093 $baseClass = strtolower($_GET["baseClass"]);
00094
00095
00096 $q = "SELECT * FROM module_class WHERE LOWER(class) = ".
00097 $ilDB->quote($baseClass);
00098 $mc_set = $ilDB->query($q);
00099 $mc_rec = $mc_set->fetchRow(DB_FETCHMODE_ASSOC);
00100 $module = $mc_rec["module"];
00101 $class = $mc_rec["class"];
00102 $class_dir = $mc_rec["dir"];
00103
00104 if ($module != "")
00105 {
00106
00107 $q = "SELECT * FROM module WHERE name = ".
00108 $ilDB->quote($module);
00109
00110 $m_set = $ilDB->query($q);
00111 $m_rec = $m_set->fetchRow(DB_FETCHMODE_ASSOC);
00112 $this->module_dir = $m_rec["dir"];
00113 include_once $this->module_dir."/".$class_dir."/class.".$class.".php";
00114 }
00115 else
00116 {
00117
00118 $q = "SELECT * FROM service_class WHERE LOWER(class) = ".
00119 $ilDB->quote($baseClass);
00120
00121 $mc_set = $ilDB->query($q);
00122 $mc_rec = $mc_set->fetchRow(DB_FETCHMODE_ASSOC);
00123 $service = $mc_rec["service"];
00124 $class = $mc_rec["class"];
00125 $class_dir = $mc_rec["dir"];
00126
00127 if ($service == "")
00128 {
00129 echo "Could not find entry in modules.xml or services.xml for".
00130 $baseClass;
00131 exit;
00132 }
00133
00134
00135 $q = "SELECT * FROM service WHERE name = ".
00136 $ilDB->quote($service);
00137
00138 $m_set = $ilDB->query($q);
00139 $m_rec = $m_set->fetchRow(DB_FETCHMODE_ASSOC);
00140 $this->service_dir = $m_rec["dir"];
00141
00142 include_once $this->service_dir."/".$class_dir."/class.".$class.".php";;
00143 }
00144
00145
00146 $this->getCallStructure(strtolower($baseClass));
00147 $base_class_gui =& new $class();
00148 $this->forwardCommand($base_class_gui);
00149 }
00150
00154 function getModuleDir()
00155 {
00156 return $this->module_dir;
00157 }
00158
00170 function &forwardCommand(&$a_gui_object)
00171 {
00172 $class = strtolower(get_class($a_gui_object));
00173
00174 $nr = $this->getNodeIdForTargetClass($this->current_node, $class);
00175 if ($nr > 0)
00176 {
00177 $this->current_node = $nr;
00178 return $a_gui_object->executeCommand();
00179 }
00180 echo "ERROR: Can't forward to class $class."; exit;
00181
00182 }
00183
00184
00206 function getNodeIdForTargetClass($a_par_node, $a_class)
00207 {
00208 $class = strtolower($a_class);
00209
00210
00211 if ($class == $this->call_node[$a_par_node]["class"])
00212 {
00213 return $a_par_node;
00214 }
00215
00216
00217 foreach($this->call_node as $nr => $node)
00218 {
00219 if (($node["parent"] == $a_par_node) &&
00220 ($node["class"] == $class))
00221 {
00222 return $nr;
00223 }
00224 }
00225
00226
00227 $par = $this->call_node[$a_par_node]["parent"];
00228 if ($par != 0)
00229 {
00230 foreach($this->call_node as $nr => $node)
00231 {
00232 if (($node["parent"] == $par) &&
00233 ($node["class"] == $class))
00234 {
00235 return $nr;
00236 }
00237 }
00238 }
00239
00240
00241 while($par != 0)
00242 {
00243 if ($this->call_node[$par]["class"] == $class)
00244 {
00245 return $par;
00246 }
00247 $par = $this->call_node[$par]["parent"];
00248 }
00249
00250 echo "ERROR: Can't find target class $a_class for node $a_par_node ".
00251 "(".$this->call_node[$a_par_node]["class"].").<br>";
00252 exit;
00253 }
00254
00260 function getCmdNode()
00261 {
00262 return $_GET["cmdNode"];
00263 }
00264
00272 function addLocation($a_title, $a_link, $a_target = "")
00273 {
00274 $this->location[] = array("title" => $a_title,
00275 "link" => $a_link, "target" => $a_target);
00276 }
00277
00283 function getLocations()
00284 {
00285 return $this->location;
00286 }
00287
00296 function addTab($a_lang_var, $a_link, $a_cmd, $a_class)
00297 {
00298 $a_class = strtolower($a_class);
00299
00300 $this->tab[] = array("lang_var" => $a_lang_var,
00301 "link" => $a_link, "cmd" => $a_cmd, "class" => $a_class);
00302 }
00303
00309 function getTabs()
00310 {
00311 return $this->tab;
00312 }
00313
00314
00333 function getCallStructure($a_class, $a_nr = 0, $a_parent = 0)
00334 {
00335 global $ilDB, $ilLog, $ilUser;
00336
00337 $a_class = strtolower($a_class);
00338
00339 if (in_array($a_class, $this->stored_trees))
00340 {
00341 $q = "SELECT * FROM ctrl_structure WHERE root_class = ".
00342 $ilDB->quote($a_class);
00343 $set = $ilDB->query($q);
00344 $rec = $set->fetchRow(DB_FETCHMODE_ASSOC);
00345 $this->call_node = unserialize($rec["call_node"]);
00346 $this->forward = unserialize($rec["forward"]);
00347 $this->parent = unserialize($rec["parent"]);
00348 $this->root_class = $a_class;
00349 }
00350 else
00351 {
00352 $this->readCallStructure($a_class, $a_nr, $a_parent);
00353 }
00354
00355
00356 if ($_GET["cmdNode"] > 0)
00357 {
00358 if (strtolower($this->call_node[$_GET["cmdNode"]]["class"]) !=
00359 strtolower($_GET["cmdClass"]))
00360 {
00361 if (DEVMODE)
00362 {
00363 die ("Internal Error: ilCtrl Node Error.");
00364 }
00365 else
00366 {
00367 if (is_object($ilLog))
00368 {
00369 if (is_object($ilUser))
00370 {
00371 $user_str = "User: ".$ilUser->getLogin()." (".$ilUser->getId()."), ";
00372 }
00373 $ilLog->write("Invalid Request (class ilCtrl). Possible attack or Control Structure broken (see Setup). ".
00374 $user_str."IP: ".$_SERVER["REMOTE_ADDR"].", URI: ".$_SERVER["REQUEST_URI"]);
00375 }
00376 sendInfo("Sorry, but the request includes invalid parameters." ,true);
00377 ilUtil::redirect("repository.php?cmd=frameset");
00378 }
00379 }
00380 }
00381 }
00382
00387 function storeCommonStructures()
00388 {
00389 global $ilDB;
00390
00391 $q = "DELETE FROM ctrl_structure";
00392 $ilDB->query($q);
00393
00394 foreach ($this->stored_trees as $root_gui_class)
00395 {
00396 $this->call_node = array();
00397 $this->forward = array();
00398 $this->parent = array();
00399 $this->readCallStructure($root_gui_class);
00400 $q = "INSERT INTO ctrl_structure (root_class, call_node, forward, parent) VALUES (".
00401 $ilDB->quote($root_gui_class).",".
00402 $ilDB->quote(serialize($this->call_node)).",".
00403 $ilDB->quote(serialize($this->forward)).",".
00404 $ilDB->quote(serialize($this->parent)).")";
00405 $ilDB->query($q);
00406 }
00407 }
00408
00412 function readCallStructure($a_class, $a_nr = 0, $a_parent = 0)
00413 {
00414 global $ilDB;
00415
00416 $a_class = strtolower($a_class);
00417
00418 $a_nr++;
00419
00420
00421 $this->call_node[$a_nr] = array("class" => $a_class, "parent" => $a_parent);
00422
00423
00424 $q = "SELECT * FROM ctrl_calls WHERE parent=".
00425 $ilDB->quote(strtolower($a_class)).
00426 " ORDER BY child";
00427
00428 $call_set = $ilDB->query($q);
00429
00430 $a_parent = $a_nr;
00431 while($call_rec = $call_set->fetchRow(DB_FETCHMODE_ASSOC))
00432 {
00433 $a_nr = $this->readCallStructure($call_rec["child"], $a_nr, $a_parent);
00434 $forw[] = $call_rec["child"];
00435 }
00436
00437
00438 $this->forwards($a_class, $forw);
00439
00440
00441
00442 $this->root_class = $a_class;
00443 return $a_nr;
00444 }
00445
00446
00455 function forwards($a_from_class, $a_to_class)
00456 {
00457 $a_from_class = strtolower($a_from_class);
00458
00459 if (is_array($a_to_class))
00460 {
00461 foreach($a_to_class as $to_class)
00462 {
00463 $this->forward[$a_from_class][] = strtolower($to_class);
00464 $this->parent[strtolower($to_class)][] = $a_from_class;
00465 }
00466 }
00467 else
00468 {
00469 $this->forward[strtolower(get_class($a_obj))][] = strtolower($a_to_class);
00470 $this->parent[strtolower($a_to_class)][] = strtolower(get_class($a_obj));
00471 }
00472 }
00473
00474
00494 function saveParameter(&$a_obj, $a_parameter)
00495 {
00496 if (is_array($a_parameter))
00497 {
00498 foreach($a_parameter as $parameter)
00499 {
00500 $this->save_parameter[strtolower(get_class($a_obj))][] = $parameter;
00501 }
00502 }
00503 else
00504 {
00505 $this->save_parameter[strtolower(get_class($a_obj))][] = $a_parameter;
00506 }
00507 }
00508
00509
00534 function setParameter(&$a_obj, $a_parameter, $a_value)
00535 {
00536 $this->parameter[strtolower(get_class($a_obj))][$a_parameter] = $a_value;
00537 }
00538
00539
00549 function setParameterByClass($a_class, $a_parameter, $a_value)
00550 {
00551 $this->parameter[strtolower($a_class)][$a_parameter] = $a_value;
00552 }
00553
00554
00561 function clearParameters(&$a_obj)
00562 {
00563 $this->clearParametersByClass(strtolower(get_class($a_obj)));
00564 }
00565
00572 function clearParametersByClass($a_class)
00573 {
00574 $this->parameter[strtolower($a_class)] = array();
00575 }
00576
00585 function getNextClass()
00586 {
00587
00588 $cmdNode = $this->getCmdNode();
00589 if ($cmdNode == "")
00590 {
00591 return false;
00592 }
00593 else
00594 {
00595 if ($this->current_node == $cmdNode)
00596 {
00597
00598
00599 return "";
00600 }
00601 else
00602 {
00603 $path = $this->getPathNew($this->current_node, $cmdNode);
00604
00605 return $this->call_node[$path[1]]["class"];
00606 }
00607 }
00608 }
00609
00616 function lookupClassPath($a_class_name)
00617 {
00618 global $ilDB;
00619 $a_class_name = strtolower($a_class_name);
00620
00621 $q = "SELECT * FROM ctrl_classfile WHERE class = ".$ilDB->quote($a_class_name);
00622
00623 $class_set = $ilDB->query($q);
00624 $class_rec = $class_set->fetchRow(DB_FETCHMODE_ASSOC);
00625
00626 return $class_rec["file"];
00627 }
00628
00637 function getClassForClasspath($a_class_path)
00638 {
00639 $path = pathinfo($a_class_path);
00640 $file = $path["basename"];
00641 $class = substr($file, 6, strlen($file) - 10);
00642
00643 return $class;
00644 }
00645
00654 function getPathNew($a_source_node, $a_target_node)
00655 {
00656
00657 $path_rev = array();
00658 $c_target = $a_target_node;
00659 while ($a_source_node != $c_target)
00660 {
00661 $path_rev[] = $c_target;
00662 $c_target = $this->call_node[$c_target]["parent"];
00663 if(!($c_target > 0))
00664 {
00665 echo "ERROR: Path not found. Source:".$a_source_node.
00666 " (".$this->call_node[$a_source_node]["class"].")".
00667 ", Target:".$a_target_node.
00668 " (".$this->call_node[$a_target_node]["class"].")";
00669 exit;
00670 }
00671 }
00672 if ($a_source_node == $c_target)
00673 {
00674 $path_rev[] = $c_target;
00675 }
00676 $path = array();
00677 for ($i=0; $i<count($path_rev); $i++)
00678 {
00679 $path[] = $path_rev[count($path_rev) - ($i + 1)];
00680 }
00681
00682 foreach($path as $node)
00683 {
00684
00685 }
00686 return $path;
00687 }
00688
00689
00695 function setTargetScript($a_target_script)
00696 {
00697 $this->target_script = $a_target_script;
00698 }
00699
00700
00706 function getTargetScript()
00707 {
00708 return $this->target_script;
00709 }
00710
00711
00718 function initBaseClass($a_base_class)
00719 {
00720 $_GET["baseClass"] = $a_base_class;
00721 $_GET["cmd"] = "";
00722 $_GET["cmdClass"] = "";
00723 $_GET["cmdNode"] = "";
00724 $this->init();
00725 }
00726
00730 function getCmd($a_default_cmd = "")
00731 {
00732 $cmd = $_GET["cmd"];
00733 if($cmd == "post")
00734 {
00735 if (is_array($_POST["cmd"]))
00736 {
00737 reset($_POST["cmd"]);
00738 }
00739 $cmd = @key($_POST["cmd"]);
00740 if($cmd == "")
00741 {
00742 $cmd = $_GET["fallbackCmd"];
00743 }
00744 }
00745 if($cmd == "")
00746 {
00747 $cmd = $a_default_cmd;
00748 }
00749 return $cmd;
00750 }
00751
00762 function setCmd($a_cmd)
00763 {
00764 $_GET["cmd"] = $a_cmd;
00765 }
00766
00777 function setCmdClass($a_cmd_class)
00778 {
00779 $a_cmd_class = strtolower($a_cmd_class);
00780
00781 $nr = $this->getNodeIdForTargetClass($this->current_node, $a_cmd_class);
00782 $_GET["cmdClass"] = $a_cmd_class;
00783 $_GET["cmdNode"] = $nr;
00784 }
00785
00789 function getCmdClass()
00790 {
00791 return strtolower($_GET["cmdClass"]);
00792 }
00793
00799 function getFormAction(&$a_gui_obj, $a_fallback_cmd = "")
00800 {
00801 $script = $this->getFormActionByClass(strtolower(get_class($a_gui_obj)),
00802 $a_fallback_cmd);
00803 return $script;
00804 }
00805
00811 function getFormActionByClass($a_class, $a_fallback_cmd = "")
00812 {
00813 $a_class = strtolower($a_class);
00814
00815 $script = $this->getLinkTargetByClass($a_class, "post");
00816 if ($a_fallback_cmd != "")
00817 {
00818 $script = ilUtil::appendUrlParameterString($script, "fallbackCmd=".$a_fallback_cmd);
00819 }
00820 return $script;
00821 }
00822
00823 function redirect(&$a_gui_obj, $a_cmd = "")
00824 {
00825 global $ilBench;
00826
00827
00828 $script = $this->getLinkTargetByClass(strtolower(get_class($a_gui_obj)), $a_cmd);
00829 if (is_object($ilBench))
00830 {
00831 $ilBench->save();
00832 }
00833 ilUtil::redirect($script);
00834 }
00835
00836
00843 function redirectByClass($a_class, $a_cmd = "")
00844 {
00845
00846
00847
00848
00849 $script = $this->getLinkTargetByClass($a_class, $a_cmd);
00850
00851 ilUtil::redirect($script);
00852 }
00853
00854
00863 function getLinkTarget(&$a_gui_obj, $a_cmd = "")
00864 {
00865
00866 $script = $this->getLinkTargetByClass(strtolower(get_class($a_gui_obj)), $a_cmd);
00867 return $script;
00868 }
00869
00870
00880 function getLinkTargetByClass($a_class, $a_cmd = "", $a_transits = "", $a_prepend_transits = false)
00881 {
00882
00883
00884
00885
00886 $script = $this->getTargetScript();
00887 $script = $this->getUrlParameters($a_class, $script, $a_cmd, $transits);
00888
00889
00890
00891 return $script;
00892 }
00893
00897 function setReturn(&$a_gui_obj, $a_cmd)
00898 {
00899 $script = $this->getTargetScript();
00900 $script = $this->getUrlParameters(strtolower(get_class($a_gui_obj)), $script, $a_cmd);
00901
00902 $this->return[strtolower(get_class($a_gui_obj))] = $script;
00903 }
00904
00908 function setReturnByClass($a_class, $a_cmd)
00909 {
00910
00911 $a_class = strtolower($a_class);
00912
00913 $script = $this->getTargetScript();
00914 $script = $this->getUrlParameters($a_class, $script, $a_cmd);
00915
00916 $this->return[strtolower($a_class)] = $script;
00917 }
00918
00922 function returnToParent(&$a_gui_obj, $a_anchor = "")
00923 {
00924 $script = $this->getParentReturn($a_gui_obj);
00925
00926 $script = ilUtil::appendUrlParameterString($script,
00927 "redirectSource=".strtolower(get_class($a_gui_obj)));
00928 if ($a_anchor != "")
00929 {
00930 $script = $script."#".$a_anchor;
00931 }
00932 ilUtil::redirect($script);
00933 }
00934
00935
00941 function getRedirectSource()
00942 {
00943 return $_GET["redirectSource"];
00944 }
00945
00949 function getParentReturn(&$a_gui_obj)
00950 {
00951 return $this->getParentReturnByClass(strtolower(get_class($a_gui_obj)));
00952 }
00953
00954
00955 function getParentReturnByClass($a_class)
00956 {
00957 $a_class = strtolower($a_class);
00958 $ret_class = $this->searchReturnClass($a_class);
00959
00960 if($ret_class)
00961 {
00962
00963 return $this->return[$ret_class];
00964 }
00965 }
00966
00970 function searchReturnClass($a_class)
00971 {
00972
00973 $a_class = strtolower($a_class);
00974
00975 $nr = $this->getNodeIdForTargetClass($this->current_node, $a_class);
00976 $path = $this->getPathNew(1, $nr);
00977
00978 for($i = count($path)-2; $i>=0; $i--)
00979 {
00980
00981
00982 if ($this->return[$this->call_node[$path[$i]]["class"]] != "")
00983 {
00984 return $this->call_node[$path[$i]]["class"];
00985 }
00986 }
00987
00988 return false;
00989 }
00990
00991 function getUrlParameters($a_class, $a_str, $a_cmd = "", $a_transits = "")
00992 {
00993
00994
00995
00996 $params = $this->getParameterArrayByClass($a_class, $a_cmd, $a_transits);
00997
00998 foreach ($params as $par => $value)
00999 {
01000 $a_str = ilUtil::appendUrlParameterString($a_str, $par."=".$value);
01001 }
01002
01003 return $a_str;
01004 }
01005
01006 function appendTransitClasses($a_str)
01007 {
01008 if (is_array($_GET["cmdTransit"]))
01009 {
01010 reset($_GET["cmdTransit"]);
01011 foreach ($_GET["cmdTransit"] as $transit)
01012 {
01013 $a_str = ilUtil::appendUrlParameterString($a_str, "cmdTransit[]=".$transit);
01014 }
01015 }
01016 return $a_str;
01017 }
01018
01019 function getTransitArray()
01020 {
01021 $trans_arr = array();
01022 if (is_array($_GET["cmdTransit"]))
01023 {
01024 reset($_GET["cmdTransit"]);
01025 foreach ($_GET["cmdTransit"] as $key => $transit)
01026 {
01027 $trans_arr["cmdTransit[".$key."]"] = $transit;
01028 }
01029 }
01030 return $trans_arr;
01031 }
01032
01033 function addTransit($a_class)
01034 {
01035 $a_class = strtolower($a_class);
01036 $_GET["cmdTransit"][] = $a_class;
01037 }
01038
01039 function getParameterArray(&$a_gui_obj, $a_cmd = "", $a_incl_transit = true)
01040 {
01041 $par_arr = $this->getParameterArrayByClass(strtolower(get_class($a_gui_obj)), $a_cmd,
01042 $trans_arr);
01043
01044 return $par_arr;
01045 }
01046
01050 function getParameterArrayByClass($a_class, $a_cmd = "", $a_transits = "")
01051 {
01052
01053 if ($a_class == "")
01054 {
01055 return array();
01056 }
01057
01058 if (!is_array($a_class))
01059 {
01060 $a_class = array($a_class);
01061 }
01062
01063 $nr = $this->current_node;
01064 foreach ($a_class as $class)
01065 {
01066
01067 $class = strtolower($class);
01068 $nr = $this->getNodeIdForTargetClass($nr, $class);
01069 $target_class = $class;
01070
01071 }
01072
01073 $path = $this->getPathNew(1, $nr);
01074 $params = array();
01075
01076
01077 foreach($path as $node_id)
01078 {
01079 $class = $this->call_node[$node_id]["class"];
01080 if (is_array($this->save_parameter[$class]))
01081 {
01082 foreach($this->save_parameter[$class] as $par)
01083 {
01084 $params[$par] = $_GET[$par];
01085 }
01086 }
01087
01088 if (is_array($this->parameter[$class]))
01089 {
01090 foreach($this->parameter[$class] as $par => $value)
01091 {
01092 $params[$par] = $value;
01093 }
01094 }
01095 }
01096
01097 if ($a_cmd != "")
01098 {
01099 $params["cmd"] = $a_cmd;
01100 }
01101
01102 $params["cmdClass"] = $target_class;
01103 $params["cmdNode"] = $nr;
01104 $params["baseClass"] = $_GET["baseClass"];
01105
01106 return $params;
01107 }
01108
01109
01110 }
01111 ?>