From 2cf33bc2d7d5701ecfbea7f0133f12f5b37703d1 Mon Sep 17 00:00:00 2001 From: Sean Harvey Date: Thu, 15 Jul 2010 04:04:06 +0000 Subject: [PATCH] BUGFIX #5833 Duplicate IDs when two similar date formats in Member_DatetimeOptionsetField containing different delimiters (e.g / and .) replaced to an empty string git-svn-id: svn://svn.silverstripe.com/silverstripe/open/modules/sapphire/branches/2.4@108001 467b73ca-7a2a-4603-9d3b-597d59a354a9 --- security/Member.php | 8 +++++--- tests/forms/MemberDatetimeOptionsetFieldTest.php | 6 +++--- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/security/Member.php b/security/Member.php index 73a922c65..fd0e8461e 100755 --- a/security/Member.php +++ b/security/Member.php @@ -1845,7 +1845,8 @@ class Member_DatetimeOptionsetField extends OptionsetField { $source = $this->getSource(); foreach($source as $key => $value) { - $itemID = $this->id() . "_" . ereg_replace('[^a-zA-Z0-9]+', '', $key); + // convert the ID to an HTML safe value (colons are not replaced, as they are valid in an ID attribute) + $itemID = $this->id() . '_' . preg_replace('/[^\.a-zA-Z0-9\-\_]/', '_', $key); if($key == $this->value) { $useValue = false; $checked = " checked=\"checked\""; @@ -1857,8 +1858,9 @@ class Member_DatetimeOptionsetField extends OptionsetField { $extraClass = $odd ? "odd" : "even"; $extraClass .= " val" . preg_replace('/[^a-zA-Z0-9\-\_]/', '_', $key); $disabled = ($this->disabled || in_array($key, $this->disabledItems)) ? "disabled=\"disabled\"" : ""; - - $options .= "
  • name\" type=\"radio\" value=\"$key\"$checked $disabled class=\"radio\" />
  • \n"; + $ATT_key = Convert::raw2att($key); + + $options .= "
  • name\" type=\"radio\" value=\"$key\"$checked $disabled class=\"radio\" />
  • \n"; } // Add "custom" input field diff --git a/tests/forms/MemberDatetimeOptionsetFieldTest.php b/tests/forms/MemberDatetimeOptionsetFieldTest.php index 0f216867f..36e149a49 100644 --- a/tests/forms/MemberDatetimeOptionsetFieldTest.php +++ b/tests/forms/MemberDatetimeOptionsetFieldTest.php @@ -47,7 +47,7 @@ class MemberDatetimeOptionsetFieldTest extends SapphireTest { $field = $this->createDateFormatFieldForMember($this->objFromFixture('Member', 'noformatmember')); $field->setForm(new Form(new MemberDatetimeOptionsetFieldTest_Controller(), 'Form', new FieldSet(), new FieldSet())); // fake form $parser = new CSSContentParser($field->Field()); - $xmlArr = $parser->getBySelector('#Form_Form_DateFormat_MMMdyyyy'); + $xmlArr = $parser->getBySelector('#Form_Form_DateFormat_MMM_d__yyyy'); $this->assertEquals('checked', (string) $xmlArr[0]['checked']); } @@ -55,7 +55,7 @@ class MemberDatetimeOptionsetFieldTest extends SapphireTest { $field = $this->createTimeFormatFieldForMember($this->objFromFixture('Member', 'noformatmember')); $field->setForm(new Form(new MemberDatetimeOptionsetFieldTest_Controller(), 'Form', new FieldSet(), new FieldSet())); // fake form $parser = new CSSContentParser($field->Field()); - $xmlArr = $parser->getBySelector('#Form_Form_TimeFormat_hmmssa'); + $xmlArr = $parser->getBySelector('#Form_Form_TimeFormat_h_mm_ss_a'); $this->assertEquals('checked', (string) $xmlArr[0]['checked']); } @@ -65,7 +65,7 @@ class MemberDatetimeOptionsetFieldTest extends SapphireTest { $field = $this->createDateFormatFieldForMember($member); $field->setForm(new Form(new MemberDatetimeOptionsetFieldTest_Controller(), 'Form', new FieldSet(), new FieldSet())); // fake form $parser = new CSSContentParser($field->Field()); - $xmlArr = $parser->getBySelector('#Form_Form_DateFormat_MMddyyyy'); + $xmlArr = $parser->getBySelector('#Form_Form_DateFormat_MM_dd_yyyy'); $this->assertEquals('checked', (string) $xmlArr[0]['checked']); }