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, biapar, Willr, Ingo, swaiba, simon_w

Pagination on $belongs_many_many


Reply

6 Posts   770 Views

Avatar
dacar

6 July 2013 at 2:12am Community Member, 168 Posts

Hi, i am currently trying to build a pagination on a dataobject. The DO belongs to many Pages.

<?php

class Mitarbeiter extends DataObject {

// Contact object's fields
private static $db = array(
'Name' => 'Varchar(255)',
   'Vorname' => 'Varchar(255)',
'Beschreibung' => 'Text',
'Webseite' => 'Varchar(255)',
   'Telefon' => 'Varchar(255)',
   'EMail' => 'Varchar(255)'
);

// One-to-one relationship with profile picture and contact list page
private static $has_one = array(
'ProfilePictures' => 'ProfilePictures_Image'
);

   private static $belongs_many_many = array(
      'Page' => 'SiteTree'
   );

In Page.php it is referenced with

   private static $many_many = array(
      'Mitarbeiter'       => 'Mitarbeiter',
...

In the Page Controller i use

   public function PaginatedPages() {
   $paginatedList = new AjaxPaginatedList(Mitarbeiter::get(), $this->request);
$paginatedList->setPageLength(2)->where('"PageID" = '.$this->ID.'')->Sort("SortOrder", "ASC");
return $paginatedList;      
   }

The Dataobjects are linked to the page via

// Start Mitarbeiterzuordnung
         $MitarbeiterFieldConfig = GridFieldConfig::create()->addComponents(
          new GridFieldToolbarHeader(),
          new GridFieldSortableHeader(),
          new GridFieldDataColumns(),
          new GridFieldPaginator(10),
          new GridFieldDeleteAction('unlinkrelation'),
          new GridFieldSortableRows('SortOrder'),
          new GridFieldManyRelationHandler(), 'GridFieldPaginator'
         );
         $MitarbeiterField = new GridField("Mitarbeiter", "Mitarbeiter", $this->Mitarbeiter()->sort('SortOrder'), $MitarbeiterFieldConfig);
         $fields->addFieldToTab('Root.Mitarbeiter', $MitarbeiterField);      

But The PaginatedList now lists all Dataobjects. How can i filter over the Page_Mitarbeiter table to only show those Mitarbeiter that are linked to the current page?

Can anybody help?

Greetings, Carsten.

Avatar
simon_w

6 July 2013 at 10:37am Forum Moderator, 474 Posts

Use $this->Mitarbeiter() to get the ManyManyList, instead of Mitarbeiter::get().

Avatar
dacar

7 July 2013 at 11:17pm (Last edited: 7 July 2013 11:17pm), Community Member, 168 Posts

Hi Simon,

thanks for your reply. I have changed the function to

   public function PaginatedPages() {
$paginatedList = new PaginatedList($this->Mitarbeiter(), $this->request);
      //var_dump($paginatedList);
$paginatedList->setPageLength(2);
$paginatedList->setPageStart(1);
return $paginatedList;
   }

The <% if PaginatedPages %> returns true. The Headline is showen. But the <% loop PaginatedPages %> returns nothing. Am i missing something? Can you help? Greetings, Carsten.

<% if PaginatedPages %>
<div class="clear"></div>
<br /><br />
<div class="page-title-wrapper">
   <h3 class="page-title-left"><% _t('Page.UNSEREMITARBEITER','Ihr Team vom Hotel Hilling') %></h3>
</div>
<div class="pagination-content">

<ul>
<% loop PaginatedPages %>
<li><span>Anzahl Datensätze: PaginatedPages.Count</span>
<div class="cpt-item six columns isotope-item" id="Mitarbeiter">
<div class="thumb-wrapper<% if First %> l0<% end_if %>">

<img class="banner-image inline b5" src="$ProfilePictures.Mitarbeiter.URL" alt="$Vorname $Name">
<div class="thumb-control-wrapper">
<ul class="thumb-control clearfix">
<li><a style="margin-left:20px;" rel="prettyPhoto[gallery1]" title="$Title" href="$ProfilePictures.URL" class="go-gallery">Galerie &ouml;ffnen</a></li>
</ul>
</div>
<p class="red">$PageID $Vorname $Name<br /><span>$Beschreibung</span></p>
</div>
</div>
</li>
<% end_loop %>
</ul>
</div>
<%-- <img class='pagination-indicator' alt="Loading" src="themes/hilling/images/loader.gif"> --%>
<div class="clear"></div>
<div class="pagination" $PaginatedPages.PaginationMetadata(2)>
<% if PaginatedPages.MoreThanOnePage %>
<% if PaginatedPages.NotFirstPage %>
<a class="prev" href="$PaginatedPages.PrevLink#Mitarbeiter"><% _t('Page.PREV','die vorherige Seite anschauen') %></a>
<% end_if %>
<% loop PaginatedPages.Pages %>
<% if CurrentBool %>
   $PageNum
<% else %>
<% if Link %>
<a href="$Link#Mitarbeiter">$PageNum</a>
<% else %>
...
<% end_if %>
<% end_if %>
<% end_loop %>
<% if PaginatedPages.NotLastPage %>
   <a class="next" href="$PaginatedPages.NextLink#Mitarbeiter"><% _t('Page.NEXT','Die nächste Seite anschauen') %></a>
<% end_if %>
<% end_if %>
</div>
<br /><br />
<% end_if %>

Avatar
dacar

11 July 2013 at 1:15am Community Member, 168 Posts

Hi, i am still stucked on this. In page.php i have a many_many relation to the employees (Mitarbeiter). They are related to any page via GridFieldConfig::create(). That works fine. Now i want to show a PaginatedList of these emloyees. Therefore i use the following code in the page.php controller as described in the documentation:

public function PaginatedPages() {
$paginatedList = new PaginatedList($this->Mitarbeiter(), $this->request);
$paginatedList->setPageLength(2);
$paginatedList->setPageStart(1);
$paginatedList->setLimitItems(0);
//$paginatedList->setTotalItems(2);
return $paginatedList;
}

But the function returns all 6 emloyees in the template instead of two? Also the Pagination is showen like

1
<a href="hotel/ueber-uns/team/?start=2#Mitarbeiter">2</a>
<a href="hotel/ueber-uns/team/?start=4#Mitarbeiter">3</a>
<a class="next" href="hotel/ueber-uns/team/?start=3#Mitarbeiter">Die nächste Seite anschauen</a>

I think there went something wrong, too. Even i used the template code from the documentation [url]http://doc.silverstripe.org/framework/en/3.1/howto/pagination[/url]

I have read the Documentation, many forum entries and many IRC Logs. I cant get this one working. Can anybody help, please? Has anybody a working example of a PaginatedList from a many_many relation?

Avatar
dacar

11 July 2013 at 4:13am Community Member, 168 Posts

Here are some aditional informations:

var_dump($this->Mitarbeiter());

object(ManyManyList)#1263 (15) {
["joinTable":protected]=>
string(16) "Page_Mitarbeiter"
["localKey":protected]=>
string(13) "MitarbeiterID"
["foreignKey":protected]=>
string(6) "PageID"
["extraFields":protected]=>
array(1) {
["SortOrder"]=>
string(3) "Int"
}
["dataClass":protected]=>
string(11) "Mitarbeiter"
["dataQuery":protected]=>
object(DataQuery)#1264 (8) {
["dataClass":protected]=>
string(11) "Mitarbeiter"
["query":protected]=>
object(SQLQuery)#1265 (12) {
["select":protected]=>
array(1) {
["SortOrder"]=>
string(30) ""Page_Mitarbeiter"."SortOrder""
}
["from":protected]=>
array(2) {
["Mitarbeiter"]=>
string(13) ""Mitarbeiter""
["Page_Mitarbeiter"]=>
array(4) {
["type"]=>
string(5) "INNER"
["table"]=>
string(16) "Page_Mitarbeiter"
["filter"]=>
array(1) {
[0]=>
string(55) ""Page_Mitarbeiter"."MitarbeiterID" = "Mitarbeiter"."ID""
}
["order"]=>
int(20)
}
}
["where":protected]=>
array(1) {
[0]=>
string(34) ""Page_Mitarbeiter"."PageID" = '13'"
}
["orderby":protected]=>
array(0) {
}
["groupby":protected]=>
array(0) {
}
["having":protected]=>
array(0) {
}
["limit":protected]=>
array(0) {
}
["distinct":protected]=>
bool(true)
["delete":protected]=>
bool(false)
["connective":protected]=>
string(3) "AND"
["replacementsOld":protected]=>
array(0) {
}
["replacementsNew":protected]=>
array(0) {
}
}
["collidingFields":protected]=>
array(0) {
}
["queriedColumns":"DataQuery":private]=>
NULL
["queryFinalised":"DataQuery":private]=>
bool(false)
["querySubclasses":protected]=>
bool(true)
["filterByClassName":protected]=>
bool(true)
["queryParams":"DataQuery":private]=>
array(2) {
["Foreign.ID"]=>
int(13)
["Foreign.Filter"]=>
string(34) ""Page_Mitarbeiter"."PageID" = '13'"
}
}
["model":protected]=>
object(DataModel)#1034 (1) {
["customDataLists":protected]=>
array(0) {
}
}
["inAlterDataQueryCall":protected]=>
bool(false)
["failover":protected]=>
NULL
["customisedObject":protected]=>
NULL
["objCache":"ViewableData":private]=>
array(0) {
}
["class"]=>
string(12) "ManyManyList"
["extension_instances":protected]=>
array(0) {
}
["beforeExtendCallbacks":protected]=>
array(0) {
}
["afterExtendCallbacks":protected]=>
array(0) {
}
}

and

var_dump(array($paginatedList));

array(1) {
[0]=>
object(PaginatedList)#1240 (14) {
["request":protected]=>
object(SS_HTTPRequest)#1035 (12) {
["url":protected]=>
string(26) "ueber-uns/philosopie"
["dirParts":protected]=>
array(0) {
}
["extension":protected]=>
NULL
["httpMethod":protected]=>
string(3) "GET"
["getVars":protected]=>
array(2) {
["url"]=>
string(49) "/ueber-uns/philosopie/"
["start"]=>
string(1) "2"
}
["postVars":protected]=>
array(0) {
}
["headers":protected]=>
array(9) {
["Host"]=>
string(15) "www.....de"
["User-Agent"]=>
string(65) "Mozilla/5.0 (Windows NT 6.1; rv:22.0) Gecko/20100101 Firefox/22.0"
["Accept"]=>
string(63) "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
["Accept-Language"]=>
string(35) "de-de,de;q=0.8,en-us;q=0.5,en;q=0.3"
["Accept-Encoding"]=>
string(13) "gzip, deflate"
["Dnt"]=>
string(1) "1"
["Referer"]=>
string(71) "http://www.....de/..."
["Cookie"]=>
string(285) "PastMember=1; PHPSESSID=7ac71f34a6d41fae8c211235fb57b39b; bypassStaticCache=1; cms-panel-collapsed-cms-content-tools-CMSMain=false; cms-panel-collapsed-cms-menu=false; cms-panel-collapsed-cms-content-tools-CMSPagesController=true; cms-panel-collapsed-cms-content-tools-ModelAdmin=false"
["Connection"]=>
string(10) "keep-alive"
}
["body":protected]=>
string(0) ""
["allParams":protected]=>
array(4) {
["URLSegment"]=>
string(10) "philosopie"
["Action"]=>
NULL
["ID"]=>
NULL
["OtherID"]=>
NULL
}
["latestParams":protected]=>
array(3) {
["Action"]=>
NULL
["ID"]=>
NULL
["OtherID"]=>
NULL
}
["routeParams":protected]=>
array(1) {
["Controller"]=>
string(17) "ModelAsController"
}
["unshiftedButParsedParts":protected]=>
int(2)
}
["getVar":protected]=>
string(5) "start"
["pageLength":protected]=>
int(2)
["pageStart":protected]=>
NULL
["totalItems":protected]=>
NULL
["limitItems":protected]=>
bool(true)
["list":protected]=>
object(ManyManyList)#1260 (15) {
["joinTable":protected]=>
string(16) "Page_Mitarbeiter"
["localKey":protected]=>
string(13) "MitarbeiterID"
["foreignKey":protected]=>
string(6) "PageID"
["extraFields":protected]=>
array(1) {
["SortOrder"]=>
string(3) "Int"
}
["dataClass":protected]=>
string(11) "Mitarbeiter"
["dataQuery":protected]=>
object(DataQuery)#1261 (8) {
["dataClass":protected]=>
string(11) "Mitarbeiter"
["query":protected]=>
object(SQLQuery)#1262 (12) {
["select":protected]=>
array(1) {
["SortOrder"]=>
string(30) ""Page_Mitarbeiter"."SortOrder""
}
["from":protected]=>
array(2) {
["Mitarbeiter"]=>
string(13) ""Mitarbeiter""
["Page_Mitarbeiter"]=>
array(4) {
["type"]=>
string(5) "INNER"
["table"]=>
string(16) "Page_Mitarbeiter"
["filter"]=>
array(1) {
[0]=>
string(55) ""Page_Mitarbeiter"."MitarbeiterID" = "Mitarbeiter"."ID""
}
["order"]=>
int(20)
}
}
["where":protected]=>
array(1) {
[0]=>
string(34) ""Page_Mitarbeiter"."PageID" = '13'"
}
["orderby":protected]=>
array(0) {

}
["groupby":protected]=>
array(0) {
}
["having":protected]=>
array(0) {
}
["limit":protected]=>
array(0) {
}
["distinct":protected]=>
bool(true)
["delete":protected]=>
bool(false)
["connective":protected]=>
string(3) "AND"
["replacementsOld":protected]=>
array(0) {
}
["replacementsNew":protected]=>
array(0) {
}
}
["collidingFields":protected]=>
array(0) {
}
["queriedColumns":"DataQuery":private]=>
NULL
["queryFinalised":"DataQuery":private]=>
bool(false)
["querySubclasses":protected]=>
bool(true)
["filterByClassName":protected]=>
bool(true)
["queryParams":"DataQuery":private]=>
array(2) {
["Foreign.ID"]=>
int(13)
["Foreign.Filter"]=>
string(34) ""Page_Mitarbeiter"."PageID" = '13'"
}
}
["model":protected]=>
object(DataModel)#1034 (1) {
["customDataLists":protected]=>
array(0) {
}
}
["inAlterDataQueryCall":protected]=>
bool(false)
["failover":protected]=>
NULL
["customisedObject":protected]=>
NULL
["objCache":"ViewableData":private]=>
array(0) {
}
["class"]=>
string(12) "ManyManyList"
["extension_instances":protected]=>
array(0) {
}
["beforeExtendCallbacks":protected]=>
array(0) {
}
["afterExtendCallbacks":protected]=>
array(0) {
}
}
["failover":protected]=>
object(ManyManyList)#1260 (15) {
["joinTable":protected]=>
string(16) "Page_Mitarbeiter"
["localKey":protected]=>
string(13) "MitarbeiterID"
["foreignKey":protected]=>
string(6) "PageID"
["extraFields":protected]=>
array(1) {
["SortOrder"]=>
string(3) "Int"
}
["dataClass":protected]=>
string(11) "Mitarbeiter"
["dataQuery":protected]=>
object(DataQuery)#1261 (8) {
["dataClass":protected]=>
string(11) "Mitarbeiter"
["query":protected]=>
object(SQLQuery)#1262 (12) {
["select":protected]=>
array(1) {
["SortOrder"]=>
string(30) ""Page_Mitarbeiter"."SortOrder""
}
["from":protected]=>
array(2) {
["Mitarbeiter"]=>
string(13) ""Mitarbeiter""
["Page_Mitarbeiter"]=>
array(4) {
["type"]=>
string(5) "INNER"
["table"]=>
string(16) "Page_Mitarbeiter"
["filter"]=>
array(1) {
[0]=>
string(55) ""Page_Mitarbeiter"."MitarbeiterID" = "Mitarbeiter"."ID""
}
["order"]=>
int(20)
}
}
["where":protected]=>
array(1) {
[0]=>
string(34) ""Page_Mitarbeiter"."PageID" = '13'"
}
["orderby":protected]=>
array(0) {
}
["groupby":protected]=>
array(0) {
}
["having":protected]=>
array(0) {
}
["limit":protected]=>
array(0) {
}
["distinct":protected]=>
bool(true)
["delete":protected]=>
bool(false)
["connective":protected]=>
string(3) "AND"
["replacementsOld":protected]=>
array(0) {
}
["replacementsNew":protected]=>
array(0) {
}
}
["collidingFields":protected]=>
array(0) {
}
["queriedColumns":"DataQuery":private]=>
NULL
["queryFinalised":"DataQuery":private]=>
bool(false)
["querySubclasses":protected]=>
bool(true)
["filterByClassName":protected]=>
bool(true)
["queryParams":"DataQuery":private]=>
array(2) {
["Foreign.ID"]=>
int(13)
["Foreign.Filter"]=>
string(34) ""Page_Mitarbeiter"."PageID" = '13'"
}
}
["model":protected]=>
object(DataModel)#1034 (1) {
["customDataLists":protected]=>
array(0) {
}
}
["inAlterDataQueryCall":protected]=>
bool(false)
["failover":protected]=>
NULL
["customisedObject":protected]=>
NULL
["objCache":"ViewableData":private]=>
array(0) {
}
["class"]=>
string(12) "ManyManyList"
["extension_instances":protected]=>
array(0) {
}
["beforeExtendCallbacks":protected]=>
array(0) {
}
["afterExtendCallbacks":protected]=>
array(0) {
}
}
["customisedObject":protected]=>
NULL
["objCache":"ViewableData":private]=>
array(0) {
}
["class"]=>
string(13) "PaginatedList"
["extension_instances":protected]=>
array(0) {
}
["beforeExtendCallbacks":protected]=>
array(0) {
}
["afterExtendCallbacks":protected]=>
array(0) {
}
}
}

Avatar
dacar

13 July 2013 at 10:01pm Community Member, 168 Posts

Hi, just made a 1-to-1 test with the example from [link]http://doc.silverstripe.org/framework/en/3.1/howto/pagination[/link]. This doesn't work on 3.1, too. Has any body any experiences with pagination and SS3.1?

Greetings, Carsten.