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.

General Questions /

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

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

Making a page accessable from multiple URLs


Go to End
Reply


3 Posts   579 Views

Avatar
zenmonkey

Community Member, 532 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, 5514 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, 532 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'));
	}