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.

General Questions

General questions about getting started with SilverStripe that don't fit in any of the categories above.

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

Model admin dataobject and translated site tree


2 Posts   671 Views


16 March 2012 at 8:59pm (Last edited: 16 March 2012 10:55pm), Community Member, 16 Posts


(I wanted to move this post from general question to dataobject manager. sorry if i did something wrong)

Based on Aram great tutorial :

I'm building a website for a galery.

I have a main DataObject called 'Oeuvre' every 'Oeuvre' has title, images etc..
Then I can link any of them to a ArtistePage (see screenshot ):

$Artistes = DataObject::get('ArtistePage');
$f->addFieldToTab("Root.Artistes", new CheckboxsetField('Artistes', 'Artistes', $Artistes));

It works perfectly with the main language sitetree but if I translate an ArtistPage using the site tree translation the link is broken.

Is there a way not break the link between a translated page and the data object (best) or a way to relink them manualy.

Thanks a lot

Below the full code


class Oeuvre extends DataObject
static $db = array(
'Titre' => 'Varchar(255)',
'Annee' => 'Text',
'TechniqueFr' => 'Text',
'TechniqueEn' => 'Text',
'Editions' => 'Text',
'DescriptionFr' => 'Text',
'DescriptionEn' => 'Text',
'URLSegment' => 'Varchar(255)',
'MetaTitle' => 'Varchar(255)'

//Set our defaults
static $defaults = array(
'Title' => 'New Oeuvre',
'URLSegment' => 'new-Oeuvre'

static $has_many = array(
'Photos' => 'Photo'

//Relate to the Artiste and Exposition pages
static $belongs_many_many = array(
'Artistes' => 'ArtistePage',
'Expositions' => 'ExpositionPage'

//Fields to show in ModelAdmin table
static $summary_fields = array(
'Titre' => 'Titre',
'Artistes' => 'Artiste',
'Thumbnail' => 'Image'
//'Photos.CMSThumbnail.Tag'=> 'Photo'

//Thumbnail to show in ModelAdmin table
function getThumbnail()
if($gallery = DataObject::get_one("Photo", "OeuvreId = {$this->ID}"))
return ($img = $gallery->Attachment()) ? $img->CroppedImage(150,150) : "no image";
return "no gallery";
//Add an SQL index for the URLSegment
static $indexes = array(
"URLSegment" => true

//Fields to search in ModelAdmin
static $searchable_fields = array (
'Artistes.ID' => array(
'title' => 'Artiste'
'Expositions.ID' => array(
'title' => 'Exposition'

public function getCMSFields()
$f = parent::getCMSFields();
$manager = new FileDataObjectManager(
$this, // Controller
'Photos', // Source name
'Photo', // Source class
'Attachment', // File name on DataObject
'Titre' => 'Titre',
'Annee' => 'Année',
'TechniqueFr' => 'Technique Français',
'TechniqueEn' => 'Technique English',
'Editions' => 'Editions',
'DescriptionFr' => 'Description Français',
'DescriptionEn' => 'Description English',
'URLSegment' => 'URL Segment',
'MetaTitle' => 'Meta Title'
), // Headings
'getCMSFields_forPopup' // Detail fields (function name or FieldSet object)
// Filter clause
// Sort clause
// Join clause
$manager->copyOnImport = false;
$f->addFieldToTab("Root.Photos", $manager);
$Artistes = DataObject::get('ArtistePage');
$f->addFieldToTab("Root.Artistes", new CheckboxsetField('Artistes', 'Artistes', $Artistes));

$Expositions = DataObject::get('ExpositionPage');
$f->addFieldToTab("Root.Expositions", new CheckboxsetField('Expositions', 'Expositions', $Expositions));
return $f;

//Set URLSegment to be unique on write
function onBeforeWrite()
// If there is no URLSegment set, generate one from Title
if((!$this->URLSegment || $this->URLSegment == 'new-Oeuvre') && $this->Title != 'New Oeuvre')
$this->URLSegment = SiteTree::generateURLSegment($this->Title);
else if($this->isChanged('URLSegment'))
// Make sure the URLSegment is valid for use in a URL
$segment = preg_replace('/[^A-Za-z0-9]+/','-',$this->URLSegment);
$segment = preg_replace('/-+/','-',$segment);

// If after sanitising there is no URLSegment, give it a reasonable default
if(!$segment) {
$segment = "Oeuvre-$this->ID";
$this->URLSegment = $segment;

// Ensure that this object has a non-conflicting URLSegment value.
$count = 2;
$this->URLSegment = preg_replace('/-[0-9]+$/', null, $this->URLSegment) . '-' . $count;


//Test whether the URLSegment exists already on another Oeuvre
function LookForExistingURLSegment($URLSegment)
return (DataObject::get_one('Oeuvre', "URLSegment = '" . $URLSegment ."' AND ID != " . $this->ID));

//Generate the link for this Oeuvre
function Link()
//if we are on a Artiste page return that
if(Director::CurrentPage()->ClassName == 'ArtistePage')
$Artiste = Director::CurrentPage();
//Otherwise just grab the first Artiste this Oeuvre is in
$Artiste = $this->Artistes()->First();
//Check we have a Artiste then return the link
return $Artiste->absoluteLink() . 'show/' . $this->URLSegment;



19 March 2012 at 9:44pm Community Member, 16 Posts


I'm sorry to insist but I tried to find a solution to this with no sucess

I just want to know if a at least there is a way I could look (tutotrials recipies anything)