Skip to content

Latest commit

 

History

History
106 lines (79 loc) · 3.17 KB

README.md

File metadata and controls

106 lines (79 loc) · 3.17 KB

Site Tree Importer Module

Build Status

Requirements

  • SilverStripe 4 or later

Installation

No installation required.

Usage

Make a tabbed-out file as directed in the form that appears below. Make sure that you use tabs, not spaces. Visit http://localhost/your-site-name/SiteTreeImporter?flush=1. Select your tabbed-out file in the file field, and tick the option boxes as appropriate:

Clear out all existing content? - This will delete everything from your site before running the importer. Use with caution! If you don't tick this, then the pages will be added to the existing site.

Publish everything after the import? - This will publish each of the pages that the importer creates. If you don't tick this, then the pages will be left as draft-only.

Format

The site tree import module lets you take a tabbed out file of the following format, and load it into your CMS as a site tree.

Home
About
	Staff
		Sam
		Sig
Products
	Laptops
		Macbook
		Macbook Pro
	Phones
		iPhone

You can optionally include JSON encoded metadata as the last part of a line, which will automatically save to properties on the Page object. This can be useful to determine URL paths or set custom titles.

Home
	About {"URLSegment": "about-us", "MetaDescription": "About our company"}
	Contact {"URLSegment": "contact-us"}

Howto

Redirect URLs

Often an existing tree will need to be imported with URLs which map to different URLs on the new site. While you could assign those manually to a .htaccess based redirect, we found it useful to store the old URL straight in the Page object, and use SilverStripe's routing to handle the redirect.

In this example, we'll use the "redirected urls" module, which routes based on a new data type called RedirectedURL. In order to create it, we add a custom setter to the Page class, which gets called automatically if a key named LegacyURL is found in the imported JSON data.

class Page extends SiteTree {
	public function setLegacyURL($url) {
		$url = Director::makeRelative($url);
		$urlBase = parse_url($url, PHP_URL_PATH);
		$urlQuerystring = parse_url($url, PHP_URL_QUERY);

		$urlObj = RedirectedURL::get()->filter(array(
			'FromBase' => $urlBase,
			'FromQuerystring' => $urlQuerystring
		))->First();
		if(!$urlObj) {
			 $urlObj = new RedirectedURL();
		}
		$urlObj->FromBase = $urlBase;
		$urlObj->FromQuerystring = $urlQuerystring;

		if(!$this->URLSegment) {
			$this->URLSegment = $this->generateURLSegment($this->Title);
		}
		$urlObj->To = $this->RelativeLink();

		$urlObj->write();
	}
}

Now you can import a tree based on the following data:

Home
	About {"LegacyURL": "/old-about-location"}
	Contact {"LegacyURL": "/old-contact-location"}

Related

See the static site connector module for a more sophisticated importer based on crawling existing HTML pages, and extracting content via XPATH.