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.

DataObjectManager Module

Discuss the DataObjectManager module, and the related ImageGallery module.

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

Alphabetically display DataObjects


Go to End
Reply

9 Posts   1407 Views

Avatar
Stefdv

17 November 2010 at 10:30pm Community Member, 110 Posts

I know there's been some discussion about this in the past, there's even a recipe about this issue but i just don't get it to work.

I have a lot of Movies (about 200+) and TV Series (about 180+) they're both DataObjects.
I used the tutorials
" http://ssbits.com/tutorials/2010/dataobjects-as-pages-part-1-keeping-it-simple/ "
to make everything work as i need but my sidemenu is getting waaaaay to long.

I need to sort them out in some kind of ABC, so i don't want the whole listing in the sidebar. I want to have some kind of Navbar on top of my page witch will show [ 0 - 9 | A - C | D - F etc. ] and then when i select one of those it will show only those movies.

Now i've been through the recipe http://doc.silverstripe.org/recipes:alphabetical_dataobjectset but i don't get it to work.

I could really use an (extended) example.

Tx in advance

Avatar
UncleCheese

18 November 2010 at 4:48am (Last edited: 18 November 2010 4:49am), 4085 Posts

That's super easy..

static $ranges = array (
'0-9',
'A-D',
'E-G',
// etc...
);

public function AlphaLinks() {
$set = new DataObjectSet();
foreach(self::$ranges as $range) {
$set->push(new ArrayData(array(
'Link' => HTTP::setGetVar('range', $range),
'Current' => $this->getRequest()->getVar('range') == $range,
'Label' => $range
)));
}
return $set;
}

public function AlphabeticalItems() {
$r = $this->getRequest()->getVar('range');
if(!$r) {
// default range to show
$r = "A-D";
}
list($start, $end) = explode("-", $r);
return DataObject::get("SomeDataObject", "Title > '$start' AND Title < '$end'");
}

template

<% control AlphaLinks %>
<a href="$Link" <% if Current %>class="current"<% end_if %>>$Label</a>
<% end_control %>

<% control AlphabeticalItems %>
$Title
<% end_control %>

Can't promise it's free of parse errors, but that should get you started..

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

Avatar
Stefdv

18 November 2010 at 5:03am (Last edited: 18 November 2010 5:28am), Community Member, 110 Posts

LOL UncleCheese,

Sure...for you its easy. For me its ...well i give it a go.

I have absolutely no idea what you are doing with that exploding thing but i will try to figure it out.

anyway, as allways thank u so much for your quick reply.

Avatar
Stefdv

18 November 2010 at 5:24am (Last edited: 18 November 2010 5:28am), Community Member, 110 Posts

Wauw UC,

That sure gives me a great deal of what i was looking for. The only thing is that its giving me the ID instead of the name of the Serie ( SerieName in my case ).

Could you help me out with that also please?

tx

btw; i figured out the exploding thing .

Avatar
UncleCheese

18 November 2010 at 5:30am 4085 Posts

Ha.. I wrote "that's super easy" before I actually coded all that up. Agreed, it's not super easy, but it's really not a huge undertaking in the grand scheme of things.

Quick PHP lesson:

explode() is a function that breaks a string up into an array when given a certain delimiter. It's Javascript counterpart is split(), if you've ever used that.

$str = "One/Two/Three/Four";
var_dump(explode("/", $str));

// returns:
array (
'One', 'Two', 'Three', 'Four'
)

list() is a weird function that takes all the members of an array and makes them their own variables..

list($one, $two, $three, $four) = explode("/", $str);

echo $two;

// returns "Two"

So in my example, you're exploding "A-D" to be an array of "A" and "D"
list($start, $end) will give you:

echo $start; // "A";
echo $end; // "D";

Make sense?

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

Avatar
UncleCheese

18 November 2010 at 5:31am 4085 Posts

What do you mean "it's giving me the ID".. where? On the template?

If you don't have a "Title" field, replace that with whatever you're using as a label.

Avatar
Stefdv

18 November 2010 at 5:39am (Last edited: 18 November 2010 6:07am), Community Member, 110 Posts

UncleCheese,

Do you get payed for all your advice? My God this must be the best support forum i have ever encountered.

Anyway,

on my frontend it shows the 0-9, a-d etc. links, but when i click on one of them it returns the ID of the corresponding DataObjects.

I did change

<Code> return DataObject::get("SomeDataObject", "Title > '$start' AND Title< '$end'"); </Code>

to

<Code> return DataObject::get("Serie", "SerieName > '$start' AND SerieName < '$end'"); </Code>

Avatar
Stefdv

18 November 2010 at 5:41am Community Member, 110 Posts

UncleCheese,

I am so sorry, i did not change Title to SerieName in the Template.

Its working great now

Thank u so much.

Go to Top