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