Version 4 supported
This version of Silverstripe CMS is still supported though will not receive any additional features. Go to documentation for the most recent stable version.

Extending DataObject models

You can add properties and methods to existing DataObjects like Member without hacking core code or sub classing by using DataExtension. See the Extending Silverstripe guide for more information on DataExtension.

The following documentation outlines some common hooks that the Extension API provides specifically for managing data records.

onBeforeWrite

You can customise saving-behavior for each DataObject, e.g. for adding workflow or data customization. The function is triggered when calling write() to save the object to the database. This includes saving a page in the CMS or altering a ModelAdmin record.

Example: Disallow creation of new players if the currently logged-in player is not a team-manager.

namespace App\Model;

use Exception;
use SilverStripe\ORM\DataObject;
use SilverStripe\Security\Security;

class Player extends DataObject
{
    private static $has_many = [
        'Teams' => 'Team',
    ];

    public function onBeforeWrite()
    {
        // check on first write action, aka "database row creation" (ID-property is not set)
        if (!$this->isInDb()) {
            $currentPlayer = Security::getCurrentUser();

            if (!$currentPlayer->IsTeamManager()) {
                throw new Exception('Player-creation not allowed');
            }
        }

        // check on every write action
        if (!$this->record['TeamID']) {
            throw new Exception('Cannot save player without a valid team');
        }

        // CAUTION: You are required to call the parent-function, otherwise
        // SilverStripe will not execute the request.
        parent::onBeforeWrite();
    }
}

onBeforeDelete

Triggered before executing delete() on an existing object.

Example: Checking for a specific permission to delete this type of object. It checks if a member is logged in who belongs to a group containing the permission "PLAYER_DELETE".

namespace App\Model;

use SilverStripe\ORM\DataObject;
use SilverStripe\Security\Permission;
use SilverStripe\Security\Security;

class Player extends DataObject
{
    private static $has_many = [
        'Teams' => 'Team',
    ];

    public function onBeforeDelete()
    {
        if (!Permission::check('PLAYER_DELETE')) {
            Security::permissionFailure($this);
            exit();
        }

        parent::onBeforeDelete();
    }
}

Note: There are no separate methods for onBeforeCreate() and onBeforeUpdate(). Please check $this->isInDb() to toggle these two modes, as shown in the example above.

Related lessons