1317 lines
57 KiB
PHP
1317 lines
57 KiB
PHP
|
<?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>';
|
|||
|
}
|
|||
|
}
|