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.

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

Sort DataList by ID array


Go to End


5 Posts   3548 Views

Avatar
Matulko

Community Member, 9 Posts

18 July 2012 at 7:40pm

hello

i got array with last opened pages and i wanna ask you how to order items in datalist by this ordered array

i tried to add items one by one but it doesnt work

$idList = Session::get('recentproducts');
		
$dl = DataList::create('ProductPage')->byIDs(array($idList[0]));
for ($i = 1; $i < count($idList); $i++)
{
	$dl->addMany( DataList::create('ProductPage')->byIDs(array($idList[$i])));	
}
		
return $dl;

aby better idea?
thx

Avatar
dpde

Community Member, 15 Posts

19 July 2012 at 12:05am

Avatar
Matulko

Community Member, 9 Posts

19 July 2012 at 7:40pm

thanks, but i'm not sure you understood my problem

I have array with ID of pages
(for example 35 43 30 32 40 50 83 52)
and I want to create DataList with DataObjects in same order as in array

(or maybe i dont understand how to use sort method in this case, can you show me it in code please)

Avatar
dpde

Community Member, 15 Posts

19 July 2012 at 8:24pm

Edited: 20/07/2012 1:47am

Sorry, I misunderstood your problem, but although you can use the sort metod combined with SQL functions .

You have an array with product ids and want to create a DataList with that products wich are in the same order like in your array?

Try the following:

// $idList is a comma separated string?
$dl = DataList::create('ProductPage')->byIDs(array($idList[0]))->sort('FIELD(ID, ' . $idList . ')');

// Plain SQL would look like 
// SELECT * FROM ProductPage WHERE ID IN (35, 43 ,30 ,32) ORDER BY FIELD (ID, 35, 43, 30, 32);

Greetings
dpde

Avatar
Blackdog

Community Member, 156 Posts

20 July 2012 at 1:46am

If you are planning for this to be in a GridField and you wish to change the sorting I would checkout the Sortable GridField Component.

https://github.com/UndefinedOffset/SortableGridField

Then you can drag and drop those items into whatever order you want and just use the sort() function when you build the list.