DataExtension that easily allows a DataObject to be viewed like a Page
DataExtension that easily allows a dataobject to be viewed like a Page
composer require dynamic/viewable-dataobject
In config.yml:
MyDataObject:
extensions:
- Dynamic\ViewableDataObject\Extensions\ViewableDataObject
On the DataObject you'd like to view as a page:
<?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:
<?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(),
]));
}
}
Adding the controller extension to a class will allow for using custom layout templates.
In config.yml:
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.
<?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.
Module rating system helping users find modules that are well supported. For more on how the rating system works visit Module standards
Score not correct? Let us know there is a problem