From 6b5289ac3fa9a4d03b394c08eb301f06043915e5 Mon Sep 17 00:00:00 2001
From: Guy Sartorelli <36352093+GuySartorelli@users.noreply.github.com>
Date: Thu, 15 Aug 2024 13:15:07 +1200
Subject: [PATCH] FIX Update CMS fields now that they're being scaffolded (#95)

---
 lang/en.yml        | 18 +++++-----
 src/IFramePage.php | 90 ++++++++++++++++++++--------------------------
 2 files changed, 47 insertions(+), 61 deletions(-)

diff --git a/lang/en.yml b/lang/en.yml
index 1d1e4cf..152778c 100644
--- a/lang/en.yml
+++ b/lang/en.yml
@@ -10,12 +10,12 @@ en:
     SINGULARNAME: 'IFrame Page'
     TITLE_DESCRIPTION: 'Used by screen readers'
     VALIDATION_BANNEDURLSCHEME: 'This URL scheme is not allowed.'
-    db_AlternateContent: 'Alternate content'
-    db_AutoHeight: 'Auto height'
-    db_AutoWidth: 'Auto width'
-    db_BottomContent: 'Bottom content'
-    db_FixedHeight: 'Fixed height'
-    db_FixedWidth: 'Fixed width'
-    db_ForceProtocol: 'Force protocol'
-    db_IFrameTitle: 'I frame title'
-    db_IFrameURL: 'I frame URL'
+    db_AlternateContent: 'Alternate Content (appears when user has iframes disabled)'
+    db_AutoHeight: 'Auto height (only works with same domain URLs)'
+    db_AutoWidth: 'Auto width (100% of the available space)'
+    db_BottomContent: 'Content (appears below iframe)'
+    db_FixedHeight: 'Fixed height (in pixels)'
+    db_FixedWidth: 'Fixed width (in pixels)'
+    db_ForceProtocol: 'Force protocol?'
+    db_IFrameTitle: 'Description of contents (title)'
+    db_IFrameURL: 'Iframe URL'
diff --git a/src/IFramePage.php b/src/IFramePage.php
index 2715c52..f49c63d 100644
--- a/src/IFramePage.php
+++ b/src/IFramePage.php
@@ -3,11 +3,9 @@
 namespace SilverStripe\IFrame;
 
 use Page;
-use SilverStripe\Forms\TextField;
 use SilverStripe\Forms\DropdownField;
-use SilverStripe\Forms\CheckboxField;
-use SilverStripe\Forms\NumericField;
-use SilverStripe\Forms\HTMLEditor\HtmlEditorField;
+use SilverStripe\Forms\FieldList;
+use SilverStripe\Forms\TextField;
 use SilverStripe\ORM\FieldType\DBField;
 use SilverStripe\ORM\ValidationException;
 use SilverStripe\ORM\ValidationResult;
@@ -20,15 +18,15 @@
 class IFramePage extends Page
 {
     private static $db = array(
+        'ForceProtocol' => 'Varchar',
         'IFrameURL' => 'Text',
         'IFrameTitle' => 'Varchar',
         'AutoHeight' => 'Boolean(1)',
         'AutoWidth' => 'Boolean(1)',
         'FixedHeight' => 'Int(500)',
         'FixedWidth' => 'Int(0)',
-        'AlternateContent' => 'HTMLText',
         'BottomContent' => 'HTMLText',
-        'ForceProtocol' => 'Varchar',
+        'AlternateContent' => 'HTMLText',
     );
 
     private static $defaults = array(
@@ -46,52 +44,40 @@ class IFramePage extends Page
 
     public function getCMSFields()
     {
-        $fields = parent::getCMSFields();
-
-        $fields->removeFieldFromTab('Root.Main', 'Content');
-        $fields->addFieldsToTab('Root.Main', [
-            $url = TextField::create('IFrameURL', 'Iframe URL'),
-            TextField::create('IFrameTitle', 'Description of contents (title)')
-                ->setDescription(_t(__CLASS__ . '.TITLE_DESCRIPTION', 'Used by screen readers')),
-        ]);
-        $url->setRightTitle(
-            DBField::create_field(
-                'HTMLText',
-                'Can be absolute (<em>http://silverstripe.com</em>) or relative to this site (<em>about-us</em>).'
-            )
-        );
-        $fields->addFieldToTab(
-            'Root.Main',
-            DropdownField::create('ForceProtocol', 'Force protocol?')
-                ->setSource(array('http://' => 'http://', 'https://' => 'https://'))
-                ->setEmptyString('')
-                ->setDescription(
-                    'Avoids mixed content warnings when iframe content is just available under a specific protocol'
-                ),
-            'Metadata'
-        );
-        $fields->addFieldsToTab('Root.Main', [
-            CheckboxField::create('AutoHeight', 'Auto height (only works with same domain URLs)'),
-            CheckboxField::create('AutoWidth', 'Auto width (100% of the available space)'),
-            NumericField::create('FixedHeight', 'Fixed height (in pixels)'),
-            NumericField::create('FixedWidth', 'Fixed width (in pixels)'),
-            HtmlEditorField::create('Content', 'Content (appears above iframe)'),
-            HtmlEditorField::create('BottomContent', 'Content (appears below iframe)'),
-            HtmlEditorField::create('AlternateContent', 'Alternate Content (appears when user has iframes disabled)')
-        ]);
-
-        // Move the Metadata field to last position, but make a check for it's
-        // existence first.
-        //
-        // See https://github.com/silverstripe-labs/silverstripe-iframe/issues/18
-        $mainTab = $fields->findOrMakeTab('Root.Main');
-        $mainTabFields = $mainTab->FieldList();
-        $metaDataField = $mainTabFields->fieldByName('Metadata');
-        if ($metaDataField) {
-            $mainTabFields->removeByName('Metadata');
-            $mainTabFields->push($metaDataField);
-        }
-        return $fields;
+        $this->beforeUpdateCMSFields(function (FieldList $fields) {
+            $fields->replaceField(
+                'IFrameURL',
+                TextField::create('IFrameURL', $this->fieldLabel('IFrameURL'))
+                ->setRightTitle(
+                    DBField::create_field(
+                        'HTMLText',
+                        'Can be absolute (<em>http://silverstripe.com</em>) '
+                        . 'or relative to this site (<em>about-us</em>).'
+                    )
+                )
+            );
+            $fields->dataFieldByName('IFrameTitle')
+                ->setDescription(_t(__CLASS__ . '.TITLE_DESCRIPTION', 'Used by screen readers'));
+            $fields->replaceField(
+                'ForceProtocol',
+                DropdownField::create('ForceProtocol', $this->fieldLabel('ForceProtocol'))
+                    ->setSource(array('http://' => 'http://', 'https://' => 'https://'))
+                    ->setEmptyString('')
+                    ->setDescription(
+                        'Avoids mixed content warnings when iframe content is just available under a specific protocol'
+                    )
+            );
+
+            $contentField = $fields->dataFieldByName('Content');
+            if ($contentField) {
+                $fields->removeByName('Content');
+                $contentField->setTitle(_t(__CLASS__ . '.db_Content', 'Content (appears above iframe)'));
+                $fields->addFieldToTab('Root.Main', $contentField, 'BottomContent');
+            }
+            $fields->dataFieldByName('BottomContent')?->addExtraClass('stacked');
+            $fields->dataFieldByName('AlternateContent')?->addExtraClass('stacked');
+        });
+        return parent::getCMSFields();
     }
 
     /**