mirror of
https://github.com/silverstripe/silverstripe-cms
synced 2024-10-22 08:05:56 +02:00
Compare commits
2 Commits
f4d5f7cfff
...
d00eed5faa
Author | SHA1 | Date | |
---|---|---|---|
|
d00eed5faa | ||
|
fe9088698f |
@ -289,14 +289,6 @@ class ContentController extends Controller
|
|||||||
return new ArrayList($visible);
|
return new ArrayList($visible);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @return ArrayList<SiteTree>
|
|
||||||
*/
|
|
||||||
public function Menu($level)
|
|
||||||
{
|
|
||||||
return $this->getMenu($level);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the default log-in form.
|
* Returns the default log-in form.
|
||||||
*
|
*
|
||||||
@ -413,23 +405,23 @@ HTML;
|
|||||||
$action = $action === 'index' ? '' : '_' . $action;
|
$action = $action === 'index' ? '' : '_' . $action;
|
||||||
|
|
||||||
$templatesFound = [];
|
$templatesFound = [];
|
||||||
// Find templates for the record + action together - e.g. Page_action.ss
|
// Find templates for the record + action together - e.g. Page_action
|
||||||
if ($this->dataRecord instanceof SiteTree) {
|
if ($this->dataRecord instanceof SiteTree) {
|
||||||
$templatesFound[] = $this->dataRecord->getViewerTemplates($action);
|
$templatesFound[] = $this->dataRecord->getViewerTemplates($action);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Find templates for the controller + action together - e.g. PageController_action.ss
|
// Find templates for the controller + action together - e.g. PageController_action
|
||||||
$templatesFound[] = SSViewer::get_templates_by_class(static::class, $action, Controller::class);
|
$templatesFound[] = SSViewer::get_templates_by_class(static::class, $action ?? '', Controller::class);
|
||||||
|
|
||||||
// Find templates for the record without an action - e.g. Page.ss
|
// Find templates for the record without an action - e.g. Page
|
||||||
if ($this->dataRecord instanceof SiteTree) {
|
if ($this->dataRecord instanceof SiteTree) {
|
||||||
$templatesFound[] = $this->dataRecord->getViewerTemplates();
|
$templatesFound[] = $this->dataRecord->getViewerTemplates();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Find the templates for the controller without an action - e.g. PageController.ss
|
// Find the templates for the controller without an action - e.g. PageController
|
||||||
$templatesFound[] = SSViewer::get_templates_by_class(static::class, "", Controller::class);
|
$templatesFound[] = SSViewer::get_templates_by_class(static::class, '', Controller::class);
|
||||||
|
|
||||||
$templates = array_merge(...$templatesFound);
|
$templates = array_merge(...$templatesFound);
|
||||||
return SSViewer::create($templates);
|
return SSViewer::create($templates, $this->getTemplateEngine());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1454,7 +1454,7 @@ class SiteTree extends DataObject implements PermissionProvider, i18nEntityProvi
|
|||||||
|
|
||||||
$tags['title'] = [
|
$tags['title'] = [
|
||||||
'tag' => 'title',
|
'tag' => 'title',
|
||||||
'content' => $this->obj('Title')->forTemplate()
|
'content' => $this->obj('Title')?->forTemplate()
|
||||||
];
|
];
|
||||||
|
|
||||||
$generator = $this->getGenerator();
|
$generator = $this->getGenerator();
|
||||||
@ -1601,7 +1601,7 @@ class SiteTree extends DataObject implements PermissionProvider, i18nEntityProvi
|
|||||||
|
|
||||||
$tagString = implode("\n", $tags);
|
$tagString = implode("\n", $tags);
|
||||||
if ($this->ExtraMeta) {
|
if ($this->ExtraMeta) {
|
||||||
$tagString .= $this->obj('ExtraMeta')->forTemplate();
|
$tagString .= $this->obj('ExtraMeta')?->forTemplate();
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->extend('updateMetaTags', $tagString);
|
$this->extend('updateMetaTags', $tagString);
|
||||||
|
@ -33,7 +33,7 @@ class ThemeContext implements Context
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a template within a test theme
|
* Create a template within a test theme. Only ss templates are supported.
|
||||||
*
|
*
|
||||||
* @Given /^a template "(?<template>[^"]+)" in theme "(?<theme>[^"]+)" with content "(?<content>[^"]+)"/
|
* @Given /^a template "(?<template>[^"]+)" in theme "(?<theme>[^"]+)" with content "(?<content>[^"]+)"/
|
||||||
* @param string $template
|
* @param string $template
|
||||||
|
@ -5,6 +5,8 @@ namespace SilverStripe\CMS\Tests\Controllers;
|
|||||||
use SilverStripe\CMS\Controllers\ContentController;
|
use SilverStripe\CMS\Controllers\ContentController;
|
||||||
use SilverStripe\CMS\Controllers\RootURLController;
|
use SilverStripe\CMS\Controllers\RootURLController;
|
||||||
use SilverStripe\CMS\Model\SiteTree;
|
use SilverStripe\CMS\Model\SiteTree;
|
||||||
|
use SilverStripe\CMS\Tests\Controllers\ContentControllerTest\DummyTemplateContentController;
|
||||||
|
use SilverStripe\CMS\Tests\Controllers\ContentControllerTest\DummyTemplateEngine;
|
||||||
use SilverStripe\Control\Director;
|
use SilverStripe\Control\Director;
|
||||||
use SilverStripe\Control\HTTPResponse_Exception;
|
use SilverStripe\Control\HTTPResponse_Exception;
|
||||||
use SilverStripe\Core\Config\Config;
|
use SilverStripe\Core\Config\Config;
|
||||||
@ -162,7 +164,7 @@ class ContentControllerTest extends FunctionalTest
|
|||||||
{
|
{
|
||||||
$this->useTestTheme(__DIR__, 'controllertest', function () {
|
$this->useTestTheme(__DIR__, 'controllertest', function () {
|
||||||
|
|
||||||
// Test a page without a controller (ContentControllerTest_PageWithoutController.ss)
|
// Test a page without a controller (ContentControllerTest_PageWithoutController)
|
||||||
$page = new ContentControllerTestPageWithoutController();
|
$page = new ContentControllerTestPageWithoutController();
|
||||||
$page->URLSegment = "test";
|
$page->URLSegment = "test";
|
||||||
$page->write();
|
$page->write();
|
||||||
@ -171,7 +173,7 @@ class ContentControllerTest extends FunctionalTest
|
|||||||
$response = $this->get($page->RelativeLink());
|
$response = $this->get($page->RelativeLink());
|
||||||
$this->assertEquals("ContentControllerTestPageWithoutController", trim($response->getBody() ?? ''));
|
$this->assertEquals("ContentControllerTestPageWithoutController", trim($response->getBody() ?? ''));
|
||||||
|
|
||||||
// This should fall over to user Page.ss
|
// This should fall over to use Page
|
||||||
$page = new ContentControllerTestPage();
|
$page = new ContentControllerTestPage();
|
||||||
$page->URLSegment = "test";
|
$page->URLSegment = "test";
|
||||||
$page->write();
|
$page->write();
|
||||||
@ -191,20 +193,27 @@ class ContentControllerTest extends FunctionalTest
|
|||||||
$this->assertEquals("ContentControllerTestPage_test", trim($response->getBody() ?? ''));
|
$this->assertEquals("ContentControllerTestPage_test", trim($response->getBody() ?? ''));
|
||||||
|
|
||||||
// Test that an action without a template will default to the index template, which is
|
// Test that an action without a template will default to the index template, which is
|
||||||
// to say the default Page.ss template
|
// to say the default Page template
|
||||||
$response = $this->get($page->RelativeLink("testwithouttemplate"));
|
$response = $this->get($page->RelativeLink("testwithouttemplate"));
|
||||||
$this->assertEquals("Page", trim($response->getBody() ?? ''));
|
$this->assertEquals("Page", trim($response->getBody() ?? ''));
|
||||||
|
|
||||||
// Test that an action with a template will render the both action template *and* the
|
// Test that an action with a template will render both the action template *and* the
|
||||||
// correct parent template
|
// correct parent template
|
||||||
$controller = new ContentController($page);
|
$controller = new DummyTemplateContentController($page);
|
||||||
$viewer = $controller->getViewer('test');
|
$viewer = $controller->getViewer('test');
|
||||||
$this->assertEquals(
|
/** @var DummyTemplateEngine $engine */
|
||||||
__DIR__
|
$engine = $viewer->getTemplateEngine();
|
||||||
. '/themes/controllertest/templates/SilverStripe/CMS/Tests/Controllers/'
|
$templateCandidates = $engine->getTemplates();
|
||||||
. 'ContentControllerTestPage_test.ss',
|
// Check for the action templates
|
||||||
$viewer->templates()['main']
|
$this->assertContains('SilverStripe\CMS\Tests\Controllers\ContentControllerTestPage_test', $templateCandidates);
|
||||||
);
|
$this->assertContains('SilverStripe\CMS\Model\SiteTree_test', $templateCandidates);
|
||||||
|
$this->assertContains('SilverStripe\CMS\Tests\Controllers\ContentControllerTest\DummyTemplateContentController_test', $templateCandidates);
|
||||||
|
$this->assertContains('SilverStripe\CMS\Controllers\ContentController_test', $templateCandidates);
|
||||||
|
// Check for the parent templates
|
||||||
|
$this->assertContains('SilverStripe\CMS\Tests\Controllers\ContentControllerTestPage', $templateCandidates);
|
||||||
|
$this->assertContains('SilverStripe\CMS\Model\SiteTree', $templateCandidates);
|
||||||
|
$this->assertContains('SilverStripe\CMS\Tests\Controllers\ContentControllerTest\DummyTemplateContentController', $templateCandidates);
|
||||||
|
$this->assertContains('SilverStripe\CMS\Controllers\ContentController', $templateCandidates);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,15 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace SilverStripe\CMS\Tests\Controllers\ContentControllerTest;
|
||||||
|
|
||||||
|
use SilverStripe\CMS\Controllers\ContentController;
|
||||||
|
use SilverStripe\Dev\TestOnly;
|
||||||
|
use SilverStripe\View\TemplateEngine;
|
||||||
|
|
||||||
|
class DummyTemplateContentController extends ContentController implements TestOnly
|
||||||
|
{
|
||||||
|
protected function getTemplateEngine(): TemplateEngine
|
||||||
|
{
|
||||||
|
return new DummyTemplateEngine();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,56 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace SilverStripe\CMS\Tests\Controllers\ContentControllerTest;
|
||||||
|
|
||||||
|
use SilverStripe\Dev\TestOnly;
|
||||||
|
use SilverStripe\View\TemplateEngine;
|
||||||
|
use SilverStripe\View\ViewLayerData;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A dummy template renderer that doesn't actually render any templates.
|
||||||
|
*/
|
||||||
|
class DummyTemplateEngine implements TemplateEngine, TestOnly
|
||||||
|
{
|
||||||
|
private string $output = '<html><head></head><body></body></html>';
|
||||||
|
|
||||||
|
private string|array $templates;
|
||||||
|
|
||||||
|
public function __construct(string|array $templateCandidates = [])
|
||||||
|
{
|
||||||
|
$this->templates = $templateCandidates;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setTemplate(string|array $templateCandidates): static
|
||||||
|
{
|
||||||
|
$this->templates = $templateCandidates;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function hasTemplate(string|array $templateCandidates): bool
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function renderString(string $template, ViewLayerData $model, array $overlay = [], bool $cache = true): string
|
||||||
|
{
|
||||||
|
return $this->output;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function render(ViewLayerData $model, array $overlay = []): string
|
||||||
|
{
|
||||||
|
return $this->output;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setOutput(string $output): void
|
||||||
|
{
|
||||||
|
$this->output = $output;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the template candidates that were passed to the constructor or to setTemplate()
|
||||||
|
*/
|
||||||
|
public function getTemplates(): array
|
||||||
|
{
|
||||||
|
return $this->templates;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user