Spaces:
No application file
No application file
namespace Mautic\CoreBundle\Helper; | |
use Mautic\CoreBundle\Helper\ListParser\ArrayListParser; | |
use Mautic\CoreBundle\Helper\ListParser\BarListParser; | |
use Mautic\CoreBundle\Helper\ListParser\Exception\FormatNotSupportedException; | |
use Mautic\CoreBundle\Helper\ListParser\JsonListParser; | |
use Mautic\CoreBundle\Helper\ListParser\ListParserInterface; | |
use Mautic\CoreBundle\Helper\ListParser\ValueListParser; | |
use Mautic\CoreBundle\Translation\Translator; | |
abstract class AbstractFormFieldHelper | |
{ | |
/** | |
* Json encoded format. | |
*/ | |
public const FORMAT_JSON = 'json'; | |
/** | |
* Bar format value1|value2. | |
*/ | |
public const FORMAT_BAR = 'bar'; | |
/** | |
* Simple value => label array. | |
*/ | |
public const FORMAT_SIMPLE_ARRAY = 'simple_array'; | |
/** | |
* Array [['value' => 'value', 'label' => 'label'] ..]. | |
*/ | |
public const FORMAT_ARRAY = 'array'; | |
/** | |
* @var string | |
*/ | |
protected $translationKeyPrefix; | |
/** | |
* @var Translator | |
*/ | |
protected $translator; | |
/** | |
* @return mixed | |
*/ | |
abstract public function setTranslationKeyPrefix(); | |
/** | |
* @return mixed | |
*/ | |
abstract public function getTypes(); | |
public function __construct() | |
{ | |
$this->setTranslationKeyPrefix(); | |
} | |
public function setTranslator(Translator $translator): void | |
{ | |
$this->translator = $translator; | |
} | |
/** | |
* @param array $customFields | |
* | |
* @return array | |
*/ | |
public function getChoiceList($customFields = []) | |
{ | |
$choices = []; | |
foreach ($this->getTypes() as $v => $type) { | |
$choices[$this->translator->transConditional("mautic.core.type.{$v}", "{$this->translationKeyPrefix}{$v}")] = $v; | |
} | |
foreach ($customFields as $v => $f) { | |
$choices[$this->translator->trans($f['label'])] = $v; | |
} | |
ksort($choices); | |
return $choices; | |
} | |
/** | |
* Format a string into an array. | |
* | |
* @param mixed $list List to parse | |
* @param bool $removeEmpty @deprecated Kept for BC with method signature | |
* @param bool $deprecatedIgnoreNumerical @deprecated Flag was introduced to support boolean choice lists; use parseBooleanList instead | |
* | |
* @return array | |
*/ | |
public static function parseList($list, $removeEmpty = true, $deprecatedIgnoreNumerical = false) | |
{ | |
if ($deprecatedIgnoreNumerical) { | |
// BC support for support | |
return static::parseBooleanList($list); | |
} | |
return static::parseChoiceList( | |
self::parseListsWithParsers( | |
$list, | |
[ | |
new JsonListParser(), | |
new BarListParser(), | |
new ValueListParser(), | |
new ArrayListParser(), | |
] | |
) | |
); | |
} | |
/** | |
* Same as parseList method above but it will return labels as keys. | |
* | |
* @param mixed $list | |
* | |
* @return mixed[] | |
*/ | |
public static function parseListForChoices($list): array | |
{ | |
return static::parseChoiceList( | |
self::parseListsWithParsers( | |
$list, | |
[ | |
new JsonListParser(), | |
new BarListParser(), | |
new ValueListParser(), | |
new ArrayListParser(), | |
] | |
), | |
true | |
); | |
} | |
/** | |
* @param mixed $list | |
* | |
* @return mixed[] | |
*/ | |
public static function parseBooleanList($list): array | |
{ | |
return static::parseChoiceList( | |
self::parseListsWithParsers( | |
$list, | |
[ | |
new JsonListParser(), | |
new BarListParser(), | |
new ValueListParser(), | |
] | |
) | |
); | |
} | |
/** | |
* @return mixed[]|string | |
*/ | |
public static function formatList($format, $choices) | |
{ | |
switch ($format) { | |
case self::FORMAT_JSON: | |
return json_encode($choices); | |
case self::FORMAT_BAR: | |
return implode('|', $choices); | |
case self::FORMAT_SIMPLE_ARRAY: | |
if (isset($choices[0]) && isset($choices[0]['label'])) { | |
$array = []; | |
foreach ($choices as $choice) { | |
$array[$choice['value']] = $choice['label']; | |
} | |
return $array; | |
} | |
return $choices; | |
case self::FORMAT_ARRAY: | |
$array = []; | |
foreach ($choices as $value => $label) { | |
$array[] = [ | |
'label' => $label, | |
'value' => $value, | |
]; | |
} | |
return $array; | |
} | |
} | |
protected static function parseChoiceList(array $list, bool $labelsAsKeys = false) | |
{ | |
$choices = []; | |
foreach ($list as $value => $label) { | |
if (is_array($label) && array_key_exists('value', $label)) { | |
$value = $label['value']; | |
$label = $label['label']; | |
if ('' === $value || null === $value) { | |
// Value is empty which can't work as a key | |
continue; | |
} | |
$choices = self::appendChoice($choices, $label, $value, $labelsAsKeys); | |
continue; | |
} | |
if (('' === $label || null === $label) && ('' === $value || null === $value)) { | |
// Both label and value are empty which can't work as choices | |
continue; | |
} | |
if (is_array($label)) { | |
// Process the label as an array as this is likely an option group | |
$key = trim(html_entity_decode($value, ENT_QUOTES)); | |
$choices[$key] = static::parseChoiceList($label); | |
continue; | |
} | |
$choices = self::appendChoice($choices, $label, $value, $labelsAsKeys); | |
} | |
return $choices; | |
} | |
/** | |
* @param mixed[] $choices | |
* | |
* @return mixed[] | |
*/ | |
private static function appendChoice(array $choices, string $label, string $value, bool $labelsAsKeys = false): array | |
{ | |
$label = trim(html_entity_decode($label, ENT_QUOTES)); | |
$value = trim(html_entity_decode($value, ENT_QUOTES)); | |
if ($labelsAsKeys) { | |
$choices[$label] = $value; | |
} else { | |
$choices[$value] = $label; | |
} | |
return $choices; | |
} | |
/** | |
* @param mixed $list | |
* @param ListParserInterface[] $parsers | |
* | |
* @return mixed[] | |
*/ | |
private static function parseListsWithParsers($list, array $parsers): array | |
{ | |
foreach ($parsers as $parser) { | |
try { | |
$list = $parser->parse($list); | |
} catch (FormatNotSupportedException) { | |
continue; | |
} | |
} | |
return $list; | |
} | |
} | |