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 DF_Web_Path $path * @param DF_Web_Routing_ActionChain $chain * @return integer */ protected static function chained_match($path, $chain) { if (!$path instanceof DF_Web_Path) { throw new DF_Error_InvalidArgumentException("path", $path, "DF_Web_Path"); } if (!$chain instanceof DF_Web_Routing_ActionChain) { throw new DF_Error_InvalidArgumentException("chain", $chain, "DF_Web_Routing_ActionChain"); } $action = $chain->get_endpoint(); $a_path = $action->get_path_match(); $a_args = $action->get_args(); $a_parts = $a_path->get_path_parts(); $a_numparts = count($a_parts); $parts = $path->get_path_parts(); $numparts = count($parts); if ($numparts < $a_numparts) { # return -1; } $rest = $parts; # FIXME For chains, dont do this for normal path actions foreach ($tmp = $chain->get_chain_list() as $_a) { $rest = self::eat_path_parts($_a, $rest); } $count = count($rest); if ($a_args instanceof DF_Web_Routing_ActionArgs_Any) { $count += 1000; } return $count; }