function doRpc($cdata) { $API = get_extdirect_api('router'); try { if (!isset($API[$cdata->action])) { throw new Exception('Call to undefined action: ' . $cdata->action); } $action = $cdata->action; $a = $API[$action]; doAroundCalls($a['before'], $cdata); $method = $cdata->method; $mdef = $a['methods'][$method]; if (!$mdef) { throw new Exception("Call to undefined method: {$method} on action {$action}"); } doAroundCalls($mdef['before'], $cdata); $r = array('type' => 'rpc', 'tid' => $cdata->tid, 'action' => $action, 'method' => $method); require_once "classes/{$action}.php"; $o = new $action(); if (isset($mdef['len'])) { $params = isset($cdata->data) && is_array($cdata->data) ? $cdata->data : array(); } else { $params = array($cdata->data); } array_push($params, $cdata->metadata); $r['result'] = call_user_func_array(array($o, $method), $params); doAroundCalls($mdef['after'], $cdata, $r); doAroundCalls($a['after'], $cdata, $r); } catch (Exception $e) { $r['type'] = 'exception'; $r['message'] = $e->getMessage(); $r['where'] = $e->getTraceAsString(); } return $r; }
<?php require 'config.php'; header('Content-Type: text/javascript'); $API = get_extdirect_api('api'); # convert API config to Ext.Direct spec $actions = array(); foreach ($API as $aname => &$a) { $methods = array(); foreach ($a['methods'] as $mname => &$m) { if (isset($m['len'])) { $md = array('name' => $mname, 'len' => $m['len']); } else { $md = array('name' => $mname, 'params' => $m['params']); } if (isset($m['formHandler']) && $m['formHandler']) { $md['formHandler'] = true; } if (isset($m['metadata'])) { $md['metadata'] = $m['metadata']; } $methods[] = $md; } $actions[$aname] = $methods; } $cfg = array('url' => 'data/direct/router.php', 'type' => 'remoting', 'actions' => $actions); echo 'Ext.ns("Ext.app"); Ext.app.REMOTING_API = '; echo json_encode($cfg); echo ';';