Jump to:

23483 Posts in 18976 Topics by 2878 members

General Questions

SilverStripe Forums » General Questions » Model admin dataobject and translated site tree

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

Page: 1
Go to End
Author Topic: 658 Views
  • Possibles
    Community Member
    16 Posts

    Model admin dataobject and translated site tree Link to this post


    (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;


  • Possibles
    Community Member
    16 Posts

    Re: Model admin dataobject and translated site tree Link to this post


    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)


Page: 1
Go to Top

Want to know more about the company that brought you SilverStripe? Then check out SilverStripe.com

Comments on this website? Please give feedback.