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.

Customising the CMS /

dynamically adding items to $db

Go to End

12 Posts   2223 Views

Carbon Crayon

Community Member, 598 Posts

15 January 2009 at 11:28am

Ok so here it is, pretty simple in the end...


class EnviromentExtention extends DataObjectDecorator {
   function augmentSQL(SQLQuery &$query) {}
   function SanitizeString($String) {
      $tmp = preg_replace('/\s+/', '_', $String); // compress internal whitespace and replace with _
      $reserved = preg_quote('\/:*?!&"<>|', '/');//characters that are illegal
       //replaces all characters up through space and all past ~ along with the above reserved characters
      return preg_replace("/([\\x00-\\x20\\x7f-\\xff{$reserved}])/e", "", $tmp);

   public function extraDBFields(){
      $db = array();
      if($Enviroments = DataObject::get("EnviromentPage")){
         foreach($Enviroments as $Enviroment)
            $key = $this->SanitizeString($Enviroment->Title);
            $db[$key."_CategoryLink"] = "Varchar(255)";
      return array('db' => $db);
   public function getCMSFields(){   
       $this->extend('updateCMSFields', $fields);
        return $fields;

   public function updateCMSFields(FieldSet &$f) {
      if($Enviroments = DataObject::get("EnviromentPage")){
         foreach($Enviroments as $Enviroment)
            $key = $this->SanitizeString($Enviroment->Title);
            $f->addFieldToTab("Root.Content.Environments", new TextField($key."_CategoryLink"));


Then in my _config.php I have this line:

Object::add_extension('CategorytPage', 'EnviromentExtention');

So now each time I add a new EnviromentPage and flush the DB, the Catagory page gets a new text field under the Enviroments tab called something like ebay_Catagorylink.

Man I love SS :D


Forum Moderator, 4096 Posts

15 January 2009 at 3:55pm

Nice job. The only thing I'd change is you have your SanitizeString method as a dynamic function. There's nothing dynamic about it -- its a simple input/output "factory" function as they're sometimes called. So cast it as static, and call it with self::SanitizeString()

A lot of times for big projects I'll create a whole static class called Strings with all sorts of functions like that.

Just a good practice, that's all.


Community Member, 2 Posts

16 September 2014 at 12:57am

Edited: 16/09/2014 6:07pm

I used this solution on a 3.0 installation, but after upgrade to 3.1, extraStatics/extraDBFields are deprecated.

Now I do not understand how to dynamically add items to $db


Forum Moderator, 1132 Posts

16 September 2014 at 7:41am

Edited: 16/09/2014 6:08pm

In Silverstripe 3.x in a Dataextension you can use the same private static $db = array(...) setup you would use in a DataObject

Go to Top