186 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			186 lines
		
	
	
		
			6.7 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 */
 | 
						|
namespace WapplerSystems\BookmarksLikesRatings\Domain\Validator;
 | 
						|
 | 
						|
use WapplerSystems\BookmarksLikesRatings\Domain\Model\Ratingobject;
 | 
						|
use WapplerSystems\BookmarksLikesRatings\Domain\Model\Stepconf;
 | 
						|
use WapplerSystems\BookmarksLikesRatings\Domain\Repository\StepconfRepository;
 | 
						|
use WapplerSystems\BookmarksLikesRatings\Domain\Repository\StepnameRepository;
 | 
						|
use TYPO3\CMS\Extbase\Persistence\Exception\InvalidQueryException;
 | 
						|
use TYPO3\CMS\Extbase\Persistence\ObjectStorage;
 | 
						|
use TYPO3\CMS\Extbase\Utility\LocalizationUtility;
 | 
						|
use TYPO3\CMS\Extbase\Validation\Validator\AbstractValidator;
 | 
						|
 | 
						|
/**
 | 
						|
 * A validator for Ratings
 | 
						|
 *
 | 
						|
 * @copyright Copyright belongs to the respective authors
 | 
						|
 * @scope singleton
 | 
						|
 */
 | 
						|
class StepconfValidator extends AbstractValidator
 | 
						|
{
 | 
						|
    /**
 | 
						|
     * @var \WapplerSystems\BookmarksLikesRatings\Domain\Repository\StepconfRepository
 | 
						|
     */
 | 
						|
    protected $stepconfRepository;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @param \WapplerSystems\BookmarksLikesRatings\Domain\Repository\StepconfRepository $stepconfRepository
 | 
						|
     */
 | 
						|
    public function injectStepconfRepository(StepconfRepository $stepconfRepository)
 | 
						|
    {
 | 
						|
        $this->stepconfRepository = $stepconfRepository;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @var \WapplerSystems\BookmarksLikesRatings\Domain\Repository\StepnameRepository
 | 
						|
     */
 | 
						|
    protected $stepnameRepository;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @param \WapplerSystems\BookmarksLikesRatings\Domain\Repository\StepnameRepository $stepnameRepository
 | 
						|
     */
 | 
						|
    public function injectStepnameRepository(StepnameRepository $stepnameRepository)
 | 
						|
    {
 | 
						|
        $this->stepnameRepository = $stepnameRepository;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * If the given step is valid
 | 
						|
     *
 | 
						|
     * @param \WapplerSystems\BookmarksLikesRatings\Domain\Model\Stepconf $stepconf
 | 
						|
     * @throws InvalidQueryException
 | 
						|
     */
 | 
						|
    protected function isValid($stepconf): void
 | 
						|
    {
 | 
						|
        /** @noinspection NotOptimalIfConditionsInspection */
 | 
						|
        if (!$this->isEmpty($stepconf) && $stepconf instanceof Stepconf) {
 | 
						|
            $this->checkRatingobject($stepconf);
 | 
						|
            if (!$this->result->hasErrors()) {
 | 
						|
                $this->checkSteporder($stepconf);
 | 
						|
            }
 | 
						|
            if (!$this->result->hasErrors()) {
 | 
						|
                $this->validateStepnames($stepconf);
 | 
						|
            }
 | 
						|
        } else {
 | 
						|
            $this->addError(LocalizationUtility::translate('error.validator.stepconf.empty', 'ThRating'), 1568139528);
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * A stepconf object must have a ratingobject
 | 
						|
     * @param Stepconf $stepconf
 | 
						|
     */
 | 
						|
    protected function checkRatingobject(Stepconf $stepconf): void
 | 
						|
    {
 | 
						|
        if (!$stepconf->getRatingobject() instanceof Ratingobject) {
 | 
						|
            $this->addError(
 | 
						|
                LocalizationUtility::translate('error.validator.stepconf.ratingobject', 'ThRating'),
 | 
						|
                1284700846
 | 
						|
            );
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * At least a steporder value must be set and a positive integer ( >0 ) and valid regaing existing values
 | 
						|
     * @param Stepconf $stepconf
 | 
						|
     */
 | 
						|
    protected function checkSteporder(Stepconf $stepconf): void
 | 
						|
    {
 | 
						|
        $steporder = $stepconf->getSteporder();
 | 
						|
        if (empty($steporder)) {
 | 
						|
            $this->addError(
 | 
						|
                LocalizationUtility::translate('error.validator.stepconf.steps', 'ThRating'),
 | 
						|
                1284700903
 | 
						|
            );
 | 
						|
            return;
 | 
						|
        }
 | 
						|
 | 
						|
        if (!is_int($stepconf->getSteporder()) || $stepconf->getSteporder() < 1) {
 | 
						|
            $this->addError(
 | 
						|
                LocalizationUtility::translate(
 | 
						|
                    'error.validator.stepconf.invalidSteporderNumber',
 | 
						|
                    'ThRating'
 | 
						|
                ),
 | 
						|
                1368123953
 | 
						|
            );
 | 
						|
        }
 | 
						|
 | 
						|
        //check if given steporder is valid (integer, maximum +1)
 | 
						|
        /** @var object $maxSteporderStepconfobject */
 | 
						|
        $maxSteporderStepconfobject = $this->stepconfRepository->findByRatingobject($stepconf->getRatingobject());
 | 
						|
        $maxSteporder = $maxSteporderStepconfobject[$maxSteporderStepconfobject->count() - 1]->getSteporder();
 | 
						|
        if ($stepconf->getSteporder() > $maxSteporder + 1) {
 | 
						|
            $this->addError(
 | 
						|
                LocalizationUtility::translate('error.validator.stepconf.maxSteporder', 'ThRating'),
 | 
						|
                1368123970
 | 
						|
            );
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * If the given step is valid
 | 
						|
     *
 | 
						|
     * @param Stepconf $stepconf
 | 
						|
     * @throws InvalidQueryException
 | 
						|
     * @throws \TYPO3\CMS\Extbase\Persistence\Exception\InvalidQueryException
 | 
						|
     */
 | 
						|
    protected function validateStepnames($stepconf): void
 | 
						|
    {
 | 
						|
        //check if a stepname is given that at least has the default language definition
 | 
						|
        //TODO move to query on stepname repository
 | 
						|
        $stepname = $stepconf->getStepname();
 | 
						|
        $countNames = 0;
 | 
						|
        if ($stepname instanceof ObjectStorage) {
 | 
						|
            $countNames = $stepname->count();
 | 
						|
        }
 | 
						|
        if ($countNames != 0) {
 | 
						|
            /** @var \WapplerSystems\BookmarksLikesRatings\Domain\Model\Stepname $firstStepname */
 | 
						|
            $firstStepname = $stepname->current();
 | 
						|
 | 
						|
            /** @var \WapplerSystems\BookmarksLikesRatings\Domain\Model\Stepname|object $defaultName */
 | 
						|
            $defaultName = $this->stepnameRepository->findDefaultStepname($firstStepname);
 | 
						|
            if (!$defaultName->isValid()) {
 | 
						|
                $this->addError(
 | 
						|
                    LocalizationUtility::translate(
 | 
						|
                        'error.validator.stepconf.defaultStepname',
 | 
						|
                        'ThRating',
 | 
						|
                        [$firstStepname->getStepconf()->getUid()]
 | 
						|
                    ),
 | 
						|
                    1384374165
 | 
						|
                );
 | 
						|
            } else {
 | 
						|
                //Finally check on language consistency
 | 
						|
                $checkConsistency = $this->stepnameRepository->checkConsistency($firstStepname);
 | 
						|
                if ($checkConsistency['doubleLang']) {
 | 
						|
                    $this->addError(
 | 
						|
                        LocalizationUtility::translate(
 | 
						|
                            'error.validator.stepconf.doubleLangEntry',
 | 
						|
                            'ThRating',
 | 
						|
                            [$firstStepname->getStepconf()->getUid()]
 | 
						|
                        ),
 | 
						|
                        1384374589
 | 
						|
                    );
 | 
						|
                } elseif ($checkConsistency['existLang']) {
 | 
						|
                    $this->addError(
 | 
						|
                        LocalizationUtility::translate(
 | 
						|
                            'error.validator.stepconf.notExistingLanguage',
 | 
						|
                            'ThRating',
 | 
						|
                            [$firstStepname->getUid()]
 | 
						|
                        ),
 | 
						|
                        1384374589
 | 
						|
                    );
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 |