diff --git a/.upgrade.yml b/.upgrade.yml index 324841a..abdeb97 100644 --- a/.upgrade.yml +++ b/.upgrade.yml @@ -1,16 +1,7 @@ mappings: WidgetContentControllerExtension: SilverStripe\Widgets\Controllers\WidgetContentControllerExtension - WidgetController: SilverStripe\Widgets\Controllers\WidgetController - Widget_Controller: SilverStripe\Widgets\Controllers\Widget_Controller + Widget_Controller: SilverStripe\Widgets\Models\WidgetController WidgetPageExtension: SilverStripe\Widgets\Extensions\WidgetPageExtension WidgetAreaEditor: SilverStripe\Widgets\Forms\WidgetAreaEditor Widget: SilverStripe\Widgets\Model\Widget WidgetArea: SilverStripe\Widgets\Model\WidgetArea - WidgetAreaEditorTest: SilverStripe\Widgets\Tests\WidgetAreaEditorTest - WidgetAreaEditorTest_FakePage: SilverStripe\Widgets\Tests\WidgetAreaEditorTest\FakePage - WidgetAreaEditorTest_TestWidget: SilverStripe\Widgets\Tests\WidgetAreaEditorTest\TestWidget - WidgetControllerTest: SilverStripe\Widgets\Tests\WidgetControllerTest - WidgetControllerTest_Widget: SilverStripe\Widgets\Tests\WidgetControllerTest\TestWidget - WidgetControllerTest_WidgetController: SilverStripe\Widgets\Tests\WidgetControllerTest\TestWidgetController - WidgetControllerTestPage: SilverStripe\Widgets\Tests\WidgetControllerTest\TestPage - WidgetControllerTestPage_Controller: SilverStripe\Widgets\Tests\WidgetControllerTest\TestPageController diff --git a/_config/contentcontroller-url-handler.yml b/_config/contentcontroller-url-handler.yml index 101d4c5..d96a520 100644 --- a/_config/contentcontroller-url-handler.yml +++ b/_config/contentcontroller-url-handler.yml @@ -1,5 +1,5 @@ --- -Name: contentcontrollerurlhandler +Name: widgetscontentcontrollerurlhandler --- SilverStripe\CMS\Controllers\ContentController: extensions: diff --git a/_config/routes.yml b/_config/routes.yml index 502a610..c3a5c2f 100644 --- a/_config/routes.yml +++ b/_config/routes.yml @@ -1,3 +1,6 @@ +--- +Name: widgetsroutes +--- SilverStripe\Control\Director: rules: 'WidgetController//$Action/$ID/$OtherID': 'SilverStripe\Widgets\Controllers\WidgetController' diff --git a/composer.json b/composer.json index d6f702d..52b95a1 100644 --- a/composer.json +++ b/composer.json @@ -12,7 +12,8 @@ "require": { "silverstripe/vendor-plugin": "^1.0", "silverstripe/framework": "^4.0", - "silverstripe/cms": "^4.0" + "silverstripe/cms": "^4.0", + "silverstripe/versioned": "^1.0" }, "require-dev": { "phpunit/phpunit": "^5.7", diff --git a/src/Extensions/WidgetPageExtension.php b/src/Extensions/WidgetPageExtension.php index 4eeccc3..242c79d 100644 --- a/src/Extensions/WidgetPageExtension.php +++ b/src/Extensions/WidgetPageExtension.php @@ -19,17 +19,25 @@ use SilverStripe\Widgets\Model\WidgetArea; */ class WidgetPageExtension extends DataExtension { - private static $db = array( + private static $db = [ 'InheritSideBar' => 'Boolean', - ); + ]; - private static $defaults = array( + private static $defaults = [ 'InheritSideBar' => true - ); + ]; - private static $has_one = array( - 'SideBar' => WidgetArea::class - ); + private static $has_one = [ + 'SideBar' => WidgetArea::class, + ]; + + private static $owns = [ + 'SideBar', + ]; + + private static $cascade_deletes = [ + 'SideBar', + ]; public function updateCMSFields(FieldList $fields) { diff --git a/src/Model/Widget.php b/src/Model/Widget.php index cec10c0..51d0c9d 100644 --- a/src/Model/Widget.php +++ b/src/Model/Widget.php @@ -3,6 +3,7 @@ namespace SilverStripe\Widgets\Model; use Exception; +use SilverStripe\Control\HTTPRequest; use SilverStripe\Core\ClassInfo; use SilverStripe\Core\Injector\Injector; use SilverStripe\Forms\CheckboxField; @@ -10,6 +11,7 @@ use SilverStripe\Forms\FieldList; use SilverStripe\Forms\HiddenField; use SilverStripe\Forms\TextField; use SilverStripe\ORM\DataObject; +use SilverStripe\Versioned\Versioned; /** * Widgets let CMS authors drag and drop small pieces of functionality into @@ -23,42 +25,27 @@ use SilverStripe\ORM\DataObject; */ class Widget extends DataObject { - /** - * @var array - */ - private static $db = array( + private static $db = [ "Title" => "Varchar(255)", "Sort" => "Int", "Enabled" => "Boolean", - ); + ]; - /** - * @var array - */ - private static $defaults = array( + private static $defaults = [ 'Enabled' => true, - ); + ]; - /** - * @var array - */ - private static $casting = array( + private static $casting = [ 'CMSTitle' => 'Text', 'Description' => 'Text', - ); + ]; - private static $only_available_in = array(); + private static $only_available_in = []; - /** - * @var array - */ - private static $has_one = array( + private static $has_one = [ "Parent" => WidgetArea::class, - ); + ]; - /** - * @var string - */ private static $default_sort = "\"Sort\""; /** @@ -76,18 +63,16 @@ class Widget extends DataObject */ private static $description = "Description of what this widget does."; - /** - * @var array - */ - private static $summary_fields = array( + private static $summary_fields = [ 'CMSTitle' => 'Title' - ); + ]; - /** - * @var string - */ private static $table_name = 'Widget'; + private static $extensions = [ + Versioned::class . '.versioned', + ]; + /** * @var WidgetController */ @@ -267,10 +252,13 @@ class Widget extends DataObject } if (!class_exists($controllerClass)) { - throw new Exception('Could not find controller class for ' . $controllerClass); + throw new Exception('Could not find controller class for ' . static::class); } $this->controller = Injector::inst()->create($controllerClass, $this); + if (Injector::inst()->has(HTTPRequest::class)) { + $this->controller->setRequest(Injector::inst()->get(HTTPRequest::class)); + } return $this->controller; } diff --git a/src/Model/WidgetArea.php b/src/Model/WidgetArea.php index dbd862f..fe05577 100644 --- a/src/Model/WidgetArea.php +++ b/src/Model/WidgetArea.php @@ -2,32 +2,36 @@ namespace SilverStripe\Widgets\Model; +use SilverStripe\Control\Controller; use SilverStripe\ORM\ArrayList; use SilverStripe\ORM\DataObject; +use SilverStripe\ORM\HasManyList; +use SilverStripe\ORM\SS_List; +use SilverStripe\Versioned\Versioned; /** * Represents a set of widgets shown on a page. - * - * @package widgets */ class WidgetArea extends DataObject { - /** - * @var array - */ - private static $has_many = array( + private static $has_many = [ "Widgets" => Widget::class - ); + ]; + + private static $owns = [ + 'Widgets', + ]; + + private static $cascade_deletes = [ + 'Widgets', + ]; + + private static $extensions = [ + Versioned::class . '.versioned', + ]; - /** - * @var string - */ private static $table_name = 'WidgetArea'; - /** - * - * @var string - */ public $template = __CLASS__; /** @@ -43,6 +47,9 @@ class WidgetArea extends DataObject $items = $this->ItemsToRender(); if (!is_null($items)) { foreach ($items as $widget) { + /** @var Widget $widget */ + + /** @var Controller $controller */ $controller = $widget->getController(); $controller->doInit(); @@ -57,7 +64,7 @@ class WidgetArea extends DataObject */ public function Items() { - return $this->getComponents('Widgets'); + return $this->Widgets(); } /** @@ -65,8 +72,7 @@ class WidgetArea extends DataObject */ public function ItemsToRender() { - return $this->getComponents('Widgets') - ->filter("Enabled", 1); + return $this->Items()->filter('Enabled', 1); } /** @@ -85,15 +91,4 @@ class WidgetArea extends DataObject { $this->template = $template; } - - /** - * Delete all connected Widgets when this WidgetArea gets deleted - */ - public function onBeforeDelete() - { - parent::onBeforeDelete(); - foreach ($this->Widgets() as $widget) { - $widget->delete(); - } - } } diff --git a/src/Controllers/WidgetController.php b/src/Model/WidgetController.php similarity index 98% rename from src/Controllers/WidgetController.php rename to src/Model/WidgetController.php index 0dbc6aa..606e444 100644 --- a/src/Controllers/WidgetController.php +++ b/src/Model/WidgetController.php @@ -1,12 +1,11 @@