fonctions CRUD par defaut
[mtweb] / mw / libs / empty_class.php
1 <?php
2
3 /*
4
5   Cette classe aide a agreger des classes qui en heritent
6
7   une classe qui herite de empty_class peut etre vide
8   (sans attribut ni methode). une fois instanciee,
9   la fonction load_modules lui ajoute les methodes
10   qui sont definies dans d'autres classes qui heritent
11   aussi de empty_class
12
13   NOTE: pour la compatibilite php4 et php5,
14   le mecanisme d'agregation est different selon
15   la version de php
16
17   php4: c'est la methode aggregate qui est utilisee
18
19   php5: les classes contenant les nouvelles methodes
20         sont instanciees et sont enregistrĂ©es dans
21         le tableau associatif $module
22
23   ATTENTION: les attributs de ces classes, en php5,
24              on donc un contexte qui depend de
25              leur classe et ne sont pas accessibles
26              directement via l'instance principale
27
28              si ces attributs doivent etre accessible
29              via l'instance principale, il faut prevoir
30              des accesseurs.
31
32 */
33
34   class empty_class{
35
36     var $root_inst;
37     var $modules;
38
39     function empty_class($root_inst){
40       if($root_inst === true) $this->root_inst = $this;
41       else $this->root_inst = $root_inst;
42     }
43
44     function load_modules($modules_path, $current_modules, $core_modules = null){
45       $this->_load_modules($modules_path, $current_modules, $this->root_inst, true);
46       if(isset($core_modules) && $current_modules != $core_modules){
47         $this->_load_modules($modules_path, $core_modules, $this->root_inst, true);
48       }
49     }
50
51     function _load_modules($modules_path, $modules_path_suffixe, $root_inst, $recursif = false){
52       if(file_exists($modules_path.$modules_path_suffixe) && $dh = opendir($modules_path.$modules_path_suffixe)){
53         while(($file = readdir($dh)) !== false){
54           if(is_dir($modules_path.$modules_path_suffixe.$file)){
55             if($recursif && substr($file, 0, 1) != "."){
56               $this->_load_modules($modules_path, $modules_path_suffixe.$file."/", $root_inst, $recursif);
57             }
58           }
59           elseif(strcasecmp(substr($file, -4), ".php") == 0){
60             $this->load($modules_path.$modules_path_suffixe.$file, $root_inst);
61           }
62         }
63         closedir($dh);
64       }
65     }
66
67     function load($module_file, $root_inst){
68       if($module_file && file_exists($module_file)){
69         $v_path = explode("/", $module_file);
70         $file = $v_path[count($v_path) - 1];
71         if(strcasecmp(substr($file, -4), ".php") == 0){
72           $class_name = substr($file, 0, -4);
73           if(!class_exists($class_name)){
74             require_once $module_file;
75             if(version_compare(PHP_VERSION, '5.0.0', '>=')){
76               if(class_exists($class_name) && !isset($this->modules[$class_name])){
77                 $this->modules[$class_name] = new $class_name($root_inst);
78               }
79             }
80             else{
81               if(class_exists($class_name)){
82                 aggregate($this, $class_name);
83               }
84             }
85           }
86         }
87       }
88     }
89
90     function __call($method_name, $arguments){
91       return $this->empty_class_call($this->root_inst, $method_name, $arguments);
92     }
93
94     function empty_class_call($inst, $method_name, $arguments){
95       $r = false;
96       if(($module = $this->get_module_for_method($inst, $method_name)) !== false){
97         $args = ""; foreach($arguments as $i => $arg) $args .= ($args ? ", " : "")."\$arguments[".$i."]";
98         eval("\$r = \$module->".$method_name."(".$args.");");
99       }
100       else $r = $this->call_default($inst, $method_name, $arguments);
101       return $r;
102     }
103
104     function get_module_for_method($inst, $method_name){
105       $module = false;
106       if(isset($inst->modules)) foreach($inst->modules as $module_name => $module_impl){
107         if(method_exists($module_impl, $method_name)){
108           $module = $module_impl;
109           break;
110         }
111         else{
112           $module = $this->get_module_for_method($module_impl, $method_name);
113           if($module !== false) break;
114         }
115       }
116       return $module;
117     }
118
119     function call_default($inst, $method_name, $arguments){
120       return false;
121     }
122
123   }
124
125 ?>