Jump to:

23486 Posts in 18995 Topics by 2878 members

General Questions

SilverStripe Forums » General Questions » Making a page accessable from multiple URLs

General questions about getting started with SilverStripe that don't fit in any of the categories above.

Moderators: martimiz, Sean, biapar, Willr, Ingo, swaiba, simon_w

Page: 1
Go to End
Author Topic: 348 Views
  • zenmonkey
    Avatar
    Community Member
    528 Posts

    Making a page accessable from multiple URLs Link to this post

    I need to make a pagetype accessable from multiple URLs. Am I better off trying overload the Director to search anotehr field or to create a custom redirector page that doesn't show up in the sitetree and create it in the onBEforeWrite of the original page? Background: its for a real estate site. I'd like propoerties to be available from the address mysite.com/123-main-st-townsville and the MLS number mysite.com/R4322

    The rederector is an easier solution to code, but I'm wondering about perfomance since it essentially doubles teh size of my site tree.

  • Willr
    Avatar
    Forum Moderator
    5508 Posts

    Re: Making a page accessable from multiple URLs Link to this post

    You could create a custom handleAction function on your HomePage_Controller to do the lookup for a matching Property, return a redirect rather than the normal handleAction and fall back to parent::handleAction(). Can't find too many examples in the docs but you should checkout Controller.php and ContentControlller.php's handleAction to get an idea of what you need

    HomePage_Controller {

    function handleAction($request) {
    check to see if $Action matches a listing..
    if matches redirect ($this->redirect(..)
    else
    parent::handleAction($request);
    }

  • zenmonkey
    Avatar
    Community Member
    528 Posts

    Re: Making a page accessable from multiple URLs Link to this post

    Overlaoding handleAction and handleRequest doesn't seem to give access to the $URLSegment Section.
    I started digging back thorugh the controller and found that if I ReWrite the getNestedController in ModelAsAdmin it works how I need (not ideal) and just extending ModelAdmin and overriding it with Director::addRules seems to kill the hompage redirect

    here is my getNestedController to give you an idea of what I'm trying to acheive.

    public function getNestedController() {
          $request = $this->request;
          if(!$URLSegment = $request->param('URLSegment')) {
             throw new Exception('ModelAsController->getNestedController(): was not passed a URLSegment value.');
          }
          
          // Find page by link, regardless of current locale settings
          if(class_exists('Translatable')) Translatable::disable_locale_filter();
          $listing = DataObject::get_one('Listing', "MLS = '$URLSegment'");
          if($listing){
             $URLSegment = $listing->URLSegment;
          }
          $sitetree = DataObject::get_one(
             'SiteTree',
             sprintf(
                '"URLSegment" = \'%s\' %s',
                Convert::raw2sql(rawurlencode($URLSegment)),
                (SiteTree::nested_urls() ? 'AND "ParentID" = 0' : null)
             )
          );
          if(class_exists('Translatable')) Translatable::enable_locale_filter();
          
          if(!$sitetree) {
             // If a root page has been renamed, redirect to the new location.
             // See ContentController->handleRequest() for similiar logic.
             $redirect = self::find_old_page($URLSegment);
             if($redirect) {
                $params = $request->getVars();
                if(isset($params['url'])) unset($params['url']);
                $this->response = new SS_HTTPResponse();
                $this->response->redirect(
                   Controller::join_links(
                      $redirect->Link(
                         Controller::join_links(
                            $request->param('Action'),
                            $request->param('ID'),
                            $request->param('OtherID')
                         )
                      ),
                      // Needs to be in separate join links to avoid urlencoding
                      ($params) ? '?' . http_build_query($params) : null
                   ),
                   301
                );
                
                return $this->response;
             }
             
             if($response = ErrorPage::response_for(404)) {
                return $response;
             } else {
                $this->httpError(404, 'The requested page could not be found.');
             }
          }
          
          // Enforce current locale setting to the loaded SiteTree object
          if(class_exists('Translatable') && $sitetree->Locale) Translatable::set_current_locale($sitetree->Locale);
          
          if(isset($_REQUEST['debug'])) {
             Debug::message("Using record #$sitetree->ID of type $sitetree->class with link {$sitetree->Link()}");
          }
          
          return self::controller_for($sitetree, $this->request->param('Action'));
       }

    348 Views
Page: 1
Go to Top

Want to know more about the company that brought you SilverStripe? Then check out SilverStripe.com

Comments on this website? Please give feedback.