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.

DataObjectManager Module /

Discuss the DataObjectManager module, and the related ImageGallery module.

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

many Attachments on FileDataObjectManager


Go to End
Reply


24 Posts   4011 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, 4096 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, 4096 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, 4096 Posts

2 February 2011 at 7:22am

<% control Attachments %>

Go to Top