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.

Template Questions

Is there a control to detect every nth list item


Reply

23 Posts   7015 Views

Avatar
Hammy

17 February 2009 at 7:17am (Last edited: 17 February 2009 7:23am), Community Member, 49 Posts

Awesome, that worked :)

My only concern about adding it into the /sapphire/code/ViewableData.php is that when I go to update the SS with another release, this could easily be forgotten about. Is there a way to extend this?

I've tried adding the following into my _config.php

Object::add_extension('ViewableData', 'ExtendedViewableData');

and in /mysite/code/ExtenedViewableData.php

<?php
class ExtendedViewableData extends Extension {
   
   /**
    * Returns 'true' if this item is after 4th item.
    * @return boolean
    */
   function IsAfterFourth() {
      return $this->iteratorPos % 4 == 0;
   }
   
}
?>

But this doesn't seem to work and I get the following error:

"[User Error] Object::__call() Method 'loadExtraStatics' not found in class 'ExtendedViewableData'"

Have I got this all wrong and need to approach it from another angle?

Avatar
UncleCheese

17 February 2009 at 1:31pm 4085 Posts

There is absolutely no reason why you should have to hack the core to do this. Add the function I gave you to the object you're controlling. For instance:

<% control MyObject %>
<% if Fourth %>Fourth<% end_if %>
<% end_control %>

class MyObject
{
function Fourth()
{
return !$this->iteratorPos % 4;
}
}

Avatar
Trym

17 February 2009 at 7:17pm Community Member, 18 Posts

Hi UncleCheese.

If the object that is in control is a DataObjectSet returned from e.g. the method call "DataObject::get", then its more troblesome to add the desired functionality.

Do you have a suggestion for this?

Best regards Trym

Avatar
Hammy

17 February 2009 at 9:49pm Community Member, 49 Posts

Sorry - should have mentioned that I'm using DataObject::get method as the object inside the control...

Avatar
UncleCheese

18 February 2009 at 3:23am 4085 Posts

Right.. so this:

class SomePage extends Page
{
function Objects()
{
return DataObject::get("SomeObject");
}
}

class SomeObject
{
function Fourth() { return !$this->iteratorPos % 4;}
}

<% control Objects %>
<% if Fourth %>fourth<% end_if %>
<% end_control %>

Shouldn't need anything more than that. I do this all the time.

Avatar
Trym

18 February 2009 at 3:49am Community Member, 18 Posts

cool.

\trym

Avatar
reekrd

26 June 2009 at 7:17am Community Member, 9 Posts

Hi.

I'm trying to apply this to the second tutorial, http://doc.silverstripe.org/doku.php?id=tutorial:2-extending-a-basic-site

My setup is exactly as in the tutorial and for every third news item I would like to add a divider or set a special css class. I just can't figure it out :(

This is how my HomePage.ss looks like:

<div id="NewsWrapper" class="content {$URLSegment}">
   <ul id="NewsList">
   <% control LatestNews %>
      <li class="newsitem">
         <h1><a href="$Link" title="Read more on &quot;{$Name}&quot;">$Title</a></h1>
         <h3>$Date.Nice</h3>
         <p>$Content.FirstParagraph <a href="$Link" title="Read more on &quot;{$Title}&quot;">Read more &gt;&gt;</a></p>
      </li>
   <% end_control %>
   </ul>
</div> <!-- end: NewsWrapper -->

In this thread I saw that there is a template variable called $Pos that gives you the current position. However I can't figure out how to use it. It seems logical that I could simply do:

<% control LatestNews %>
   <% if (($Pos%3)==0) %>
      <li class="newsitem">
   <% else %>
      <li class="newsitem">
   <% end_if %>
      <h1><a href="$Link" title="Read more on &quot;{$Name}&quot;">$Title</a></h1>
      <h3>$Date.Nice</h3>
      <p>$Content.FirstParagraph <a href="$Link" title="Read more on &quot;{$Title}&quot;">Read more &gt;&gt;</a></p>
   </li>
<% end_control %>

But that gives me a blank page. I can't seem to use it in any way when I combine it with an if statement. It would be awesome if the tutorials also would cover things like this. Tutorials that are more from a designers point of view.

Maybe there is a section in the documentation or tutorials that covers things like this. If not it would be very helpful to collect all these types of tips and tricks so it's easier for a designer to jump straight into using SilverStripe without really having to understand the inner workings of it....

Best
.r

Avatar
UncleCheese

26 June 2009 at 7:32am 4085 Posts

Assuming you're using the same classes that are in the tutorial, you can just add to your ArticlePage class:

public function Third()
{
return !$this->iteratorPos % 3;
}

then replace:

<% if (($Pos%3)==0) %>

with

<% if Third %>