protected static function resolve_chained_actions($actions) { $resolved = array(); foreach ($actions as $actionpath => $action) { if (!$action instanceof DF_Web_Routing_Action_Chained) { continue; } if (!$action->is_endpoint()) { continue; } $chain = new DF_Web_Routing_ActionChain($action); $more = true; $chained = $action; $nextpath = $actionpath; $path = NULL; while ($more) { if ($path && "{$path}") { $path = $chained->get_path_match()->append_path($path); } else { $path = $chained->get_path_match(); } # TODO implement recursion if ($chained->is_chained_root()) { $more = false; } else { $chainpath = $chained->get_chained(); if (!$chainpath) { throw new DF_Web_Exception("Missing chained on action: {$nextpath}"); } if ($chained = $actions["{$chainpath}"]) { if (!$chained instanceof DF_Web_Routing_Action_Chained) { throw new DF_Web_Exception("Action not chained: {$chainpath} ({$nextpath})"); } $chain->add_to_chain($chained); $nextpath = "{$chainpath}"; } else { throw new DF_Web_Exception("Chained action not found: {$chainpath} ({$nextpath})"); } } } #error_log("Chain $action:\n".$chain->toDebugString()); $resolved[] = $chain; } return $resolved; }
/** * * * @param unknown_type $actionpath * @param unknown_type $action * @param unknown_type $actions * @throws DF_Web_Exception * @return DF_Web_Routing_ActionChain */ protected static function upgradeActionToActionChain($actionpath, $action, $actions) { if (!$action instanceof DF_Web_Routing_Action_Chained) { return NULL; } if (!$action->is_endpoint()) { return NULL; } $chain = new DF_Web_Routing_ActionChain($action); $more = TRUE; $chained = $action; $nextpath = $actionpath; $path = NULL; while ($more) { if ($path && "{$path}") { $path = $chained->get_path_match()->append_path($path); } else { $path = $chained->get_path_match(); } # TODO implement recursion if ($chained->is_chained_root()) { $more = false; } else { $chainpath = $chained->get_chained(); if (!$chainpath) { throw new DF_Web_Exception("Missing chained on action: {$nextpath}"); } if ($chained = $actions["{$chainpath}"]) { if (!$chained instanceof DF_Web_Routing_Action_Chained) { throw new DF_Web_Exception("Action not chained: {$chainpath} ({$nextpath})"); } $chain->add_to_chain($chained); $nextpath = "{$chainpath}"; } else { throw new DF_Web_Exception("Chained action not found: {$chainpath} ({$nextpath})"); } } } return $chain; }