Merge pull request #11150 from beerbohmdo/allow_override_moneyfield

Allow better subclassing of MoneyField
This commit is contained in:
Guy Sartorelli 2024-02-26 11:20:11 +13:00 committed by GitHub
commit c2b606c24c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 44 additions and 5 deletions

View File

@ -59,11 +59,7 @@ class MoneyField extends FormField
public function __construct($name, $title = null, $value = "")
{
$this->setName($name);
$this->fieldAmount = NumericField::create(
"{$name}[Amount]",
_t('SilverStripe\\Forms\\MoneyField.FIELDLABELAMOUNT', 'Amount')
)
->setScale(2);
$this->buildAmountField();
$this->buildCurrencyField();
parent::__construct($name, $title, $value);
@ -75,6 +71,18 @@ class MoneyField extends FormField
$this->fieldCurrency = clone $this->fieldCurrency;
}
/**
* Builds a field to input the amount of money
*/
protected function buildAmountField(): void
{
$this->fieldAmount = NumericField::create(
$this->name . '[Amount]',
_t('SilverStripe\\Forms\\MoneyField.FIELDLABELAMOUNT', 'Amount')
)
->setScale(2);
}
/**
* Builds a new currency field based on the allowed currencies configured
*

View File

@ -2,9 +2,13 @@
namespace SilverStripe\Forms\Tests;
use SilverStripe\Forms\DropdownField;
use SilverStripe\Forms\HiddenField;
use SilverStripe\Forms\NumericField;
use SilverStripe\Forms\RequiredFields;
use SilverStripe\Forms\Tests\MoneyFieldTest\CustomSetter_Object;
use SilverStripe\Forms\Tests\MoneyFieldTest\TestObject;
use SilverStripe\Forms\TextField;
use SilverStripe\ORM\FieldType\DBMoney;
use SilverStripe\Dev\SapphireTest;
use SilverStripe\Forms\MoneyField;
@ -127,4 +131,31 @@ class MoneyFieldTest extends SapphireTest
]);
$this->assertFalse($field->validate($validator));
}
public function testGetCurrencyField(): void
{
$field = new MoneyField('Money');
$field->setAllowedCurrencies(['NZD', 'USD']);
$this->assertInstanceOf(DropdownField::class, $field->getCurrencyField());
$this->assertEquals('Money[Currency]', $field->getCurrencyField()->getName());
$field->setAllowedCurrencies(['USD']);
$this->assertInstanceOf(HiddenField::class, $field->getCurrencyField());
$this->assertEquals('Money[Currency]', $field->getCurrencyField()->getName());
$field->setAllowedCurrencies([]);
$this->assertInstanceOf(TextField::class, $field->getCurrencyField());
$this->assertEquals('Money[Currency]', $field->getCurrencyField()->getName());
}
public function testGetAmountField(): void
{
$field = new MoneyField('Money');
$this->assertInstanceOf(NumericField::class, $field->getAmountField());
$this->assertEquals(2, $field->getAmountField()->getScale());
$this->assertEquals('Money[Amount]', $field->getAmountField()->getName());
}
}