improvements-2.x-dev/src/ImprovementsTwigExtension.php
src/ImprovementsTwigExtension.php
<?php
namespace Drupal\improvements;
use Drupal\Component\Utility\NestedArray;
use Drupal\Core\Field\EntityReferenceFieldItemListInterface;
use Drupal\Core\Field\FieldItemListInterface;
use Drupal\druhels\ArrayHelper;
use Drupal\druhels\EntityHelper;
use Twig\Extension\AbstractExtension;
use Twig\TwigFilter;
use Twig\TwigFunction;
/**
* Twig extensions.
*/
class ImprovementsTwigExtension extends AbstractExtension {
/**
* {@inheritdoc}
*/
public function getFunctions(): array {
return [
new TwigFunction('preg_matches', [$this, 'pregMatches']),
new TwigFunction('field_has_value', [$this, 'fieldHasValue']),
new TwigFunction('referenced_entities_field_has_value', [$this, 'referencedEntitiesFieldHasValue']),
new TwigFunction('set_array_value', [$this, 'setArrayValue']),
];
}
/**
* {@inheritdoc}
*/
public function getFilters(): array {
return [
new TwigFilter('without_theme', [$this, 'withoutTheme']), // @TODO Add test
new TwigFilter('relative_url', 'file_url_transform_relative'), // @TODO Add test
new TwigFilter('filter_empty', [$this, 'filterEmpty']), // @TODO Add test
new TwigFilter('unique', [$this, 'arrayUnique']), // @TODO Add test
new TwigFilter('clean_phone', [$this, 'cleanPhone']), // @TODO Add test
];
}
/**
* Call preg_match() and return matches.
*
* @return string|array|null
*/
public function pregMatches(string $pattern, string $subject, int $match_index = NULL): mixed {
if (preg_match($pattern, $subject, $matches)) {
if ($match_index !== NULL) {
return $matches[$match_index] ?? NULL;
}
return $matches;
}
return NULL;
}
/**
* Return render-array without #theme property.
*
* @return mixed
*/
public function withoutTheme($element): mixed {
if (is_array($element) && isset($element['#theme'])) {
unset($element['#theme']);
}
return $element;
}
/**
* Return TRUE if field has value.
*
* @param FieldItemListInterface $field_items
* @param mixed $value
* @param string|null $value_property_name
*
* @TODO Add test
*/
public function fieldHasValue(FieldItemListInterface $field_items, mixed $value, string $value_property_name = NULL): bool {
return EntityHelper::fieldHasValue($field_items, $value, $value_property_name);
}
/**
* Return TRUE if referenced entities field has value.
*
* @param EntityReferenceFieldItemListInterface $parent_items
* @param string $child_field_name
* @param mixed $child_field_value
* @param string|null $child_value_property_name
*
* @TODO Add test
*/
public function referencedEntitiesFieldHasValue(EntityReferenceFieldItemListInterface $parent_items, string $child_field_name, mixed $child_field_value, string $child_value_property_name = NULL): bool {
return EntityHelper::referencedEntitiesFieldHasValue($parent_items, $child_field_name, $child_field_value, $child_value_property_name);
}
/**
* Set array value.
*
* @TODO Add test
*/
public function setArrayValue(mixed $array, array $keys, mixed $value): array {
if (!is_array($keys)) {
$keys = [$keys];
}
NestedArray::setValue($array, $keys, $value);
return $array;
}
/**
* Remove empty elements from array.
*/
public function filterEmpty(mixed $array): mixed {
if (is_array($array)) {
$array = ArrayHelper::removeEmptyElements($array);
}
return $array;
}
/**
* Remove duplicate values.
*/
public function arrayUnique(mixed $array): mixed {
if (is_array($array)) {
return array_unique($array);
}
return $array;
}
/**
* Clean phone.
*/
public function cleanPhone(?string $phone): mixed {
if ($phone) {
return preg_replace('/[^0-9+]/', '', $phone);
}
return $phone;
}
}
