Skip to content

Commit

Permalink
Merge pull request #136 from mateusz/fix-link-rewrite
Browse files Browse the repository at this point in the history
BUG Fixes to link rewriting when previewing subsites.
  • Loading branch information
mateusz committed Apr 2, 2014
2 parents 83d5280 + 9cf7a14 commit a651ee2
Show file tree
Hide file tree
Showing 5 changed files with 163 additions and 20 deletions.
12 changes: 10 additions & 2 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,19 @@ matrix:
include:
- php: 5.4
env: DB=MYSQL CORE_RELEASE=master
- php: 5.4
env: DB=MYSQL CORE_RELEASE=3.1 BEHAT_TEST=1

before_script:
- composer self-update
- phpenv rehash
- git clone git://github.com/silverstripe-labs/silverstripe-travis-support.git ~/travis-support
- php ~/travis-support/travis_setup.php --source `pwd` --target ~/builds/ss
- "if [ \"$BEHAT_TEST\" = \"\" ]; then php ~/travis-support/travis_setup.php --source `pwd` --target ~/builds/ss; fi"
- "if [ \"$BEHAT_TEST\" = \"1\" ]; then php ~/travis-support/travis_setup.php --source `pwd` --target ~/builds/ss --require silverstripe/behat-extension; fi"
- cd ~/builds/ss
- php ~/travis-support/travis_setup_selenium.php --if-env BEHAT_TEST
- php ~/travis-support/travis_setup_php54_webserver.php --if-env BEHAT_TEST

script:
- phpunit subsites/tests/
- "if [ \"$BEHAT_TEST\" = \"\" ]; then phpunit subsites/tests; fi"
- "if [ \"$BEHAT_TEST\" = \"1\" ]; then vendor/bin/behat @subsites; fi"
38 changes: 23 additions & 15 deletions code/model/Subsite.php
Original file line number Diff line number Diff line change
Expand Up @@ -153,20 +153,26 @@ public static function changeSubsite($subsite) {
* @return int Subsite ID
*/
public static function getSubsiteIDForDomain($host = null, $checkPermissions = true) {
if($host == null) $host = $_SERVER['HTTP_HOST'];
if($host == null && isset($_SERVER['HTTP_HOST'])) {
$host = $_SERVER['HTTP_HOST'];
}

if(!self::$strict_subdomain_matching) $host = preg_replace('/^www\./', '', $host);
$matchingDomains = null;
$cacheKey = null;
if ($host) {
if(!self::$strict_subdomain_matching) $host = preg_replace('/^www\./', '', $host);

$cacheKey = implode('_', array($host, Member::currentUserID(), self::$check_is_public));
if(isset(self::$_cache_subsite_for_domain[$cacheKey])) return self::$_cache_subsite_for_domain[$cacheKey];
$cacheKey = implode('_', array($host, Member::currentUserID(), self::$check_is_public));
if(isset(self::$_cache_subsite_for_domain[$cacheKey])) return self::$_cache_subsite_for_domain[$cacheKey];

$SQL_host = Convert::raw2sql($host);
$matchingDomains = DataObject::get(
"SubsiteDomain",
"'$SQL_host' LIKE replace(\"SubsiteDomain\".\"Domain\",'*','%')",
"\"IsPrimary\" DESC"
)->innerJoin('Subsite', "\"Subsite\".\"ID\" = \"SubsiteDomain\".\"SubsiteID\" AND \"Subsite\".\"IsPublic\"=1");
}

$SQL_host = Convert::raw2sql($host);
$matchingDomains = DataObject::get(
"SubsiteDomain",
"'$SQL_host' LIKE replace(\"SubsiteDomain\".\"Domain\",'*','%')",
"\"IsPrimary\" DESC"
)->innerJoin('Subsite', "\"Subsite\".\"ID\" = \"SubsiteDomain\".\"SubsiteID\" AND \"Subsite\".\"IsPublic\"=1");

if($matchingDomains && $matchingDomains->Count()) {
$subsiteIDs = array_unique($matchingDomains->column('SubsiteID'));
$subsiteDomains = array_unique($matchingDomains->column('Domain'));
Expand All @@ -177,7 +183,7 @@ public static function getSubsiteIDForDomain($host = null, $checkPermissions = t
implode(',', $subsiteDomains)
));
}

$subsiteID = $subsiteIDs[0];
} else if($default = DataObject::get_one('Subsite', "\"DefaultSite\" = 1")) {
// Check for a 'default' subsite
Expand All @@ -186,9 +192,11 @@ public static function getSubsiteIDForDomain($host = null, $checkPermissions = t
// Default subsite id = 0, the main site
$subsiteID = 0;
}

self::$_cache_subsite_for_domain[$cacheKey] = $subsiteID;


if ($cacheKey) {
self::$_cache_subsite_for_domain[$cacheKey] = $subsiteID;
}

return $subsiteID;
}

Expand Down
7 changes: 4 additions & 3 deletions javascript/LeftAndMain_Subsites.js
Original file line number Diff line number Diff line change
Expand Up @@ -181,7 +181,7 @@
$(doc).find('a').each(function() {
var href = $(this).attr('href');

if (!href.match(/^http:\/\//)) {
if (typeof href!=='undefined' && !href.match(/^http:\/\//)) {

$(this).attr('href', $.path.addSearchParams(href, {
'SubsiteID': subsiteId
Expand All @@ -192,9 +192,10 @@

// Inject the SubsiteID as a hidden input into all forms submitting to the local site.
$(doc).find('form').each(function() {
var action = $(this).attr('action');

if (!$(this).attr('action').match(/^http:\/\//)) {
$(doc).find('form').append('<input type=hidden name="SubsiteID" value="' + subsiteId + '" >');
if (typeof action!=='undefined' && !action.match(/^http:\/\//)) {
$(this).append('<input type=hidden name="SubsiteID" value="' + subsiteId + '" >');
}

});
Expand Down
100 changes: 100 additions & 0 deletions tests/behat/features/bootstrap/Context/FeatureContext.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
<?php

namespace Subsites\Test\Behaviour;

use SilverStripe\BehatExtension\Context\SilverStripeContext,
SilverStripe\BehatExtension\Context\BasicContext,
SilverStripe\BehatExtension\Context\LoginContext,
SilverStripe\BehatExtension\Context\FixtureContext,
SilverStripe\Framework\Test\Behaviour\CmsFormsContext,
SilverStripe\Framework\Test\Behaviour\CmsUiContext,
SilverStripe\Cms\Test\Behaviour;

// PHPUnit
require_once 'PHPUnit/Autoload.php';
require_once 'PHPUnit/Framework/Assert/Functions.php';

/**
* Features context
*
* Context automatically loaded by Behat.
* Uses subcontexts to extend functionality.
*/
class FeatureContext extends SilverStripeContext {

/**
* @var FixtureFactory
*/
protected $fixtureFactory;

/**
* Initializes context.
* Every scenario gets it's own context object.
*
* @param array $parameters context parameters (set them up through behat.yml)
*/
public function __construct(array $parameters) {
parent::__construct($parameters);

$this->useContext('BasicContext', new BasicContext($parameters));
$this->useContext('LoginContext', new LoginContext($parameters));
$this->useContext('CmsFormsContext', new CmsFormsContext($parameters));
$this->useContext('CmsUiContext', new CmsUiContext($parameters));

$fixtureContext = new FixtureContext($parameters);
$fixtureContext->setFixtureFactory($this->getFixtureFactory());
$this->useContext('FixtureContext', $fixtureContext);

// Use blueprints to set user name from identifier
$factory = $fixtureContext->getFixtureFactory();
$blueprint = \Injector::inst()->create('FixtureBlueprint', 'Member');
$blueprint->addCallback('beforeCreate', function($identifier, &$data, &$fixtures) {
if(!isset($data['FirstName'])) $data['FirstName'] = $identifier;
});
$factory->define('Member', $blueprint);

// Auto-publish pages
foreach(\ClassInfo::subclassesFor('SiteTree') as $id => $class) {
$blueprint = \Injector::inst()->create('FixtureBlueprint', $class);
$blueprint->addCallback('afterCreate', function($obj, $identifier, &$data, &$fixtures) {
$obj->publish('Stage', 'Live');
});
$factory->define($class, $blueprint);
}
}

public function setMinkParameters(array $parameters) {
parent::setMinkParameters($parameters);

if(isset($parameters['files_path'])) {
$this->getSubcontext('FixtureContext')->setFilesPath($parameters['files_path']);
}
}

/**
* @return FixtureFactory
*/
public function getFixtureFactory() {
if(!$this->fixtureFactory) {
$this->fixtureFactory = \Injector::inst()->create('BehatFixtureFactory');
}

return $this->fixtureFactory;
}

public function setFixtureFactory(FixtureFactory $factory) {
$this->fixtureFactory = $factory;
}

//
// Place your definition and hook methods here:
//
// /**
// * @Given /^I have done something with "([^"]*)"$/
// */
// public function iHaveDoneSomethingWith($argument) {
// $container = $this->kernel->getContainer();
// $container->get('some_service')->doSomethingWith($argument);
// }
//
}
26 changes: 26 additions & 0 deletions tests/behat/features/preview-navigation.feature
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
Feature: Preview navigation
As a CMS user
I can navigate a subsite in the preview pane
In order to preview my content

Background:
Given a "subsite" "My subsite"
And a "page" "My page" with "URLSegment"="my-page", "Content"="My page content <a name='aname'>aname</a><a href='other-page'>ahref</a>" and "Subsite"="=>Subsite.My subsite"
And a "page" "Other page" with "URLSegment"="other-page", "Content"="Other page content <form action='my-page'><input type='submit' value='Submit my form'></form>" and "Subsite"="=>Subsite.My subsite"
Given a "member" "Joe" belonging to "Admin Group" with "Email"="[email protected]" and "Password"="Password1"
And the "group" "Admin Group" has permissions "Full administrative rights"
And I log in with "[email protected]" and "Password1"

Scenario: I can navigate the subsite preview
When I go to "admin"
And I select "My subsite" from "SubsitesSelect"
And I go to "admin/pages"
And I click on "My page" in the tree
And I wait for 3 seconds
And I set the CMS mode to "Preview mode"
And I follow "ahref" in preview
Then the preview contains "Other page content"
# We are already on the second page, submit the form to return to first one.
When I wait for 3 seconds
And I press "Submit my form" in preview
Then the preview contains "My page content"

0 comments on commit a651ee2

Please sign in to comment.