mirror of
https://github.com/processwire/processwire.git
synced 2025-08-17 20:11:46 +02:00
Update InputfieldSelector to support sorted by field labels (rather than names) and support for better multi-language subfield names.
This commit is contained in:
@@ -609,7 +609,50 @@ class InputfieldSelector extends Inputfield implements ConfigurableModule {
|
|||||||
if($info['input'] == 'page') {
|
if($info['input'] == 'page') {
|
||||||
$info['subfields'] = array_merge($info['subfields'], $this->systemPageFields);
|
$info['subfields'] = array_merge($info['subfields'], $this->systemPageFields);
|
||||||
}
|
}
|
||||||
if(!empty($info['subfields'])) ksort($info['subfields']);
|
|
||||||
|
if(!empty($info['subfields'])) {
|
||||||
|
$subfields = array();
|
||||||
|
foreach($info['subfields'] as $name => $subfield) {
|
||||||
|
|
||||||
|
// consider multi-language
|
||||||
|
if(strpos($name, 'data') === 0 && $this->wire('languages')) {
|
||||||
|
list($unused, $languageID) = explode('data', "x$name");
|
||||||
|
if(ctype_digit($languageID)) {
|
||||||
|
$language = $this->wire('languages')->get((int) $languageID);
|
||||||
|
if($language && $language->id) {
|
||||||
|
$subfield['label'] = $field->getLabel() . " (" . $language->get('title|name') . ")";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(isset($this->systemFields[$name])) {
|
||||||
|
$label = isset($this->systemFields[$name]['label']) ? $this->systemFields[$name]['label'] : $name;
|
||||||
|
} else if(!empty($subfield['label'])) {
|
||||||
|
$label = $subfield['label'];
|
||||||
|
} else if(strpos($name, 'data') === 0 && ctype_digit(substr($name, 4)) && $this->wire('languages')) {
|
||||||
|
|
||||||
|
} else {
|
||||||
|
$f = $this->wire('fields')->get($name);
|
||||||
|
$label = $f ? $f->getLabel() : $name;
|
||||||
|
}
|
||||||
|
$subfield['label'] = $label;
|
||||||
|
$key = $this->showFieldLabels ? "$label\t$name" : $name;
|
||||||
|
while(isset($subfields[$key])) $key .= " ";
|
||||||
|
$subfields[$key] = $subfield;
|
||||||
|
}
|
||||||
|
ksort($subfields);
|
||||||
|
if($this->showFieldLabels) {
|
||||||
|
// convert back to name-based keys
|
||||||
|
$_subfields = array();
|
||||||
|
foreach($subfields as $key => $subfield) {
|
||||||
|
list($label, $name) = explode("\t", $key);
|
||||||
|
$_subfields[$name] = $subfield;
|
||||||
|
}
|
||||||
|
$subfields = $_subfields;
|
||||||
|
}
|
||||||
|
$info['subfields'] = $subfields;
|
||||||
|
}
|
||||||
|
|
||||||
return $info;
|
return $info;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -793,8 +836,20 @@ class InputfieldSelector extends Inputfield implements ConfigurableModule {
|
|||||||
unset($out);
|
unset($out);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if($settings['showFieldLabels']) {
|
||||||
|
$customFields = array();
|
||||||
|
foreach($settings['customFields'] as $field) {
|
||||||
|
$label = $field->getLabel();
|
||||||
|
while(isset($customFields[$label])) $label .= ' ';
|
||||||
|
$customFields[$label] = $field;
|
||||||
|
}
|
||||||
|
ksort($customFields);
|
||||||
|
} else {
|
||||||
|
$customFields = $settings['customFields'];
|
||||||
|
}
|
||||||
|
|
||||||
// build custom fields optgroup
|
// build custom fields optgroup
|
||||||
foreach($settings['customFields'] as $field) {
|
foreach($customFields as $field) {
|
||||||
/** @var Field $field */
|
/** @var Field $field */
|
||||||
$fieldName = $field->name;
|
$fieldName = $field->name;
|
||||||
if(in_array($fieldName, $settings['exclude'])) continue;
|
if(in_array($fieldName, $settings['exclude'])) continue;
|
||||||
@@ -1330,22 +1385,12 @@ class InputfieldSelector extends Inputfield implements ConfigurableModule {
|
|||||||
list($limitField, $limitSubfield) = explode('.', $limitField);
|
list($limitField, $limitSubfield) = explode('.', $limitField);
|
||||||
if($limitSubfield) $limitSubfields[$limitSubfield] = $limitSubfield;
|
if($limitSubfield) $limitSubfields[$limitSubfield] = $limitSubfield;
|
||||||
}
|
}
|
||||||
|
|
||||||
// render all the subfield options
|
// render all the subfield options
|
||||||
foreach($selectorInfo['subfields'] as $name => $info) {
|
foreach($selectorInfo['subfields'] as $name => $info) {
|
||||||
|
|
||||||
if(count($limitSubfields) && !isset($limitSubfields[$name])) continue;
|
if(count($limitSubfields) && !isset($limitSubfields[$name])) continue;
|
||||||
|
|
||||||
if(isset($this->systemFields[$name])) {
|
$label = $this->wire('sanitizer')->entities($info['label']);
|
||||||
$label = isset($this->systemFields[$name]['label']) ? $this->systemFields[$name]['label'] : $name;
|
|
||||||
} else if(!empty($info['label'])) {
|
|
||||||
$label = $info['label'];
|
|
||||||
} else {
|
|
||||||
$f = $this->wire('fields')->get($name);
|
|
||||||
$label = $f ? $f->getLabel() : $name;
|
|
||||||
}
|
|
||||||
|
|
||||||
$label = $this->wire('sanitizer')->entities($label);
|
|
||||||
// render primary subfield selection (unless selector info says not to)
|
// render primary subfield selection (unless selector info says not to)
|
||||||
if(isset($info['input']) && $info['input'] != 'none') {
|
if(isset($info['input']) && $info['input'] != 'none') {
|
||||||
$selected = $selectedValue == $name && (!$valueHasSelectorString || empty($info['subfields'])) ? ' selected' : '';
|
$selected = $selectedValue == $name && (!$valueHasSelectorString || empty($info['subfields'])) ? ' selected' : '';
|
||||||
|
Reference in New Issue
Block a user