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.

General Questions /

General questions about getting started with SilverStripe that don't fit in any of the categories above.

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


Go to End

5 Posts   3442 Views


Community Member, 79 Posts

30 September 2011 at 6:25pm

Edited: 30/09/2011 6:27pm

My apologies if this is already explained somewhere, but I have tried to find the solution but to no avail.

I am trying to extend the URL params that are allowed for a particular controller on a new site I am building


This leaves me one parameter short and rather than just use a ?year=2011 I wanted to learn how to add another parameter to the URL.

In this set up my-zone is a page and so is body.

Body has a pagetype of WeighIn and calendar is a method on the WeighIn_Controller

I have tried adding the Rule to Director in a number of different ways but no luck, so I guess my understanding of it is completely wrong. Would appreciate any help.



Director::addRules(100, array('/my-zone//$Action/$ID/$OtherID/$Year'=>'WeighIn_Controller'));



class WeighIn extends Page {

	public static $db = array(

	public static $has_one = array(
        static $icon = "/themes/dd/images/treeicons/user_orange";
class WeighIn_Controller extends Page_Controller {
    public static $allowed_actions = array (

    public function init() {
     * Add Weigh In Point
    function addentry() {
        // form code
    function saveentry($data, $form) {
        // Save code
    /* draws a calendar */
    function draw_calendar($month,$year){

    // code to draw calendar


    function CalendarHTML($month = null, $year = null) {

    echo "Year = ".Director::urlParam('Year')."<hr/>";
    echo "Action = ".Director::urlParam('Action')."<hr/>";
    echo "ID = ".Director::urlParam('ID')."<hr/>";
    echo "OtherID = ".Director::urlParam('OtherID')."<hr/>";
    if($month === null){
        $month = date("n");
    if($year === null){
        $year = date("Y");
    return $this->draw_calendar($month, $year);


Ryan M.

Community Member, 309 Posts

1 October 2011 at 8:02am

It doesn't look like you've built a function to handle the $Action. For example,

http://domainname.local/my-zone/body/calendar/10/2011 => pagename//$Action/$Type/$Month/$Year 
( I think you need to remove the slash at the beginning of the url route )

public function body() {
this 'body' function is matched with the $Action in the url route.
then inside this function you can use the rest of the url parameters to bring up a calendar set to the $Month and $Year.

More Info:


Community Member, 79 Posts

1 October 2011 at 5:42pm

Opps sorry Ryan I see my mistake in the question.

There is a page called "my-zone" and then a subpage with a PageType of WeighIn which is called Body.

So where I typed


it should have been


So I have a template named and this is all working correctly, just trying add in a new parameter that I can access. Obviously I could just use the query string, but I am just trying to learn how to do it without the query string :)

I will take a look at the link you sent for SSBITS.

Thanks for your help, hopefully this makes it a little clearer


I will take a look at the


Forum Moderator, 5523 Posts

1 October 2011 at 6:26pm

You won't need to mess around with Director::addRules for that, $url_handlers on your page_controller can give names to more params.

Mark Rickerby (@maetl) has a good guide to URL handling in SilverStripe -


Community Member, 79 Posts

1 October 2011 at 11:42pm

Thanks Willr & Ryan M,

I now have it all sorted. One of my issues was that I was trying use the template and therefor there wasn't necessarily a calendar() method.

So in the end this is the code I have if anyone else is looking

    public static $url_handlers = array(
        'calendar/$Type/$Month/$Year' => 'calendar',



   function calendar($request) {

        $month = $request->param('Month');
        $year = $request->param('Year');
        $type = $request->param('Type');
        if($type == 'calendar'){
            return $this->draw_month_calendar($month, $year);
        }elseif($type == 'list'){
            return $this->draw_month_list($month, $year);