Jump to:

5513 Posts in 1732 Topics by 1218 members

Customising the CMS

SilverStripe Forums » Customising the CMS » Decorator for ContentController

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

Page: 1
Go to End
Author Topic: 3331 Views
  • Andre
    Avatar
    Community Member
    126 Posts

    Decorator for ContentController Link to this post

    Hallo folks,

    I have been extending the (daily trunk from yesterday) Poll Module a little bit.

    I gave it a Field called PollaName (only PollTitle was available until now) which I want to use to select the Poll inside ShowPoll (instead of random).

    Its working for now when adding the following function to the Page_Controller:

    function MyPoll() {
    $PollName = 'myfirstpoll';
    return new ShowPoll($this, $PollName);
    }

    a next step will be to have a select Field on the Page Object to select a poll to be shown on this Page. This is no big Deal to Implement, but I don't want to hardcode this inside the Page class. Instead i prefere to use (haven't done this before) a Decorator.

    I'm noit quite sure, I understand the Decorator Patterns right, but for my understanding, all I have to do is to is to write a Decorator class as foloowed:

    class Pollable extends SiteTreeDecorator {
    function extraStatics(){
    return array('db' => array('ShowPoll' => 'Text'));
    }

    function updateCMSFields(&fields){
    // add Dropdown List with Poll here
    }

    // add any function I want to use in Frontend
    }

    Than I can add DataObject::add_extension('Page', 'Pollable'); to the Polls _config.php an all Pages inheriting Page should be able to select a poll to be shown in the Frontend.

    The function to Show the Poll will normaly be added to the Page_Controller. If I add this function to my Pollable Decorator, will it than be available in my Page_Controller to, or do I have to add an extension for the Controller too (and how do i do this)?

  • Andre
    Avatar
    Community Member
    126 Posts

    Re: Decorator for ContentController Link to this post

    So I gave it a try and wrote the following Decorator:

    <?php

    /**
    * Page Decorator, to make every Page choose a Poll or select from Parent
    */
    class Pollable extends SiteTreeDecorator {

    function extraStatics(){
    return array('db' => array('SelectedPoll' => 'Int'));
    }

    function updateCMSFields(&$fields){
    $fields->addFieldToTab('Root.Content.Poll', new DropdownField('SelectedPoll', 'Poll', $this->owner->PollsArray()));
    }

    function ShowPoll() {
    //die(print_r($this->owner, true).'id'.$this->owner->SelectedPoll);
    return new ShowPoll($this->owner, 'ShowPoll', $this->owner->SelectedPoll);
    }

    function PollsArray(){
    $PollsArray = array();

    foreach(DataObject::get('Poll') as $Poll){
    $PollsArray[(string)$Poll->ID] = $Poll->PollName;
    }

    return $PollsArray;
    }
    }
    ?>

    The good thin is, the correct pollform is shown, the bad thing is, the form submission doesn't work.
    Thats the output if I try to submit the Pollform.

    Action 'ShowPoll' isn't allowed on class Page_Controller

  • Andre
    Avatar
    Community Member
    126 Posts

    Re: Decorator for ContentController Link to this post

    ok, got it working. Here is the code for the two needed Decorators:

    Pollable.php
    /**
    * Page Decorator, to make every Page choose a Poll or select from Parent
    */
    class Pollable extends SiteTreeDecorator {

    function extraStatics(){
    return array('db' => array('SelectedPoll' => 'Int'));
    }

    function updateCMSFields(&$fields){
    $fields->addFieldToTab('Root.Content.Poll', new DropdownField('SelectedPoll', 'Umfrage', $this->owner->PollsArray()));
    }

    function PollsArray(){
    $PollsArray = array();

    foreach(DataObject::get('Poll') as $Poll){
    $PollsArray[(string)$Poll->ID] = $Poll->PollTitle;
    }

    return $PollsArray;
    }
    }

    ------------
    PollableController.php
    /**
    * Page_Controller Decorator, to make every Page choose a Poll or select from Parent
    */
    class PollableController extends Extension {

    public static $allowed_actions = array('ShowPoll');

    function ShowPoll() {
    //die(print_r($this->owner, true).'id'.$this->owner->SelectedPoll);
    return new ShowPoll($this->owner, 'ShowPoll', $this->owner->SelectedPoll);
    }
    }

    The Extensions mus be loaded in _config.php (I just added this to poll_module/_config.php) with the following to lines:

    // add Pollable to Page
    DataObject::add_extension('Page', 'Pollable');
    Object::add_extension('Page_Controller', 'PollableController');

    on ShowPoll.php change Line 16 to
       function __construct($controller, $name, $id) {
    and line 19 to
          $poll = DataObject::get_one('Poll', 'IsActive = true AND ID = \''.$id.'\'', true);

    Thats all (the PollName was removed again by me).

    3331 Views
Page: 1
Go to Top

Want to know more about the company that brought you SilverStripe? Then check out SilverStripe.com

Comments on this website? Please give feedback.