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.

DataObjectManager Module /

Discuss the DataObjectManager module, and the related ImageGallery module.

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

Help with pagination in DataObject


Go to End


3 Posts   1608 Views

Avatar
Mauro74

Community Member, 30 Posts

4 November 2011 at 12:04am

Hi all,

I'm pretty new to Silverstripe and PHP in general, so I'm learning by tutorials. In the well known website ssbits.com I found a very useful tutorial called 'DataObject as pages' (http://www.ssbits.com/tutorials/2010/dataobjects-as-pages-part-1-keeping-it-simple/). The tutorial is great, it shows how to create a list of staff members without using pages and using the DataObjectManager in the CMS.

I used the tutorial to implement a list of events, but now I'm stuck finding a way to paginate the list! Anyone could help me please?
here's my controller:

class GigPage_Controller extends Page_Controller
{
    //Allow our 'show' function as a URL action
    static $allowed_actions = array('show');
     
    //Get the current gig detail from the URL, if any
    public function getGigDetail()
    {
        $Params = $this->getURLParams();
         
        if(is_numeric($Params['ID']) && $GigDetail = DataObject::get_by_id('GigDetail', (int)$Params['ID']))
        {      
            return $GigDetail;
        }
    }
     
    //Displays the gig detail detail page, using GigPage_show.ss template
    function show()
    {      
        if($GigDetail = $this->getGigDetail())
        {
            $Data = array(
                'GigDetail' => $GigDetail
            );
             
            //return our $Data array to use on the page
            return $this->Customise($Data);
        }
        else
        {
            //Gig not found
            return $this->httpError(404, 'Sorry that member of staff could not be found');
        }
    }
    
    
    //Return our custom breadcrumbs
    public function Breadcrumbs() {
         
        //Get the default breadcrumbs
        $Breadcrumbs = parent::Breadcrumbs();
         
        if($GigDetail = $this->getGigDetail())
        {
            //Explode them into their individual parts
            $Parts = explode(SiteTree::$breadcrumbs_delimiter, $Breadcrumbs);
     
            //Count the parts
            $NumOfParts = count($Parts);
             
            //Change the last item to a link instead of just text
            $Parts[$NumOfParts-1] = ('<a href="' . $this->Link() . '">' . $Parts[$NumOfParts-1] . '</a>');
             
            //Add our extra piece on the end
            $Parts[$NumOfParts] = $GigDetail->Place .' - '. $GigDetail->Date;
     
            //Return the imploded array
            $Breadcrumbs = implode(SiteTree::$breadcrumbs_delimiter, $Parts);          
        }
 
        return $Breadcrumbs;
    }       
    
    
    
}

here's my template:

<div class="typography">
  <% if GigDetails %>
    <div id="gig-list">
        <% control GigDetails %>
        <div class="gig">
            <h3>$Place</h3>
            <p>$Date.Nice - on stage at $Time</p>
            <p>Address: $Address</p>
            <p><a href="$Link">see map &raquo;</a></p>
        </div>
        <% end_control %>
    </div>
    <% end_if %>
</div>

Thanks in advance!

Mauro

Avatar
UncleCheese

Forum Moderator, 4102 Posts

4 November 2011 at 3:16am

I don't see anything in your code that returns a DataObjectSet. On your controller, you have <% control GigDetails %>, which I assume returns a DOS, but that function isn't anywhere in your code.

--------------------
SilverStripe tips, tutorials, screencasts and more: http://www.leftandmain.com

Avatar
Mauro74

Community Member, 30 Posts

4 November 2011 at 3:53am

Edited: 04/11/2011 5:10am

Hi UncleCheese, you're right I cannot see the function that return a DOS neither, so I'm posting the entire code here so you can have a better understanding of what's going on, because I don't! :)

GigPage.php:

class GigPage extends Page
{
    static $has_many = array(
        'GigDetails' => 'GigDetail'
    );
    
    
    public function getCMSFields()
    {
        $fields = parent::getCMSFields();
         
        $manager = new DataObjectManager(
            $this,
            'GigDetails',
            'GigDetail'
        ); 
        $fields->addFieldToTab("Root.Content.GigDetails", $manager);
         
        return $fields;
    }
}
 
class GigPage_Controller extends Page_Controller
{
    //Allow our 'show' function as a URL action
    static $allowed_actions = array('show');
     
    //Get the current gig detail from the URL, if any
    public function getGigDetail()
    {
        $Params = $this->getURLParams();
         
        if(is_numeric($Params['ID']) && $GigDetail = DataObject::get_by_id('GigDetail', (int)$Params['ID']))
        {      
            return $GigDetail;
        }
    }
     
    //Displays the gig detail detail page, using GigPage_show.ss template
    function show()
    {      
        if($GigDetail = $this->getGigDetail())
        {
            $Data = array(
                'GigDetail' => $GigDetail
            );
             
            //return our $Data array to use on the page
            return $this->Customise($Data);
        }
        else
        {
            //Gig not found
            return $this->httpError(404, 'Sorry that member of staff could not be found');
        }
    }
    
    
    //Return our custom breadcrumbs
    public function Breadcrumbs() {
         
        //Get the default breadcrumbs
        $Breadcrumbs = parent::Breadcrumbs();
         
        if($GigDetail = $this->getGigDetail())
        {
            //Explode them into their individual parts
            $Parts = explode(SiteTree::$breadcrumbs_delimiter, $Breadcrumbs);
     
            //Count the parts
            $NumOfParts = count($Parts);
             
            //Change the last item to a link instead of just text
            $Parts[$NumOfParts-1] = ('<a href="' . $this->Link() . '">' . $Parts[$NumOfParts-1] . '</a>');
             
            //Add our extra piece on the end
            $Parts[$NumOfParts] = $GigDetail->Place .' - '. $GigDetail->Date;
     
            //Return the imploded array
            $Breadcrumbs = implode(SiteTree::$breadcrumbs_delimiter, $Parts);          
        }
 
        return $Breadcrumbs;
    }       
    
    
    
}

GigDetail.php:

class GigDetail extends DataObject
{
    //db fields
    static $db = array (
        'Place' => 'Varchar(255)',
        'Date' => 'Date',
        'Time' => 'Varchar(50)',
        'Address' => 'Varchar(255)',
        //'Address' => 'HTMLText', to return HTML content
        'Postcode' => 'Varchar(50)',
    );
     
    //Relations
    static $has_one = array (
        'GigPage' => 'GigPage',
    );
     
    //Fields to show in the DOM table
    static $summary_fields = array(
        'Place' => 'Place',
        'Date' => 'Date',
        'Time' => 'Time',
        'Address' => 'Address'
    );
     
    //Fields for the DOM Popup
    public function getCMSFields()
    {
        return new FieldSet(
            new TextField('Place'),
            new DatePickerField('Date','Gig Date (for example: 20/12/2010)'),
            new TextField('Time', 'Time (for example: 20.30)'),
            new TextareaField('Address', 'Address'),
            //new SimpleTinyMCEField('Address', 'Address'), to use HTML editor
            new TextField('Postcode', 'Postcode')
        );
    }
    
    //Return the link to view this gig detail
    public function Link()
    {
        if($GigPage = $this->GigPage())
        {
            $Action = 'show/' . $this->ID;
            return $GigPage->Link($Action);   
        }
    }
}

GigPage.ss:

<div class="typography">
  <% if GigDetails %>
    <div id="gig-list">
        <% control GigDetails %>
        <div class="gig">
            <h3>$Place</h3>
            <p>$Date.Nice - on stage at $Time</p>
            <p>Address: $Address</p>
            <p><a href="$Link">see map &raquo;</a></p>
        </div>
        <% end_control %>
    </div>
    <% end_if %>
</div>

GigPage_show.ss

<div class="breadcrumbs">
   <p>$Breadcrumbs</p>
</div>
<div class="typography">
    <h2>Gig Detail</h2>
    <% control GigDetail %>
    <h3>$Place</h3>
            <p>$Date.Nice - on stage at $Time</p>
            <p>Address: $Address</p>
     </div>
    <% end_control %>
</div>

Thanks very much for your help!
Mauro