open-orchestra/open-orchestra-cms-bundle

View on GitHub
Backoffice/Form/DataTransformer/AbstractReferenceKeywordTransformer.php

Summary

Maintainability
A
1 hr
Test Coverage
<?php

namespace OpenOrchestra\Backoffice\Form\DataTransformer;

use Symfony\Component\Form\DataTransformerInterface;
use OpenOrchestra\ModelInterface\Repository\KeywordRepositoryInterface;
use OpenOrchestra\Backoffice\Exception\NotFoundedKeywordException;
use OpenOrchestra\Backoffice\Manager\KeywordToDocumentManager;
use Doctrine\Common\Collections\ArrayCollection;

/**
 * Class AbstractReferenceKeywordTransformer
 */
abstract class AbstractReferenceKeywordTransformer implements DataTransformerInterface
{
    protected $keywordToDocumentManager;
    protected $keywordRepository;

    /**
     * @param KeywordToDocumentManager   $keywordToDocumentManager
     * @param KeywordRepositoryInterface $keywordRepository
     */
    public function __construct(
        KeywordToDocumentManager $keywordToDocumentManager,
        KeywordRepositoryInterface $keywordRepository
    ){
        $this->keywordToDocumentManager = $keywordToDocumentManager;
        $this->keywordRepository = $keywordRepository;
    }

    /**
     * @param string $keywords
     *
     * @return string
     *
     * @throws NotFoundedKeywordException
     */
    public function transform($keywords)
    {
        if (null === $keywords) {
            return '';
        }

        $keywordCondition = $this->getKeywordAsCondition($keywords);
        $keywordArray = $this->getKeywordAsArray($keywords);

        foreach ($keywordArray as $keyword) {
            if ($keyword != '') {
                $keywordDocument = $this->keywordRepository->find($keyword);
                if (!is_null($keywordDocument)) {
                    $keywords = str_replace($keyword, $keywordDocument->getLabel(), $keywordCondition);
                } else {
                    throw new NotFoundedKeywordException();
                }
            }
        }

        return $keywordCondition;
    }

    /**
     * @param string  $keywords
     * @param boolean $asString
     *
     * @return mixed
     *
     * @throws NotFoundedKeywordException
     */
    protected function partialReverseTransform($keywords, $asString = true)
    {
        $keywordArray = $this->getKeywordAsArray($keywords);
        $referenceKeywords = new ArrayCollection();

        foreach ($keywordArray as $keyword) {
            if ($keyword != '') {
                $keywordDocument = $this->keywordRepository->find($keyword);
                if (is_null($keywordDocument)) {
                    $keywordDocument = $this->keywordToDocumentManager->getDocument($keyword);
                }
                if (!is_null($keywordDocument)) {
                    $keywords = str_replace($keyword, $keywordDocument->getId(), $keywords);
                    $referenceKeywords->add($keywordDocument);
                } else {
                    throw new NotFoundedKeywordException();
                }
            }
        }

        return $asString ? $keywords : $referenceKeywords;
    }

    /**
     * @param mixed $keywords
     *
     * @return array
     */
    abstract protected function getKeywordAsArray($keywords);

    /**
     * @param string $keywords
     *
     * @return string
     */
    abstract protected function getKeywordAsCondition($keywords);
}