00001 <?php
00023 define('PRONTO_VERSION', '0.6');
00024
00025 class Factory
00026 {
00027
00034 function &db($config)
00035 {
00036 if($config['type']) {
00037 $type = $config['type'];
00038 } else if(defined('DB_DRIVER')) {
00039 $type = DB_DRIVER;
00040 }
00041 switch($type) {
00042 case 'mysql': $cn = 'DB_MySQL'; break;
00043 case 'postgresql': $cn = 'DB_PostgreSQL'; break;
00044 case 'mssql': $cn = 'DB_MSSQL'; break;
00045 case 'sqlite': $cn = 'DB_SQLite'; break;
00046 case 'sqlite3': $cn = 'DB_SQLite3'; break;
00047 case 'odbc': $cn = 'DB_ODBC'; break;
00048 case 'pdo': $cn = 'DB_PDO'; break;
00049 case 'none': return new stdClass;
00050 }
00051 if(is_array($config['opts'])) {
00052 $persistent = !!$config['opts']['persistent'];
00053 } else {
00054 $persistent = (defined('DB_PERSISTENT') && DB_PERSISTENT === true);
00055 }
00056
00057 require_once(DIR_FS_PRONTO.DS.'core'.DS.'db.php');
00058 require_once(DIR_FS_PRONTO.DS.'core'.DS.'db'.DS.$type.'.php');
00059
00060 return new $cn($config, $persistent);
00061 }
00062
00070 function &page($name)
00071 {
00072 $o =& Registry::get("pronto:page:$name");
00073
00074
00075
00076 $filespec = array(DIR_FS_APP.DS.'pages'.DS.'*.php');
00077 if(defined('MODULES')) {
00078 foreach(explode(' ',MODULES) as $mod) {
00079 $filespec[] = DIR_FS_APP.DS.'modules'.DS.$mod.DS.'pages/*.php';
00080 }
00081 }
00082 require_once(DIR_FS_PRONTO.DS.'core'.DS.'sql.php');
00083 require_once(DIR_FS_PRONTO.DS.'core'.DS.'page.php');
00084 require_once(DIR_FS_APP.DS.'core'.DS.'page.php');
00085 require_once(DIR_FS_PRONTO.DS.'core'.DS.'page_crud.php');
00086 require_once(DIR_FS_PRONTO.DS.'core'.DS.'page_static.php');
00087 $o =& Factory::newobj('pages', 'p'.$name, $filespec);
00088
00089 Registry::set("pronto:page:$name", $o);
00090 return $o;
00091 }
00092
00100 function &model($name)
00101 {
00102 $o =& Registry::get("pronto:model:$name");
00103
00104
00105
00106 $filespec = array(DIR_FS_APP.DS.'models'.DS.'*.php');
00107 if(defined('MODULES')) {
00108 foreach(explode(' ',MODULES) as $mod) {
00109 $filespec[] = DIR_FS_APP.DS.'modules'.DS.$mod.DS.'models'.DS.'*.php';
00110 }
00111 }
00112 require_once(DIR_FS_PRONTO.DS.'core'.DS.'record_model.php');
00113 require_once(DIR_FS_PRONTO.DS.'core'.DS.'record_selector.php');
00114 require_once(DIR_FS_APP.DS.'core'.DS.'record_model.php');
00115
00116
00117 require_once(DIR_FS_PRONTO.DS.'core'.DS.'model.php');
00118 require_once(DIR_FS_APP.DS.'core'.DS.'model.php');
00119
00120 $o =& Factory::newobj('models', 'm'.$name, $filespec);
00121 Registry::set("pronto:model:$name", $o);
00122 return $o;
00123 }
00124
00137 function &fly_model($table)
00138 {
00139 require_once(DIR_FS_PRONTO.DS.'core'.DS.'record_model.php');
00140 require_once(DIR_FS_PRONTO.DS.'core'.DS.'record_selector.php');
00141 require_once(DIR_FS_APP.DS.'core'.DS.'record_model.php');
00142
00143 $o = new RecordModel();
00144 $o->table = $table;
00145
00146 $o->enable_cache = false;
00147
00148 return $o;
00149 }
00150
00159 function &plugin($name, $type='page')
00160 {
00161 switch($type) {
00162 case 'page':
00163 $prefix = 'pp';
00164 $regname = 'pronto:plugins';
00165 break;
00166 case 'template':
00167 $prefix = 'tp';
00168 $regname = 'pronto:helpers';
00169 break;
00170 }
00171 $store =& Registry::get($regname);
00172 if(!$store) $story = new stdClass;
00173
00174
00175 if(isset($store->$name)) return $store->$name;
00176
00177 $filespec = array(
00178 DIR_FS_PRONTO.DS.'plugins'.DS.$type.DS.'*.php',
00179 DIR_FS_APP.DS.'plugins'.DS.$type.DS.'*.php'
00180 );
00181 if(defined('MODULES')) {
00182 foreach(explode(' ',MODULES) as $mod) {
00183 $filespec[] = DIR_FS_APP.DS.'modules'.DS.$mod.DS.'plugins'.DS.$type.DS.'*.php';
00184 }
00185 }
00186 require_once(DIR_FS_PRONTO.DS.'core'.DS.'plugin.php');
00187 require_once(DIR_FS_APP.DS.'core'.DS.'plugin.php');
00188 $o =& Factory::newobj("{$type}_plugins", $prefix.$name, $filespec);
00189
00190 $store->$name =& $o;
00191 Registry::set("$regname", $store);
00192 return $o;
00193 }
00194
00202 function &helper($name)
00203 {
00204 return Factory::plugin($name, 'template');
00205 }
00206
00207
00208
00209
00210
00211 function &newobj($type, $name, $filespec)
00212 {
00213 $name = strtolower($name);
00214 $map =& Registry::get("pronto:map:$type");
00215 if($map == false) {
00216
00217 $cache =& Registry::get('pronto:cache');
00218 $map =& $cache->get("pronto:map:$type");
00219 if($map == false) {
00220
00221 $files = array();
00222 foreach($filespec as $f) {
00223 $g = glob($f);
00224 if($g) $files = array_merge($files, $g);
00225 }
00226 $map = Factory::build_class_map($files);
00227 $cache->set("pronto:map:$type", $map);
00228 }
00229 Registry::set("pronto:map:$type", $map);
00230 }
00231
00232 if(!isset($map[$name])) {
00233 $f = false;
00234 return $f;
00235 }
00236
00237 if(preg_match('|_plugins$|', $type)) {
00238
00239 $obj = new LazyLoad($name, $map[$name]);
00240 } else {
00241 require_once($map[$name]);
00242 $obj = new $name();
00243 }
00244 return $obj;
00245 }
00246
00247 function build_class_map($files) {
00248 $map = array();
00249 foreach($files as $f) {
00250 if(substr(basename($f), 0, 1) == '_') continue;
00251 $class_list = get_declared_classes();
00252 require_once($f);
00253 foreach(array_diff(get_declared_classes(), $class_list) as $c) {
00254 $map[strtolower($c)] = $f;
00255 }
00256 }
00257 return $map;
00258 }
00259 }
00260
00261 ?>