Obey media ordering

This commit is contained in:
Matias Griese
2022-04-12 14:17:03 +03:00
parent 2921366907
commit e1901d8385
4 changed files with 55 additions and 10 deletions

View File

@@ -145,18 +145,10 @@ trait MediaTrait
/** @var MediaFactory $factory */
$factory = Grav::instance()['media_factory'];
$order = $this->getNestedProperty($field);
if (is_array($order)) {
$order = array_is_list($order) ? $order : array_keys($order);
} else {
$order = [];
}
$params = $settings['media'] ?? [];
$params += [
'object' => $this,
'path' => $settings[$var],
'order' => $order,
'load' => true
];

View File

@@ -2911,7 +2911,22 @@ class Page implements PageInterface
$schema = $this->getBlueprint()->schema();
$settings = $schema ? $schema->getProperty($field) : null;
return $this->parseMediaFieldSettings($field, $settings);
$settings = $this->parseMediaFieldSettings($field, $settings);
if ($settings && !isset($settings['media']['order'])) {
if (str_starts_with($field, 'header.')) {
$field = substr($field, 7);
}
$header = $this->header();
$order = Utils::getField($header, $field);
if (is_array($order)) {
$settings['media']['order'] = array_is_list($order) ? $order : array_keys($order);
} else {
$settings['media']['order'] = [];
}
}
return $settings;
}
/**

View File

@@ -36,6 +36,7 @@ use function function_exists;
use function in_array;
use function is_array;
use function is_callable;
use function is_object;
use function is_string;
use function strlen;
@@ -1295,6 +1296,33 @@ abstract class Utils
return $newArray;
}
/**
* @param array|object $current
* @param string $name
* @param mixed|null $default
* @param string $separator
* @return mixed|null
*/
public static function getField($current, string $name, $default = null, string $separator = '.')
{
if ($name === '') {
return $current;
}
$path = explode($separator, $name);
foreach ($path as $field) {
if (is_object($current) && isset($current->{$field})) {
$current = $current->{$field};
} elseif (is_array($current) && isset($current[$field])) {
$current = $current[$field];
} else {
return $default;
}
}
return $current;
}
/**
* Checks if the passed path contains the language code prefix
*

View File

@@ -99,7 +99,17 @@ trait FlexMediaTrait
$schema = $this->getBlueprint()->schema();
$settings = $schema ? $schema->getProperty($field) : null;
return $this->parseMediaFieldSettings($field, $settings);
$settings = $this->parseMediaFieldSettings($field, $settings);
if ($settings && !isset($settings['media']['order'])) {
$order = Utils::getField($this->getArrayElements(), $field);
if (is_array($order)) {
$settings['media']['order'] = array_is_list($order) ? $order : array_keys($order);
} else {
$settings['media']['order'] = [];
}
}
return $settings;
}
/**