dynamic/viewable-dataobject

DataExtension that easily allows a DataObject to be viewed like a Page

Installs: 6 021

Dependents: 2

Suggesters: 0

Stars: 2

Watchers: 4

Forks: 6

Open Issues: 5

Type:silverstripe-vendormodule

2.0.0-beta2 2018-11-15 15:33 UTC

README

Build Status Scrutinizer Code Quality Code Coverage Build Status codecov

Latest Stable Version Latest Unstable Version Total Downloads License Monthly Downloads Daily Downloads

DataExtension that easily allows a dataobject to be viewed like a Page

Requirements

  • SilverStripe ^4.0

Installation

composer require dynamic/viewable-dataobject

In config.yml:

MyDataObject:
	extensions:
		- Dynamic\ViewableDataObject\Extensions\ViewableDataObject

Example usage

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(),
        ]));
    }
} 	

Controller Extension

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.