WordPress.org

Make WordPress Core

Ticket #25963: 25963.3.diff

File 25963.3.diff, 4.5 KB (added by adamsilverstein, 6 years ago)

adds ?theme=name routing; also pushState: true

  • src/wp-admin/js/theme.js

     
    282282                                scroll = document.body.scrollTop;
    283283
    284284                                // Clean the url structure
    285                                 themes.router.navigate( '' );
     285                                themes.router.navigate( themes.data.settings.root );
    286286
    287287                                // Restore scroll position
    288288                                document.body.scrollTop = scroll;
     
    476476                return view;
    477477        },
    478478
     479        buildNavigation: function( url ) {
     480                return themes.data.settings.root + url;
     481        },
     482
    479483        // Renders the overlay with the ThemeDetails view
    480484        // Uses the current model data
    481485        expand: function( id ) {
     
    485489                this.model = self.collection.get( id );
    486490
    487491                // Trigger a route update for the current model
    488                 themes.router.navigate( 'theme/' + this.model.id );
     492                themes.router.navigate( self.buildNavigation( '?theme=' + this.model.id ), { trigger: true, replace: true } );
    489493
    490494                // Sets this.view to 'detail'
    491495                this.setView( 'detail' );
     
    497501                });
    498502
    499503                this.overlay.render();
    500                 this.$el.append( this.overlay.el );
     504                if ( 0 === $( 'div.theme-overlay' ).length ) {
     505                        this.$el.append( this.overlay.el );
     506                } else {
     507                        $( 'div.theme-overlay' ).html( this.overlay.el );
     508                }
    501509
    502510                this.overlay.screenshotGallery();
    503511
     
    540548
    541549                        // Trigger a route update for the current model
    542550                        // that renders the new theme's overlay
    543                         themes.router.navigate( 'theme/' + nextModel.id, { trigger: true } );
     551                        themes.router.navigate( self.buildNavigation( '?theme=' + nextModel.id ), { trigger: true } );
    544552                }
    545553        },
    546554
     
    564572
    565573                        // Trigger a route update for the current model
    566574                        // that renders the new theme's overlay
    567                         themes.router.navigate( 'theme/' + previousModel.id, { trigger: true } );
     575                        themes.router.navigate( self.buildNavigation( '?theme=' + previousModel.id ), { trigger: true } );
    568576                }
    569577        }
    570578});
     
    598606
    599607                // Update the URL hash
    600608                if ( event.target.value ) {
    601                         themes.router.navigate( 'search/' + event.target.value, { replace: true } );
     609                        themes.router.navigate( themes.data.settings.root + '/search/' + event.target.value, { replace: true } );
    602610                } else {
    603                         themes.router.navigate( '' );
     611                        themes.router.navigate( themes.data.settings.root );
    604612                }
    605613        }
    606614});
     
    611619
    612620        routes: {
    613621                'search/*query': 'search',
    614                 'theme/*slug': 'theme'
     622                '*path':         'default'
    615623        },
    616624
    617625        // Set the search input value based on url
     
    646654                this.routes();
    647655
    648656                // Set ups history with pushState and our root
    649                 Backbone.history.start({ root: themes.data.settings.root });
     657                if ( window.history && window.history.pushState ) {
     658                        Backbone.history.start({ pushState: true });
     659                }
    650660        },
    651661
    652662        routes: function() {
    653                 var self = this;
     663                var queryvars, self = this;
    654664                // Bind to our global thx object
    655665                // so that the object is available to sub-views
    656666                themes.router = new themes.routes();
     
    664674                themes.router.on( 'route:search', function( query ) {
    665675                        self.themes.doSearch( query );
    666676                });
    667         }
     677
     678                // Handles default route event
     679                themes.router.on( 'route:default', function() {
     680                        queryvars = self.getURLParams( document.URL );
     681                        if ( 'undefined' !== typeof queryvars.theme ) {
     682                                self.view.view.expand( queryvars.theme );
     683                        }
     684                });
     685
     686        },
     687        getURLParams: function( url ) {
     688                var base, params, results, i, param,
     689                        parts = url.split( '?' );
     690
     691                if ( parts.length === 1 ) {
     692                        return {};
     693                }
     694
     695                base = parts.shift();
     696                params = parts.pop().split( '&' );
     697
     698                if ( params.length === 1 && params[ 0 ] === '' ) {
     699                        return {};
     700                }
     701
     702                result = {};
     703                for ( i = 0, len = params.length; i < len; i++ ) {
     704                        param = params[ i ].split( '=' );
     705                        result[ param[ 0 ] ] = decodeURIComponent( param[ 1 ] );
     706                }
     707                return result;
     708}
    668709};
    669710
    670711// Ready...
  • src/wp-admin/themes.php

     
    9898                'canInstall'    => ( ! is_multisite() && current_user_can( 'install_themes' ) ),
    9999                'installURI'    => ( ! is_multisite() && current_user_can( 'install_themes' ) ) ? admin_url( 'theme-install.php' ) : null,
    100100                'confirmDelete' => __( "Are you sure you want to delete this theme?\n\nClick 'Cancel' to go back, 'OK' to confirm the delete." ),
    101                 'root'          => admin_url( 'themes.php' ),
     101                'root'          => parse_url( admin_url( 'themes.php' ), PHP_URL_PATH ),
    102102                'extraRoutes'   => '',
    103103        ),
    104104        'l10n' => array(