Skip to content

Commit

Permalink
FIX SSViewer should resolve templates with or without underscores
Browse files Browse the repository at this point in the history
* Capture fully qualified class name, without "Controller"
  • Loading branch information
robbieaverill committed Jan 10, 2017
1 parent c620063 commit 6fb4922
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 48 deletions.
6 changes: 3 additions & 3 deletions src/View/SSViewer.php
Original file line number Diff line number Diff line change
Expand Up @@ -253,9 +253,9 @@ public static function get_templates_by_class($classOrObject, $suffix = '', $bas
$templates[] = $template;
$templates[] = ['type' => 'Includes', $template];

// If the class is "Page_Controller", look for Page.ss
if (stripos($class, '_controller') !== false) {
$templates[] = str_ireplace('_controller', '', $class) . $suffix;
// If the class is "PageController" (PSR-2 compatibility) or "Page_Controller" (legacy), look for Page.ss
if (preg_match('/^(?<name>.+[^\\])_?Controller$/i', $class, $matches)) {
$templates[] = $matches['name'] . $suffix;
}

if ($baseClass && $class == $baseClass) {
Expand Down
85 changes: 41 additions & 44 deletions tests/php/View/SSViewerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
use SilverStripe\View\SSViewer;
use SilverStripe\View\Requirements;
use SilverStripe\View\Tests\SSViewerTest\SSViewerTestModel;
use SilverStripe\View\Tests\SSViewerTest\SSViewerTestModel_Controller;
use SilverStripe\View\Tests\SSViewerTest\SSViewerTestModelController;
use SilverStripe\View\ViewableData;
use SilverStripe\View\SSViewer_FromString;
use SilverStripe\View\SSTemplateParser;
Expand Down Expand Up @@ -1526,17 +1526,15 @@ public function testNestedLoops()

public function testLayout()
{
$self = $this;

$this->useTestTheme(
__DIR__.'/SSViewerTest',
'layouttest',
function () use ($self) {
function () {
$template = new SSViewer(array('Page'));
$self->assertEquals("Foo\n\n", $template->process(new ArrayData(array())));
$this->assertEquals("Foo\n\n", $template->process(new ArrayData(array())));

$template = new SSViewer(array('Shortcodes', 'Page'));
$self->assertEquals("[file_link]\n\n", $template->process(new ArrayData(array())));
$this->assertEquals("[file_link]\n\n", $template->process(new ArrayData(array())));
}
);
}
Expand All @@ -1546,76 +1544,75 @@ function () use ($self) {
*/
public function testGetTemplatesByClass()
{
$self = $this;
$this->useTestTheme(
__DIR__.'/SSViewerTest',
__DIR__ . '/SSViewerTest',
'layouttest',
function () use ($self) {
function () {
// Test passing a string
$templates = SSViewer::get_templates_by_class(
SSViewerTestModel_Controller::class,
SSViewerTestModelController::class,
'',
Controller::class
);
$self->assertEquals(
$this->assertEquals(
[
SSViewerTestModel_Controller::class,
[
'type' => 'Includes',
SSViewerTestModel_Controller::class,
],
SSViewerTestModel::class,
Controller::class,
[
'type' => 'Includes',
Controller::class,
],
SSViewerTestModelController::class,
[
'type' => 'Includes',
SSViewerTestModelController::class,
],
SSViewerTestModel::class,
Controller::class,
[
'type' => 'Includes',
Controller::class,
],
],
$templates
);

// Test to ensure we're stopping at the base class.
$templates = SSViewer::get_templates_by_class(
SSViewerTestModel_Controller::class,
SSViewerTestModelController::class,
'',
SSViewerTestModel_Controller::class
SSViewerTestModelController::class
);
$self->assertEquals(
$this->assertEquals(
[
SSViewerTestModel_Controller::class,
[
'type' => 'Includes',
SSViewerTestModel_Controller::class,
],
SSViewerTestModel::class,
SSViewerTestModelController::class,
[
'type' => 'Includes',
SSViewerTestModelController::class,
],
SSViewerTestModel::class,
],
$templates
);

// Make sure we can search templates by suffix.
$templates = SSViewer::get_templates_by_class(
SSViewerTestModel::class,
'_Controller',
'Controller',
DataObject::class
);
$self->assertEquals(
[
SSViewerTestModel_Controller::class,
$this->assertEquals(
[
'type' => 'Includes',
SSViewerTestModel_Controller::class,
],
DataObject::class.'_Controller',
[
'type' => 'Includes',
DataObject::class.'_Controller',
],
SSViewerTestModelController::class,
[
'type' => 'Includes',
SSViewerTestModelController::class,
],
DataObject::class . 'Controller',
[
'type' => 'Includes',
DataObject::class . 'Controller',
],
],
$templates
);

// Let's throw something random in there.
$self->setExpectedException('InvalidArgumentException');
$this->setExpectedException('InvalidArgumentException');
SSViewer::get_templates_by_class(array());
}
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
use SilverStripe\Dev\TestOnly;
use SilverStripe\Control\Controller;

class SSViewerTestModel_Controller extends Controller implements TestOnly
class SSViewerTestModelController extends Controller implements TestOnly
{

}

0 comments on commit 6fb4922

Please sign in to comment.