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, biapar, Willr, Ingo, swaiba

dynamically adding items to $db


Go to End
Reply


12 Posts   2461 Views

Avatar
Carbon Crayon

Community Member, 598 Posts

15 January 2009 at 11:28am

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

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.

Avatar
mrguits

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

Avatar
martimiz

Forum Moderator, 1199 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