Spaces:
No application file
No application file
namespace Mautic\CoreBundle\Model; | |
use Doctrine\ORM\EntityManagerInterface; | |
use Mautic\CoreBundle\Entity\CommonRepository; | |
use Mautic\CoreBundle\Entity\FormEntity; | |
use Mautic\CoreBundle\Helper\ClickthroughHelper; | |
use Mautic\CoreBundle\Helper\CoreParametersHelper; | |
use Mautic\CoreBundle\Helper\UserHelper; | |
use Mautic\CoreBundle\Security\Permissions\CorePermissions; | |
use Mautic\CoreBundle\Translation\Translator; | |
use Psr\Log\LoggerInterface; | |
use Symfony\Component\EventDispatcher\EventDispatcherInterface; | |
use Symfony\Component\Intl\Locales; | |
use Symfony\Component\Routing\Generator\UrlGeneratorInterface; | |
/** | |
* @template T of object | |
*/ | |
abstract class AbstractCommonModel implements MauticModelInterface | |
{ | |
public function __construct( | |
protected EntityManagerInterface $em, | |
protected CorePermissions $security, | |
protected EventDispatcherInterface $dispatcher, | |
protected UrlGeneratorInterface $router, | |
protected Translator $translator, | |
protected UserHelper $userHelper, | |
protected LoggerInterface $logger, | |
protected CoreParametersHelper $coreParametersHelper | |
) { | |
} | |
/** | |
* Retrieve the supported search commands for a repository. | |
* | |
* @return array | |
*/ | |
public function getSupportedSearchCommands() | |
{ | |
return []; | |
} | |
/** | |
* Retrieve the search command list for a repository. | |
* | |
* @return array | |
*/ | |
public function getCommandList() | |
{ | |
$repo = $this->getRepository(); | |
return $repo->getSearchCommands(); | |
} | |
/** | |
* Retrieve the repository for an entity. | |
* | |
* @return CommonRepository<T> | |
*/ | |
public function getRepository() | |
{ | |
static $commonRepo; | |
if (null === $commonRepo) { | |
$commonRepo = $this->em->getRepository(FormEntity::class); | |
} | |
return $commonRepo; | |
} | |
/** | |
* Retrieve the permissions base. | |
* | |
* @return string | |
*/ | |
public function getPermissionBase() | |
{ | |
return ''; | |
} | |
/** | |
* Return a list of entities. | |
* | |
* @param array $args [start, limit, filter, orderBy, orderByDir] | |
* | |
* @return \Doctrine\ORM\Tools\Pagination\Paginator|array | |
*/ | |
public function getEntities(array $args = []) | |
{ | |
// set the translator | |
$repo = $this->getRepository(); | |
$repo->setTranslator($this->translator); | |
$repo->setCurrentUser($this->userHelper->getUser()); | |
return $repo->getEntities($args); | |
} | |
/** | |
* Get a specific entity. | |
*/ | |
public function getEntity($id = null): ?object | |
{ | |
if (null !== $id) { | |
$repo = $this->getRepository(); | |
if (method_exists($repo, 'getEntity')) { | |
return $repo->getEntity($id); | |
} | |
return $repo->find((int) $id); | |
} | |
return null; | |
} | |
/** | |
* Encode an array to append to a URL. | |
* | |
* @return string | |
*/ | |
public function encodeArrayForUrl($array) | |
{ | |
return ClickthroughHelper::encodeArrayForUrl((array) $array); | |
} | |
/** | |
* Decode a string appended to URL into an array. | |
* | |
* @param bool $urlDecode | |
* | |
* @return mixed | |
*/ | |
public function decodeArrayFromUrl($string, $urlDecode = true) | |
{ | |
return ClickthroughHelper::decodeArrayFromUrl($string, $urlDecode); | |
} | |
/** | |
* @param array $routeParams | |
* @param bool $absolute | |
* @param array $clickthrough | |
* | |
* @return string | |
*/ | |
public function buildUrl($route, $routeParams = [], $absolute = true, $clickthrough = []) | |
{ | |
$referenceType = ($absolute) ? UrlGeneratorInterface::ABSOLUTE_URL : UrlGeneratorInterface::ABSOLUTE_PATH; | |
$url = $this->router->generate($route, $routeParams, $referenceType); | |
return $url.((!empty($clickthrough)) ? '?ct='.$this->encodeArrayForUrl($clickthrough) : ''); | |
} | |
/** | |
* Retrieve entity based on id/alias slugs. | |
* | |
* @param string $slug | |
* | |
* @return object|bool | |
*/ | |
public function getEntityBySlugs($slug) | |
{ | |
$slugs = explode('/', $slug); | |
$idSlug = ''; | |
$category = null; | |
$lang = null; | |
$slugCount = count($slugs); | |
$locales = Locales::getNames(); | |
switch (true) { | |
case 3 === $slugCount: | |
[$lang, $category, $idSlug] = $slugs; | |
break; | |
case 2 === $slugCount: | |
[$category, $idSlug] = $slugs; | |
// Check if the first slug is actually a locale | |
if (isset($locales[$category])) { | |
$lang = $category; | |
$category = null; | |
} | |
break; | |
case 1 === $slugCount: | |
$idSlug = $slugs[0]; | |
break; | |
} | |
// Check for uncategorized | |
if ($this->translator->trans('mautic.core.url.uncategorized') == $category) { | |
$category = null; | |
} | |
if ($lang && !isset($locales[$lang])) { | |
// Language doesn't exist so return false | |
return false; | |
} | |
$entity = false; | |
if (str_contains($idSlug, ':')) { | |
$parts = explode(':', $idSlug); | |
if (2 == count($parts)) { | |
$entity = $this->getEntity($parts[0]); | |
} | |
} else { | |
$entity = $this->getRepository()->findOneBySlugs($idSlug, $category, $lang); | |
} | |
if ($entity && $lang) { | |
// Set the slug used to fetch the entity | |
$entity->languageSlug = $lang; | |
} | |
return $entity; | |
} | |
/** | |
* @param string $alias | |
* @param string|null $categoryAlias | |
* @param string|null $lang | |
* | |
* @return object|null | |
*/ | |
public function getEntityByAlias($alias, $categoryAlias = null, $lang = null) | |
{ | |
return null; | |
} | |
/** | |
* @phpstan-param class-string<T> $class | |
* | |
* @return CommonRepository<T> | |
*/ | |
protected function getServiceRepository(string $class) | |
{ | |
return $this->em->getRepository($class); | |
} | |
} | |