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.

Data Model Questions

Passing an ID to a URL


Reply

8 Posts   2830 Views

Avatar
Andrew Houle

3 March 2009 at 10:33am Community Member, 132 Posts

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

3 March 2009 at 10:53am Community Member, 132 Posts

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

7 January 2010 at 5:45am Community Member, 110 Posts

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
Pigeon

7 January 2010 at 12:24pm Community Member, 243 Posts

$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

9 January 2010 at 5:56am Community Member, 110 Posts

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

10 January 2010 at 3:11am (Last edited: 10 January 2010 4:10am), Community Member, 110 Posts

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

10 January 2010 at 4:18am Community Member, 110 Posts

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

11 January 2010 at 6:38am Community Member, 110 Posts

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?