diff --git a/.travis.yml b/.travis.yml index 13ba7a0..2180396 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,14 +11,12 @@ php: - 7.1 env: - - DB=MYSQL CORE_RELEASE=master + - DB=MYSQL CORE_RELEASE=4 matrix: include: - php: 5.6 - env: DB=MYSQL CORE_RELEASE=master - - php: 5.6 - env: DB=PGSQL CORE_RELEASE=master + env: DB=PGSQL CORE_RELEASE=4 before_script: - composer self-update || true diff --git a/README.md b/README.md index 7ade92f..9515b0b 100644 --- a/README.md +++ b/README.md @@ -62,7 +62,7 @@ e.g. WidgetTitle ? $this->WidgetTitle : self::$title; } diff --git a/_config/legacy.yml b/_config/legacy.yml new file mode 100644 index 0000000..25e98c6 --- /dev/null +++ b/_config/legacy.yml @@ -0,0 +1,7 @@ +--- +Name: widgetslegacymapping +--- +SilverStripe\ORM\DatabaseAdmin: + classname_value_remapping: + Widget: SilverStripe\Widgets\Model\Widget + WidgetArea: SilverStripe\Widgets\Model\WidgetArea diff --git a/composer.json b/composer.json index 5065f11..4b5ee42 100644 --- a/composer.json +++ b/composer.json @@ -24,8 +24,10 @@ "autoload": { "psr-4": { "SilverStripe\\Widgets\\": "src/", - "SilverStripe\\Widgets\\Tests\\": "tests/", + "SilverStripe\\Widgets\\Tests\\": "tests/" } }, - "license": "BSD-3-Clause" + "license": "BSD-3-Clause", + "minimum-stability": "dev", + "prefer-stable": true } diff --git a/docs/en/getting-started.md b/docs/en/getting-started.md index 6301b34..f1080e6 100644 --- a/docs/en/getting-started.md +++ b/docs/en/getting-started.md @@ -25,7 +25,7 @@ can enable through your `config.yml`: ```yaml Page: extensions: - - WidgetPageExtension + - SilverStripe\Widgets\Extensions\WidgetPageExtension ``` Run a `dev/build`, and adjust your templates to include the resulting sidebar view. @@ -63,7 +63,7 @@ e.g. widget; - } - - /** - * Overloaded from {@link Widget->Content()} to allow for controller / form - * linking. - * - * @return string HTML - */ - public function Content() - { - return $this->renderWith(array_reverse(ClassInfo::ancestry($this->widget->class))); - } - - /** - * Overloaded from {@link Widget->WidgetHolder()} to allow for controller/ - * form linking. - * - * @return string HTML - */ - public function WidgetHolder() - { - return $this->renderWith("WidgetHolder"); - } - /** * @return Widget */ @@ -167,7 +137,8 @@ class WidgetController extends Controller $leftandmain = LeftAndMain::create(); $leftandmain->doInit(); - $className = $this->urlParams['ID']; + // Decode if fully qualified - @see Widget::ClassName + $className = str_replace('_', '\\', $this->urlParams['ID']); if (class_exists('Translatable') && Member::currentUserID()) { // set current locale based on logged in user's locale $locale = Member::currentUser()->Locale; diff --git a/src/Forms/WidgetAreaEditor.php b/src/Forms/WidgetAreaEditor.php index 758a1ab..b0aeca4 100644 --- a/src/Forms/WidgetAreaEditor.php +++ b/src/Forms/WidgetAreaEditor.php @@ -142,7 +142,7 @@ class WidgetAreaEditor extends FormField throw new Exception("no form"); } - $widgetData = $this->getForm()->getRequest()->requestVar(Widget::class); + $widgetData = $this->getForm()->getRequest()->requestVar('Widget'); if ($widgetData && isset($widgetData[$this->getName()])) { $widgetAreaData = $widgetData[$this->getName()]; @@ -180,7 +180,6 @@ class WidgetAreaEditor extends FormField if ($widget->ParentID == 0) { $widget->ParentID = $record->$name()->ID; } - $widget->populateFromPostData($newWidgetData); } } diff --git a/src/Model/Widget.php b/src/Model/Widget.php index c7700f3..915fcdc 100644 --- a/src/Model/Widget.php +++ b/src/Model/Widget.php @@ -147,7 +147,7 @@ class Widget extends DataObject public function getTitle() { return $this->getField('Title') - ?: _t($this->ClassName() . '.TITLE', $this->config()->title); + ?: _t($this->class . '.TITLE', $this->config()->title); } /** @@ -155,7 +155,7 @@ class Widget extends DataObject */ public function getCMSTitle() { - return _t($this->ClassName() . '.CMSTITLE', $this->config()->cmsTitle); + return _t($this->class . '.CMSTITLE', $this->config()->cmsTitle); } /** @@ -163,7 +163,7 @@ class Widget extends DataObject */ public function getDescription() { - return _t($this->ClassName() . '.DESCRIPTION', $this->config()->description); + return _t($this->class . '.DESCRIPTION', $this->config()->description); } /** @@ -231,11 +231,14 @@ class Widget extends DataObject } /** + * A fully qualified class name is returned with underscores instead of backslashes so it is HTML safe. Dashes + * can't be used as they're handled in the Javascript for other purposes. + * * @return string */ public function ClassName() { - return $this->class; + return str_replace('\\', '_', $this->class); } /** diff --git a/templates/SilverStripe/Widgets/Forms/WidgetAreaEditor.ss b/templates/SilverStripe/Widgets/Forms/WidgetAreaEditor.ss index b735eec..0455fa4 100644 --- a/templates/SilverStripe/Widgets/Forms/WidgetAreaEditor.ss +++ b/templates/SilverStripe/Widgets/Forms/WidgetAreaEditor.ss @@ -4,8 +4,8 @@

<% _t('WidgetAreaEditor_ss.AVAILABLE', 'Available Widgets') %>

<% _t('WidgetAreaEditor_ss.AVAILWIDGETS', 'Click a widget title below to use it on this page.') %>

- <% if AvailableWidgets %> - <% loop AvailableWidgets %> + <% if $AvailableWidgets %> + <% loop $AvailableWidgets %> $DescriptionSegment <% end_loop %> <% else %> @@ -18,10 +18,10 @@

<% _t('WidgetAreaEditor_ss.INUSE', 'Widgets currently used') %>

<% _t('WidgetAreaEditor_ss.TOSORT', 'To sort currently used widgets on this page, drag them up and down.') %>

- +
- <% if UsedWidgets %> - <% loop UsedWidgets %> + <% if $UsedWidgets %> + <% loop $UsedWidgets %> $EditableSegment <% end_loop %> <% else %> @@ -29,4 +29,4 @@ <% end_if %>
-
\ No newline at end of file + diff --git a/templates/WidgetDescription.ss b/templates/WidgetDescription.ss index af5e495..e7acc6f 100644 --- a/templates/WidgetDescription.ss +++ b/templates/WidgetDescription.ss @@ -3,4 +3,4 @@

$Description

- \ No newline at end of file + diff --git a/templates/WidgetEditor.ss b/templates/WidgetEditor.ss index d784f8b..d1f2e4c 100644 --- a/templates/WidgetEditor.ss +++ b/templates/WidgetEditor.ss @@ -10,5 +10,5 @@ <% end_if %> -

<% _t('WidgetEditor_ss.DELETE', 'Delete') %>

- \ No newline at end of file +

<% _t('WidgetEditor_ss.DELETE', 'Delete') %>

+ diff --git a/tests/WidgetAreaEditorTest.php b/tests/WidgetAreaEditorTest.php index c3579fe..d8193e3 100644 --- a/tests/WidgetAreaEditorTest.php +++ b/tests/WidgetAreaEditorTest.php @@ -41,7 +41,7 @@ class WidgetAreaEditorTest extends SapphireTest public function testFillingOneArea() { $data = array( - Widget::class => array( + 'Widget' => array( 'BottomBar' => array( 'new-1' => array( 'Title' => 'MyTestWidget', @@ -78,7 +78,7 @@ class WidgetAreaEditorTest extends SapphireTest public function testFillingTwoAreas() { $data = array( - Widget::class => array( + 'Widget' => array( 'SideBar' => array( 'new-1' => array( 'Title' => 'MyTestWidgetSide', @@ -128,7 +128,7 @@ class WidgetAreaEditorTest extends SapphireTest { // First get some widgets in there $data = array( - Widget::class => array( + 'Widget' => array( 'SideBar' => array( 'new-1' => array( 'Title' => 'MyTestWidgetSide', @@ -168,7 +168,7 @@ class WidgetAreaEditorTest extends SapphireTest // Save again (after removing the SideBar's widget) $data = array( - Widget::class => array( + 'Widget' => array( 'SideBar' => array( ), 'BottomBar' => array( @@ -200,7 +200,7 @@ class WidgetAreaEditorTest extends SapphireTest { // First get some widgets in there $data = array( - Widget::class => array( + 'Widget' => array( 'SideBar' => array( 'new-1' => array( 'Title' => 'MyTestWidgetSide', @@ -240,7 +240,7 @@ class WidgetAreaEditorTest extends SapphireTest // Save again (after removing the SideBar's widget) $data = array( - Widget::class => array( + 'Widget' => array( 'SideBar' => array( ), 'BottomBar' => array( @@ -266,7 +266,7 @@ class WidgetAreaEditorTest extends SapphireTest { // First get some widgets in there $data = array( - Widget::class => array( + 'Widget' => array( 'SideBar' => array( 'new-1' => array( 'Title' => 'MyTestWidgetSide', @@ -306,7 +306,7 @@ class WidgetAreaEditorTest extends SapphireTest // Save again (after removing the SideBar's widget) $data = array( - Widget::class => array( + 'Widget' => array( 'SideBar' => array( $sideWidgets[0]->ID => array( 'Title' => 'MyTestWidgetSide-edited', @@ -344,7 +344,7 @@ class WidgetAreaEditorTest extends SapphireTest { // First get some widgets in there $data = array( - Widget::class => array( + 'Widget' => array( 'SideBar' => array( 'new-1' => array( 'Title' => 'MyTestWidgetSide', @@ -384,7 +384,7 @@ class WidgetAreaEditorTest extends SapphireTest // Save again (after removing the SideBar's widget) $data = array( - Widget::class => array( + 'Widget' => array( 'SideBar' => array( $sideWidgets[0]->ID => array( 'Title' => 'MyTestWidgetSide-edited', @@ -422,7 +422,7 @@ class WidgetAreaEditorTest extends SapphireTest { // First get some widgets in there $data = array( - Widget::class => array( + 'Widget' => array( 'SideBar' => array( 'new-1' => array( 'Title' => 'MyTestWidgetSide', @@ -463,7 +463,7 @@ class WidgetAreaEditorTest extends SapphireTest // Save again (after removing the SideBar's widget) $data = array( - Widget::class => array( + 'Widget' => array( 'SideBar' => array( $sideWidgets[0]->ID => array( 'Title' => 'MyTestWidgetSide-edited',