Skip to main content

This site requires you to update your browser. Your browsing experience maybe affected by not having the most up to date version.

We've moved the forum!

Please use forum.silverstripe.org for any new questions (announcement).
The forum archive will stick around, but will be read only.

You can also use our Slack channel or StackOverflow to ask for help.
Check out our community overview for more options to contribute.

General Questions /

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

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

Making a page accessable from multiple URLs


Go to End


3 Posts   967 Views

Avatar
zenmonkey

Community Member, 545 Posts

26 November 2012 at 7:17am

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.

Avatar
Willr

Forum Moderator, 5523 Posts

2 December 2012 at 5:41pm

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);
}

Avatar
zenmonkey

Community Member, 545 Posts

10 December 2012 at 4:58pm

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'));
	}