Skip to main content

This site requires you to update your browser. Your browsing experience maybe affected by not having the most up to date version.

We've moved the forum!

Please use forum.silverstripe.org for any new questions (announcement).
The forum archive will stick around, but will be read only.

You can also use our Slack channel or StackOverflow to ask for help.
Check out our community overview for more options to contribute.

Data Model Questions /

Moderators: martimiz, Sean, Ed, biapar, Willr, Ingo, swaiba

Passing an ID to a URL


Go to End


8 Posts   3956 Views

Avatar
Andrew Houle

Community Member, 140 Posts

3 March 2009 at 10:33am

I have an EventPage (page) and Event (dataobject). I want to be able to render the dataobject on a page by passing the id to the url. So for example: mysite.com/nu-events/evt/3 would be the 3rd event. I think I have everything setup correctly, but I'm getting the following error... Object::__call() Method 'getViewer' not found in class 'Event'

I have this function in EventPage

function evt() {
		if($id = Director::urlParam('ID')) { // check to see we have been passed an ID
			return DataObject::get_by_id("Event", $id);
		}
	}

And I have a template named: EventPage_evt.ss following the ClassName_action format, but I can't get that template to show. I can get the dataobject to show if i use renderWith() ie...

function event() {
		if($id = Director::urlParam('ID')) { // check to see we have been passed an ID
			$evt = DataObject::get_by_id("Event", $id);
   			return $evt->renderWith('EventPage_evt'); 
		}
	}

But that strips out the Page template stuff. How can I get SS to recognize the appropriate template. Thanks in advance for your help.

Avatar
Andrew Houle

Community Member, 140 Posts

3 March 2009 at 10:53am

Got it to work with the help of UncleCheese, using this code

function evt() {
		if($id = Director::urlParam('ID')) { // check to see we have been passed an ID
			$evt = DataObject::get_by_id("Event", $id);
   			return $this->customise(array('Event' => $evt))->renderWith(array('EventPage',  'Page'));
		}
	}

Then using EventPage.ss as my template. Calling variables $Event.name. I hope this can help someone else

Avatar
Stefdv

Community Member, 110 Posts

7 January 2010 at 5:45am

Okay, i'm almost pulling my hair out. I get the most of Silverstripe ( i like to think) but i just can't figure this out.

I'm using modeladmin to manage my tv-series, Serie is a DataObject and Episode is a DataObject
I have a SeriePage.php and i have a SeriePage.ss, that works great. It shows al my Series with Covers and Discription, No problem there.

I need to create a Link (function) to link to a (not really existing) Episodes page. (Template i guess).

Now i tried your solution but it just won't work.

-----------------------------------------------------------------------------------------------------------------------------
class SeriePage_Controller extends Page_Controller {

function GetEpisode() {
if($id = Director::urlParam('ID'))
$episode = DataObject::get_by_id("episode", $id);
return $this->customise(array('episode' => $episode))->renderWith(array('EpisodePage', 'Page'));
}
}
-------------------------------------------------------------------------------------------------------
Then in my SeriePage.ss i use the GetEpisode function as Link.

-----------------------------------------------
<a href="$GetEpisode">

-----------------------------------

I've made a EpisodePage template

------------------------------------------------------------------------

<link href="../../css/typography.css" rel="stylesheet" type="text/css" />
<div class="typography">
<ul>
<% control Episode %>

<li><a href="mms:\\\" class="left">$Episode.Title</a></li>
<% end_control %>
</ul>
</div>

----------------------------------------------------------------------

Where do i go wrong ?????

Avatar
dhensby

Community Member, 253 Posts

7 January 2010 at 12:24pm

$GetEpisode is not a string, it is a DataObject. Thus, to get a link from it one would have to do $GetEpisode.Link

However, the link for the series page should be:

<% control Children %><!-- controlling the episodes of the series -->
...
<a href="{$Series.Link}/GetEpisode/$ID">..</a>
...
<% end_control %>

Then that link will then open a page that is rendered with the EpisodePage template.

The template then needs to control 'episode' NOT 'Episode'.

NB: When fetching classes, the class name parameter is case sensitive

Avatar
Stefdv

Community Member, 110 Posts

9 January 2010 at 5:56am

Pigeon (tx again ) the way you bring it, it must be so simple
But as i mentioned...I just don't get it :(

To be honest, i don't even really understand what i'm doing in my 'GetEpisode' function.
Now the solution seems to be that i have to control the children ( i understand that episodes are - in theory - children of a serie).
But i came across different solutions, like http://www.silverstripe.org/data-model-questions/show/257660#post257660 but then i still have nothing to put in my href...

How is it possible that i just can't find a simple solution on how to create, in fact, just a dynamic page. I worked tru the Silverstripe book (where they seem to use it for the Jobs DataObject ), i spend days scrolling tru the forum. I think it has something to do with overloading the $Link, but i'm soooooo lost.

All i want;

I list my series which are DataObjects ( got that part )
When i click on a serie it needs to open a page with the Episodes (DataObject) belonging to that serie.

------
<ul>
<li><a href= "Episodes belonging to Serie.Name">Serie.Name</a></li>
</ul

I really believe that i'm the only one who can't figure this out...please have patiance with me.

Avatar
Stefdv

Community Member, 110 Posts

10 January 2010 at 3:11am

Edited: 10/01/2010 4:10am

I think that posting my code would help.(?)

----------------------------------------------------------------------------------------------------------------------
class Serie extends DataObject {
static $db = array(
'Name' => 'Varchar',
'Server' => "Enum('Tcamts051,Tcamts052')",
'Folder' => "Enum('series 1,series 2, series3, series 4')",
'Omschrijving' => 'Text'

);
static $has_one = array (
'SerieCover' => 'Image',
'SeriePagina' => 'SeriePagina'
);
static $has_many = array(
'Episodes' => 'Episode'
);
static $searchable_fields = array ('Name');
static $singular_name = 'Serie';
static $plural_name = 'Series';
}
----------------------------------------------------------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------------------------------------------------------
class Episode extends DataObject {

static $db = array(
'Name' => 'Varchar',
'Season' => "Enum('Season 01,Season 02,Season 03,Season 04,Season 05,Season 06,Season 07,Season 08,Season 09,Season 10,Specials')"
);

static $has_one = array(
'MySerie' => 'Serie'
);

}
-------------------------------------------------------------------------------------------------------------------------------------------------

I manage those with Modeladmin

-------------------------------------------------------------------------------------------------------------------------------------------------
class SerieAdmin extends ModelAdmin {

static $managed_models = array(
'Serie',
'Episode',
);

static $url_segment = 'series';
}
-------------------------------------------------------------------------------------------------------------------------------------------------

Then for my SeriePage..
-------------------------------------------------------------------------------------------------------------------------------------------------
class SeriePagina extends Page {

static $db = array ();

static $has_many = array(
'Series' => 'Serie'
);

static $singular_name = 'Serie Pagina';
static $plural_name = 'Serie Paginas';

}

class SeriePagina_Controller extends Page_Controller {

function GetEpisode() {
if($id = Director::urlParam('ID')) {
$afl = DataObject::get_by_id('Episode', $id);
return $this->customise(array('Episode' => $afl))->renderWith(array('EpisodePage', 'Page'));
}
}
}
-----------------------------------------------------------------------------------------------------------------------------

And my Template for listing the Series

-----------------------------------------------------------------------------------------------------------------------------
<div class="typography">

<% if Series %>
<% control Series %>

<table width="757" border="1" align="center">
<tr>
<td width="86"><a href="AND THIS IS THE PROBLEM">$Name</a></td>
<td width="522">&nbsp;</td>
</tr>
<tr>
<td height="160">$SerieCover.Setwidth(85)</a></td>
<td>$Omschrijving</td>
</tr>

</table>
<% end_control %>

<% else %>
Geen Series
<% end_if %>
$Content
</div>
------------------------------------------------------------------------------------------------------------------------------------------
I did make a EpisodePage.ss
------------------------------------------------------------------------------------------------------------------------------------------
<link href="../../css/typography.css" rel="stylesheet" type="text/css" />
<div class="typography">
<h2>$Name</h2>
<% if Episode %>
<ul>
<% control Episode %>
<li><a href="mms:\\\$MySerie.Server\$MySerie.Folder\$MySerie.Name\$Season\{$Name}.wmv" class="left">$Name</a></li>
<% end_control %>
</ul>
<% else %>
No episodes yet
<% end_if %>

</div>
------------------------------------------------------------------------------------------------------------------------------------

Btw Pigeon, i hope you don't mind but i asked Hamish to look at this also 'cause he handled the same kind of question a while ago.

Avatar
Stefdv

Community Member, 110 Posts

10 January 2010 at 4:18am

Okay, i did get a little further...

Now i got it to render with my Episodepage.

I had to use <a href="Serie/GetEpisode/$ID"> in my SeriePage so now i get http:\\localhost\serie\GetEpisode\1 (for the first listed serie) and \2 for the second listed serie etc.

but now ;
when i click on serie 1 i get the episode with ID 1
when i click on serie 2 i get the episode with ID 2

Somewhere in the function i need to compare the ID to the Episodes.MySerieID.

Avatar
Stefdv

Community Member, 110 Posts

11 January 2010 at 6:38am

Okay...changed the '::get_by_id' into '::get' now at least it shows every episode. But it shows every episode no mather what serie i choose.

I tried to play around with the $this, but i'm missing something.

-----------------------------------------------------------------------------------------------------------
function GetEpisode() {
if($id = Director::urlParam('ID')) {
$afl = DataObject::get('Episode',$this->ID='MySerieID');
return $this->customise(array('Episode' => $afl))->renderWith(array('EpisodePage', 'Page'));
}
}

-------------------------------------------------------------------------------------------------------------------

Any ideas?