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


Reply

12 Posts   1993 Views

Avatar
Carbon Crayon

15 January 2009 at 11:28am Community Member, 598 Posts

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

EnviromentExtention.php

<?php
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

Avatar
UncleCheese

15 January 2009 at 3:55pm 4085 Posts

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.

Avatar
mrguits

16 September 2014 at 12:57am (Last edited: 16 September 2014 6:07pm), Community Member, 2 Posts

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

Avatar
martimiz

16 September 2014 at 7:41am (Last edited: 16 September 2014 6:08pm), Forum Moderator, 1091 Posts

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