mirror of
https://github.com/FriendsOfTYPO3/tea.git
synced 2024-11-24 23:16:13 +01:00
parent
ad460b20b3
commit
82e7e95487
8 changed files with 168 additions and 4 deletions
|
@ -6,7 +6,7 @@ This project adheres to [Semantic Versioning](https://semver.org/).
|
|||
## x.y.z
|
||||
|
||||
### Added
|
||||
- Add a FE editor (#864)
|
||||
- Add an FE editor (#864, #872, #874)
|
||||
- Add automerging of green Dependabot PRs (#756)
|
||||
|
||||
### Changed
|
||||
|
|
|
@ -8,6 +8,7 @@ use Psr\Http\Message\ResponseInterface;
|
|||
use TTN\Tea\Domain\Model\Product\Tea;
|
||||
use TTN\Tea\Domain\Repository\Product\TeaRepository;
|
||||
use TYPO3\CMS\Core\Context\Context;
|
||||
use TYPO3\CMS\Core\Utility\GeneralUtility;
|
||||
use TYPO3\CMS\Extbase\Mvc\Controller\ActionController;
|
||||
|
||||
/**
|
||||
|
@ -70,4 +71,22 @@ class FrontEndEditorController extends ActionController
|
|||
|
||||
return $this->redirect('index');
|
||||
}
|
||||
|
||||
public function newAction(?Tea $tea = null): ResponseInterface
|
||||
{
|
||||
// Note: We are using `makeInstance` here instead of `new` to allow for XCLASSing.
|
||||
$teaToAssign = $tea ?? GeneralUtility::makeInstance(Tea::class);
|
||||
$this->view->assign('tea', $teaToAssign);
|
||||
|
||||
return $this->htmlResponse();
|
||||
}
|
||||
|
||||
public function createAction(Tea $tea): ResponseInterface
|
||||
{
|
||||
$tea->setOwnerUid($this->getUidOfLoggedInUser());
|
||||
|
||||
$this->teaRepository->add($tea);
|
||||
|
||||
return $this->redirect('index');
|
||||
}
|
||||
}
|
||||
|
|
|
@ -67,6 +67,14 @@
|
|||
<source>Save</source>
|
||||
<target>Speichern</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="plugin.frontEndEditor.action.new">
|
||||
<source>Create new tea</source>
|
||||
<target>Neuen Tee anlegen</target>
|
||||
</trans-unit>
|
||||
<trans-unit id="plugin.frontEndEditor.new.heading">
|
||||
<source>Create new tea</source>
|
||||
<target>Neuen Tee anlegen</target>
|
||||
</trans-unit>
|
||||
</body>
|
||||
</file>
|
||||
</xliff>
|
||||
|
|
|
@ -51,6 +51,12 @@
|
|||
<trans-unit id="plugin.frontEndEditor.action.save">
|
||||
<source>Save</source>
|
||||
</trans-unit>
|
||||
<trans-unit id="plugin.frontEndEditor.action.new">
|
||||
<source>Create new tea</source>
|
||||
</trans-unit>
|
||||
<trans-unit id="plugin.frontEndEditor.new.heading">
|
||||
<source>Create new tea</source>
|
||||
</trans-unit>
|
||||
</body>
|
||||
</file>
|
||||
</xliff>
|
||||
|
|
|
@ -7,6 +7,12 @@
|
|||
<f:translate key="plugin.frontEndEditor.index.heading"/>
|
||||
</h2>
|
||||
|
||||
<p class="btn btn-link">
|
||||
<f:link.action action="new">
|
||||
<f:translate key="plugin.frontEndEditor.action.new"/>
|
||||
</f:link.action>
|
||||
</p>
|
||||
|
||||
<f:if condition="{teas}">
|
||||
<f:then>
|
||||
<table class="table table-striped table-hover">
|
||||
|
|
14
Resources/Private/Templates/FrontEndEditor/New.html
Normal file
14
Resources/Private/Templates/FrontEndEditor/New.html
Normal file
|
@ -0,0 +1,14 @@
|
|||
<!DOCTYPE html>
|
||||
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
|
||||
<f:layout name="FrontEndEditor"/>
|
||||
|
||||
<f:section name="main">
|
||||
<h2>
|
||||
<f:translate key="plugin.frontEndEditor.new.heading"/>
|
||||
</h2>
|
||||
|
||||
<f:form action="create" name="tea" object="{tea}">
|
||||
<f:render partial="FrontEndEditor/Form" arguments="{_all}"/>
|
||||
</f:form>
|
||||
</f:section>
|
||||
</html>
|
|
@ -13,6 +13,7 @@ use TYPO3\CMS\Core\Context\UserAspect;
|
|||
use TYPO3\CMS\Core\Http\HtmlResponse;
|
||||
use TYPO3\CMS\Core\Http\RedirectResponse;
|
||||
use TYPO3\CMS\Core\Information\Typo3Version;
|
||||
use TYPO3\CMS\Core\Utility\GeneralUtility;
|
||||
use TYPO3\CMS\Extbase\Mvc\Controller\ActionController;
|
||||
use TYPO3\CMS\Extbase\Mvc\Exception\StopActionException;
|
||||
use TYPO3\CMS\Extbase\Persistence\QueryResultInterface;
|
||||
|
@ -67,6 +68,14 @@ final class FrontEndEditorControllerTest extends UnitTestCase
|
|||
$this->subject->method('htmlResponse')->willReturn($responseStub);
|
||||
}
|
||||
|
||||
protected function tearDown(): void
|
||||
{
|
||||
// empty FIFO queue
|
||||
GeneralUtility::makeInstance(Tea::class);
|
||||
|
||||
parent::tearDown();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int<0, max> $userUid
|
||||
*/
|
||||
|
@ -193,7 +202,7 @@ final class FrontEndEditorControllerTest extends UnitTestCase
|
|||
$this->setUidOfLoggedInUser($userUid);
|
||||
$tea = new Tea();
|
||||
$tea->setOwnerUid($userUid);
|
||||
$this->mockRedirect('index');
|
||||
$this->stubRedirect('index');
|
||||
|
||||
$this->teaRepositoryMock->expects(self::once())->method('update')->with($tea);
|
||||
|
||||
|
@ -216,6 +225,20 @@ final class FrontEndEditorControllerTest extends UnitTestCase
|
|||
}
|
||||
}
|
||||
|
||||
private function stubRedirect(string $actionName): void
|
||||
{
|
||||
if ((new Typo3Version())->getMajorVersion() <= 11) {
|
||||
$this->subject->method('redirect')
|
||||
// @phpstan-ignore-next-line This class does not exist in V12 anymore, but this branch is V11-only.
|
||||
->willThrowException(new StopActionException('redirectToUri', 1476045828));
|
||||
// @phpstan-ignore-next-line This class does not exist in V12 anymore, but this branch is V11-only.
|
||||
$this->expectException(StopActionException::class);
|
||||
} else {
|
||||
$redirectResponse = $this->createStub(RedirectResponse::class);
|
||||
$this->subject->method('redirect')->willReturn($redirectResponse);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @test
|
||||
*/
|
||||
|
@ -262,4 +285,92 @@ final class FrontEndEditorControllerTest extends UnitTestCase
|
|||
|
||||
$this->subject->updateAction($tea);
|
||||
}
|
||||
|
||||
/**
|
||||
* @test
|
||||
*/
|
||||
public function newActionWithTeaAssignsProvidedTeaToView(): void
|
||||
{
|
||||
$tea = new Tea();
|
||||
|
||||
$this->viewMock->expects(self::once())->method('assign')->with('tea', $tea);
|
||||
|
||||
$this->subject->newAction($tea);
|
||||
}
|
||||
|
||||
/**
|
||||
* @test
|
||||
*/
|
||||
public function newActionWithNullTeaAssignsProvidedNewTeaToView(): void
|
||||
{
|
||||
$tea = new Tea();
|
||||
GeneralUtility::addInstance(Tea::class, $tea);
|
||||
|
||||
$this->viewMock->expects(self::once())->method('assign')->with('tea', $tea);
|
||||
|
||||
$this->subject->newAction(null);
|
||||
}
|
||||
|
||||
/**
|
||||
* @test
|
||||
*/
|
||||
public function newActionWithoutTeaAssignsProvidedNewTeaToView(): void
|
||||
{
|
||||
$tea = new Tea();
|
||||
GeneralUtility::addInstance(Tea::class, $tea);
|
||||
|
||||
$this->viewMock->expects(self::once())->method('assign')->with('tea', $tea);
|
||||
|
||||
$this->subject->newAction();
|
||||
}
|
||||
|
||||
/**
|
||||
* @test
|
||||
*/
|
||||
public function newActionReturnsHtmlResponse(): void
|
||||
{
|
||||
$result = $this->subject->newAction();
|
||||
|
||||
self::assertInstanceOf(HtmlResponse::class, $result);
|
||||
}
|
||||
|
||||
/**
|
||||
* @test
|
||||
*/
|
||||
public function createActionSetsLoggedInUserAsOwnerOfProvidedTea(): void
|
||||
{
|
||||
$userUid = 5;
|
||||
$this->setUidOfLoggedInUser($userUid);
|
||||
$tea = new Tea();
|
||||
$this->stubRedirect('index');
|
||||
|
||||
$this->subject->createAction($tea);
|
||||
|
||||
self::assertSame($userUid, $tea->getOwnerUid());
|
||||
}
|
||||
|
||||
/**
|
||||
* @test
|
||||
*/
|
||||
public function createActionPersistsProvidedTea(): void
|
||||
{
|
||||
$tea = new Tea();
|
||||
$this->stubRedirect('index');
|
||||
|
||||
$this->teaRepositoryMock->expects(self::once())->method('add')->with($tea);
|
||||
|
||||
$this->subject->createAction($tea);
|
||||
}
|
||||
|
||||
/**
|
||||
* @test
|
||||
*/
|
||||
public function createActionRedirectsToIndexAction(): void
|
||||
{
|
||||
$tea = new Tea();
|
||||
|
||||
$this->mockRedirect('index');
|
||||
|
||||
$this->subject->updateAction($tea);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -42,12 +42,12 @@ ExtensionUtility::configurePlugin(
|
|||
'TeaFrontEndEditor',
|
||||
// all actions
|
||||
[
|
||||
FrontEndEditorController::class => 'index, edit, update',
|
||||
FrontEndEditorController::class => 'index, edit, update, create, new',
|
||||
],
|
||||
// non-cacheable actions
|
||||
[
|
||||
// All actions need to be non-cacheable because they either contain dynamic data,
|
||||
// or because they are specific to the logged-in FE user (while FE content is cached by FE groups).
|
||||
FrontEndEditorController::class => 'index, edit, update',
|
||||
FrontEndEditorController::class => 'index, edit, update, create, new',
|
||||
]
|
||||
);
|
||||
|
|
Loading…
Reference in a new issue