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.

We've moved the forum!

Please use forum.silverstripe.org for any new questions (announcement).
The forum archive will stick around, but will be read only.

You can also use our Slack channel or StackOverflow to ask for help.
Check out our community overview for more options to contribute.

DataObjectManager Module /

Discuss the DataObjectManager module, and the related ImageGallery module.

Moderators: martimiz, UncleCheese, Sean, Ed, biapar, Willr, Ingo, swaiba

many Attachments on FileDataObjectManager


Go to End


24 Posts   5985 Views

Avatar
jmax

Community Member, 17 Posts

1 February 2011 at 5:39am

Hi all from Italy and sorry for my english ;-)

I have a problem with FileDataOjectManager. I'd like to have many attachment files, is it possible?

the code with a single attachment is like this

$manager = new FileDataObjectManager(
$this, // Controller
'Resources', // Source name
'Resource', // Source class
'Attachment', // File name on DataObject
array(
'Name' => 'Name',
'Description' => 'Description',
'Category' => 'Category',
'Attachment.Name' => 'Attachment',
), // Headings
'getCMSFields_forPopup' // Detail fields (function name or FieldSet object)
// Filter clause
// Sort clause
// Join clause
);

but i need to have more than one file for each entries.

like this:

Name --- Description --- Category --- Attachment1 --- Attachment2 --- Attachment3

Is it possible.

Thanks to all

Bye

Max

Avatar
UncleCheese

Forum Moderator, 4102 Posts

1 February 2011 at 6:02am

You can do a nested FileDataObjectManager

class SomePage extends Page {
has_many FileObjects => File Object

getCMSFields() {
new DataObjectManager($this, FileObjects, FileObject)
}
}

class FileObject extends DataObject {

has_one SomePage => SomePage

has_many Files => MyFile

getCMSFields {
new AssetManager($this, Files, MyFile)
}

}

class MyFile Extends File {
has_one = FileObject => FileObject
}

Avatar
jmax

Community Member, 17 Posts

1 February 2011 at 6:11am

hi UncleCheese,

thanks for your answer, but it's the first time that i use the dataobjectmanager can you help me?

this is my Resouce.php

<?php
class Resource extends DataObject
{
static $db = array (
'Name' => 'Text',
'Description' => 'Text',
'Category' => "Enum('Industry, Finance, Education')",
);

static $has_one = array (
'Attachment' => 'File',
'ResourcePage' => 'ResourcePage'
);

public function getCMSFields_forPopup()
{
return new FieldSet(
new TextField('Name'),
new TextareaField('Description'),
new DropdownField('Category','Category', singleton('Resource')->dbObject('Category')->enumValues()),
new FileUploadField('Attachment')

);
}
}
?>

==================================

and this is the ResourcePage.php

<?php
class ResourcePage extends Page
{
static $has_many = array (
'Resources' => 'Resource'
);

public function getCMSFields()
{
$f = parent::getCMSFields();
$manager = new FileDataObjectManager(
$this, // Controller
'Resources', // Source name
'Resource', // Source class
'Attachment', // File name on DataObject
array(
'Name' => 'Name',
'Description' => 'Description',
'Category' => 'Category',
'Attachment.Name' => 'Attachment',
), // Headings
'getCMSFields_forPopup' // Detail fields (function name or FieldSet object)
// Filter clause
// Sort clause
// Join clause
);

$manager->setFilter(
'Category', // Name of field to filter
'Filter by Category', // Label for filter
singleton('Resource')->dbObject('Category')->enumValues() // Map for filter (could be $dataObject->toDropdownMap(), e.g.)
);

// If undefined, all types are allowed. Pass with or without a leading "."
$manager->setAllowedFileTypes(array('pdf','doc'));

// Label for the upload button in the popup
$manager->setBrowseButtonText("Upload (PDF or DOC only)");

// In grid view, what field will appear underneath the icon. If left out, it defaults to the file title.
$manager->setGridLabelField('Name');

// Plural form of the objects being managed. Used on the "Add" button.
// If left out, this defaults to [MyObjectName]s
$manager->setPluralTitle('Resources');

$f->addFieldToTab("Root.Content.Resources", $manager);

return $f;
}

}

class ResourcePage_Controller extends Page_Controller
{
}
?>

Sorry but i don't know how to create the nested FileDataObjectManager that you write.
I hope you can help me..

Thank you very much

Max

Avatar
jmax

Community Member, 17 Posts

1 February 2011 at 11:47pm

Hi UncleCheese,
i thank you so much for your answer, but can you help me more
with your experience?

thanks so much

Avatar
UncleCheese

Forum Moderator, 4102 Posts

2 February 2011 at 4:04am

Edited: 02/02/2011 4:05am

Try it this way:

<?php 
class Resource extends DataObject 
{ 
   static $db = array ( 
      'Name' => 'Text', 
      'Description' => 'Text', 
      'Category' => "Enum('Industry, Finance, Education')", 
   ); 
    
   static $has_many = array ( 
      'Attachments' => 'ResourceFile'
   );

   static $has_one = array  (
      'ResourcePage' => 'ResourcePage' 
   ); 
    
   public function getCMSFields_forPopup() 
   { 
      return new FieldSet( 
         new TextField('Name'), 
         new TextareaField('Description'), 
         new DropdownField('Category','Category', singleton('Resource')->dbObject('Category')->enumValues()), 
         new MultipleFileUploadField('Attachments')

      ); 
   } 
} 

==================================

ResourceFile.php

<?php

class ResourceFile extends File {

static $has_one = array (
'Resource' => 'Resource'
);
}


==================================
and this is the ResourcePage.php

<?php 
class ResourcePage extends Page 
{ 
   static $has_many = array ( 
      'Resources' => 'Resource' 
   ); 
    
   public function getCMSFields() 
   { 
      $f = parent::getCMSFields(); 
      $manager = new DataObjectManager( 
         $this, // Controller 
         'Resources', // Source name 
         'Resource', // Source class 
         array( 
            'Name' => 'Name', 
            'Description' => 'Description', 
            'Category' => 'Category', 
            'Attachment.Name' => 'Attachment', 
         ), // Headings 
         'getCMSFields_forPopup' // Detail fields (function name or FieldSet object) 
         // Filter clause 
         // Sort clause 
         // Join clause 
      ); 
       
      $manager->setFilter( 
         'Category', // Name of field to filter 
         'Filter by Category', // Label for filter 
         singleton('Resource')->dbObject('Category')->enumValues() // Map for filter (could be $dataObject->toDropdownMap(), e.g.) 
      ); 
       
      // If undefined, all types are allowed. Pass with or without a leading "."       
      $manager->setAllowedFileTypes(array('pdf','doc')); 
       
      // Label for the upload button in the popup 
      $manager->setBrowseButtonText("Upload (PDF or DOC only)"); 
       
      // In grid view, what field will appear underneath the icon. If left out, it defaults to the file title. 
      $manager->setGridLabelField('Name'); 
       
      // Plural form of the objects being managed. Used on the "Add" button. 
      // If left out, this defaults to [MyObjectName]s 
      $manager->setPluralTitle('Resources'); 
             
      $f->addFieldToTab("Root.Content.Resources", $manager);

      return $f; 
   }

}

class ResourcePage_Controller extends Page_Controller 
{ 
} 
?>

Avatar
jmax

Community Member, 17 Posts

2 February 2011 at 4:22am

Thank you very much!!
You're Great!

Avatar
jmax

Community Member, 17 Posts

2 February 2011 at 5:16am

sorry Unclecheese,

now in frontend i can load data of my DataObjectManager

but how to link file uploaded?

<% control Resources %>
$Name - $Description - $Attachments
<% end_control %>

Before i was used Attacment.URL for a single file..

but now don't work

Avatar
UncleCheese

Forum Moderator, 4102 Posts

2 February 2011 at 7:22am

<% control Attachments %>

Go to Top