Thanks for your help @JonoM. I tried the canView()
method but no luck (if I’m doing it right that is). Also looked into routing but I can’t wrap my head around it.
Here’s the code for TeamPage.php:
<?php
class TeamPage extends Page
{
protected static $singular_name = 'Team Page';
protected static $plural_name = 'Team Page';
static $db = [
'SecondaryContent' => 'HTMLText'
];
private static $has_many = array (
'TeamMembers' => 'TeamMember',
);
public function getCMSFields()
{
$fields = parent::getCMSFields();
$fields->addFieldToTab('Root.TeamMembers', GridField::create(
'TeamMembers',
'List of Team Members',
$this->TeamMembers(),
GridFieldConfig_RecordEditor::create()
->addComponent(new GridFieldSortableRows('SortID'))
));
$fields->addFieldToTab('Root.Main', HTMLEditorField::create('SecondaryContent'));
return $fields;
}
}
class TeamPage_Controller extends Page_Controller
{
private static $allowed_actions = array (
'show'
);
public function show(SS_HTTPRequest $request) {
$teammember = TeamMember::get()->byID($request->param('ID'));
if(!$teammember) {
return $this->httpError(404,'That team member could not be found');
}
return array (
'TeamMember' => $teammember
);
}
}
Then here’s the code for TeamMember.php:
<?php
class TeamMember extends DataObject {
private static $db = array (
'Title' => 'Varchar(255)',
'SecondaryTitle' => 'Varchar(255)',
'ShortName' => 'Varchar(255)',
'Organisation' => 'Varchar(255)',
'Role' => 'Varchar(255)',
'Description' => 'HTMLText',
'Email' => 'Varchar(255)',
'Phone' => 'Varchar(255)',
'Mobile' => 'Varchar(255)',
'LinkedIn' => 'Varchar(255)',
'Displayed' => 'Boolean',
'SortID' => 'Int',
'StaffPartner' => 'Enum("Staff, Partner", "Staff")'
);
public function Link() {
return $this->TeamPage()->Link('show/'.$this->ID);
//return $this->URLSegment = $this->generateURLSegment($this->Title);
}
private static $has_one = array (
'TeamPage' => 'TeamPage',
'HomePage' => 'HomePage',
'MemberImage' => 'Image'
);
private static $summary_fields = array (
'GridThumbnail' => '',
'Title' => 'Name'
);
public function getGridThumbnail() {
if($this->MemberImage()->exists()) {
return $this->MemberImage()->SetWidth(50);
}
return "(no image)";
}
private static $default_sort = 'SortID ASC';
public function getCMSFields() {
$fields = FieldList::create(
TextField::create('Title'),
TextField::create('SecondaryTitle'),
TextField::create('ShortName'),
TextField::create('Organisation'),
TextField::create('Role'),
DropdownField::create('StaffPartner', 'Staff or Partner?', ['Staff' => 'Staff', 'Partner' => 'Partner']),
TextField::create('Email'),
TextField::create('Phone'),
TextField::create('Mobile'),
TextField::create('LinkedIn', 'LinkedIn')->setAttribute('placeholder', 'https://...'),
UploadField::create('MemberImage', 'Member image')->setFolderName('Images/Team-Images'),
HtmlEditorField::create('Description')->setRows(5)
);
return $fields;
}
/**
* Generate a URL segment based on the title provided.
*
* If {@link Extension}s wish to alter URL segment generation, they can do so by defining
* updateURLSegment(&$url, $title). $url will be passed by reference and should be modified.
* $title will contain the title that was originally used as the source of this generated URL.
* This lets extensions either start from scratch, or incrementally modify the generated URL.
*
* @param string $title Page title.
* @return string Generated url segment
*/
public function generateURLSegment($title)
{
$filter = URLSegmentFilter::create();
$t = $filter->filter($title);
// Fallback to generic page name if path is empty (= no valid, convertable characters)
if(!$t || $t == '-' || $t == '-1') $t = "page-$this->ID";
// Hook for extensions
$this->extend('updateURLSegment', $t, $title);
return $t;
}
}
Thanks for your help so far. Cheers