Changeset 2867

Show
Ignore:
Timestamp:
11/24/08 06:27:53 (7 weeks ago)
Author:
ringmaster
Message:

Stack dependencies are now sorted after the fact, so you can call Stack::add() and set a value for $after when the thing that it's after hasn't yet been added. This accounts for script dependencies and variable load orders in plugins with a more reliable dependency loading order than mere insertion.

Location:
trunk/htdocs/system/classes
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • trunk/htdocs/system/classes/adminhandler.php

    r2865 r2867  
    22412241            return Session::messages_get( true, 'array' ); 
    22422242        } 
    2243                          
     2243 
    22442244        if(isset($handler_vars['PasswordDigest']) || isset($handler_vars['digest'])) { 
    2245              
     2245 
    22462246            if(( isset($handler_vars['action']) && $handler_vars['action'] == 'add') || isset($handler_vars['newgroup'])) { 
    22472247                if(isset($handler_vars['newgroup'])) { 
     
    27172717    public static function setup_stacks() { 
    27182718        Stack::add( 'admin_header_javascript', Site::get_url('scripts') . "/jquery.js", 'jquery' ); 
    2719         Stack::add( 'admin_header_javascript', Site::get_url('scripts') . "/ui.core.js", 'ui.core' ); 
    2720         Stack::add( 'admin_header_javascript', Site::get_url('scripts') . "/ui.slider.js", 'ui.slider' ); 
    2721         Stack::add( 'admin_header_javascript', Site::get_url('scripts') . "/ui.tabs.js", 'ui.tabs' ); 
    2722         Stack::add( 'admin_header_javascript', Site::get_url('scripts') . "/ui.sortable.js", 'ui.sortable' ); 
    2723         Stack::add( 'admin_header_javascript', Site::get_url('scripts') . "/ui.resizable.js", 'ui.resizable' ); 
    2724         Stack::add( 'admin_header_javascript', Site::get_url('scripts') . "/jquery.spinner.js", 'jquery.spinner' ); 
    2725         Stack::add( 'admin_header_javascript', Site::get_url('scripts') . "/jquery.color.js", 'jquery.color' ); 
    2726         Stack::add( 'admin_header_javascript', Site::get_url('habari') . "/3rdparty/humanmsg/humanmsg.js", 'humanmsg' ); 
    2727         Stack::add( 'admin_header_javascript', Site::get_url('habari') . "/3rdparty/hotkeys/jquery.hotkeys.js", 'jquery.hotkeys' ); 
    2728         Stack::add( 'admin_header_javascript', Site::get_url('admin_theme') . "/js/media.js", 'media' ); 
    2729         Stack::add( 'admin_header_javascript', Site::get_url('admin_theme') . "/js/admin.js", 'admin' ); 
     2719        Stack::add( 'admin_header_javascript', Site::get_url('scripts') . "/ui.core.js", 'ui.core', 'jquery' ); 
     2720        Stack::add( 'admin_header_javascript', Site::get_url('scripts') . "/ui.slider.js", 'ui.slider', array('jquery', 'ui.core') ); 
     2721        Stack::add( 'admin_header_javascript', Site::get_url('scripts') . "/ui.tabs.js", 'ui.tabs', array('jquery', 'ui.core') ); 
     2722        Stack::add( 'admin_header_javascript', Site::get_url('scripts') . "/ui.sortable.js", 'ui.sortable', array('jquery', 'ui.core') ); 
     2723        Stack::add( 'admin_header_javascript', Site::get_url('scripts') . "/ui.resizable.js", 'ui.resizable', array('jquery', 'ui.core') ); 
     2724        Stack::add( 'admin_header_javascript', Site::get_url('scripts') . "/jquery.spinner.js", 'jquery.spinner', 'jquery' ); 
     2725        Stack::add( 'admin_header_javascript', Site::get_url('scripts') . "/jquery.color.js", 'jquery.color', 'jquery' ); 
     2726        Stack::add( 'admin_header_javascript', Site::get_url('habari') . "/3rdparty/humanmsg/humanmsg.js", 'humanmsg', 'jquery' ); 
     2727        Stack::add( 'admin_header_javascript', Site::get_url('habari') . "/3rdparty/hotkeys/jquery.hotkeys.js", 'jquery.hotkeys', 'jquery' ); 
     2728        Stack::add( 'admin_header_javascript', Site::get_url('admin_theme') . "/js/media.js", 'media', 'jquery' ); 
     2729        Stack::add( 'admin_header_javascript', Site::get_url('admin_theme') . "/js/admin.js", 'admin', 'jquery' ); 
    27302730    } 
    27312731} 
  • trunk/htdocs/system/classes/stack.php

    r2866 r2867  
    2828{ 
    2929    private static $stacks = array(); 
     30    private static $stack_sort = array(); 
     31    private static $sorting; 
    3032 
    3133    /** 
     
    112114            $stack = array(); 
    113115            self::$stacks[$stack_name] = $stack; 
     116            self::$stack_sort[$stack_name] = array(); 
    114117        } 
    115118        return self::$stacks[$stack_name]; 
     
    132135                $after = array($after); 
    133136            } 
    134             $newstack = array(); 
    135             foreach($stack as $k => $v) { 
    136                 $newstack[$k] = $v; 
    137                 $inserted = false; 
    138                 if(in_array($k, $after)) { 
    139                     unset($after[array_search($k, $after)]); 
    140                     if(count($after) == 0) { 
    141                         $newstack[$value_name] = $value; 
    142                         $inserted = true; 
    143                     } 
     137            foreach($after as $a) { 
     138                if(!isset(self::$stack_sort[$stack_name])) { 
     139                    self::$stack_sort[$stack_name] = array(); 
    144140                } 
    145             } 
    146             if(!$inserted) { 
    147                 $newstack[$value_name] = $value; 
    148             } 
    149             $stack = $newstack; 
    150         } 
    151         else { 
    152             $stack[$value_name]= $value; 
    153         } 
     141                if(!isset(self::$stack_sort[$stack_name][$a])) { 
     142                    self::$stack_sort[$stack_name][$a] = array(); 
     143                } 
     144                self::$stack_sort[$stack_name][$a][$value_name] = $value_name; 
     145            } 
     146        } 
     147        $stack[$value_name]= $value; 
    154148        self::$stacks[$stack_name]= $stack; 
    155149        return $stack; 
     
    172166    } 
    173167 
     168    public static function get_sorted_stack( $stack_name ) 
     169    { 
     170        self::$sorting = $stack_name; 
     171        $stack = self::get_named_stack($stack_name); 
     172 
     173        uksort($stack, array('Stack', 'sort_stack_cmp')); 
     174        return $stack; 
     175    } 
     176 
     177    public static function sort_stack_cmp( $a, $b ) 
     178    { 
     179        $aa = isset(self::$stack_sort[self::$sorting][$a]) ? self::$stack_sort[self::$sorting][$a] : array(); 
     180        $ba = isset(self::$stack_sort[self::$sorting][$b]) ? self::$stack_sort[self::$sorting][$b] : array(); 
     181        $acb = isset($aa[$b]); 
     182        $bca = isset($ba[$a]); 
     183        $ac = count($aa); 
     184        $bc = count($ba); 
     185        if(($acb && $bca) || !($acb || $bca)) { 
     186            if($ac == $bc) { 
     187                return 0; 
     188            } 
     189            return $ac > $bc ? -1 : 1; 
     190        } 
     191        elseif($acb) { 
     192            return -1; 
     193        } 
     194        elseif($bca) { 
     195            return 1; 
     196        } 
     197    } 
     198 
    174199    /** 
    175200     * Returns all of the values of the stack 
     
    180205    { 
    181206        $out = ''; 
    182         $stack = self::get_named_stack( $stack_name ); 
     207        $stack = self::get_sorted_stack( $stack_name ); 
    183208        $stack = Plugins::filter( 'stack_out', $stack, $stack_name ); 
    184209        foreach( $stack as $element ) {