mirror of
https://github.com/silverstripe/silverstripe-framework
synced 2024-10-22 14:05:37 +02:00
Merge branch 'master' into pulls/4.0/remove-deprecated-methods
This commit is contained in:
commit
33119a1f36
@ -290,8 +290,6 @@ mappings:
|
|||||||
CheckboxSetField: SilverStripe\Forms\CheckboxSetField
|
CheckboxSetField: SilverStripe\Forms\CheckboxSetField
|
||||||
CompositeField: SilverStripe\Forms\CompositeField
|
CompositeField: SilverStripe\Forms\CompositeField
|
||||||
ConfirmedPasswordField: SilverStripe\Forms\ConfirmedPasswordField
|
ConfirmedPasswordField: SilverStripe\Forms\ConfirmedPasswordField
|
||||||
CountryDropdownField: SilverStripe\Forms\CountryDropdownField
|
|
||||||
CreditCardField: SilverStripe\Forms\CreditCardField
|
|
||||||
CurrencyField: SilverStripe\Forms\CurrencyField
|
CurrencyField: SilverStripe\Forms\CurrencyField
|
||||||
CurrencyField_Readonly: SilverStripe\Forms\CurrencyField_Readonly
|
CurrencyField_Readonly: SilverStripe\Forms\CurrencyField_Readonly
|
||||||
CurrencyField_Disabled: SilverStripe\Forms\CurrencyField_Disabled
|
CurrencyField_Disabled: SilverStripe\Forms\CurrencyField_Disabled
|
||||||
@ -317,13 +315,10 @@ mappings:
|
|||||||
GroupedDropdownField: SilverStripe\Forms\GroupedDropdownField
|
GroupedDropdownField: SilverStripe\Forms\GroupedDropdownField
|
||||||
HeaderField: SilverStripe\Forms\HeaderField
|
HeaderField: SilverStripe\Forms\HeaderField
|
||||||
HiddenField: SilverStripe\Forms\HiddenField
|
HiddenField: SilverStripe\Forms\HiddenField
|
||||||
InlineFormAction: SilverStripe\Forms\InlineFormAction
|
|
||||||
InlineFormAction_ReadOnly: SilverStripe\Forms\InlineFormAction_ReadOnly
|
|
||||||
LabelField: SilverStripe\Forms\LabelField
|
LabelField: SilverStripe\Forms\LabelField
|
||||||
ListboxField: SilverStripe\Forms\ListboxField
|
ListboxField: SilverStripe\Forms\ListboxField
|
||||||
LiteralField: SilverStripe\Forms\LiteralField
|
LiteralField: SilverStripe\Forms\LiteralField
|
||||||
LookupField: SilverStripe\Forms\LookupField
|
LookupField: SilverStripe\Forms\LookupField
|
||||||
MemberDatetimeOptionsetField: SilverStripe\Forms\MemberDatetimeOptionsetField
|
|
||||||
MoneyField: SilverStripe\Forms\MoneyField
|
MoneyField: SilverStripe\Forms\MoneyField
|
||||||
MultiSelectField: SilverStripe\Forms\MultiSelectField
|
MultiSelectField: SilverStripe\Forms\MultiSelectField
|
||||||
NullableField: SilverStripe\Forms\NullableField
|
NullableField: SilverStripe\Forms\NullableField
|
||||||
@ -331,7 +326,6 @@ mappings:
|
|||||||
NumericField_Readonly: SilverStripe\Forms\NumericField_Readonly
|
NumericField_Readonly: SilverStripe\Forms\NumericField_Readonly
|
||||||
OptionsetField: SilverStripe\Forms\OptionsetField
|
OptionsetField: SilverStripe\Forms\OptionsetField
|
||||||
PasswordField: SilverStripe\Forms\PasswordField
|
PasswordField: SilverStripe\Forms\PasswordField
|
||||||
PhoneNumberField: SilverStripe\Forms\PhoneNumberField
|
|
||||||
PopoverField: SilverStripe\Forms\PopoverField
|
PopoverField: SilverStripe\Forms\PopoverField
|
||||||
PrintableTransformation: SilverStripe\Forms\PrintableTransformation
|
PrintableTransformation: SilverStripe\Forms\PrintableTransformation
|
||||||
PrintableTransformation_TabSet: SilverStripe\Forms\PrintableTransformation_TabSet
|
PrintableTransformation_TabSet: SilverStripe\Forms\PrintableTransformation_TabSet
|
||||||
@ -636,7 +630,6 @@ mappings:
|
|||||||
GridFieldTest_HTMLFragments: SilverStripe\Forms\Tests\GridField\GridFieldTest\HTMLFragments
|
GridFieldTest_HTMLFragments: SilverStripe\Forms\Tests\GridField\GridFieldTest\HTMLFragments
|
||||||
GridFieldTest_Permissions: SilverStripe\Forms\Tests\GridField\GridFieldTest\Permissions
|
GridFieldTest_Permissions: SilverStripe\Forms\Tests\GridField\GridFieldTest\Permissions
|
||||||
GroupedDropdownFieldTest: SilverStripe\Forms\Tests\GroupedDropdownFieldTest
|
GroupedDropdownFieldTest: SilverStripe\Forms\Tests\GroupedDropdownFieldTest
|
||||||
InlineFormActionTest: SilverStripe\Forms\Tests\InlineFormActionTest
|
|
||||||
ListboxFieldTest: SilverStripe\Forms\Tests\ListboxFieldTest
|
ListboxFieldTest: SilverStripe\Forms\Tests\ListboxFieldTest
|
||||||
ListboxFieldTest_DataObject: SilverStripe\Forms\Tests\ListboxFieldTest\TestObject
|
ListboxFieldTest_DataObject: SilverStripe\Forms\Tests\ListboxFieldTest\TestObject
|
||||||
ListboxFieldTest_Article: SilverStripe\Forms\Tests\ListboxFieldTest\Article
|
ListboxFieldTest_Article: SilverStripe\Forms\Tests\ListboxFieldTest\Article
|
||||||
|
@ -22,10 +22,7 @@ on the SilverStripe API documentation.
|
|||||||
|
|
||||||
## Formatted input
|
## Formatted input
|
||||||
|
|
||||||
* [api:AjaxUniqueTextField]: Text field that automatically checks that the value entered is unique for the given set of fields in a given set of tables.
|
|
||||||
* [api:ConfirmedPasswordField]: Two masked input fields, checks for matching passwords.
|
* [api:ConfirmedPasswordField]: Two masked input fields, checks for matching passwords.
|
||||||
* [api:CountryDropdownField]: A simple extension to dropdown field, pre-configured to list countries.
|
|
||||||
* [api:CreditCardField]: Allows input of credit card numbers via four separate form fields, including generic validation of its numeric values.
|
|
||||||
* [api:CurrencyField]: Text field, validating its input as a currency. Limited to US-centric formats, including a hardcoded currency symbol and decimal separators.
|
* [api:CurrencyField]: Text field, validating its input as a currency. Limited to US-centric formats, including a hardcoded currency symbol and decimal separators.
|
||||||
See [api:MoneyField] for a more flexible implementation.
|
See [api:MoneyField] for a more flexible implementation.
|
||||||
* [api:DateField]: Represents a date in a single input field, or separated into day, month, and year. Can optionally use a calendar popup.
|
* [api:DateField]: Represents a date in a single input field, or separated into day, month, and year. Can optionally use a calendar popup.
|
||||||
@ -36,7 +33,6 @@ on the SilverStripe API documentation.
|
|||||||
* [api:MoneyField]: A form field that can save into a [api:Money] database field.
|
* [api:MoneyField]: A form field that can save into a [api:Money] database field.
|
||||||
* [api:NumericField]: Text input field with validation for numeric values.
|
* [api:NumericField]: Text input field with validation for numeric values.
|
||||||
* [api:OptionsetField]: Set of radio buttons designed to emulate a dropdown.
|
* [api:OptionsetField]: Set of radio buttons designed to emulate a dropdown.
|
||||||
* [api:PhoneNumberField]: Field for displaying phone numbers. It separates the number, the area code and optionally the country code and extension.
|
|
||||||
* [api:SelectionGroup]: SelectionGroup represents a number of fields which are selectable by a radio button that appears at the beginning of each item.
|
* [api:SelectionGroup]: SelectionGroup represents a number of fields which are selectable by a radio button that appears at the beginning of each item.
|
||||||
* [api:TimeField]: Input field with time-specific, localised validation.
|
* [api:TimeField]: Input field with time-specific, localised validation.
|
||||||
|
|
||||||
|
@ -1289,6 +1289,9 @@ After (`mysite/_config/config.yml`):
|
|||||||
* Removed `ModelAsController::find_old_page()`. Use `OldPageRedirector::find_old_page()` instead
|
* Removed `ModelAsController::find_old_page()`. Use `OldPageRedirector::find_old_page()` instead
|
||||||
* Removed `RootURLController:set_default_homepage_link()` and `RootURLController::get_default_homepage_link()`.
|
* Removed `RootURLController:set_default_homepage_link()` and `RootURLController::get_default_homepage_link()`.
|
||||||
Use the `RootURLController.default_homepage_link` config setting instead.
|
Use the `RootURLController.default_homepage_link` config setting instead.
|
||||||
|
* Removed `CreditCardField`, `CountryDropdownField`, `PhoneNumberField`, `MemberDatetimeOptionsetField`, `InlineFormAction`.
|
||||||
|
Use custom code instead
|
||||||
|
* Removed `ResetFormAction`, use `FormAction::create()->setAttribute('type', 'reset')` instead
|
||||||
|
|
||||||
#### <a name="overview-general-deprecated"></a>General and Core Deprecated API
|
#### <a name="overview-general-deprecated"></a>General and Core Deprecated API
|
||||||
|
|
||||||
|
@ -53,7 +53,6 @@ en:
|
|||||||
BAD_METHOD: 'This form requires a {method} submission'
|
BAD_METHOD: 'This form requires a {method} submission'
|
||||||
CSRF_EXPIRED_MESSAGE: 'Your session has expired. Please re-submit the form.'
|
CSRF_EXPIRED_MESSAGE: 'Your session has expired. Please re-submit the form.'
|
||||||
CSRF_FAILED_MESSAGE: 'There seems to have been a technical problem. Please click the back button, refresh your browser, and try again.'
|
CSRF_FAILED_MESSAGE: 'There seems to have been a technical problem. Please click the back button, refresh your browser, and try again.'
|
||||||
VALIDATIONCREDIT: 'Please ensure you have entered the credit card number correctly'
|
|
||||||
VALIDATIONPASSWORDSDONTMATCH: 'Passwords don''t match'
|
VALIDATIONPASSWORDSDONTMATCH: 'Passwords don''t match'
|
||||||
VALIDATIONPASSWORDSNOTEMPTY: 'Passwords can''t be empty'
|
VALIDATIONPASSWORDSNOTEMPTY: 'Passwords can''t be empty'
|
||||||
VALIDATIONSTRONGPASSWORD: 'Passwords must have at least one digit and one alphanumeric character'
|
VALIDATIONSTRONGPASSWORD: 'Passwords must have at least one digit and one alphanumeric character'
|
||||||
@ -161,8 +160,6 @@ en:
|
|||||||
IsNullLabel: 'Is Null'
|
IsNullLabel: 'Is Null'
|
||||||
SilverStripe\Forms\NumericField:
|
SilverStripe\Forms\NumericField:
|
||||||
VALIDATION: '''{value}'' is not a number, only numbers can be accepted for this field'
|
VALIDATION: '''{value}'' is not a number, only numbers can be accepted for this field'
|
||||||
SilverStripe\Forms\PhoneNumberField:
|
|
||||||
VALIDATION: 'Please enter a valid phone number'
|
|
||||||
SilverStripe\Forms\TimeField:
|
SilverStripe\Forms\TimeField:
|
||||||
VALIDATEFORMAT: 'Please enter a valid time format ({format})'
|
VALIDATEFORMAT: 'Please enter a valid time format ({format})'
|
||||||
SilverStripe\ORM\DataObject:
|
SilverStripe\ORM\DataObject:
|
||||||
|
@ -1,82 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace SilverStripe\Forms;
|
|
||||||
|
|
||||||
use SilverStripe\i18n\i18n;
|
|
||||||
use SilverStripe\Security\Member;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A simple extension to dropdown field, pre-configured to list countries.
|
|
||||||
* It will default to the country of the current visitor.
|
|
||||||
*/
|
|
||||||
class CountryDropdownField extends DropdownField
|
|
||||||
{
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Should we default the dropdown to the region determined from the user's locale?
|
|
||||||
*
|
|
||||||
* @config
|
|
||||||
* @var bool
|
|
||||||
*/
|
|
||||||
private static $default_to_locale = true;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The region code to default to if default_to_locale is set to false, or we can't
|
|
||||||
* determine a region from a locale.
|
|
||||||
*
|
|
||||||
* @config
|
|
||||||
* @var string
|
|
||||||
*/
|
|
||||||
private static $default_country = 'NZ';
|
|
||||||
|
|
||||||
protected $extraClasses = array('dropdown');
|
|
||||||
|
|
||||||
protected $schemaDataType = FormField::SCHEMA_DATA_TYPE_SINGLESELECT;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the locale of the Member, or if we're not logged in or don't have a locale, use the default one
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
protected function locale()
|
|
||||||
{
|
|
||||||
if (($member = Member::currentUser()) && $member->Locale) {
|
|
||||||
return $member->Locale;
|
|
||||||
}
|
|
||||||
return i18n::get_locale();
|
|
||||||
}
|
|
||||||
|
|
||||||
public function setSource($source)
|
|
||||||
{
|
|
||||||
if ($source) {
|
|
||||||
return parent::setSource($source);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get sorted countries
|
|
||||||
$source = i18n::getData()->getCountries();
|
|
||||||
return parent::setSource($source);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function Field($properties = array())
|
|
||||||
{
|
|
||||||
$source = $this->getSource();
|
|
||||||
|
|
||||||
// Default value to best availabel locale
|
|
||||||
$value = $this->Value();
|
|
||||||
if (CountryDropdownField::config()->default_to_locale
|
|
||||||
&& (!$value || !isset($source[$value]))
|
|
||||||
&& $this->locale()
|
|
||||||
) {
|
|
||||||
$value = i18n::getData()->countryFromLocale(i18n::get_locale());
|
|
||||||
if ($value) {
|
|
||||||
$this->setValue($value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Default to default country otherwise
|
|
||||||
if (!$value || !isset($source[$value])) {
|
|
||||||
$this->setValue(CountryDropdownField::config()->default_country);
|
|
||||||
}
|
|
||||||
|
|
||||||
return parent::Field($properties);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,121 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace SilverStripe\Forms;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Allows input of credit card numbers via four separate form fields,
|
|
||||||
* including generic validation of its numeric values.
|
|
||||||
*
|
|
||||||
* @todo Validate
|
|
||||||
*/
|
|
||||||
class CreditCardField extends TextField
|
|
||||||
{
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Add default attributes for use on all inputs.
|
|
||||||
*
|
|
||||||
* @return array List of attributes
|
|
||||||
*/
|
|
||||||
public function getAttributes()
|
|
||||||
{
|
|
||||||
return array_merge(
|
|
||||||
parent::getAttributes(),
|
|
||||||
array(
|
|
||||||
'autocomplete' => 'off',
|
|
||||||
'maxlength' => 4,
|
|
||||||
'size' => 4
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function Field($properties = array())
|
|
||||||
{
|
|
||||||
$parts = $this->arrayValue();
|
|
||||||
|
|
||||||
$properties['ValueOne'] = $parts[0];
|
|
||||||
$properties['ValueTwo'] = $parts[1];
|
|
||||||
$properties['ValueThree'] = $parts[2];
|
|
||||||
$properties['ValueFour'] = $parts[3];
|
|
||||||
|
|
||||||
return parent::Field($properties);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get tabindex HTML string
|
|
||||||
*
|
|
||||||
* @param int $increment Increase current tabindex by this value
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function getTabIndexHTML($increment = 0)
|
|
||||||
{
|
|
||||||
// we can't add a tabindex if there hasn't been one set yet.
|
|
||||||
if ($this->getAttribute('tabindex') === null) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
$tabIndex = (int)$this->getAttribute('tabindex') + (int)$increment;
|
|
||||||
return (is_numeric($tabIndex)) ? ' tabindex = "' . $tabIndex . '"' : '';
|
|
||||||
}
|
|
||||||
|
|
||||||
public function dataValue()
|
|
||||||
{
|
|
||||||
if (is_array($this->value)) {
|
|
||||||
return implode("", $this->value);
|
|
||||||
} else {
|
|
||||||
return $this->value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get either list of values, or null
|
|
||||||
*
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public function arrayValue()
|
|
||||||
{
|
|
||||||
if (is_array($this->value)) {
|
|
||||||
return $this->value;
|
|
||||||
}
|
|
||||||
|
|
||||||
$value = $this->dataValue();
|
|
||||||
return $this->parseCreditCard($value);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Parse credit card value into list of four four-digit values
|
|
||||||
*
|
|
||||||
* @param string $value
|
|
||||||
* @return array|null
|
|
||||||
*/
|
|
||||||
protected function parseCreditCard($value)
|
|
||||||
{
|
|
||||||
if (preg_match("/([0-9]{4})([0-9]{4})([0-9]{4})([0-9]{4})/", $value, $parts)) {
|
|
||||||
return [ $parts[1], $parts[2], $parts[3], $parts[4] ];
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function validate($validator)
|
|
||||||
{
|
|
||||||
$value = $this->dataValue();
|
|
||||||
if (empty($value)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check if format is valid
|
|
||||||
if ($this->parseCreditCard($value)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Format is invalid
|
|
||||||
$validator->validationError(
|
|
||||||
$this->name,
|
|
||||||
_t(
|
|
||||||
'SilverStripe\\Forms\\Form.VALIDATIONCREDIT',
|
|
||||||
"Please ensure you have entered the credit card number correctly"
|
|
||||||
),
|
|
||||||
"validation"
|
|
||||||
);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
@ -175,7 +175,11 @@ class FormAction extends FormField
|
|||||||
|
|
||||||
public function getAttributes()
|
public function getAttributes()
|
||||||
{
|
{
|
||||||
$type = (isset($this->attributes['src'])) ? 'image' : 'submit';
|
if (isset($this->attributes['type'])) {
|
||||||
|
$type = $this->attributes['type'];
|
||||||
|
} else {
|
||||||
|
$type = (isset($this->attributes['src'])) ? 'image' : 'submit';
|
||||||
|
}
|
||||||
|
|
||||||
return array_merge(
|
return array_merge(
|
||||||
parent::getAttributes(),
|
parent::getAttributes(),
|
||||||
|
@ -1,55 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace SilverStripe\Forms;
|
|
||||||
|
|
||||||
use SilverStripe\View\Requirements;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Render a button that will submit the form its contained in through ajax.
|
|
||||||
*
|
|
||||||
* Caution: The form field does not include any JavaScript or CSS when used outside of the CMS context,
|
|
||||||
* since the required frontend dependencies are included through CMS bundling.
|
|
||||||
*
|
|
||||||
* @see framework/client/dist/js/InlineFormAction.js
|
|
||||||
*/
|
|
||||||
class InlineFormAction extends FormField
|
|
||||||
{
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a new action button.
|
|
||||||
*
|
|
||||||
* @param string $action The method to call when the button is clicked
|
|
||||||
* @param string $title The label on the button
|
|
||||||
* @param string $extraClass A CSS class to apply to the button in addition to 'action'
|
|
||||||
*/
|
|
||||||
public function __construct($action, $title = "", $extraClass = '')
|
|
||||||
{
|
|
||||||
$this->extraClass = ' '.$extraClass;
|
|
||||||
parent::__construct($action, $title);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function performReadonlyTransformation()
|
|
||||||
{
|
|
||||||
return $this->castedCopy('SilverStripe\\Forms\\InlineFormAction_ReadOnly');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param array $properties
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function Field($properties = array())
|
|
||||||
{
|
|
||||||
return FormField::create_tag('input', array(
|
|
||||||
'type' => 'submit',
|
|
||||||
'name' => sprintf('action_%s', $this->getName()),
|
|
||||||
'value' => $this->title,
|
|
||||||
'id' => $this->ID(),
|
|
||||||
'class' => sprintf('action%s', $this->extraClass),
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
public function Title()
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,33 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace SilverStripe\Forms;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Readonly version of {@link InlineFormAction}.
|
|
||||||
*/
|
|
||||||
class InlineFormAction_ReadOnly extends FormField
|
|
||||||
{
|
|
||||||
|
|
||||||
protected $readonly = true;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param array $properties
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function Field($properties = array())
|
|
||||||
{
|
|
||||||
return FormField::create_tag('input', array(
|
|
||||||
'type' => 'submit',
|
|
||||||
'name' => sprintf('action_%s', $this->name),
|
|
||||||
'value' => $this->title,
|
|
||||||
'id' => $this->ID(),
|
|
||||||
'disabled' => 'disabled',
|
|
||||||
'class' => 'action disabled ' . $this->extraClass,
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
public function Title()
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,279 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace SilverStripe\Forms;
|
|
||||||
|
|
||||||
use SilverStripe\ORM\DataObjectInterface;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Field for displaying phone numbers. It separates the number, the area code and optionally the country code
|
|
||||||
* and extension.
|
|
||||||
*/
|
|
||||||
class PhoneNumberField extends FieldGroup
|
|
||||||
{
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Default area code
|
|
||||||
*
|
|
||||||
* @var string
|
|
||||||
*/
|
|
||||||
protected $areaCode;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Default country code
|
|
||||||
* @var string
|
|
||||||
*/
|
|
||||||
protected $countryCode;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Default extension
|
|
||||||
*
|
|
||||||
* @var string
|
|
||||||
*/
|
|
||||||
protected $ext;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return NumericField
|
|
||||||
*/
|
|
||||||
public function getCountryField()
|
|
||||||
{
|
|
||||||
return $this->getChildField('Country');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return NumericField
|
|
||||||
*/
|
|
||||||
public function getAreaField()
|
|
||||||
{
|
|
||||||
return $this->getChildField('Area');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return NumericField
|
|
||||||
*/
|
|
||||||
public function getNumberField()
|
|
||||||
{
|
|
||||||
return $this->getChildField('Number');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return NumericField
|
|
||||||
*/
|
|
||||||
public function getExtensionField()
|
|
||||||
{
|
|
||||||
/** @skipUpgrade */
|
|
||||||
return $this->getChildField('Extension');
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function getChildField($name)
|
|
||||||
{
|
|
||||||
$endsWith = "[{$name}]";
|
|
||||||
foreach ($this->getChildren() as $child) {
|
|
||||||
|
|
||||||
/** @var Formfield $child */
|
|
||||||
if (substr($child->getName(), 0 - strlen($endsWith)) === $endsWith) {
|
|
||||||
return $child;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function __construct(
|
|
||||||
$name,
|
|
||||||
$title = null,
|
|
||||||
$value = '',
|
|
||||||
$extension = null,
|
|
||||||
$areaCode = null,
|
|
||||||
$countryCode = null
|
|
||||||
) {
|
|
||||||
$this->areaCode = $areaCode;
|
|
||||||
$this->ext = $extension;
|
|
||||||
$this->countryCode = $countryCode;
|
|
||||||
|
|
||||||
// Build fields
|
|
||||||
$fields = new FieldList();
|
|
||||||
if ($this->countryCode !== null) {
|
|
||||||
$countryField = NumericField::create($name.'[Country]', false, $countryCode, 4)
|
|
||||||
->addExtraClass('phonenumber-field__country');
|
|
||||||
$fields->push($countryField);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($this->areaCode !== null) {
|
|
||||||
$areaField = NumericField::create($name.'[Area]', false, $areaCode, 4)
|
|
||||||
->addExtraClass('phonenumber-field__area');
|
|
||||||
$fields->push($areaField);
|
|
||||||
}
|
|
||||||
$numberField = NumericField::create($name.'[Number]', false, null, 10)
|
|
||||||
->addExtraClass('phonenumber-field__number');
|
|
||||||
$fields->push($numberField);
|
|
||||||
|
|
||||||
if ($this->ext !== null) {
|
|
||||||
$extensionField = NumericField::create($name.'[Extension]', false, $extension, 6)
|
|
||||||
->addExtraClass('phonenumber-field__extension');
|
|
||||||
$fields->push($extensionField);
|
|
||||||
}
|
|
||||||
|
|
||||||
parent::__construct($title, $fields);
|
|
||||||
|
|
||||||
$this->setName($name);
|
|
||||||
if (isset($value)) {
|
|
||||||
$this->setValue($value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public function setName($name)
|
|
||||||
{
|
|
||||||
parent::setName($name);
|
|
||||||
foreach ($this->getChildren() as $child) {
|
|
||||||
/** @var FormField $child */
|
|
||||||
$thisName = $child->getName();
|
|
||||||
$thisName = preg_replace('/^.*(\[\\w+\\])$/', $name . '\\1', $thisName);
|
|
||||||
$child->setName($thisName);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public function hasData()
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param array $properties
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function Field($properties = array())
|
|
||||||
{
|
|
||||||
foreach ($this->getChildren() as $field) {
|
|
||||||
/** @var FormField $field */
|
|
||||||
$field->setDisabled($this->isDisabled());
|
|
||||||
$field->setReadonly($this->IsReadonly());
|
|
||||||
$field->setForm($this->getForm());
|
|
||||||
}
|
|
||||||
return parent::Field($properties);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function setValue($value, $data = null)
|
|
||||||
{
|
|
||||||
$this->value = self::joinPhoneNumber($value);
|
|
||||||
$parts = $this->parseValue();
|
|
||||||
if ($countryField = $this->getCountryField()) {
|
|
||||||
$countryField->setValue($parts['Country']);
|
|
||||||
}
|
|
||||||
if ($areaField = $this->getAreaField()) {
|
|
||||||
$areaField->setValue($parts['Area']);
|
|
||||||
}
|
|
||||||
$this->getNumberField()->setValue($parts['Number']);
|
|
||||||
if ($extensionField = $this->getExtensionField()) {
|
|
||||||
/** @skipUpgrade */
|
|
||||||
$extensionField->setValue($parts['Extension']);
|
|
||||||
}
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Join phone number into a string
|
|
||||||
*
|
|
||||||
* @param array|string $value Input
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public static function joinPhoneNumber($value)
|
|
||||||
{
|
|
||||||
if (is_array($value)) {
|
|
||||||
$completeNumber = '';
|
|
||||||
if (!empty($value['Country'])) {
|
|
||||||
$completeNumber .= '+' . $value['Country'];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!empty($value['Area'])) {
|
|
||||||
$completeNumber .= '(' . $value['Area'] . ')';
|
|
||||||
}
|
|
||||||
|
|
||||||
$completeNumber .= $value['Number'];
|
|
||||||
|
|
||||||
/** @skipUpgrade */
|
|
||||||
if (!empty($value['Extension'])) {
|
|
||||||
$completeNumber .= '#' . $value['Extension'];
|
|
||||||
}
|
|
||||||
|
|
||||||
return $completeNumber;
|
|
||||||
} else {
|
|
||||||
return $value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns array with parsed phone format
|
|
||||||
*
|
|
||||||
* @return array Array with Country, Area, Number, and Extension keys (in order)
|
|
||||||
*/
|
|
||||||
protected function parseValue()
|
|
||||||
{
|
|
||||||
if (is_array($this->value)) {
|
|
||||||
return $this->value;
|
|
||||||
}
|
|
||||||
// Parse value in form "+ countrycode (areacode) phone # extension"
|
|
||||||
$valid = preg_match(
|
|
||||||
'/^(?:(?:\+(?<Country>\d+))?\s*\((?<Area>\d+)\))?\s*(?<Number>[0-9A-Za-z]*)\s*(?:[#]\s*(?<Extension>\d+))?$/',
|
|
||||||
$this->value,
|
|
||||||
$parts
|
|
||||||
);
|
|
||||||
if (!$valid) {
|
|
||||||
$parts = [];
|
|
||||||
}
|
|
||||||
/** @skipUpgrade */
|
|
||||||
return array(
|
|
||||||
'Country' => isset($parts['Country']) ? $parts['Country'] : '',
|
|
||||||
'Area' => isset($parts['Area']) ? $parts['Area'] : '',
|
|
||||||
'Number' => isset($parts['Number']) ? $parts['Number'] : '',
|
|
||||||
'Extension' => isset($parts['Extension']) ? $parts['Extension'] : '',
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function saveInto(DataObjectInterface $record)
|
|
||||||
{
|
|
||||||
$completeNumber = static::joinPhoneNumber($this->parseValue());
|
|
||||||
$record->setCastedField($this->getName(), $completeNumber);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Validate this field
|
|
||||||
*
|
|
||||||
* @todo Very basic validation at the moment
|
|
||||||
*
|
|
||||||
* @param Validator $validator
|
|
||||||
* @return bool
|
|
||||||
*/
|
|
||||||
public function validate($validator)
|
|
||||||
{
|
|
||||||
$valid = preg_match(
|
|
||||||
'/^[0-9\+\-\(\)\s\#]*$/',
|
|
||||||
$this->joinPhoneNumber($this->value)
|
|
||||||
);
|
|
||||||
|
|
||||||
if (!$valid) {
|
|
||||||
$validator->validationError(
|
|
||||||
$this->name,
|
|
||||||
_t('SilverStripe\\Forms\\PhoneNumberField.VALIDATION', "Please enter a valid phone number"),
|
|
||||||
"validation"
|
|
||||||
);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function performReadonlyTransformation()
|
|
||||||
{
|
|
||||||
// Just setReadonly without casting to NumericField_Readonly
|
|
||||||
$clone = clone $this;
|
|
||||||
$clone->setReadonly(true);
|
|
||||||
return $clone;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function performDisabledTransformation()
|
|
||||||
{
|
|
||||||
// Just setDisabled without casting to NumericField_Disabled
|
|
||||||
$clone = clone $this;
|
|
||||||
$clone->setDisabled(true);
|
|
||||||
return $clone;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,24 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace SilverStripe\Forms;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Action that clears all fields on a form.
|
|
||||||
* Inserts an input tag with type=reset.
|
|
||||||
*/
|
|
||||||
class ResetFormAction extends FormAction
|
|
||||||
{
|
|
||||||
|
|
||||||
public function getAttributes()
|
|
||||||
{
|
|
||||||
return array_merge(
|
|
||||||
parent::getAttributes(),
|
|
||||||
array('type' => 'reset')
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function Type()
|
|
||||||
{
|
|
||||||
return 'resetformaction';
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,9 +0,0 @@
|
|||||||
<span id="{$Name}_Holder" class="creditCardField">
|
|
||||||
<input $getAttributesHTML('id', 'name', 'value', 'tabindex') name="{$Name}[0]" value="{$ValueOne}" $TabIndexHTML(0)/>
|
|
||||||
-
|
|
||||||
<input $getAttributesHTML('id', 'name', 'value', 'tabindex') name="{$Name}[1]" value="{$ValueTwo}" $TabIndexHTML(1)/>
|
|
||||||
-
|
|
||||||
<input $getAttributesHTML('id', 'name', 'value', 'tabindex') name="{$Name}[2]" value="{$ValueThree}" $TabIndexHTML(2)/>
|
|
||||||
-
|
|
||||||
<input $getAttributesHTML('id', 'name', 'value', 'tabindex') name="{$Name}[3]" value="{$ValueFour}" $TabIndexHTML(3)/>
|
|
||||||
</span>
|
|
@ -1,25 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace SilverStripe\Forms\Tests;
|
|
||||||
|
|
||||||
use SilverStripe\Dev\SapphireTest;
|
|
||||||
use SilverStripe\Forms\InlineFormAction;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Tests {@see InlineFormAction}
|
|
||||||
*/
|
|
||||||
class InlineFormActionTest extends SapphireTest
|
|
||||||
{
|
|
||||||
|
|
||||||
public function testField()
|
|
||||||
{
|
|
||||||
$action = new InlineFormAction('dothing', 'My Title', 'ss-action');
|
|
||||||
$html = (string)$action->Field();
|
|
||||||
$this->assertContains('<input', $html);
|
|
||||||
$this->assertContains('type="submit"', $html);
|
|
||||||
$this->assertContains('name="action_dothing"', $html);
|
|
||||||
$this->assertContains('value="My Title"', $html);
|
|
||||||
$this->assertContains('id="dothing"', $html);
|
|
||||||
$this->assertContains('class="action ss-action"', $html);
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user