mirror of
https://github.com/silverstripe/silverstripe-framework
synced 2024-10-22 14:05:37 +02:00
NEW Scaffolded field labels now only have an uppercased first word
This commit is contained in:
parent
7cb8256fa0
commit
394dd4765c
@ -295,8 +295,8 @@ class FormField extends RequestHandler
|
|||||||
*
|
*
|
||||||
* Examples:
|
* Examples:
|
||||||
*
|
*
|
||||||
* - 'TotalAmount' will return 'Total Amount'
|
* - 'TotalAmount' will return 'Total amount'
|
||||||
* - 'Organisation.ZipCode' will return 'Organisation Zip Code'
|
* - 'Organisation.ZipCode' will return 'Organisation zip code'
|
||||||
*
|
*
|
||||||
* @param string $fieldName
|
* @param string $fieldName
|
||||||
*
|
*
|
||||||
@ -304,15 +304,27 @@ class FormField extends RequestHandler
|
|||||||
*/
|
*/
|
||||||
public static function name_to_label($fieldName)
|
public static function name_to_label($fieldName)
|
||||||
{
|
{
|
||||||
|
// Handle dot delimiters
|
||||||
if (strpos($fieldName, '.') !== false) {
|
if (strpos($fieldName, '.') !== false) {
|
||||||
$parts = explode('.', $fieldName);
|
$parts = explode('.', $fieldName);
|
||||||
|
// Ensure that any letter following a dot is uppercased, so that the regex below can break it up
|
||||||
$label = $parts[count($parts) - 2] . ' ' . $parts[count($parts) - 1];
|
// into words
|
||||||
|
$label = implode(array_map('ucfirst', $parts));
|
||||||
} else {
|
} else {
|
||||||
$label = $fieldName;
|
$label = $fieldName;
|
||||||
}
|
}
|
||||||
|
|
||||||
return preg_replace('/([a-z]+)([A-Z])/', '$1 $2', $label);
|
// Replace any capital letter that is followed by a lowercase letter with a space, the lowercased
|
||||||
|
// version of itself then the remaining lowercase letters.
|
||||||
|
$labelWithSpaces = preg_replace_callback('/([A-Z])([a-z]+)/', function ($matches) {
|
||||||
|
return ' ' . strtolower($matches[1]) . $matches[2];
|
||||||
|
}, $label);
|
||||||
|
|
||||||
|
// Add a space before any capital letter block that is at the end of the string
|
||||||
|
$labelWithSpaces = preg_replace('/([a-z])([A-Z]+)$/', '$1 $2', $labelWithSpaces);
|
||||||
|
|
||||||
|
// The first letter should be uppercase
|
||||||
|
return ucfirst(trim($labelWithSpaces));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -482,29 +482,29 @@ class FieldListTest extends SapphireTest
|
|||||||
);
|
);
|
||||||
|
|
||||||
$this->assertEquals(
|
$this->assertEquals(
|
||||||
$tabSetWithTitle->Title(),
|
|
||||||
'My TabSet Title',
|
'My TabSet Title',
|
||||||
'Automatic conversion of tab identifiers through findOrMakeTab() with FormField::name_to_label()'
|
$tabSetWithTitle->Title(),
|
||||||
|
'Existing field title should be used'
|
||||||
);
|
);
|
||||||
|
|
||||||
$tabWithoutTitle = $set->findOrMakeTab('Root.TabWithoutTitle');
|
$tabWithoutTitle = $set->findOrMakeTab('Root.TabWithoutTitle');
|
||||||
$this->assertEquals(
|
$this->assertEquals(
|
||||||
|
'Tab without title',
|
||||||
$tabWithoutTitle->Title(),
|
$tabWithoutTitle->Title(),
|
||||||
'Tab Without Title',
|
|
||||||
'Automatic conversion of tab identifiers through findOrMakeTab() with FormField::name_to_label()'
|
'Automatic conversion of tab identifiers through findOrMakeTab() with FormField::name_to_label()'
|
||||||
);
|
);
|
||||||
|
|
||||||
$tabWithTitle = $set->findOrMakeTab('Root.TabWithTitle', 'My Tab with Title');
|
$tabWithTitle = $set->findOrMakeTab('Root.TabWithTitle', 'My Tab with Title');
|
||||||
$this->assertEquals(
|
$this->assertEquals(
|
||||||
$tabWithTitle->Title(),
|
|
||||||
'My Tab with Title',
|
'My Tab with Title',
|
||||||
|
$tabWithTitle->Title(),
|
||||||
'Setting of simple tab titles through findOrMakeTab()'
|
'Setting of simple tab titles through findOrMakeTab()'
|
||||||
);
|
);
|
||||||
|
|
||||||
$childTabWithTitle = $set->findOrMakeTab('Root.TabSetWithoutTitle.NewChildTab', 'My Child Tab Title');
|
$childTabWithTitle = $set->findOrMakeTab('Root.TabSetWithoutTitle.NewChildTab', 'My Child Tab Title');
|
||||||
$this->assertEquals(
|
$this->assertEquals(
|
||||||
$childTabWithTitle->Title(),
|
|
||||||
'My Child Tab Title',
|
'My Child Tab Title',
|
||||||
|
$childTabWithTitle->Title(),
|
||||||
'Setting of nested tab titles through findOrMakeTab() works on last child tab'
|
'Setting of nested tab titles through findOrMakeTab() works on last child tab'
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -402,4 +402,31 @@ class FormFieldTest extends SapphireTest
|
|||||||
$field = new FormField('Test');
|
$field = new FormField('Test');
|
||||||
$field->Link('bar');
|
$field->Link('bar');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $name
|
||||||
|
* @param string $expected
|
||||||
|
* @dataProvider nameToLabelProvider
|
||||||
|
*/
|
||||||
|
public function testNameToLabel($name, $expected)
|
||||||
|
{
|
||||||
|
$this->assertSame($expected, FormField::name_to_label($name));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return array[]
|
||||||
|
*/
|
||||||
|
public function nameToLabelProvider()
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
['TotalAmount', 'Total amount'],
|
||||||
|
['Organisation.ZipCode', 'Organisation zip code'],
|
||||||
|
['Organisation.zipCode', 'Organisation zip code'],
|
||||||
|
['FooBarBaz', 'Foo bar baz'],
|
||||||
|
['URLSegment', 'URL segment'],
|
||||||
|
['ONLYCAPS', 'ONLYCAPS'],
|
||||||
|
['onlylower', 'Onlylower'],
|
||||||
|
['SpecialURL', 'Special URL'],
|
||||||
|
];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -415,7 +415,7 @@ class FormTest extends FunctionalTest
|
|||||||
// Firstly, assert that required fields still work when not using an exempt action
|
// Firstly, assert that required fields still work when not using an exempt action
|
||||||
$this->assertPartialMatchBySelector(
|
$this->assertPartialMatchBySelector(
|
||||||
'#Form_Form_SomeRequiredField_Holder .required',
|
'#Form_Form_SomeRequiredField_Holder .required',
|
||||||
array('"Some Required Field" is required'),
|
array('"Some required field" is required'),
|
||||||
'Required fields show a notification on field when left blank'
|
'Required fields show a notification on field when left blank'
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -487,7 +487,7 @@ class FormTest extends FunctionalTest
|
|||||||
$this->assertPartialMatchBySelector(
|
$this->assertPartialMatchBySelector(
|
||||||
'#Form_Form_SomeRequiredField_Holder span.required',
|
'#Form_Form_SomeRequiredField_Holder span.required',
|
||||||
array(
|
array(
|
||||||
'"Some Required Field" is required'
|
'"Some required field" is required'
|
||||||
),
|
),
|
||||||
'Required fields show a notification on field when left blank'
|
'Required fields show a notification on field when left blank'
|
||||||
);
|
);
|
||||||
|
@ -102,7 +102,7 @@ class i18nTest extends SapphireTest
|
|||||||
$obj->fieldLabel('MyProperty')
|
$obj->fieldLabel('MyProperty')
|
||||||
);
|
);
|
||||||
$this->assertEquals(
|
$this->assertEquals(
|
||||||
'My Untranslated Property',
|
'My untranslated property',
|
||||||
$obj->fieldLabel('MyUntranslatedProperty')
|
$obj->fieldLabel('MyUntranslatedProperty')
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user