407 Nachrichten unter 107 Themen von 101 Mitgliedern
[SilverStripe Roadmap][Changelog]

Dataobject mit mehreren Files

Seite: 1 753 mal gelesen
  • spankmaster79
    spankmaster79 Community Member
    22 Beiträge

    Dataobject mit mehreren Files

    Hi,

    ich möchte ein DataObject bauen das mehrere Files beinhalten kann. Das dann wiederum einer Seite zugeordnet ist.

    public static $has_one = array (
    'Attachment' => 'File',
    'Page' => 'Page'
    );
    public static $has_many = array (
    'OtherAttachments' => 'File',
    );

    Wenn ich nun das ganze über einen ModelAdmin verwalte und weiss ich nicht welchen Manager ich für die Files nehmen soll. Probiere ich es mit einem FileDataObjectManager werden mir alle Files aufgelistet, ich habe aber noch garkeine zugeordnet.


    public function getCMSFields() {
    $fieldset = parent::getCMSFields();

    $fieldset->addFieldToTab('Root.Main', new FileIFrameField('Attachment', 'Datei'));

    /* @var $manager FileDataObjectManager */
    $manager = new HasManyComplexTableField(
    $this, // Controller
    'OtherAttachments', // Source name
    'File', // Source class
    'OtherAttachments', // File name on DataObject
    array(
    'Name' => 'Name',
    'Description' => 'Beschreibung',
    'Date' => 'Datum'
    ), // Headings 'field' => 'text'
    'getCMSFields_forPopup' // Detail fields (function name or FieldSet object)
    // Filter clause
    // Sort clause
    // Join clause
    );

    $fieldset->replaceField('OtherAttachments', $manager);

    return $fieldset;
    }


    Oder hab ich da irgendwo einen Denkfehler...

    Gruß
    Spanky
  • Izeroy
    Community Member
    211 Beiträge

    Re: Dataobject mit mehreren Files

    Hallo Spanky,
    da du keiner Filter eingebaut hast, werden natürlich alle Files angezeigt.

    Du müsstest dafür einen Filter in deinen FileDataObjectManager einbauen:


    ...
    array(
    'Name' => 'Name',
    'Description' => 'Beschreibung',
    'Date' => 'Datum'
    ), // Headings 'field' => 'text'
    'getCMSFields_forPopup' // Detail fields (function name or FieldSet object)
    // Filter clause
    // Sort clause
    // Join clause

    ...


    Dies wäre meine 1. Idee!

    So eine zweite Sache kam mir gerade beim Durchschauen deines Codes:


    ...
    /* @var $manager FileDataObjectManager */

    $manager = new HasManyComplexTableField(

    $this, // Controller

    'OtherAttachments', // Source name <<< ist dies so Korrekt? Dort muss der Name der Relation zum DataObject stehen.

    'File', // Source class <<< und dort dann natürlich der Name der Klasse des DataObjects

    'OtherAttachments', // File name on DataObject
    ...


    Greetz
    Ben

    Weitere Fragen?! Meld dich einfach! MSN: benjamin.buessenschuett@hotmail.de ICQ: 354 848 193 Webseite: www.silverstripe-hilfe.de

  • Pipifix
    Pipifix Community Member
    32 Beiträge

    Re: Dataobject mit mehreren Files

    Hallo Spankmaster, Hallo Itzeroy.

    Ich bin gerade dabei, in die Tiefen von Silverstripe und deren DOs einzutauchen. Dabei bin ich auf diesen Thread gestoßen. Doch der führt nicht bis zum Ende... Daher wollte ich fragen, ob ihr die Lösung/Codesnippet zu eurem Problem heir anfügen könnt, damit ich es durcharbeiten kann. Oder evtl mir eine Hilfestellung zu meinem Problem geben könnt:
    Ich habe ein Datenobjekt 'Projekte'. Dieses funktioniert auch alles super. Nun soll ich mehrere PDFs als Downloadelement anfügen. Wenn ich es recht sehe, muss ich mein Projekt-DO um
    public static $has_one = array (
    'Attachment' => 'File'
    );
    public static $has_many = array (
    'OtherAttachments' => 'File',
    );

    erweitern.
    Und dann Spankmasters getCMSFields-funktion in meine integrieren. Aber mit welchem Filter?
    Noch eine Frage: was genau macht den diese Zeile? Warum Replace?
    $fieldset->replaceField('OtherAttachments', $manager);

    Danke für Eure Hilfe. Pipifix

  • Pipifix
    Pipifix Community Member
    32 Beiträge

    Re: Dataobject mit mehreren Files

    Achso. Silverstripe 2.46 (uploadify und dataobject_manager -> letzte git repos)

    mein Dataobject

    <?php

    class Projekt extends DataObject
    {
       static $db = array(
          'Title' => 'Varchar(255)',
          'Description' => 'HTMLText',
          'Long' => 'Int',
          'Lat' => 'Int',
          'URLSegment' => 'Varchar(255)',
          'LinkURL' => 'Varchar(255)',
          'ProjectCat' => "Enum('Soziales, Strasse, Wirtschaft')",
          'ProjectStatus' => "Enum('Planung, Durchfuehrung, Abgeschlossen')",
          'StatusText' => 'Varchar(255)',
          'DownloadItem' => 'Varchar(255)',
          'MetaTitle' => 'Varchar(255)'
       );

       //Set our defaults
       static $defaults = array(   
          'Title' => 'Neues Projekt',
          'URLSegment' => 'neues-projekt'
       );
       
       static $has_one = array(
          'Image' => 'Image'
       );
       
       //Relate to the category pages
       static $belongs_many_many = array(
          'Categories' => 'CategoryPage'
       );
       
       //Fields to show in ModelAdmin table
       static $summary_fields = array(
          'Title' => 'Title',
          'URLSegment' => 'URLSegment',
          'ProjectStatus' => 'ProjectStatus',
          'ProjectCat' => 'ProjectCat',
       );   

       //Add an SQL index for the URLSegment
       static $indexes = array(
          "URLSegment" => true
       );   

       //Fields to search in ModelAdmin
       static $searchable_fields = array (
          'Title',
          'URLSegment',
          'Description',
          'Categories.ID' => array(
             'title' => 'Category'
          )
       );

       function getCMSFields()
       {
          $fields = parent::getCMSFields();

          //Main Tab
          $fields->addFieldToTab("Root.Main", new TextField('Title', 'Title'));   
          $fields->addFieldToTab("Root.Main", new TextField('MetaTitle', 'Untertitle'));   
          $fields->addFieldToTab("Root.Main", new TextField('URLSegment', 'URL des Projektes - Beispiel:alfred-kästner-schule - wichtig!'));   
          $fields->addFieldToTab("Root.Main", new HTMLEditorField('Description'));
          $fields->addFieldToTab("Root.Main", new NumericField('LinkURL','URL einer zu verlinkenden Seite (TODO)'));
          //Images
          $fields->addFieldToTab("Root.Main", new ImageField('Image', 'Image', Null, Null, Null, 'Uploads/projekte_bilder'));
          //Images
          $fields->addFieldToTab("Root.Main", new NumericField('Long','Kartenbild: Bild-Pixel (X)'));
          $fields->addFieldToTab("Root.Main", new NumericField('Lat','Kartenbild: Bild-Pixel (Y)'));   
          
          
          $statusValues = $this->dbObject('ProjectStatus')->enumValues();
          $fields->addFieldToTab("Root.Categories", new DropdownField('ProjectStatus', 'Status: Stand des Projektes', $statusValues));
          $fields->addFieldToTab("Root.Categories", new TextField('StatusText', 'Zusätzlicher Statustext'));
          $catValues = $this->dbObject('ProjectCat')->enumValues();
          $fields->addFieldToTab("Root.Categories", new DropdownField('ProjectCat', 'Projektkategorie(notwendig fur Farbgestaltung)', $catValues));
          
          //Categories
          $Categories = DataObject::get('CategoryPage');
          $fields->addFieldToTab("Root.Categories", new CheckboxsetField('Categories', 'Categories', $Categories));
       
          
          $fields->addFieldToTab("Root.Dateien", new TextField('DownloadItem', 'Download-Datei'));
          return $fields;
       }

       //Set URLSegment to be unique on write
       function onBeforeWrite()
       {      
          // If there is no URLSegment set, generate one from Title
          if((!$this->URLSegment || $this->URLSegment == 'neues-projekt') && $this->Title != 'Neues Projekt')
          {
             $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 = "projekt-$this->ID";
             }
             $this->URLSegment = $segment;
          }

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

          parent::onBeforeWrite();
       }
          
       //Test whether the URLSegment exists already on another Projekt
       function LookForExistingURLSegment($URLSegment)
       {
          return (DataObject::get_one('Projekt', "URLSegment = '" . $URLSegment ."' AND ID != " . $this->ID));
       }
       
       //Generate the link for this projekt
       function Link()
       {
          //if we are on a category page return that
          if(Director::CurrentPage()->ClassName == 'CategoryPage')
          {
             $Category = Director::CurrentPage();
          }
          //Otherwise just grab the first category this projekt is in
          else
          {
             $Category = $this->Categories()->First();
          }   
          //Check we have a category then return the link
          if($Category)
          {
             return $Category->absoluteLink() . 'show/' . $this->URLSegment;      
          }
       }
       
    }



    Nochmals danke. Pipifix
  • Pipifix
    Pipifix Community Member
    32 Beiträge

    Re: Dataobject mit mehreren Files

    Ping.

Zur Zeit online: Zur Zeit ist leider niemand online.

Wir begrüßen unsere neuen Mitglieder: saerdna