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 /

Moderators: martimiz, Sean, Ed, biapar, Willr, Ingo, swaiba

dynamically adding items to $db

Go to End

12 Posts   2780 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, 4102 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, 1203 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