bookmark-pages/Classes/Controller/VoteController.php

1317 lines
57 KiB
PHP
Raw Permalink Normal View History

2021-08-17 19:45:38 +02:00
<?php
/*
* This file is part of the package thucke/th-rating.
*
* For the full copyright and license information, please read the
* LICENSE file that was distributed with this source code.
*/
/** @noinspection PhpUnnecessaryFullyQualifiedNameInspection */
/** @noinspection PhpFullyQualifiedNameUsageInspection */
namespace WapplerSystems\BookmarksLikesRatings\Controller;
use WapplerSystems\BookmarksLikesRatings\Domain\Model\Rating;
use WapplerSystems\BookmarksLikesRatings\Domain\Model\Vote;
use WapplerSystems\BookmarksLikesRatings\Domain\Model\Voter;
use WapplerSystems\BookmarksLikesRatings\Domain\Repository\RatingobjectRepository;
use WapplerSystems\BookmarksLikesRatings\Domain\Repository\StepconfRepository;
use WapplerSystems\BookmarksLikesRatings\Domain\Repository\VoteRepository;
use WapplerSystems\BookmarksLikesRatings\Domain\Validator\RatingValidator;
use WapplerSystems\BookmarksLikesRatings\Domain\Validator\StepconfValidator;
use WapplerSystems\BookmarksLikesRatings\Domain\Validator\VoteValidator;
use WapplerSystems\BookmarksLikesRatings\Exception\FeUserStoragePageException;
use WapplerSystems\BookmarksLikesRatings\Exception\InvalidStoragePageException;
use WapplerSystems\BookmarksLikesRatings\Service\AccessControlService;
use WapplerSystems\BookmarksLikesRatings\Service\CookieService;
use WapplerSystems\BookmarksLikesRatings\Service\ExtensionConfigurationService;
use WapplerSystems\BookmarksLikesRatings\Service\ExtensionHelperService;
use WapplerSystems\BookmarksLikesRatings\Service\ExtensionManagementService;
use WapplerSystems\BookmarksLikesRatings\Service\RichSnippetService;
use WapplerSystems\BookmarksLikesRatings\View\JsonView;
use TYPO3\CMS\Core\Database\ConnectionPool;
use TYPO3\CMS\Core\Log\LogLevel;
use TYPO3\CMS\Core\Utility\ArrayUtility;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Extbase\Annotation as Extbase;
use TYPO3\CMS\Extbase\Configuration\ConfigurationManagerInterface;
use TYPO3\CMS\Extbase\Mvc\Controller\ActionController;
use TYPO3\CMS\Extbase\Object\ObjectManager;
use TYPO3\CMS\Extbase\Utility\LocalizationUtility;
/**
* The Vote Controller
*
* @version $Id:$
* @license http://opensource.org/licenses/gpl-license.php GNU Public License, version 2
*/
class VoteController extends ActionController
{
protected const AJAX_REFERENCE_ID = 'ajaxRef';
/**
* @var \WapplerSystems\BookmarksLikesRatings\Domain\Model\Vote
*/
protected $vote;
/**
* @var \WapplerSystems\BookmarksLikesRatings\Domain\Model\RatingImage
*/
protected $ratingImage;
/**
* @var array
*/
protected $ajaxSelections;
/**
* @var string
*/
protected $ratingName;
/**
* @var bool
*/
protected $cookieProtection;
/**
* @var int
*/
protected $cookieLifetime;
/**
* @var array
*/
protected $signalSlotHandlerContent;
/**
* @var \TYPO3\CMS\Core\Log\Logger
*/
protected $logger;
/**
* @var string
*/
protected $prefixId;
/**
* @var \WapplerSystems\BookmarksLikesRatings\Service\AccessControlService
*/
protected $accessControlService;
/**
* @param \WapplerSystems\BookmarksLikesRatings\Service\AccessControlService $accessControlService
*/
public function injectAccessControlService(AccessControlService $accessControlService): void
{
$this->accessControlService = $accessControlService;
}
/**
* @var \WapplerSystems\BookmarksLikesRatings\Service\JsonService
*/
protected $jsonService;
/**
* @param \WapplerSystems\BookmarksLikesRatings\Service\JsonService $jsonService
*/
public function injectJsonService(\WapplerSystems\BookmarksLikesRatings\Service\JsonService $jsonService)
{
$this->jsonService = $jsonService;
}
/**
* @var \WapplerSystems\BookmarksLikesRatings\Service\RichSnippetService
*/
protected $richSnippetService;
/**
* @param \WapplerSystems\BookmarksLikesRatings\Service\RichSnippetService $richSnippetService
*/
public function injectRichSnippetService(RichSnippetService $richSnippetService): void
{
$this->richSnippetService = $richSnippetService;
}
/**
* @var \WapplerSystems\BookmarksLikesRatings\Service\CookieService
*/
protected $cookieService;
/**
* @param \WapplerSystems\BookmarksLikesRatings\Service\CookieService $cookieService
*/
public function injectCookieService(CookieService $cookieService): void
{
$this->cookieService = $cookieService;
}
/**
* @var \WapplerSystems\BookmarksLikesRatings\Domain\Repository\VoteRepository
*/
protected $voteRepository;
/**
* @param \WapplerSystems\BookmarksLikesRatings\Domain\Repository\VoteRepository $voteRepository
*/
public function injectVoteRepository(VoteRepository $voteRepository): void
{
$this->voteRepository = $voteRepository;
}
/**
* @var \WapplerSystems\BookmarksLikesRatings\Domain\Validator\VoteValidator
*/
protected $voteValidator;
/**
* @param \WapplerSystems\BookmarksLikesRatings\Domain\Validator\VoteValidator $voteValidator
*/
public function injectVoteValidator(VoteValidator $voteValidator): void
{
$this->voteValidator = $voteValidator;
}
/**
* @var \WapplerSystems\BookmarksLikesRatings\Domain\Validator\RatingValidator
*/
protected $ratingValidator;
/**
* @param \WapplerSystems\BookmarksLikesRatings\Domain\Validator\RatingValidator $ratingValidator
*/
public function injectRatingValidator(RatingValidator $ratingValidator): void
{
$this->ratingValidator = $ratingValidator;
}
/**
* @var \WapplerSystems\BookmarksLikesRatings\Domain\Repository\RatingobjectRepository
*/
protected $ratingobjectRepository;
/**
* @param \WapplerSystems\BookmarksLikesRatings\Domain\Repository\RatingobjectRepository $ratingobjectRepository
*/
public function injectRatingobjectRepository(RatingobjectRepository $ratingobjectRepository): void
{
$this->ratingobjectRepository = $ratingobjectRepository;
}
/**
* @var \WapplerSystems\BookmarksLikesRatings\Domain\Repository\StepconfRepository
*/
protected $stepconfRepository;
/**
* @param \WapplerSystems\BookmarksLikesRatings\Domain\Repository\StepconfRepository $stepconfRepository
*/
public function injectStepconfRepository(StepconfRepository $stepconfRepository): void
{
$this->stepconfRepository = $stepconfRepository;
}
/**
* @var \WapplerSystems\BookmarksLikesRatings\Domain\Validator\StepconfValidator
*/
protected $stepconfValidator;
/**
* @param \WapplerSystems\BookmarksLikesRatings\Domain\Validator\StepconfValidator $stepconfValidator
*/
public function injectStepconfValidator(StepconfValidator $stepconfValidator): void
{
$this->stepconfValidator = $stepconfValidator;
}
/**
* @var \WapplerSystems\BookmarksLikesRatings\Service\ExtensionHelperService
*/
protected $extensionHelperService;
/**
* @param \WapplerSystems\BookmarksLikesRatings\Service\ExtensionHelperService $extensionHelperService
*/
public function injectExtensionHelperService(ExtensionHelperService $extensionHelperService): void
{
$this->extensionHelperService = $extensionHelperService;
}
/**
* @var \WapplerSystems\BookmarksLikesRatings\Service\ExtensionConfigurationService
*/
protected $extensionConfigurationService;
/**
* @param \WapplerSystems\BookmarksLikesRatings\Service\ExtensionConfigurationService $extensionConfigurationService
*/
public function injectExtensionConfigurationService(ExtensionConfigurationService $extensionConfigurationService): void
{
$this->extensionConfigurationService = $extensionConfigurationService;
}
/**
* Lifecycle-Event
* wird nach der Initialisierung des Objekts und nach dem Auflösen der Dependencies aufgerufen.
*/
public function initializeObject(): void
{
}
/**
* Initializes the current action
*
* @throws FeUserStoragePageException
* @throws InvalidStoragePageException
* @throws \Exception
* @throws \TYPO3\CMS\Extbase\Mvc\Exception\NoSuchArgumentException
*/
/** @noinspection PhpMissingParentCallCommonInspection */
protected function initializeAction(): void
{
//instantiate the logger
$this->logger = GeneralUtility::makeInstance(ObjectManager::class)
->get(ExtensionHelperService::class)->getLogger(__CLASS__);
$this->logger->log(LogLevel::DEBUG, 'Entry point');
$this->prefixId =
strtolower("tx_{$this->request->getControllerExtensionName()}_{$this->request->getPluginName()}");
//Set default storage pids
$this->extensionConfigurationService->setExtDefaultQuerySettings();
//make current request object avaiable to other classes
$this->extensionHelperService->setRequest($this->request);
$frameworkConfiguration = $this->configurationManager->getConfiguration(
ConfigurationManagerInterface::CONFIGURATION_TYPE_FRAMEWORK
);
if ($this->request->hasArgument(self::AJAX_REFERENCE_ID)) {
//switch to JSON respone on AJAX request
$this->request->setFormat('json');
$this->defaultViewObjectName = JsonView::class;
//read unique AJAX identification on AJAX request
$this->ajaxSelections['ajaxRef'] = $this->request->getArgument(self::AJAX_REFERENCE_ID);
/** @noinspection PhpElementIsNotAvailableInCurrentPhpVersionInspection */
$this->settings = $this->jsonService->decodeJsonToArray($this->request->getArgument('settings'));
$frameworkConfiguration['settings'] = $this->settings;
$this->logger->log(
LogLevel::INFO,
'AJAX request detected - set new frameworkConfiguration',
$frameworkConfiguration
);
//\TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump($this->settings,get_class($this).' initializeAction');
} else {
//set unique AJAX identification
$this->ajaxSelections['ajaxRef'] = $this->prefixId . '_' . $this->getRandomId();
$this->logger->log(LogLevel::DEBUG, 'Set id for AJAX requests', $this->ajaxSelections);
}
if (!is_array($frameworkConfiguration['ratings'])) {
$frameworkConfiguration['ratings'] = [];
}
ArrayUtility::mergeRecursiveWithOverrule(
$this->settings['ratingConfigurations'],
$frameworkConfiguration['ratings']
)
;
$this->setCookieProtection();
}
/**
* Index action for this controller.
*/
public function indexAction(): void
{
// @var \WapplerSystems\BookmarksLikesRatings\Domain\Model\Ratingobject $ratingobject
//update foreign table for each rating
foreach ($this->ratingobjectRepository->findAll() as $ratingobject) {
foreach ($ratingobject->getRatings() as $rating) {
$this->setForeignRatingValues($rating);
}
}
$this->view->assign('ratingobjects', $this->ratingobjectRepository->findAll());
//initialize ratingobject and autocreate four ratingsteps
$ratingobject = $this->objectManager
->get(ExtensionManagementService::class)
->makeRatable('TestTable', 'TestField', 4);
/** @var \WapplerSystems\BookmarksLikesRatings\Domain\Model\Stepconf $stepconf */
$stepconf = $ratingobject->getStepconfs()->current();
//add descriptions in default language to each stepconf
$this->objectManager->get(ExtensionManagementService::class)->setStepname(
$stepconf,
'Automatic generated entry ',
null,
true
);
//add descriptions in german language to each stepconf
$this->objectManager->get(ExtensionManagementService::class)->setStepname(
$stepconf,
'Automatischer Eintrag ',
'de',
true
);
}
/**
* Includes the hidden form to handle AJAX requests
*
* @noinspection PhpUnused
*/
public function singletonAction(): void
{
$this->logger->log(LogLevel::DEBUG, 'Entry singletonAction');
$messageArray = $this->extensionHelperService->renderDynCSS();
//generate dynamic CSS file and add messages to flashMessageQueue
foreach ($messageArray as $message) {
$this->logFlashMessage(
$message['messageText'],
$message['messageTitle'],
$message['severity'],
$message['additionalInfo']
);
}
$this->controllerContext->getFlashMessageQueue()->clear();
$this->logger->log(LogLevel::DEBUG, 'Exit singletonAction');
}
/**
* Displays the vote of the current user
*
* @param \WapplerSystems\BookmarksLikesRatings\Domain\Model\Vote $vote
* @Extbase\IgnoreValidation("vote")
* @throws \TYPO3\CMS\Core\Exception
* @throws \WapplerSystems\BookmarksLikesRatings\Exception\InvalidAggregateRatingSchemaTypeException
* @throws \WapplerSystems\BookmarksLikesRatings\Exception\RecordNotFoundException
* @noinspection PhpUnused
*/
public function showAction(Vote $vote = null): void
{
$this->logger->log(LogLevel::DEBUG, 'Entry showAction');
//is_object($vote) && \TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump($vote->getUid(),'showAction');
$this->initVoting($vote); //just to set all properties
$this->fillSummaryView();
if (!$this->voteValidator->validate($this->vote)->hasErrors()) {
if ($this->accessControlService->isLoggedIn($vote->getVoter()) || $vote->isAnonymous()) {
} else {
$this->logFlashMessage(
LocalizationUtility::translate('flash.vote.create.noPermission', 'ThRating'),
LocalizationUtility::translate('flash.heading.error', 'ThRating'),
'ERROR',
['errorCode' => 1403201246]
);
}
}
$this->view->assign('actionMethodName', $this->actionMethodName);
$this->logger->log(LogLevel::DEBUG, 'Exit showAction');
}
/**
* Creates a new vote
*
* @param \WapplerSystems\BookmarksLikesRatings\Domain\Model\Vote $vote
* @throws \TYPO3\CMS\Core\Exception
* @throws \TYPO3\CMS\Extbase\Mvc\Exception\NoSuchArgumentException
* @throws \TYPO3\CMS\Extbase\Mvc\Exception\StopActionException
* @throws \TYPO3\CMS\Extbase\SignalSlot\Exception\InvalidSlotException
* @throws \TYPO3\CMS\Extbase\SignalSlot\Exception\InvalidSlotReturnException
* @noinspection PhpUnused
*/
public function createAction(\WapplerSystems\BookmarksLikesRatings\Domain\Model\Vote $vote): void
{
//http://localhost:8503/index.php?id=71&tx_thrating_pi1[controller]=Vote&tx_thrating_pi1[action]=create&
//tx_thrating_pi1[vote][rating]=1&tx_thrating_pi1[vote][voter]=1&tx_thrating_pi1[vote][vote]=1
$this->logger->log(LogLevel::DEBUG, 'Entry createAction', ['errorCode' => 1404934047]);
if ($this->accessControlService->isLoggedIn($vote->getVoter()) || $vote->isAnonymous()) {
$this->logger->log(LogLevel::DEBUG, 'Start processing', ['errorCode' => 1404934054]);
/** @var \WapplerSystems\BookmarksLikesRatings\Domain\Model\Vote $matchVote */
$matchVote = null;
//if not anonymous check if vote is already done
if (!$vote->isAnonymous()) {
$this->logger->log(
LogLevel::DEBUG,
'FE user is logged in - looking for existing vote',
['errorCode' => 1404933999]
);
$matchVote = $this->voteRepository->findMatchingRatingAndVoter($vote->getRating(), $vote->getVoter());
}
//add new or anonymous vote
if ($this->voteValidator->validate($matchVote)->hasErrors() || $vote->isAnonymous()) {
$this->logger->log(LogLevel::DEBUG, 'New vote could be added', ['errorCode' => 1404934012]);
$vote->getRating()->addVote($vote);
if ($this->cookieProtection && $vote->isAnonymous() && !$vote->hasAnonymousVote($this->prefixId)) {
$this->logger->log(
LogLevel::DEBUG,
'Anonymous rating; preparing cookie potection',
['errorCode' => 1404934021]
);
$anonymousRating['ratingtime'] = time();
$anonymousRating['voteUid'] = $vote->getUid();
//TODO: switch to session store according to https://t3terminal.com/blog/de/typo3-cookie/
if (!empty($this->cookieLifetime)) {
$expireTime = (new \DateTime('NOW'))->add(\DateInterval::createFromDateString($this->cookieLifetime . ' days'))->getTimestamp();
//set cookie to prevent multiple anonymous ratings
$this->cookieService->setVoteCookie(
$this->prefixId . '_AnonymousRating_' . $vote->getRating()->getUid(),
$this->jsonService->encodeToJson($anonymousRating),
$expireTime
);
}
}
$setResult = $this->setForeignRatingValues($vote->getRating());
if (!$setResult) {
$this->logFlashMessage(
LocalizationUtility::translate('flash.vote.create.foreignUpdateFailed', 'ThRating'),
LocalizationUtility::translate('flash.heading.warning', 'ThRating'),
'WARNING',
[
'errorCode' => 1403201551,
'ratingobject' => $vote->getRating()->getRatingobject()->getUid(),
'ratetable' => $vote->getRating()->getRatingobject()->getRatetable(),
'ratefield' => $vote->getRating()->getRatingobject()->getRatefield()
]
);
}
$this->logFlashMessage(
LocalizationUtility::translate('flash.vote.create.newCreated', 'ThRating'),
LocalizationUtility::translate('flash.heading.ok', 'ThRating'),
'DEBUG',
[
'ratingobject' => $vote->getRating()->getRatingobject()->getUid(),
'ratetable' => $vote->getRating()->getRatingobject()->getRatetable(),
'ratefield' => $vote->getRating()->getRatingobject()->getRatefield(),
'voter' => $vote->getVoter()->getUsername(),
'vote' => (string)$vote->getVote()
]
);
} elseif (!empty($this->settings['enableReVote']) &&
!$this->voteValidator->validate($matchVote)->hasErrors()) {
/** @var \WapplerSystems\BookmarksLikesRatings\Domain\Model\Stepconf $matchVoteStepconf */
$matchVoteStepconf = $matchVote->getVote();
/** @var \WapplerSystems\BookmarksLikesRatings\Domain\Model\Stepconf $newVoteStepconf */
$newVoteStepconf = $vote->getVote();
if ($matchVoteStepconf !== $newVoteStepconf) {
//do update of existing vote
$this->logFlashMessage(
LocalizationUtility::translate(
'flash.vote.create.updateExistingVote',
'ThRating',
[$matchVoteStepconf->getSteporder(), (string)$matchVoteStepconf]
),
LocalizationUtility::translate('flash.heading.ok', 'ThRating'),
'DEBUG',
[
'voter UID' => $vote->getVoter()->getUid(),
'ratingobject UID' => $vote->getRating()->getRatingobject()->getUid(),
'rating' => $vote->getRating()->getUid(),
'vote UID' => $vote->getUid(),
'new vote' => (string)$vote->getVote(),
'old vote' => (string)$matchVoteStepconf
]
);
$vote->getRating()->updateVote($matchVote, $vote);
} else {
$this->logFlashMessage(
LocalizationUtility::translate('flash.vote.create.noUpdateSameVote', 'ThRating'),
LocalizationUtility::translate('flash.heading.warning', 'ThRating'),
'WARNING',
[
'voter UID' => $vote->getVoter()->getUid(),
'ratingobject UID' => $vote->getRating()->getRatingobject()->getUid(),
'rating' => $vote->getRating()->getUid(),
'vote UID' => $vote->getUid(),
'new vote' => (string)$newVoteStepconf,
'old vote' => (string)$matchVoteStepconf
]
);
}
} else {
//display message that rating has been already done
$vote = $matchVote;
$this->logFlashMessage(
LocalizationUtility::translate('flash.vote.create.alreadyRated', 'ThRating'),
LocalizationUtility::translate('flash.heading.notice', 'ThRating'),
'NOTICE',
[
'errorCode' => 1403202280,
'voter UID' => $vote->getVoter()->getUid(),
'ratingobject UID' => $vote->getRating()->getRatingobject()->getUid(),
'rating' => $vote->getRating()->getUid(),
'vote UID' => $vote->getUid()
]
);
}
$this->vote = $vote;
} else {
$this->logFlashMessage(
LocalizationUtility::translate('flash.vote.create.noPermission', 'ThRating'),
LocalizationUtility::translate('flash.heading.error', 'ThRating'),
'ERROR',
['errorCode' => 1403203210]
);
}
$referrer = $this->request->getInternalArgument('__referrer');
$newArguments = $this->request->getArguments();
//replace vote argument with correct vote if user has already rated
$newArguments['vote']['vote'] = $this->vote->getVote();
unset($newArguments['action'], $newArguments['controller']);
//Send signal to connected slots
$this->initSignalSlotDispatcher('afterCreateAction');
$newArguments = ['signalSlotHandlerContent' => $this->signalSlotHandlerContent] + $newArguments;
$this->logger->log(LogLevel::DEBUG, 'Exit createAction - forwarding request', [
'action' => $referrer['@action'], /** @phpstan-ignore-line */
'controller' => $referrer['@controller'], /** @phpstan-ignore-line */
'extension' => $referrer['@extension'], /** @phpstan-ignore-line */
'arguments' => $newArguments
]);
$this->controllerContext->getFlashMessageQueue()->clear();
/** @var array $referrer */
$this->forward($referrer['@action'], $referrer['@controller'], $referrer['@extension'], $newArguments);
}
/**
* FE user gives a new vote by SELECT form
* A classic SELECT input form will be provided to AJAX-submit the vote
*
* @param \WapplerSystems\BookmarksLikesRatings\Domain\Model\Vote|null $vote The new vote (used on callback from createAction)
* @Extbase\IgnoreValidation("vote")
* @throws \WapplerSystems\BookmarksLikesRatings\Exception\InvalidAggregateRatingSchemaTypeException
* @throws \TYPO3\CMS\Core\Exception
* @throws \WapplerSystems\BookmarksLikesRatings\Exception\RecordNotFoundException
* @noinspection PhpUnused
*/
public function newAction(Vote $vote = null): void
{
$this->logger->log(LogLevel::DEBUG, 'Entry newAction');
//find vote using additional information
$this->initSettings();
$this->initVoting($vote);
$this->view->assign('actionMethodName', $this->actionMethodName);
if (!$this->vote->hasRated() ||
(!$this->accessControlService->isLoggedIn($this->vote->getVoter()) && $this->vote->isAnonymous())) {
$this->view->assign('ajaxSelections', $this->ajaxSelections['json']);
} else {
$this->logger->log(LogLevel::INFO, 'New rating is not possible; forwarding to showAction');
}
$this->fillSummaryView();
if ($this->view instanceof JsonView) {
$this->view->assign('flashMessages', $this->view->getFlashMessages());
}
$this->logger->log(LogLevel::DEBUG, 'Exit newAction');
}
/**
* FE user gives a new vote by using a starrating obejct
* A graphic starrating object containing links will be provided to AJAX-submit the vote
*
* @param \WapplerSystems\BookmarksLikesRatings\Domain\Model\Vote $vote The new vote
* @Extbase\IgnoreValidation("vote")
* @throws \TYPO3\CMS\Extbase\Mvc\Exception\NoSuchArgumentException
* @throws \TYPO3\CMS\Extbase\SignalSlot\Exception\InvalidSlotException
* @throws \TYPO3\CMS\Extbase\SignalSlot\Exception\InvalidSlotReturnException
* @throws \WapplerSystems\BookmarksLikesRatings\Exception\InvalidAggregateRatingSchemaTypeException*
* @throws \WapplerSystems\BookmarksLikesRatings\Exception\RecordNotFoundException
* @throws \TYPO3\CMS\Core\Exception
*/
//http://localhost:8503/index.php?id=71&tx_thrating_pi1[controller]=Vote&tx_thrating_pi1[action]=ratinglinks
public function ratinglinksAction(Vote $vote = null): void
{
//\TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump($this->view,get_class($this).' ratinglinksAction');
$this->logger->log(LogLevel::DEBUG, 'Entry ratinglinksAction');
$this->settings['ratingConfigurations']['default'] =
$this->settings['defaultRatingConfiguration']['ratinglinks'];
$this->graphicActionHelper($vote);
$this->initSignalSlotDispatcher('afterRatinglinkAction');
$this->logger->log(LogLevel::DEBUG, 'Exit ratinglinksAction');
}
/**
* Handle graphic pollings
* Graphic bars containing links will be provided to AJAX-submit the polling
*
* @param \WapplerSystems\BookmarksLikesRatings\Domain\Model\Vote $vote The new vote
* @Extbase\IgnoreValidation("vote")
* @throws \TYPO3\CMS\Extbase\Mvc\Exception\NoSuchArgumentException
* @throws \TYPO3\CMS\Extbase\SignalSlot\Exception\InvalidSlotException
* @throws \TYPO3\CMS\Extbase\SignalSlot\Exception\InvalidSlotReturnException
* @throws \WapplerSystems\BookmarksLikesRatings\Exception\InvalidAggregateRatingSchemaTypeException*
* @throws \WapplerSystems\BookmarksLikesRatings\Exception\RecordNotFoundException
* @throws \TYPO3\CMS\Core\Exception
* @noinspection PhpUnused
*/
public function pollingAction(Vote $vote = null): void
{
//\TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump($this->view,get_class($this).' pollingAction');
$this->logger->log(LogLevel::DEBUG, 'Entry pollingAction');
$this->settings['ratingConfigurations']['default'] =
$this->settings['defaultRatingConfiguration']['polling'];
$this->graphicActionHelper($vote);
$this->initSignalSlotDispatcher('afterPollingAction');
$this->logger->log(LogLevel::DEBUG, 'Exit pollingAction');
}
/**
* Handle mark action
* An icon containing for the mark action will be provided for AJAX-submission
*
* @param \WapplerSystems\BookmarksLikesRatings\Domain\Model\Vote $vote The new vote
* @Extbase\IgnoreValidation("vote")
* @throws \TYPO3\CMS\Extbase\Mvc\Exception\NoSuchArgumentException
* @throws \TYPO3\CMS\Extbase\SignalSlot\Exception\InvalidSlotException
* @throws \TYPO3\CMS\Extbase\SignalSlot\Exception\InvalidSlotReturnException
* @throws \WapplerSystems\BookmarksLikesRatings\Exception\InvalidAggregateRatingSchemaTypeException*
* @throws \TYPO3\CMS\Core\Exception
* @throws \WapplerSystems\BookmarksLikesRatings\Exception\RecordNotFoundException
*/
public function markAction(\WapplerSystems\BookmarksLikesRatings\Domain\Model\Vote $vote = null): void
{
$this->logger->log(LogLevel::DEBUG, 'Entry markAction');
$this->settings['ratingConfigurations']['default'] = $this->settings['defaultRatingConfiguration']['mark'];
$this->graphicActionHelper($vote);
$this->initSignalSlotDispatcher('afterMarkAction');
$this->logger->log(LogLevel::DEBUG, 'Exit markAction');
}
/**
* FE user gives a new vote by using a starrating obejct
* A graphic starrating object containing links will be provided to AJAX-submit the vote
*
* @param \WapplerSystems\BookmarksLikesRatings\Domain\Model\Vote|null $vote The new vote
* @Extbase\IgnoreValidation("vote")
* @throws \WapplerSystems\BookmarksLikesRatings\Exception\InvalidAggregateRatingSchemaTypeException*
* @throws \TYPO3\CMS\Core\Exception
* @throws \WapplerSystems\BookmarksLikesRatings\Exception\RecordNotFoundException
*/
//http://localhost:8503/index.php?id=71&tx_thrating_pi1[controller]=Vote&tx_thrating_pi1[action]=ratinglinks
public function graphicActionHelper(Vote $vote = null): void
{
$this->logger->log(LogLevel::DEBUG, 'Entry graphicActionHelper');
$this->initSettings();
$this->initVoting($vote);
$this->view->assign('actionMethodName', $this->actionMethodName);
$rating = $this->vote->getRating();
if (!$this->ratingValidator->validate($rating)->hasErrors()) {
$this->ratingImage = $this->objectManager->get(\WapplerSystems\BookmarksLikesRatings\Domain\Model\RatingImage::class);
$this->ratingImage->setConf($this->settings['ratingConfigurations'][$this->ratingName]['imagefile']);
//read dimensions of the image
$imageDimensions = $this->ratingImage->getImageDimensions();
$height = $imageDimensions['height'];
$width = $imageDimensions['width'];
//calculate concrete values for polling display
$currentRates = $rating->getCurrentrates();
$currentPollDimensions = $currentRates['currentPollDimensions'];
foreach ($currentPollDimensions as $step => $currentPollDimension) {
$currentPollDimensions[$step]['steporder'] = $step;
$currentPollDimensions[$step]['backgroundPos'] = round(
$height / 3 * (($currentPollDimension['pctValue'] / 100) - 2),
1
);
$currentPollDimensions[$step]['backgroundPosTilt'] = round(
$width / 3 * (($currentPollDimension['pctValue'] / 100) - 2),
1
);
}
$this->logger->log(
LogLevel::DEBUG,
'Current polling dimensions',
['currentPollDimensions' => $currentPollDimensions]
);
$this->view->assign('currentPollDimensions', $currentPollDimensions);
}
$this->view->assign('ratingName', $this->ratingName);
$this->view->assign('ratingClass', $this->settings['ratingClass']);
if ((!$this->vote->isAnonymous() &&
$this->accessControlService->isLoggedIn($this->vote->getVoter()) &&
(!$this->vote->hasRated() || !empty($this->settings['enableReVote']))) ||
(
($this->vote->isAnonymous() &&
!$this->accessControlService->isLoggedIn($this->vote->getVoter())) &&
(
(!$this->vote->hasAnonymousVote($this->prefixId) &&
$this->cookieProtection &&
!$this->request->hasArgument('settings')) ||
!$this->cookieProtection
)
)
) {
//if user hasn<73>t voted yet then include ratinglinks
$this->view->assign('ajaxSelections', $this->ajaxSelections['steporder']);
$this->logger->log(
LogLevel::INFO,
'Set ratinglink information',
['errorCode' => 1404933850, 'ajaxSelections[steporder]' => $this->ajaxSelections['steporder']]
);
}
$this->fillSummaryView();
if ($this->view instanceof JsonView) {
$this->view->assign(
'flashMessages',
$this->view->getFlashMessages()
);
}
$this->logger->log(LogLevel::DEBUG, 'Exit graphicActionHelper');
}
/**
* Initialize signalSlotHandler for given action
* Registered slots are being called with two parameters
* 1. signalSlotMessage: an array consisting of
* 'tablename' - the tablename of the rated object
* 'fieldname' - the fieldname of the rated object
* 'uid' - the uid of the rated object
* 'currentRates' - an array constising of the actual rating statistics
* 'currentrate' - the calculated overall rating
* 'weightedVotes' - an array giving the voting counts for every ratingstep
* 'sumWeightedVotes' an array giving the voting counts for every ratingstep multiplied by their weights
* 'anonymousVotes' - count of anonymous votings
* if the user has voted anonymous or non-anonymous:
* 'voter' - the uid of the frontenduser that has voted
* 'votingStep' - the ratingstep that has been choosen
* 'votingName' - the name of the ratingstep
* 'anonymousVote' - boolean info if it was an anonymous rating
*
* @param string $slotName the slotname
* @throws \TYPO3\CMS\Extbase\Mvc\Exception\NoSuchArgumentException
* @throws \TYPO3\CMS\Extbase\SignalSlot\Exception\InvalidSlotException
* @throws \TYPO3\CMS\Extbase\SignalSlot\Exception\InvalidSlotReturnException
*/
protected function initSignalSlotDispatcher(string $slotName): void
{
$this->logger->log(LogLevel::DEBUG, 'Entry initSignalSlotDispatcher', ['slotName' => $slotName]);
if ($this->request->hasArgument('signalSlotHandlerContent')) {
//set orginal handlerContent if action has been forwarded
$this->signalSlotHandlerContent = $this->request->getArgument('signalSlotHandlerContent');
$this->logger->log(
LogLevel::INFO,
'Fetch static SignalSlotHandlerContent',
['signalSlotHandlerContent' => $this->signalSlotHandlerContent]
);
} else {
$signalSlotMessage = [];
$signalSlotMessage['tablename'] = $this->vote->getRating()->getRatingobject()->getRatetable();
$signalSlotMessage['fieldname'] = $this->vote->getRating()->getRatingobject()->getRatefield();
$signalSlotMessage['uid'] = (int)$this->vote->getRating()->getRatedobjectuid();
$signalSlotMessage['currentRates'] = $this->vote->getRating()->getCurrentrates();
if (!$this->voteValidator->validate($this->vote)->hasErrors()) {
$signalSlotMessage['voter'] = $this->vote->getVoter()->getUid();
$signalSlotMessage['votingStep'] = $this->vote->getVote()->getSteporder();
$signalSlotMessage['votingName'] = (string)$this->vote->getVote()->getStepname();
$signalSlotMessage['anonymousVote'] = $this->vote->isAnonymous();
}
$this->logger->log(
LogLevel::INFO,
'Going to process signalSlot',
['signalSlotMessage' => $signalSlotMessage]
);
//clear signalSlotHandlerArray for sure
$this->signalSlotHandlerContent = [];
$this->signalSlotDispatcher->dispatch(
__CLASS__,
$slotName,
[$signalSlotMessage, &$this->signalSlotHandlerContent]
);
$this->logger->log(
LogLevel::INFO,
'New signalSlotHandlerContent',
['signalSlotHandlerContent' => $this->signalSlotHandlerContent]
);
}
$this->view->assign('staticPreContent', $this->signalSlotHandlerContent['staticPreContent']);
$this->view->assign('staticPostContent', $this->signalSlotHandlerContent['staticPostContent']);
unset(
$this->signalSlotHandlerContent['staticPreContent'],
$this->signalSlotHandlerContent['staticPostContent']
);
$this->view->assign('preContent', $this->signalSlotHandlerContent['preContent']);
$this->view->assign('postContent', $this->signalSlotHandlerContent['postContent']);
$this->logger->log(LogLevel::DEBUG, 'Exit initSignalSlotDispatcher');
}
/**
* Check preconditions for rating
*
* @param \WapplerSystems\BookmarksLikesRatings\Domain\Model\Vote $vote the vote this selection is for
* @throws \WapplerSystems\BookmarksLikesRatings\Exception\RecordNotFoundException
* @throws \TYPO3\CMS\Core\Exception
*/
protected function initVoting(Vote $vote = null): void
{
$this->logger->log(LogLevel::DEBUG, 'Entry initVoting');
$logVoterUid = 0;
if ($this->voteValidator->isObjSet($vote) && !$this->voteValidator->validate($vote)->hasErrors()) {
$this->vote = $vote;
$this->logger->log(LogLevel::DEBUG, 'Using valid vote');
} else {
$this->logger->log(LogLevel::DEBUG, 'initVoting ELSE');
//first initialize parent objects for vote object
$ratingobject = $this->extensionHelperService->getRatingobject($this->settings);
$rating = $this->extensionHelperService->getRating($this->settings, $ratingobject);
$this->vote = $this->extensionHelperService->getVote($this->prefixId, $this->settings, $rating);
$countSteps = count($ratingobject->getStepconfs());
if (empty($countSteps)) {
$this->logger->log(LogLevel::DEBUG, 'No ratingsteps configured', ['errorCode' => 1403201012]);
$this->logFlashMessage(
LocalizationUtility::translate('flash.ratingobject.noRatingsteps', 'ThRating'),
LocalizationUtility::translate('flash.heading.error', 'ThRating'),
'ERROR',
['errorCode' => 1403201012]
);
}
if (!$this->vote->getVoter() instanceof \WapplerSystems\BookmarksLikesRatings\Domain\Model\Voter) {
if (!empty($this->settings['showNoFEUser'])) {
$this->logFlashMessage(
LocalizationUtility::translate('flash.vote.noFEuser', 'ThRating'),
LocalizationUtility::translate('flash.heading.notice', 'ThRating'),
'NOTICE',
['errorCode' => 1403201096]
);
}
} else {
$logVoterUid = $this->vote->getVoter()->getUid();
}
}
$this->logger->log(LogLevel::INFO, 'Using vote', [
'ratingobject' => $this->vote->getRating()->getRatingobject()->getUid(),
'rating' => $this->vote->getRating()->getUid(),
'voter' => $logVoterUid
]);
//set array to create voting information
$this->setAjaxSelections($this->vote);
$this->logger->log(LogLevel::DEBUG, 'Exit initVoting');
}
/**
* Check preconditions for settings
*/
protected function initSettings(): void
{
$this->logger->log(LogLevel::DEBUG, 'Entry initSettings');
//switch display mode to correct config if nothing is set
if (empty($this->settings['display'])) {
$this->settings['display'] = $this->settings['ratingConfigurations']['default'];
}
//set display configuration
if (!empty($this->settings['display'])) {
if (isset($this->settings['ratingConfigurations'][$this->settings['display']])) {
$this->ratingName = $this->settings['display'];
} else {
//switch back to default if given display configuration does not exist
$this->ratingName = $this->settings['ratingConfigurations']['default'];
$this->logFlashMessage(
LocalizationUtility::translate('flash.vote.ratinglinks.wrongDisplayConfig', 'ThRating'),
LocalizationUtility::translate('flash.heading.error', 'ThRating'),
'WARNING',
[
'errorCode' => 1403203414,
'settings display' => $this->settings['display'],
'avaiable ratingConfigurations' => $this->settings['ratingConfigurations']
]
);
}
} else {
//choose default ratingConfiguration if nothing is defined
$this->ratingName = $this->settings['ratingConfigurations']['default'];
$this->logger->log(
LogLevel::WARNING,
'Display name not set - using configured default',
['default display' => $this->ratingName]
);
}
$ratingConfiguration = $this->settings['ratingConfigurations'][$this->ratingName];
//\TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump(
//$this->settings,get_class($this).' settings '.$this->ratingName);
//override extension settings with rating configuration settings
if (is_array($ratingConfiguration['settings'])) {
unset(
$ratingConfiguration['settings']['defaultObject'],
$ratingConfiguration['settings']['ratingConfigurations']
);
if (!is_array($ratingConfiguration['ratings'])) {
$ratingConfiguration['ratings'] = [];
}
ArrayUtility::mergeRecursiveWithOverrule($this->settings, $ratingConfiguration['settings']);
$this->logger->log(
LogLevel::DEBUG,
'Override extension settings with rating configuration settings',
['Original setting' => $this->settings, 'Overruling settings' => $ratingConfiguration['settings']]
);
}
//override fluid settings with rating fluid settings
if (is_array($ratingConfiguration['fluid'])) {
ArrayUtility::mergeRecursiveWithOverrule($this->settings['fluid'], $ratingConfiguration['fluid']);
$this->logger->log(LogLevel::DEBUG, 'Override fluid settings with rating fluid settings');
}
$this->logger->log(LogLevel::INFO, 'Final extension configuration', ['settings' => $this->settings]);
//distinguish between bar and no-bar rating
$this->view->assign('barimage', 'noratingbar');
if ($ratingConfiguration['barimage']) {
$this->view->assign('barimage', 'ratingbar');
$this->logger->log(LogLevel::DEBUG, 'Set ratingbar config');
}
//set tilt or normal rating direction
$this->settings['ratingClass'] = 'normal';
if ($ratingConfiguration['tilt']) {
$this->logger->log(LogLevel::DEBUG, 'Tilt rating class configuration');
$this->settings['ratingClass'] = 'tilt';
}
$frameworkConfiguration =
$this->configurationManager->getConfiguration(ConfigurationManagerInterface::CONFIGURATION_TYPE_FRAMEWORK);
$frameworkConfiguration['settings'] = $this->settings;
$this->configurationManager->setConfiguration($frameworkConfiguration);
$this->setCookieProtection();
$this->logger->log(LogLevel::DEBUG, 'Exit initSettings');
}
/**
* Build array of possible AJAX selection configuration
*
* @param \WapplerSystems\BookmarksLikesRatings\Domain\Model\Vote $vote the vote this selection is for
*/
protected function setAjaxSelections(Vote $vote): void
{
if (empty($this->settings['displayOnly']) && $vote->getVoter() instanceof Voter) {
//cleanup settings to reduce data size in POST form
$tmpDisplayConfig = $this->settings['ratingConfigurations'][$this->settings['display']];
unset($this->settings['defaultObject'], $this->settings['ratingConfigurations']);
$this->settings['ratingConfigurations'][$this->settings['display']] = $tmpDisplayConfig;
//TODO: ?? $currentRates = $vote->getRating()->getCurrentrates();
/** @var \WapplerSystems\BookmarksLikesRatings\Domain\Model\Stepconf $stepConf */
foreach ($vote->getRating()->getRatingobject()->getStepconfs() as $i => $stepConf) {
/** @noinspection PhpElementIsNotAvailableInCurrentPhpVersionInspection */
$key = utf8_encode(
$this->jsonService->encodeToJson([
'value' => $stepConf->getUid(),
'voter' => $vote->getVoter()->getUid(),
'rating' => $vote->getRating()->getUid(),
'ratingName' => $this->ratingName,
'settings' => $this->jsonService->encodeToJson($this->settings),
'actionName' => strtolower($this->request->getControllerActionName()),
self::AJAX_REFERENCE_ID => $this->ajaxSelections['ajaxRef']
])
);
$this->ajaxSelections['json'][$key] = (string)$stepConf;
$this->ajaxSelections['steporder'][$stepConf->getSteporder()]['step'] = $stepConf;
$this->ajaxSelections['steporder'][$stepConf->getSteporder()]['ajaxvalue'] = $key;
}
$this->logger->log(
LogLevel::DEBUG,
'Finalized ajaxSelections',
['ajaxSelections' => $this->ajaxSelections]
);
}
}
/**
* Fill all variables for FLUID
*
* @throws \WapplerSystems\BookmarksLikesRatings\Exception\InvalidAggregateRatingSchemaTypeException
*/
protected function fillSummaryView()
{
$this->view->assign('settings', $this->settings);
$this->view->assign('ajaxRef', $this->ajaxSelections['ajaxRef']);
$this->view->assign('rating', $this->vote->getRating());
$this->view->assign('voter', $this->vote->getVoter());
if ($this->richSnippetService->setRichSnippetConfig($this->settings)) {
/** @var \WapplerSystems\BookmarksLikesRatings\Service\RichSnippetService $richSnippetObject */
$richSnippetObject =
$this->richSnippetService->getRichSnippetObject($this->vote->getRating()->getRatedobjectuid());
$richSnippetObject->setAnchor('RatingAX_' . $this->vote->getRating()->getRatingobject()->getUid() .
'_' . $this->vote->getRating()->getRatedobjectuid());
if (empty($richSnippetObject->getName())) {
$richSnippetObject->setName('Rating AX ' . $this->vote->getRating()->getRatingobject()->getUid() .
'_' . $this->vote->getRating()->getRatedobjectuid());
}
$this->view->assign('richSnippetObject', $richSnippetObject);
}
$currentrate = $this->vote->getRating()->getCurrentrates();
$this->view->assign('stepCount', count($currentrate['weightedVotes']));
$this->view->assign('anonymousVotes', $currentrate['anonymousVotes']);
$this->view->assign(
'anonymousVoting',
!empty($this->settings['mapAnonymous']) && !$this->accessControlService->getFrontendUserUid()
);
if ($this->settings['showNotRated'] && empty($currentrate['currentrate'])) {
$this->logFlashMessage(
LocalizationUtility::translate('flash.vote.show.notRated', 'ThRating'),
LocalizationUtility::translate('flash.heading.info', 'ThRating'),
'INFO',
['errorCode' => 1403203414]
);
}
if (!$this->voteValidator->validate($this->vote)->hasErrors()) {
/** @noinspection NotOptimalIfConditionsInspection */
if ((
!$this->vote->isAnonymous() &&
$this->vote->getVoter()->getUid() === $this->accessControlService->getFrontendUserUid()
) || ($this->vote->isAnonymous() && ($this->vote->hasAnonymousVote($this->prefixId) ||
$this->cookieProtection || $this->cookieService->isProtected()))) {
$this->view->assign('protected', $this->cookieService->isProtected());
$this->view->assign('voting', $this->vote);
$this->view->assign(
'usersRate',
$this->vote->getVote()->getSteporder() * 100 / count($currentrate['weightedVotes']) . '%'
);
}
}
//$this->view->assign('LANG', \WapplerSystems\BookmarksLikesRatings\Utility\LocalizationUtility::getLangArray('ThRating'));
}
/**
* Override getErrorFlashMessage to present
* nice flash error messages.
*
* @return string
*/
protected function getErrorFlashMessage()
{
switch ($this->actionMethodName) {
case 'createAction':
return 'Could not create the new vote:';
case 'showAction':
return 'Could not show vote!';
default:
return parent::getErrorFlashMessage();
}
}
/**
* Generates a random number
* used as the unique iddentifier for AJAX objects
*
* @return int
* @throws \Exception
*/
protected function getRandomId()
{
mt_srand((int)microtime() * 1000000);
return random_int(1000000, 9999999);
}
protected function setCookieProtection(): void
{
$this->cookieLifetime = abs((int)$this->settings['cookieLifetime']);
$this->logger->log(
LogLevel::DEBUG,
'Cookielifetime set to ' . $this->cookieLifetime . ' days',
['errorCode' => 1465728751]
);
if (empty($this->cookieLifetime)) {
$this->cookieProtection = false;
} else {
$this->cookieProtection = true;
}
}
/**
* Sends log information to flashMessage and logging framework
*
* @param string $messageText
* @param string $messageTitle
* @param string $severity
* @param array $additionalInfo
*/
private function logFlashMessage(
string $messageText,
string $messageTitle,
string $severity,
array $additionalInfo
) {
$additionalInfo = ['messageTitle' => $messageTitle] + $additionalInfo;
$severity = strtoupper($severity);
switch ($severity) {
case 'DEBUG':
$flashSeverity = 'OK';
break;
case 'INFO':
$flashSeverity = 'INFO';
break;
case 'NOTICE':
$flashSeverity = 'NOTICE';
break;
case 'WARNING':
$flashSeverity = 'WARNING';
break;
default:
$flashSeverity = 'ERROR';
}
if ((int)$additionalInfo['errorCode']) {
$messageText .= ' (' . $additionalInfo['errorCode'] . ')';
}
//TODO: locally enqueue flashmessages of setStoragePids when controllerContext has not been set yet
if (is_object($this->controllerContext)) {
$this->addFlashMessage(
$messageText,
$messageTitle,
constant('\TYPO3\CMS\Core\Messaging\AbstractMessage::' . $flashSeverity)
);
}
$this->logger->log(constant('\TYPO3\CMS\Core\Log\LogLevel::' . $severity), $messageText, $additionalInfo);
}
/**
* Sets the rating values in the foreign table
* Recommended field type is VARCHAR(255)
*
* @param Rating $rating The rating
* @return bool
*/
protected function setForeignRatingValues(Rating $rating)
{
$table = $rating->getRatingobject()->getRatetable();
$lockedFieldnames = $this->getLockedfieldnames($table);
$rateField = $rating->getRatingobject()->getRatefield();
if (!empty($GLOBALS['TCA'][$table]['columns'][$rateField]) && !in_array($rateField, $lockedFieldnames, false)) {
$rateUid = $rating->getRatedobjectuid();
$currentRatesArray = $rating->getCurrentrates();
if (empty($this->settings['foreignFieldArrayUpdate'])) {
//do update using DOUBLE value
$currentRates = round($currentRatesArray['currentrate'], 2);
} else {
//do update using whole currentrates JSON array
$currentRates = $this->jsonService->encodeToJson($currentRatesArray);
}
/** @var \TYPO3\CMS\Core\Database\Query\QueryBuilder $queryBuilder */
$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)
->getQueryBuilderForTable($table);
//do update foreign table
$queryResult = $queryBuilder
->update($table)
->where($queryBuilder->expr()->eq('uid', $queryBuilder->createNamedParameter($rateUid)))
->set($rateField, $currentRates)
->execute();
return !empty($queryResult);
}
$this->logger->log(
LogLevel::NOTICE,
'Foreign ratefield does not exist in ratetable or is locked for rating updates',
[
'ratingobject UID' => $rating->getRatingobject()->getUid(),
'ratetable' => $rating->getRatingobject()->getRatetable(),
'ratefield' => $rating->getRatingobject()->getRatefield()
]
);
return true;
}
/**
* Create a list of fieldnamed that must not be updated with ratingvalues
*
* @param string $table tablename looking for system fields
* @return array
*/
protected function getLockedfieldnames($table)
{
$TCA = &$GLOBALS['TCA'][$table]['ctrl']; // Set private TCA var
/** @var array $lockedFields */
$lockedFields = GeneralUtility::intExplode(',', $TCA['label_alt'], true);
array_push(
$lockedFields,
'pid',
'uid',
'pages',
'pages_language_overlay',
$TCA['label'],
$TCA['tstamp'],
$TCA['crdate'],
$TCA['cruser_id'],
$TCA['delete'],
$TCA['enablecolumns']['disabled'],
$TCA['enablecolumns']['starttime'],
$TCA['enablecolumns']['endtime'],
$TCA['enablecolumns']['fe_group'],
$TCA['selicon_field'],
$TCA['sortby'],
$TCA['editlock'],
$TCA['origUid'],
$TCA['fe_cruser_id'],
$TCA['fe_crgroup_id'],
$TCA['fe_admin_lock'],
$TCA['languageField'],
$TCA['transOrigPointerField'],
$TCA['transOrigDiffSourceField']
);
return $lockedFields;
}
/**
* @return \TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController
*/
protected function getTypoScriptFrontendController()
{
/** @var \TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController $TSFE */
global $TSFE;
return $TSFE;
}
/**
* Demo slotHandler for slot 'afterRatinglinkAction'
*
* @param array $signalSlotMessage array containing signal information
* @param array $customContent array by reference to return pre and post content
*/
public function afterRatinglinkActionHandler(
/** @noinspection PhpUnusedParameterInspection */
$signalSlotMessage,
&$customContent
) {
//\TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump($signalSlotMessage,'signalSlotMessage');
$customContent['preContent'] = '<b>This ist my preContent</b>';
$customContent['staticPreContent'] = '<b>This ist my staticPreContent</b>';
$customContent['postContent'] = '<b>This ist my postContent</b>';
$customContent['staticPostContent'] = '<b>This ist my stticPostContent</b>';
}
/**
* Demo slotHandler for slot 'afterCreateAction'
*
* @param array $signalSlotMessage array containing signal information
* @param array $customContent array by reference to return pre and post content
*/
/** @noinspection PhpUnusedParameterInspection */
public function afterCreateActionHandler(
/** @noinspection PhpUnusedParameterInspection */
$signalSlotMessage,
&$customContent
) {
//\TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump($signalSlotMessage,'signalSlotMessage');
$customContent['preContent'] = '<b>This ist my preContent after afterCreateActionHandler</b>';
$customContent['staticPreContent'] = '<b>This ist my staticPreContent after afterCreateActionHandler</b>';
$customContent['postContent'] = '<b>This ist my postContent after afterCreateActionHandler</b>';
}
}