silverstripe-framework/forms/CountryDropdownField.php
Matthew Hailwood 445aba2a56 Do not default to locale if hasEmptyDefault is true
Currently there is no per-instance way to say "don't default to the current locale".
If you've explicitly said "This field right here, it has an empty default value" then we should probably respect that.
2017-03-09 12:35:37 +13:00

78 lines
2.2 KiB
PHP

<?php
/**
* A simple extension to dropdown field, pre-configured to list countries.
* It will default to the country of the current visitor.
*
* @package forms
* @subpackage fields-relational
*/
class CountryDropdownField extends DropdownField {
/**
* Should we default the dropdown to the region determined from the user's locale?
* @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
* @var string
*/
private static $default_country = 'NZ';
protected $extraClasses = array('dropdown');
/**
* 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 __construct($name, $title = null, $source = null, $value = "", $form=null) {
if(!is_array($source)) {
// Get a list of countries from Zend
$source = Zend_Locale::getTranslationList('territory', $this->locale(), 2);
// We want them ordered by display name, not country code
// PHP 5.3 has an extension that sorts UTF-8 strings correctly
if (class_exists('Collator') && ($collator = Collator::create($this->locale()))) {
$collator->asort($source);
}
// Otherwise just put up with them being weirdly ordered for now
else {
asort($source);
}
// We don't want "unknown country" as an option
unset($source['ZZ']);
}
parent::__construct($name, ($title===null) ? $name : $title, $source, $value, $form);
}
public function Field($properties = array()) {
$source = $this->getSource();
if(!$this->getHasEmptyDefault()){
if (!$this->value || !isset($source[$this->value])) {
if ($this->config()->default_to_locale && $this->locale()) {
$locale = new Zend_Locale();
$locale->setLocale($this->locale());
$this->value = $locale->getRegion();
}
}
if (!$this->value || !isset($source[$this->value])) {
$this->value = $this->config()->default_country;
}
}
return parent::Field();
}
}