SilverStripe Viewable Dataobject
, (*1)
, (*2)
DataExtension that easily allows a dataobject to be viewed like a Page, (*3)
Requirements
Installation
composer require dynamic/viewable-dataobject
, (*4)
In config.yml:, (*5)
MyDataObject:
extensions:
- Dynamic\ViewableDataObject\Extensions\ViewableDataObject
Example usage
On the DataObject you'd like to view as a page:, (*6)
<?php
use Dynamic\ViewableDataObject\VDOInterfaces\ViewableDataObjectInterface;
class MyDataObject extends DataObject implements ViewableDataObjectInterface
{
public function getParentPage()
{
return MyDisplayPage::get()->first();
}
public function getViewAction()
{
return 'myobject';
}
}
On the Page_Controller you'd like to view your DataObject:, (*7)
<?php
use SilverStripe\Control\HTTPRequest;
use SilverStripe\View\ArrayData;
class MyDisplayPageController extends \PageController
{
public function myobject(HTTPRequest $request)
{
$urlSegment = $request->latestParam('ID');
if (!$object = MyDataObject::get()->filter('URLSegment', $urlSegment)->first()) {
return $this->httpError(404, "The object you're looking for doesn't seem to be here.");
}
return $this->customise(new ArrayData([
'Object' => $object,
'Title' => $object->Title,
'MetaTags' => $object->MetaTags(false),
'Breadcrumbs' => $object->Breadcrumbs(),
]));
}
}
Controller Extension
Adding the controller extension to a class will allow for using custom layout templates., (*8)
In config.yml:, (*9)
MyControler:
extensions:
- Dynamic\ViewableDataObject\Extensions\ControllerExtension
Instead of calling render
, renderWith
, or customize
; renderWithLayout
can be passed a list of layout templates and extra data., (*10)
<?php
use SilverStripe\Control\HTTPRequest;
class MyDisplayPageController extends \PageController
{
public function myobject(HTTPRequest $request)
{
$urlSegment = $request->latestParam('ID');
if (!$object = MyDataObject::get()->filter('URLSegment', $urlSegment)->first()) {
return $this->httpError(404, "The object you're looking for doesn't seem to be here.");
}
return $this->renderWithLayout([
MyDataObject::class,
MyDisplayPage::class,
], [
'Object' => $object,
'Title' => $object->Title,
'MetaTags' => $object->MetaTags(false),
'Breadcrumbs' => $object->Breadcrumbs(),
]);
}
}
renderWithLayout
will add \Page::class
to the end of the template list.
The first valid template in the array will be used., (*11)