menu

three in a row

Posted by on | Comments

Below is a function that can be helpful in making a grid in the Silverstripe CMS. Providing css clases to mark columns and rows.  What you need is the following setup: one or more Parent Pages, each with a bunch of ChildPages.  The function below will return a data object set with the parent pages and the child pages with a a few  extra variables that can be used in classes in your template.

static $number_of_items_per_row = 3;
function GridDataObjectSet() {
        $dos = new DataObjectSet();
        //get parents
        $parentDos = DataObject::get("ParentPageClassName");
        if($parentDos) {
            foreach($parentDos as $parentPage) {
                //get children
                $children = DataObject::get("ChildPageClassName", "`ParentID` = ".$parentPage->ID);
                //set children
                $parentPage->ChildPages = new DataObjectSet();
                if($children) {
                    //work out row counts
                    $parentPage->ChildCount = $children->count();
                    $parentPage->ChildCount = $children->count();
                    $parentPage->NumberOfRows = ceil($parentPage->ChildCount/ self::$number_of_items_per_row);
                    $count = 0;
                    foreach($children as $child) {
                        $count++;
                        //work out column position
                        $child->ColumnPosition = "middleColumn";
                        if(!(($count) % self::$number_of_items_per_row)) {
                            $child->ColumnPosition = "lastColumn";
                        }
                        elseif(!(($count - 1) % self::$number_of_items_per_row)) {
                            $child->ColumnPosition= "firstColumn";
                        }
                        //work out row position
                        $child->RowNumber = ceil($count / self::$number_of_items_per_row);
                        if($child->RowNumber == 1) {
                            $child->FirstRowLastRow = "onFirstRow";
                        }
                        elseif($child->RowNumber == $parentPage->NumberOfRows) {
                            $child->FirstRowLastRow = "onLastRow";
                        }
                        $parentPage->ChildPages->push($child);
                    }
                }
                $dos->push($parentPage);
            }
        }
        return $dos;
    }

here is the template code that goes with it:

<% if GridDataObjectSet %><% control GridDataObjectSet  %>
<h2>$Title</h2>
<ul>
    <% control ChildPages %>
    <li>
        <a href="$Link">$Title</a>
    </li>
    <% end_control %>

</ul>
<% end_control %><% end_if %>
number_of_logos_per_row