Last modified on 21 October 2010, at 15:34

SilverStripe


The intent of this book is to be a set of solutions for common problems in the SilverStripe CMS ('content management system').

About SilverStripeEdit

SilverStripe is an MVC (model/view/controller) Framework and Content Management System based on PHP5 and MySQL5.

Building a moduleEdit

Loading page specific JavaScript and CSSEdit

// controller
class Movies_Controller extends Page_Controller
{
        // init
        function init()
        {       
                Requirements::javascript('mysite/javascript/movies.js');

                parent::init();
        }
}

CRUD (Create, Read, Update and Delete) in the CMSEdit

Let's say that we need to allow the Administrator to edit the list of coders in the Developers section.

First we need to create the Developers DataObject.

class Developers_DataObject extends DataObject
{
        // fields
        static $db = array(
                'Name'          =>'Varchar(150)',
                'Lastname'      =>'Varchar(150)',);

        // edit form in the CMS
        function getCMSFields_forPopup()
        {
                $fields = new FieldSet();
                $fields->push( new TextField( 'Name', 'Name:' ) );
                $fields->push( new TextField( 'Lastname', 'Lastname:' ) );
                return $fields;
        }
}

In the same DataObject, we need to define the fields for the form.

Next, we need to create the Page type for the Developers section.

class Developers_Page extends Page {

    // make the relation between the section and the list of coders
    static $has_one = array(
        'MyDeveloper' => 'Developers_DataObject'
    );


    // manage the relation in the CMS
    function getCMSFields()
    {
        // don't overwrite the main fields
        $fields = parent::getCMSFields();

        $tablefield = new HasOneComplexTableField(
            $this,
            'MyDeveloper',
            'Developers_DataObject', 
            array(
                'Name' => 'Name',
                'Lastname' => 'Lastname',), 
            'getCMSFields_forPopup');

            // add a new tab in the CMS
            $fields->addFieldToTab( 'Root.Content.Coders', $tablefield );
                                        
            return $fields;
    }
}

Our next step is to create a new page "Developers".

Now we need to go to "Behaviour" and change the page type to Developers.

This new page will have a tab called "Coders", where we can edit the developers list.

Relationing a DataObject with a ModuleEdit

In this case we'll make a relation between Movies and Cities. Then we'll allow the administrator to add new cities in a page type 'Movies'.

<?php
/*
 * Local Cities Data Object
 * 
 */
class LocalCitiesDataObject extends DataObject
{
        static $db = array(
                "Name" => "Varchar(150)"
        );
        
        // relation
        static $has_one = array(
                'LocalCities' => 'Movies' // 1-n relation
        );
        
        // edit form for the CMS
        function getCMSFields_forPopup()
        {
                $fields = new FieldSet();
                $fields->push( new TextField( 'Name' ) );
                return $fields;
        }
}

/**
 * Defines the Movies page type
 */
class Movies extends Page
{

        // relation
        static $has_many = array(
                'LocalCities' => 'LocalCitiesDataObject' // 1-n relation
        );

        // records list in the CMS
        function getCMSFields()
        {
                // don't overwrite the defaults fields for the Page
                $fields = parent::getCMSFields();

                // for handling 1-n relation
                $tablefield = new HasManyComplexTableField(
                        $this,
                'LocalCities', // the name of the relationship
                'LocalCitiesDataObject', // the related table 
                        array(
                                "Name" => "Name"
                        ),
                 'getCMSFields_forPopup' // the function to build the add/edit form
         );

         $fields->addFieldToTab( 'Root.Content.Cities', $tablefield );
         
         return $fields;
        }
}

CreditsEdit

This contribution is courtesy of the following coders:

  • Guy Steuart
  • Leonardo Alberto Celis