Example #1
0
 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;
 }
Example #2
0
 /**
  * 
  * 
  * @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;
 }