first commit
This commit is contained in:
115
Classes/Widget/AbstractWidgetController.php
Normal file
115
Classes/Widget/AbstractWidgetController.php
Normal file
@@ -0,0 +1,115 @@
|
||||
<?php
|
||||
namespace WapplerSystems\Meilisearch\Widget;
|
||||
|
||||
/*
|
||||
* This file is part of the TYPO3 CMS project.
|
||||
*
|
||||
* It is free software; you can redistribute it and/or modify it under
|
||||
* the terms of the GNU General Public License, either version 2
|
||||
* of the License, or any later version.
|
||||
*
|
||||
* For the full copyright and license information, please read the
|
||||
* LICENSE.txt file that was distributed with this source code.
|
||||
*
|
||||
* The TYPO3 project - inspiring people to share!
|
||||
*/
|
||||
|
||||
use WapplerSystems\Meilisearch\ConnectionManager;
|
||||
use WapplerSystems\Meilisearch\Domain\Search\ResultSet\SearchResultSetService;
|
||||
use WapplerSystems\Meilisearch\Search;
|
||||
use WapplerSystems\Meilisearch\System\Configuration\ConfigurationManager;
|
||||
use WapplerSystems\Meilisearch\Mvc\Controller\SolrControllerContext;
|
||||
use WapplerSystems\Meilisearch\System\Configuration\TypoScriptConfiguration;
|
||||
use WapplerSystems\Meilisearch\Util;
|
||||
use WapplerSystems\Meilisearch\Widget\WidgetRequest;
|
||||
use TYPO3\CMS\Core\Utility\GeneralUtility;
|
||||
use TYPO3\CMS\Fluid\Core\Widget\AbstractWidgetController as CoreAbstractWidgetController;
|
||||
|
||||
/**
|
||||
* Class AbstractWidgetController
|
||||
*
|
||||
* @author Frans Saris <frans@beech.it>
|
||||
* @author Timo Hund <timo.hund@dkd.de>
|
||||
*/
|
||||
class AbstractWidgetController extends CoreAbstractWidgetController
|
||||
{
|
||||
|
||||
/**
|
||||
* @var array
|
||||
*/
|
||||
protected $supportedRequestTypes = [WidgetRequest::class];
|
||||
|
||||
/**
|
||||
* @var ConfigurationManager
|
||||
*/
|
||||
private $solrConfigurationManager;
|
||||
|
||||
/**
|
||||
* @var \WapplerSystems\Meilisearch\Mvc\Controller\SolrControllerContext
|
||||
*/
|
||||
protected $controllerContext;
|
||||
|
||||
/**
|
||||
* @param \WapplerSystems\Meilisearch\System\Configuration\ConfigurationManager
|
||||
*/
|
||||
public function injectSolrConfigurationManager(ConfigurationManager $configurationManager)
|
||||
{
|
||||
$this->solrConfigurationManager = $configurationManager;
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize the controller context
|
||||
*
|
||||
* @return \WapplerSystems\Meilisearch\Mvc\Controller\SolrControllerContext ControllerContext to be passed to the view
|
||||
* @api
|
||||
*/
|
||||
protected function buildControllerContext()
|
||||
{
|
||||
/** @var $controllerContext \WapplerSystems\Meilisearch\Mvc\Controller\SolrControllerContext */
|
||||
$controllerContext = $this->objectManager->get(SolrControllerContext::class);
|
||||
$controllerContext->setRequest($this->request);
|
||||
$controllerContext->setResponse($this->response);
|
||||
if ($this->arguments !== null) {
|
||||
$controllerContext->setArguments($this->arguments);
|
||||
}
|
||||
$controllerContext->setUriBuilder($this->uriBuilder);
|
||||
$typoScriptConfiguration = $this->solrConfigurationManager->getTypoScriptConfiguration();
|
||||
$controllerContext->setTypoScriptConfiguration($typoScriptConfiguration);
|
||||
|
||||
$this->setActiveSearchResultSet($controllerContext);
|
||||
|
||||
return $controllerContext;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param \WapplerSystems\Meilisearch\Mvc\Controller\SolrControllerContext $controllerContext
|
||||
* @return \WapplerSystems\Meilisearch\Mvc\Controller\SolrControllerContext
|
||||
*/
|
||||
protected function setActiveSearchResultSet($controllerContext)
|
||||
{
|
||||
$resultSetService = $this->initializeSearch($controllerContext->getTypoScriptConfiguration());
|
||||
$lastResult = $resultSetService->getLastResultSet();
|
||||
if (!is_null($lastResult)) {
|
||||
$controllerContext->setSearchResultSet($lastResult);
|
||||
}
|
||||
|
||||
return $controllerContext;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param TypoScriptConfiguration $typoScriptConfiguration
|
||||
* @return SearchResultSetService
|
||||
*/
|
||||
protected function initializeSearch(TypoScriptConfiguration $typoScriptConfiguration)
|
||||
{
|
||||
/** @var \WapplerSystems\Meilisearch\ConnectionManager $solrConnection */
|
||||
$solrConnection = GeneralUtility::makeInstance(ConnectionManager::class)->getConnectionByPageId($GLOBALS['TSFE']->id, Util::getLanguageUid(), $GLOBALS['TSFE']->MP);
|
||||
$search = GeneralUtility::makeInstance(Search::class, /** @scrutinizer ignore-type */ $solrConnection);
|
||||
|
||||
return GeneralUtility::makeInstance(
|
||||
SearchResultSetService::class,
|
||||
/** @scrutinizer ignore-type */ $typoScriptConfiguration,
|
||||
/** @scrutinizer ignore-type */ $search
|
||||
);
|
||||
}
|
||||
}
|
247
Classes/Widget/AbstractWidgetViewHelper.php
Normal file
247
Classes/Widget/AbstractWidgetViewHelper.php
Normal file
@@ -0,0 +1,247 @@
|
||||
<?php
|
||||
namespace WapplerSystems\Meilisearch\Widget;
|
||||
|
||||
/*
|
||||
* This file is part of the TYPO3 CMS project.
|
||||
*
|
||||
* It is free software; you can redistribute it and/or modify it under
|
||||
* the terms of the GNU General Public License, either version 2
|
||||
* of the License, or any later version.
|
||||
*
|
||||
* For the full copyright and license information, please read the
|
||||
* LICENSE.txt file that was distributed with this source code.
|
||||
*
|
||||
* The TYPO3 project - inspiring people to share!
|
||||
*/
|
||||
|
||||
use WapplerSystems\Meilisearch\Mvc\Controller\SolrControllerContext;
|
||||
use WapplerSystems\Meilisearch\Widget\WidgetRequest as SolrFluidWidgetRequest;
|
||||
use TYPO3\CMS\Extbase\Mvc\Web\Response;
|
||||
use TYPO3\CMS\Extbase\Object\ObjectManagerInterface;
|
||||
use TYPO3Fluid\Fluid\Core\Parser\SyntaxTree\RootNode;
|
||||
use TYPO3Fluid\Fluid\Core\ViewHelper\ViewHelperInterface;
|
||||
use TYPO3\CMS\Fluid\Core\Widget\AbstractWidgetViewHelper as AbstractCoreWidgetViewHelper;
|
||||
use TYPO3\CMS\Fluid\Core\Widget\AjaxWidgetContextHolder;
|
||||
use TYPO3\CMS\Fluid\Core\Widget\Exception\MissingControllerException;
|
||||
use TYPO3\CMS\Fluid\Core\Widget\WidgetRequest as CoreWidgetRequest;
|
||||
use TYPO3\CMS\Fluid\Core\Widget\WidgetContext;
|
||||
use TYPO3\CMS\Extbase\Service\ExtensionService;
|
||||
|
||||
|
||||
/**
|
||||
* Class AbstractWidgetViewHelper
|
||||
*
|
||||
* This is almost a exact copy of \TYPO3\CMS\Fluid\Core\ViewHelper\AbstractViewHelper
|
||||
* because we need to switch the request object to overrule the widget prefix for url params
|
||||
* todo: find cleaner way to let widget listen to tx_meilisearch[] instead of tx_meilisearch[@widget]
|
||||
*
|
||||
* @author Frans Saris <frans@beech.it>
|
||||
* @author Timo Hund <timo.hund@dkd.de>
|
||||
*/
|
||||
abstract class AbstractWidgetViewHelper extends AbstractCoreWidgetViewHelper implements ViewHelperInterface
|
||||
{
|
||||
|
||||
/**
|
||||
* The Controller associated to this widget.
|
||||
* This needs to be filled by the individual subclass by di
|
||||
* annotation.
|
||||
*
|
||||
* @var AbstractWidgetController
|
||||
* @api
|
||||
*/
|
||||
protected $controller;
|
||||
|
||||
/**
|
||||
* If set to TRUE, it is an AJAX widget.
|
||||
*
|
||||
* @var boolean
|
||||
* @api
|
||||
*/
|
||||
protected $ajaxWidget = false;
|
||||
|
||||
/**
|
||||
* @var AjaxWidgetContextHolder
|
||||
*/
|
||||
private $ajaxWidgetContextHolder;
|
||||
|
||||
/**
|
||||
* @var ObjectManagerInterface
|
||||
*/
|
||||
protected $objectManager;
|
||||
|
||||
/**
|
||||
* @var ExtensionService
|
||||
*/
|
||||
protected $extensionService;
|
||||
|
||||
/**
|
||||
* @var \TYPO3\CMS\Fluid\Core\Widget\WidgetContext
|
||||
*/
|
||||
private $widgetContext;
|
||||
|
||||
/**
|
||||
* @param ExtensionService $extensionService
|
||||
*/
|
||||
public function injectExtensionService(ExtensionService $extensionService)
|
||||
{
|
||||
$this->extensionService = $extensionService;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param AjaxWidgetContextHolder $ajaxWidgetContextHolder
|
||||
* @return void
|
||||
*/
|
||||
public function injectAjaxWidgetContextHolder(AjaxWidgetContextHolder $ajaxWidgetContextHolder)
|
||||
{
|
||||
$this->ajaxWidgetContextHolder = $ajaxWidgetContextHolder;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param ObjectManagerInterface $objectManager
|
||||
* @return void
|
||||
*/
|
||||
public function injectObjectManager(ObjectManagerInterface $objectManager)
|
||||
{
|
||||
$this->objectManager = $objectManager;
|
||||
$this->widgetContext = $this->objectManager->get(WidgetContext::class);
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize the arguments of the ViewHelper, and call the render() method of the ViewHelper.
|
||||
*
|
||||
* @return string the rendered ViewHelper.
|
||||
*/
|
||||
public function initializeArgumentsAndRender()
|
||||
{
|
||||
$this->validateArguments();
|
||||
$this->initialize();
|
||||
$this->initializeWidgetContext();
|
||||
return $this->callRenderMethod();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return SolrControllerContext
|
||||
* @throws \InvalidArgumentException
|
||||
*/
|
||||
protected function getControllerContext()
|
||||
{
|
||||
$controllerContext = null;
|
||||
if (method_exists($this->renderingContext, 'getControllerContext')) {
|
||||
$controllerContext = $this->renderingContext->getControllerContext();
|
||||
}
|
||||
|
||||
if (!$controllerContext instanceof SolrControllerContext) {
|
||||
throw new \InvalidArgumentException('No valid SolrControllerContext found', 1512998673);
|
||||
}
|
||||
|
||||
return $controllerContext;
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize the Widget Context, before the Render method is called.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
private function initializeWidgetContext()
|
||||
{
|
||||
$this->widgetContext->setWidgetConfiguration($this->getWidgetConfiguration());
|
||||
$this->initializeWidgetIdentifier();
|
||||
$this->widgetContext->setControllerObjectName(get_class($this->controller));
|
||||
|
||||
$extensionName = $this->getControllerContext()->getRequest()->getControllerExtensionName();
|
||||
$pluginName = $this->getControllerContext()->getRequest()->getPluginName();
|
||||
$this->widgetContext->setParentExtensionName($extensionName);
|
||||
$this->widgetContext->setParentPluginName($pluginName);
|
||||
$pluginNamespace = $this->extensionService->getPluginNamespace($extensionName, $pluginName);
|
||||
$this->widgetContext->setParentPluginNamespace($pluginNamespace);
|
||||
$this->widgetContext->setWidgetViewHelperClassName(get_class($this));
|
||||
|
||||
if ($this->ajaxWidget === true) {
|
||||
$this->ajaxWidgetContextHolder->store($this->widgetContext);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Stores the syntax tree child nodes in the Widget Context, so they can be
|
||||
* rendered with <f:widget.renderChildren> lateron.
|
||||
*
|
||||
* @param array $childNodes The SyntaxTree Child nodes of this ViewHelper.
|
||||
* @return void
|
||||
*/
|
||||
public function setChildNodes(array $childNodes)
|
||||
{
|
||||
$rootNode = $this->objectManager->get(RootNode::class);
|
||||
foreach ($childNodes as $childNode) {
|
||||
$rootNode->addChildNode($childNode);
|
||||
}
|
||||
$this->widgetContext->setViewHelperChildNodes($rootNode, $this->renderingContext);
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate the configuration for this widget. Override to adjust.
|
||||
*
|
||||
* @return array
|
||||
* @api
|
||||
*/
|
||||
protected function getWidgetConfiguration()
|
||||
{
|
||||
return $this->arguments;
|
||||
}
|
||||
|
||||
/**
|
||||
* Initiate a sub request to $this->controller. Make sure to fill $this->controller
|
||||
* via Dependency Injection.
|
||||
*
|
||||
* @return \TYPO3\CMS\Extbase\Mvc\ResponseInterface the response of this request.
|
||||
* @throws MissingControllerException
|
||||
*/
|
||||
protected function initiateSubRequest()
|
||||
{
|
||||
if (!$this->controller instanceof AbstractWidgetController) {
|
||||
if (isset($this->controller)) {
|
||||
throw new MissingControllerException('initiateSubRequest() can not be called if there is no valid controller extending TYPO3\\CMS\\Fluid\\Core\\Widget\\AbstractWidgetController. Got "' . get_class($this->controller) . '" in class "' . get_class($this) . '".', 1289422564);
|
||||
}
|
||||
throw new MissingControllerException('initiateSubRequest() can not be called if there is no controller inside $this->controller. Make sure to add a corresponding injectController method to your WidgetViewHelper class "' . get_class($this) . '".', 1284401632);
|
||||
}
|
||||
/** @var $subRequest \WapplerSystems\Meilisearch\Widget\WidgetRequest */
|
||||
$subRequest = $this->objectManager->get(SolrFluidWidgetRequest::class);
|
||||
$subRequest->setWidgetContext($this->widgetContext);
|
||||
|
||||
$this->passArgumentsToSubRequest($subRequest);
|
||||
$subResponse = $this->objectManager->get(Response::class);
|
||||
$this->controller->processRequest($subRequest, $subResponse);
|
||||
return $subResponse;
|
||||
}
|
||||
|
||||
/**
|
||||
* Pass the arguments of the widget to the subrequest.
|
||||
*
|
||||
* @param CoreWidgetRequest $subRequest
|
||||
* @return void
|
||||
*/
|
||||
private function passArgumentsToSubRequest(CoreWidgetRequest $subRequest)
|
||||
{
|
||||
$arguments = $this->getControllerContext()->getRequest()->getArguments();
|
||||
|
||||
if (isset($arguments)) {
|
||||
if (isset($arguments['action'])) {
|
||||
$subRequest->setControllerActionName($arguments['action']);
|
||||
unset($arguments['action']);
|
||||
}
|
||||
$subRequest->setArguments($arguments);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* The widget identifier is unique on the current page, and is used
|
||||
* in the URI as a namespace for the widget's arguments.
|
||||
*
|
||||
* @return string the widget identifier for this widget
|
||||
* @return void
|
||||
* @todo clean up, and make it somehow more routing compatible.
|
||||
*/
|
||||
private function initializeWidgetIdentifier()
|
||||
{
|
||||
$this->widgetContext->setWidgetIdentifier('');
|
||||
}
|
||||
}
|
38
Classes/Widget/WidgetRequest.php
Normal file
38
Classes/Widget/WidgetRequest.php
Normal file
@@ -0,0 +1,38 @@
|
||||
<?php
|
||||
namespace WapplerSystems\Meilisearch\Widget;
|
||||
|
||||
/*
|
||||
* This file is part of the TYPO3 CMS project.
|
||||
*
|
||||
* It is free software; you can redistribute it and/or modify it under
|
||||
* the terms of the GNU General Public License, either version 2
|
||||
* of the License, or any later version.
|
||||
*
|
||||
* For the full copyright and license information, please read the
|
||||
* LICENSE.txt file that was distributed with this source code.
|
||||
*
|
||||
* The TYPO3 project - inspiring people to share!
|
||||
*/
|
||||
|
||||
use TYPO3\CMS\Fluid\Core\Widget\WidgetRequest as CoreWidgetRequest;
|
||||
|
||||
/**
|
||||
* Class WidgetRequest
|
||||
*
|
||||
* @author Frans Saris <frans@beech.it>
|
||||
* @author Timo Hund <timo.hund@dkd.de>
|
||||
*/
|
||||
class WidgetRequest extends CoreWidgetRequest
|
||||
{
|
||||
|
||||
/**
|
||||
* Returns the unique URI namespace for this widget in the format pluginNamespace[widgetIdentifier]
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getArgumentPrefix()
|
||||
{
|
||||
// we skip the [@widget] part
|
||||
return $this->widgetContext->getParentPluginNamespace();
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user