diff --git a/modules/backend/classes/ListColumn.php b/modules/backend/classes/ListColumn.php index 0389ab891..f73b0f820 100644 --- a/modules/backend/classes/ListColumn.php +++ b/modules/backend/classes/ListColumn.php @@ -1,5 +1,6 @@ valueFrom ?: $this->columnName; + return $this->getColumnNameFromData($columnName, $data, $default); + } + + /** + * Internal method to extract the value of a column name from a data set. + * @param string $columnName + * @param mixed $data + * @param mixed $default + * @return mixed + */ + protected function getColumnNameFromData($columnName, $data, $default = null) + { + /* + * Array column name, eg: column[key][key2][key3] + */ + $keyParts = HtmlHelper::nameToArray($columnName); + $result = $data; + + /* + * Loop the column key parts and build a value. + * To support relations only the last column should return the + * relation value, all others will look up the relation object as normal. + */ + foreach ($keyParts as $key) { + if ($result instanceof Model && $result->hasRelation($key)) { + $result = $result->{$key}; + } + else { + if (!isset($result->{$key})) { + return $default; + } + + $result = $result->{$key}; + } + } + + return $result; + } } diff --git a/modules/backend/widgets/Lists.php b/modules/backend/widgets/Lists.php index 9fc3fc9d2..c61dba1a9 100644 --- a/modules/backend/widgets/Lists.php +++ b/modules/backend/widgets/Lists.php @@ -713,12 +713,25 @@ class Lists extends WidgetBase $label = studly_case($name); } + /* + * Auto configure pivot relation + */ if (starts_with($name, 'pivot[') && strpos($name, ']') !== false) { $_name = HtmlHelper::nameToArray($name); - $config['relation'] = array_shift($_name); - $config['valueFrom'] = array_shift($_name); + $relationName = array_shift($_name); + $valueFrom = array_shift($_name); + + if (count($_name) > 0) { + $valueFrom .= '['.implode('][', $_name).']'; + } + + $config['relation'] = $relationName; + $config['valueFrom'] = $valueFrom; $config['searchable'] = false; } + /* + * Auto configure standard relation + */ elseif (strpos($name, '[') !== false && strpos($name, ']') !== false) { $config['valueFrom'] = $name; $config['sortable'] = false; @@ -792,7 +805,9 @@ class Lists extends WidgetBase $value = $record->{$columnName}->lists($column->valueFrom); } elseif ($this->isColumnRelated($column) || $this->isColumnPivot($column)) { - $value = $record->{$columnName} ? $record->{$columnName}->{$column->valueFrom} : null; + $value = $record->{$columnName} + ? $column->getValueFromData($record->{$columnName}) + : null; } else { $value = null; @@ -802,11 +817,7 @@ class Lists extends WidgetBase * Handle taking value from model attribute. */ elseif ($column->valueFrom) { - $keyParts = HtmlHelper::nameToArray($column->valueFrom); - $value = $record; - foreach ($keyParts as $key) { - $value = $value->{$key}; - } + $value = $column->getValueFromData($record); } /* * Otherwise, if the column is a relation, it will be a custom select, diff --git a/modules/system/assets/ui/js/select.js b/modules/system/assets/ui/js/select.js index d8e648253..ea94b88bd 100644 --- a/modules/system/assets/ui/js/select.js +++ b/modules/system/assets/ui/js/select.js @@ -91,7 +91,7 @@ var placeholder = $element.data('placeholder') if (placeholder) { - extraOptions.placeholder = placeholder; + extraOptions.placeholder = placeholder } $element.select2($.extend({}, selectOptions, extraOptions))