Versions:

This document contains information for an outdated version and may not be maintained any more. If some of your projects still use this version, consider upgrading as soon as possible.

Extending DataObjects

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 customize 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.

<?php

class Player extends DataObject {

  private static $has_many = array(
    "Teams"=>"Team"
  );

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

      if(!$currentPlayer->IsTeamManager()) {
        user_error('Player-creation not allowed', E_USER_ERROR);
        exit();
      }
    }

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

    // 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".

<?php

class Player extends DataObject {

  private static $has_many = array(
    "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.

Was this article helpful?