Spaces:
No application file
No application file
| namespace Mautic\CoreBundle\Helper; | |
| use Doctrine\DBAL\Connection; | |
| use Doctrine\DBAL\Query\Expression\CompositeExpression; | |
| use Mautic\CoreBundle\Factory\ModelFactory; | |
| use Mautic\CoreBundle\Security\Permissions\CorePermissions; | |
| class BuilderTokenHelper | |
| { | |
| private bool $isConfigured = false; | |
| protected $permissionSet; | |
| protected $modelName; | |
| protected $viewPermissionBase; | |
| protected $langVar; | |
| protected $bundleName; | |
| /** | |
| * @param ModelFactory<object> $modelFactory | |
| */ | |
| public function __construct( | |
| private CorePermissions $security, | |
| private ModelFactory $modelFactory, | |
| private Connection $connection, | |
| private UserHelper $userHelper | |
| ) { | |
| } | |
| /** | |
| * This method must be called before the BuilderTokenHelper can be used. | |
| */ | |
| public function configure( | |
| string $modelName, | |
| ?string $viewPermissionBase = null, | |
| ?string $bundleName = null, | |
| ?string $langVar = null | |
| ): void { | |
| $this->modelName = $modelName; | |
| $this->viewPermissionBase = (!empty($viewPermissionBase)) ? $viewPermissionBase : "$modelName:{$modelName}s"; | |
| $this->bundleName = (!empty($bundleName)) ? $bundleName : 'Mautic'.ucfirst($modelName).'Bundle'; | |
| $this->langVar = (!empty($langVar)) ? $langVar : $modelName; | |
| $this->permissionSet = [ | |
| $this->viewPermissionBase.':viewown', | |
| $this->viewPermissionBase.':viewother', | |
| ]; | |
| $this->isConfigured = true; | |
| } | |
| /** | |
| * @param string $tokenRegex Token regex without wrapping regex escape characters. Use (value) or (.*?) where the ID of the | |
| * entity should go. i.e. {pagelink=(value)} | |
| * @param string $filter String to filter results by | |
| * @param string $labelColumn The column that houses the label | |
| * @param string $valueColumn The column that houses the value | |
| * @param CompositeExpression $expr Use $factory->getDatabase()->getExpressionBuilder()->andX() | |
| * | |
| * @return array|void | |
| * | |
| * @throws \BadMethodCallException | |
| */ | |
| public function getTokens( | |
| $tokenRegex, | |
| $filter = '', | |
| $labelColumn = 'name', | |
| $valueColumn = 'id', | |
| CompositeExpression $expr = null | |
| ) { | |
| if (!$this->isConfigured) { | |
| throw new \BadMethodCallException('You must call the "'.static::class.'::configure()" method first.'); | |
| } | |
| // set some permissions | |
| $permissions = $this->security->isGranted( | |
| $this->permissionSet, | |
| 'RETURN_ARRAY' | |
| ); | |
| if (1 == count(array_unique($permissions)) && false == end($permissions)) { | |
| return; | |
| } | |
| $repo = $this->modelFactory->getModel($this->modelName)->getRepository(); | |
| $prefix = $repo->getTableAlias(); | |
| if (!empty($prefix)) { | |
| $prefix .= '.'; | |
| } | |
| $exprBuilder = $this->connection->createExpressionBuilder(); | |
| if (isset($permissions[$this->viewPermissionBase.':viewother']) && !$permissions[$this->viewPermissionBase.':viewother']) { | |
| $expr = $expr->with( | |
| $exprBuilder->eq($prefix.'created_by', $this->userHelper->getUser()->getId()) | |
| ); | |
| } | |
| if (!empty($filter)) { | |
| $expr = $expr->with( | |
| $exprBuilder->like('LOWER('.$labelColumn.')', ':label') | |
| ); | |
| $parameters = [ | |
| 'label' => strtolower($filter).'%', | |
| ]; | |
| } else { | |
| $parameters = []; | |
| } | |
| $items = $repo->getSimpleList($expr, $parameters, $labelColumn, $valueColumn); | |
| $tokens = []; | |
| foreach ($items as $item) { | |
| $token = str_replace(['(value)', '(.*?)'], $item['value'], $tokenRegex); | |
| $tokens[$token] = $item['label']; | |
| } | |
| return $tokens; | |
| } | |
| /** | |
| * Override default permission set of viewown and viewother. | |
| */ | |
| public function setPermissionSet(array $permissions): void | |
| { | |
| $this->permissionSet = $permissions; | |
| } | |
| /** | |
| * @deprecated 2.6.0 to be removed in 3.0 | |
| */ | |
| public static function getVisualTokenHtml($token, $description, $forPregReplace = false): string | |
| { | |
| if ($forPregReplace) { | |
| return preg_quote('<strong contenteditable="false" data-token="', '/').'(.*?)'.preg_quote('">**', '/') | |
| .'(.*?)'.preg_quote('**</strong>', '/'); | |
| } | |
| return '<strong contenteditable="false" data-token="'.$token.'">**'.$description.'**</strong>'; | |
| } | |
| } | |