|
|
|
@ -103,21 +103,16 @@ class PicoTwigExtension extends Twig_Extension |
|
|
|
|
public function mapFilter($var, $mapKeyPath) |
|
|
|
|
{ |
|
|
|
|
if (!is_array($var) && (!is_object($var) || !is_a($var, 'Traversable'))) { |
|
|
|
|
throw new InvalidArgumentException( |
|
|
|
|
'Unable to apply Twig "map" filter: ' |
|
|
|
|
. 'You must pass a traversable variable' |
|
|
|
|
); |
|
|
|
|
} |
|
|
|
|
if (empty($mapKeyPath)) { |
|
|
|
|
throw new InvalidArgumentException( |
|
|
|
|
'Unable to apply Twig "map" filter: ' |
|
|
|
|
. 'You must specify the $mapKeyPath parameter' |
|
|
|
|
); |
|
|
|
|
throw new Twig_Error_Runtime(sprintf( |
|
|
|
|
'The map filter only works with arrays or "Traversable", got "%s"', |
|
|
|
|
is_object($var) ? get_class($var) : gettype($var) |
|
|
|
|
)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$result = array(); |
|
|
|
|
foreach ($var as $key => $value) { |
|
|
|
|
$result[$key] = $this->getKeyOfVar($value, $mapKeyPath); |
|
|
|
|
$mapValue = $this->getKeyOfVar($value, $mapKeyPath); |
|
|
|
|
$result[$key] = ($mapValue !== null) ? $mapValue : $value; |
|
|
|
|
} |
|
|
|
|
return $result; |
|
|
|
|
} |
|
|
|
@ -149,22 +144,13 @@ class PicoTwigExtension extends Twig_Extension |
|
|
|
|
if (is_object($var) && is_a($var, 'Traversable')) { |
|
|
|
|
$var = iterator_to_array($var, true); |
|
|
|
|
} elseif (!is_array($var)) { |
|
|
|
|
throw new InvalidArgumentException( |
|
|
|
|
'Unable to apply Twig "sort_by" filter: ' |
|
|
|
|
. 'You must pass a traversable variable' |
|
|
|
|
); |
|
|
|
|
} |
|
|
|
|
if (empty($sortKeyPath)) { |
|
|
|
|
throw new InvalidArgumentException( |
|
|
|
|
'Unable to apply Twig "sort_by" filter: ' |
|
|
|
|
. 'You must specify the $sortKeyPath parameter' |
|
|
|
|
); |
|
|
|
|
throw new Twig_Error_Runtime(sprintf( |
|
|
|
|
'The sort_by filter only works with arrays or "Traversable", got "%s"', |
|
|
|
|
is_object($var) ? get_class($var) : gettype($var) |
|
|
|
|
)); |
|
|
|
|
} |
|
|
|
|
if (($fallback !== 'top') && ($fallback !== 'bottom') && ($fallback !== 'keep')) { |
|
|
|
|
throw new InvalidArgumentException( |
|
|
|
|
'Unable to apply Twig "sort_by" filter: ' |
|
|
|
|
. 'Invalid $fallback parameter: ' . $fallback |
|
|
|
|
); |
|
|
|
|
throw new Twig_Error_Runtime('The sort_by filter only supports the "top", "bottom" and "keep" fallbacks'); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$twigExtension = $this; |
|
|
|
@ -206,7 +192,7 @@ class PicoTwigExtension extends Twig_Extension |
|
|
|
|
* array interpreted as key path (when passing e.g. ['foo', 'bar'], |
|
|
|
|
* the method will return $var['foo']['bar']) specifying the value |
|
|
|
|
* @return mixed the requested |
|
|
|
|
* value or NULL when the the given key or key path didn't match |
|
|
|
|
* value or NULL when the given key or key path didn't match |
|
|
|
|
*/ |
|
|
|
|
public static function getKeyOfVar($var, $keyPath) |
|
|
|
|
{ |
|
|
|
@ -218,15 +204,21 @@ class PicoTwigExtension extends Twig_Extension |
|
|
|
|
|
|
|
|
|
foreach ($keyPath as $key) { |
|
|
|
|
if (is_object($var)) { |
|
|
|
|
if (is_a($var, 'Traversable')) { |
|
|
|
|
if (is_a($var, 'ArrayAccess')) { |
|
|
|
|
// use ArrayAccess, see below |
|
|
|
|
} elseif (is_a($var, 'Traversable')) { |
|
|
|
|
$var = iterator_to_array($var); |
|
|
|
|
} elseif (isset($var->{$key})) { |
|
|
|
|
$var = $var->{$key}; |
|
|
|
|
continue; |
|
|
|
|
} elseif (is_callable(array($var, 'get' . ucfirst($key)))) { |
|
|
|
|
$var = call_user_func(array($var, 'get' . ucfirst($key))); |
|
|
|
|
continue; |
|
|
|
|
} elseif (!is_a($var, 'ArrayAccess')) { |
|
|
|
|
try { |
|
|
|
|
$var = call_user_func(array($var, 'get' . ucfirst($key))); |
|
|
|
|
continue; |
|
|
|
|
} catch (BadMethodCallException $e) { |
|
|
|
|
return null; |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
return null; |
|
|
|
|
} |
|
|
|
|
} elseif (!is_array($var)) { |
|
|
|
|