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

Uploadify - multiple file upload


Reply


8 Posts   1573 Views

Avatar
Mackodlak

Community Member, 95 Posts

8 September 2011 at 9:18pm

Hello,

this is primary a question for UncleCheese, but any1 who know the answer would be welcome to give it.

I have seen the code examples for DOM/Uploadify posted in this thread:
http://www.silverstripe.org/dataobjectmanager-module-forum/show/7009?start=0
and it works (I've tried it with a bit of different names for sth, but mainly the same thing). now I would like to be able to attach 2 files to same Dataobject. I've tried doing sth like:

<?php
class Resource extends DataObject
{
   static $db = array (
      'Name' => 'Text',
      'Description' => 'Text',
      'Category' => "Enum('Industry, Finance, Education')"
   );
   
   static $has_one = array (
      'Attachment' => 'File',
'MYFILE' => '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 FileIFrameField('Attachment'),
new FileIFrameField('MYFILE'),
      );
   }
}
?>

and it doesn't work. I added sth like:

<?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
'MYFILE', // Second file name on DataObject
         array(
            'Name' => 'Name',
            'Description' => 'Description',
            'Category' => 'Category'
         ), // Headings
.....
and it just gives out errors. Any ideas how to do this? I need 2 separate file uploaded in 2 different categorys in same Dataobject

Avatar
UncleCheese

4085 Posts

9 September 2011 at 1:57am

Just use a regular DOM.

Avatar
Mackodlak

Community Member, 95 Posts

9 September 2011 at 7:12pm

Hey mate, I have tried that, didn't help much - for some reason just changing FileDataObjectManager to DataObjectManager doesn't do much help, if you had sth else in mind plz do tell.

Then I wanted to use the code you supplied on your website with frontend form for Jop aplication (kinda simmilar to what I want - it has a file and multifile upload thingie and it rly is all i need in the end.
The files can be found at this location:
http://www.leftandmain.com/silverstripe-tutorials/2010/08/30/using-uploadify-in-frontend-forms/

Anyways, long story short, I have placed them in /ss/mycode and .../templates/layout folders as neaded, rebuilt a side (/dev/build) and I can go to admin interface and create a new JobAplicationPage, but then the following error pops up:

ERROR [Notice]: Undefined index: ManyS3File
IN POST /ss/admin/getitem?ID=430&ajax=1
Line 154 in /var/www/ss/sapphire/core/ClassInfo.php

Source
======
145:    /**
146:     * @todo Improve documentation
147:     */
148:    static function ancestry($class, $onlyWithTables = false) {
149:       global $_ALL_CLASSES;
150:
151:       if(is_object($class)) $class = $class->class;
152:       else if(!is_string($class)) user_error("Bad class value " . var_export($class, true) . " passed to
ClassInfo::ancestry()", E_USER_WARNING);
153:
* 154:       $items = $_ALL_CLASSES['parents'][$class];
155:       $items[$class] = $class;
156:       if($onlyWithTables) foreach($items as $item) {
157:          if(!DataObject::has_own_table($item)) unset($items[$item]);
158:       }
159:       return $items;
160:    }

Trace
=====
<ul>ClassInfo::ancestry(ManyS3File)
line 426 of Object.php

Object::combined_static(ManyS3File,has_one,DataObject)
line 1334 of DataObject.php

DataObject->getRemoteJoinField(ManyS3Files,has_many)
line 1264 of DataObject.php

DataObject->getComponents(ManyS3Files)

call_user_func_array(Array,Array)
line 711 of Object.php

Object->__call(ManyS3Files,Array)
line 38 of MultipleFileUploadField.php

JobApplicationPage->ManyS3Files()
line 38 of MultipleFileUploadField.php

MultipleFileUploadField->setValue(,JobApplicationPage)
line 992 of Form.php

Form->loadDataFrom(JobApplicationPage)
line 490 of CMSMain.php

CMSMain->getEditForm(430)
line 1039 of LeftAndMain.php

LeftAndMain->EditForm()
line 389 of LeftAndMain.php

LeftAndMain->getitem(SS_HTTPRequest)
line 193 of Controller.php

Controller->handleAction(SS_HTTPRequest)
line 143 of RequestHandler.php

RequestHandler->handleRequest(SS_HTTPRequest)
line 147 of Controller.php

Controller->handleRequest(SS_HTTPRequest)
line 282 of Director.php

Director::handleRequest(SS_HTTPRequest,Session)
line 125 of Director.php

Director::direct(/admin/getitem)
line 127 of main.php

</ul>

Plz help

Avatar
UncleCheese

4085 Posts

10 September 2011 at 1:32am

Don't forget that DOM and FDOM have different constructors, so you'll need to remove one argument when going from FDOM to DOM.

--------------------
SilverStripe tips, tutorials, screencasts and more: http://www.leftandmain.com

Avatar
Mackodlak

Community Member, 95 Posts

13 September 2011 at 12:21am

Mate I am probably boring my now, but I don't see the problem, can you fix this for me?
This is my actual code

<?php
class Challenge extends DataObject{

   static $db=array(
      'Naziv' => 'Text',
      'Datum' => 'Date',
      'Opis'=>'Text',
      'Aktivan'=>'Boolean'
   );
   
   static $has_one=array(
      'Izazov'=>'File',
      'Razultati'=>'File',
      'Izazovi' => 'Izazovi',
      'IzazoviArhiva' => 'IzazoviArhiva'
   );
   
   public function getCMSFields_forPopup(){
   
      return new FieldSet(
         new TextField('Naziv','Naziv izazova'),
         new DatePickerField('Datum'),
         new TextField('Opis','Krataki opis'),
         new FileIFrameField('Izazov'),
         new FileIFrameField('Rezultati'),
         new CheckboxField('Aktivan')
      );
   }
}
?>

<?php
/**
* Izazovi page type - sadrzi aktivne izazove
*/

class Izazovi extends Page {

   static $has_one = array(
      'Photo' => 'Image'
   );
   
   static $allowed_children = array(
      'IzazoviArhiva',
      'Challenge'
   );
   
   static $has_many=array(
      'Challenges'=>'Challenge'
   );

   
   static $db = array(
'Content' => 'Text'
   );

   public function getCMSFields(){
$fields = parent::getCMSFields();
    $manager = new DataObjectManager(
         $this, // Controller
         'Challenges', // Source name
         'Challenge', // Source class
         'Izazov', // File name on DataObject
         'Rezultati', // File name on DataObject
         array(
            'Naziv' => 'Naziv',
            'Datum' => 'Datum',
            'Opis' => 'Opis',
            'Aktivan'=> 'Aktivan'
         ), // Headings
         'getCMSFields_forPopup' // Detail fields (function name or FieldSet object)
         // Filter clause
         // Sort clause
         // Join clause
      );
      
$fields->removeFieldFromTab('Root.Content.Main', 'Content');
    $fields->addFieldToTab("Root.Content.Image", new ImageField('Photo','Slika'));
$fields->addFieldToTab('Root.Content.Main', new TextareaField('Content', 'Content', 20));
    $fields->addFieldToTab("Root.Content.Izazovi",$manager);
return $fields;
}
}

class Izazovi_Controller extends Page_Controller {
...

and the error it gives me in /admin/ :

ERROR [Warning]: Invalid argument supplied for foreach()
IN POST /ss/admin/getitem?ID=19&ajax=1
Line 284 in /var/www/ss/dataobject_manager/code/DataObjectManager.php

Source
======
275:       if(!$this->controller->ID && $this->isNested)
276:          return $this->renderWith('DataObjectManager_holder');
277:       return parent::FieldHolder();
278:    }
279:
280:    
281:    public function Headings()
282:    {
283:       $headings = array();
* 284:       foreach($this->fieldList as $fieldName => $fieldTitle) {
285:          if(isset($_REQUEST['ctf'][$this->Name()]['sort_dir']))
286:             $dir = $_REQUEST['ctf'][$this->Name()]['sort_dir'] == "ASC" ? "DESC" : "ASC";
287:          else
288:             $dir = "ASC";
289:          $headings[] = new ArrayData(array(
290:             "Name" => $fieldName,

Trace
=====
<ul>DataObjectManager->Headings()
line 369 of ViewableData.php

ViewableData->obj(Headings,,1)
line 245 of .cache.dataobject_manager.templates.DataObjectManager.ss

include(/tmp/silverstripe-cache-var-www-ss/.cache.dataobject_manager.templates.DataObjectManager.ss)
line 420 of SSViewer.php

SSViewer->process(DataObjectManager)
line 342 of ViewableData.php

ViewableData->renderWith(DataObjectManager)
line 275 of ComplexTableField.php

ComplexTableField->FieldHolder()
line 277 of DataObjectManager.php

DataObjectManager->FieldHolder()
line 369 of ViewableData.php

ViewableData->obj(FieldHolder,,,1)
line 446 of ViewableData.php

ViewableData->XML_val(FieldHolder,,1)
line 73 of .cache.sapphire.templates.TabSetFieldHolder.ss

include(/tmp/silverstripe-cache-var-www-ss/.cache.sapphire.templates.TabSetFieldHolder.ss)
line 420 of SSViewer.php

SSViewer->process(TabSet)
line 342 of ViewableData.php

ViewableData->renderWith(TabSetFieldHolder)
line 80 of TabSet.php

TabSet->FieldHolder()
line 369 of ViewableData.php

ViewableData->obj(FieldHolder,,,1)
line 446 of ViewableData.php

ViewableData->XML_val(FieldHolder,,1)
line 58 of .cache.sapphire.templates.TabSetFieldHolder.ss

include(/tmp/silverstripe-cache-var-www-ss/.cache.sapphire.templates.TabSetFieldHolder.ss)
line 420 of SSViewer.php

SSViewer->process(TabSet)
line 342 of ViewableData.php

ViewableData->renderWith(TabSetFieldHolder)
line 80 of TabSet.php

TabSet->FieldHolder()
line 369 of ViewableData.php

ViewableData->obj(FieldHolder,,,1)
line 446 of ViewableData.php

ViewableData->XML_val(FieldHolder,,1)
line 77 of .cache.sapphire.templates.Includes.Form.ss

include(/tmp/silverstripe-cache-var-www-ss/.cache.sapphire.templates.Includes.Form.ss)
line 420 of SSViewer.php

SSViewer->process(Form)
line 342 of ViewableData.php

ViewableData->renderWith(Array)
line 1108 of Form.php

Form->forTemplate()
line 1135 of Form.php

Form->formHtmlContent()
line 391 of LeftAndMain.php

LeftAndMain->getitem(SS_HTTPRequest)
line 193 of Controller.php

Controller->handleAction(SS_HTTPRequest)
line 143 of RequestHandler.php

RequestHandler->handleRequest(SS_HTTPRequest)
line 147 of Controller.php

Controller->handleRequest(SS_HTTPRequest)
line 282 of Director.php

Director::handleRequest(SS_HTTPRequest,Session)
line 125 of Director.php

Director::direct(/admin/getitem)
line 127 of main.php

</ul>

Avatar
UncleCheese

4085 Posts

13 September 2011 at 1:48am

Look at the API for FDOM versus DOM. This argument does not exist in DOM:

'Izazov', // File name on DataObject

Avatar
Mackodlak

Community Member, 95 Posts

13 September 2011 at 10:13pm

Edited: 14/09/2011 1:47am

Hey mate, thank you, i figured it out, you helped a lot.
Btw, how to formulate a <% if $Rezultati %> in .ss file so that if there is a filed uploaded it would show it, if not then nothing?

I have tried this:

         <% control getChallenges(2) %>
                     
               <h3>$Naziv</h3>
               <p class="document_text"><b>Datum:</b> $Datum</p>                      
               <p class="document_text"><b>Kratki opis:</b> $Opis</p>
               <p>&nbsp;<a href="$Izazov.URL">Preuzmi izazov</a></p>
               <% if $Rezultati %>
                  <p>Rezultati izazova:</p>
                  <p>&nbsp;<a href="$Razultati.URL">Rezultati</a></p>
               <% end_if %>
               </br>      
         <% end_control %>

but it doesn't work... I need $Rezultati file to only be shown once it is uploaded, since the Iizazov file is some kind of a challenge, and once the certain amount of time has passes we will announce the ppl who managed to finish it and show resaults in $Rezultati (pdf file) so once that is uploaded for that particular challenge it is supposed to be shown.

EDIT:

Been trying with return file_exists($this->Rezultati); in some function but it doesn't work also, always returns bool(false) so I rly don't know how to check if there is a file uploaded or not.

EDIT2:

works, had a typo in filename

Avatar
UncleCheese

4085 Posts

14 September 2011 at 5:13am

Also you don't want the $ in the if statement. Prepending a $ before the variable name will render its output to the template, and that's not what you want.

<% if MyFile %> not <% if $MyFile %>

--------------------
SilverStripe tips, tutorials, screencasts and more: http://www.leftandmain.com