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.

Archive

Our old forums are still available as a read-only archive.

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

using DataObject::get() to fill dropdown in getCMSFields_forPopup()


Go to End
Reply

9 Posts   8135 Views

Avatar
RobertM

22 August 2008 at 1:04am Community Member, 26 Posts

I have created these two classes, but I would like to populate the dropdown in Project from another DataObject table that can be edited inside a tab in ProjectHolder.

class ProjectHolder extends Page {
static $db = array(
);
static $has_one = array(

);
static $has_many = array(
'Projects' => 'Project'
);

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

   $tablefield = new HasManyComplexTableField(
$this,
'Projects',
'Project',
array(
    'title' => 'Title',
    'manager' => 'Manager'
),
'getCMSFields_forPopup'
);
$tablefield->setAddTitle( 'A Project' );

   $fields->addFieldToTab( 'Root.Content.Projects', $tablefield );

return $fields;
}
}

class Project extends DataObject {

static $db = array(
'title' => 'Text',
   'manager' => "Enum('Manager1, Manager2')"
);

static $has_one = array(
'MyProjectHolder' => 'ProjectHolder'
);

function getCMSFields_forPopup() {
   $fields = new FieldSet();
   $fields->push( new TextField( 'title' ) );
   $map = array('1' =>'Manager1','2' => 'Manager2');
   $fields->push( new DropdownField(
      'manager',
      'manager of project',    
      $map)
   );
   
return $fields;
}

}

Avatar
Willr

22 August 2008 at 3:09pm Forum Moderator, 5511 Posts

So you want to populate the 'Managers' list on Project.php from a seperate 'Managers' DataObject? Well What you would need to do is create a Managers DataObject first off, then a project has one Manager. Then I think you can call toArray() on a dataobjectset. So you would have

class Project extends DataObject {
static $db = array(
'title' => 'Text',
);

static $has_one = array(
'MyProjectHolder' => 'ProjectHolder',
'Manager' => 'Manager'
);

function getCMSFields_forPopup() {
$fields = new FieldSet();
$fields->push( new TextField( 'title' ) );
$managers = DataObject::get("Manager")->toArray();
$fields->push( new DropdownField(
'manager',
'manager of project',
$managers)
);

return $fields;
}

}

That would be your project code. You would also then need a Manager.php dataobject.

Avatar
RobertM

22 August 2008 at 9:38pm Community Member, 26 Posts

i'm still having a bit of trouble with this, as it is not populating the dropdown box with the contents of DataObject::get("Manager"), but merely giving one option, "Manager". The second problem is that even if this only option "Manager" is chosen it doesn't save - before I had

'manager' => "Enum('Manager1, Manager2')"


in $db.

my files now look thus:

<?php

class Project extends DataObject {

static $db = array(
'title' => 'Text',
   'manager' => 'Text'
);

static $has_one = array(
'MyProjectHolder' => 'ProjectHolder',
   'Manager' => 'Manager'
);

function getCMSFields_forPopup() {
   $fields = new FieldSet();
   $fields->push( new TextField( 'title' ) );
   $managers = DataObject::get("Manager")->toArray();
   $fields->push( new DropdownField(
   'manager',
   'manager of project',
   $managers)
   );
   
return $fields;
}

}

?>


<?php

class Manager extends DataObject {

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

static $has_one = array(
'MyProjectHolder' => 'ProjectHolder'
);

static $has_many = array(
   'MyProject' => 'Project'
);

function getCMSFields_forPopup() {
   $fields = new FieldSet();
   $fields->push( new TextField( 'Name' ) );
   
return $fields;
}

}

?>


<?php
/**
* Defines the ProjectHolder page type
*/
class ProjectHolder extends Page {
static $db = array(
);
static $has_one = array(

);
static $has_many = array(
'Projects' => 'Project',
   'Managers' => 'Manager'
);

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

   $tablefield = new HasManyComplexTableField(
$this,
'Projects',
'Project',
array(
    'title' => 'Title',
    'manager' => 'Manager'
),
'getCMSFields_forPopup'
);
$tablefield->setAddTitle( 'A Project' );

   $managertablefield = new HasManyComplexTableField(
$this,
'Managers',
'Manager',
array(
    'name' => 'Name',
   
),
'getCMSFields_forPopup'
);
$managertablefield->setAddTitle( 'A Manager' );

   $fields->addFieldToTab( 'Root.Content.Projects', $tablefield );
   $fields->addFieldToTab( 'Root.Content.Managers', $managertablefield );
return $fields;
}
}

class ProjectHolder_Controller extends Page_Controller {
}


perhaps i'm doing something wrong?

Avatar
Willr

22 August 2008 at 9:47pm Forum Moderator, 5511 Posts

Well one of the issues that its not saving is because we defined a has_one relation on Project -> manager we dont need the manager database field (in the $db array) Instead the has_one automatically creates a FieldNameID database column we want to save into for the has_one so you would need to change the dropdown constructor

$fields->push( new DropdownField(
'ManagerID',
'manager of project',
$managers)
);

as for only 1 manager showing up you might just like to do a Debug::show($managers); after the DataObject() call and see what it returns. See if anythings amiss

Avatar
RobertM

22 August 2008 at 10:23pm Community Member, 26 Posts

It still wont save, but I do get 2 options now, but they appear as "Manager" still in the dropdown. Here is the output of Debug::show($managers);

Debug (Project->getCMSFields_forPopup() in line 18 of Project.php)

* 0 =
Database record: Manager
o ID :

4

o ClassName :

Manager

o Created :

2008-08-22 11:16:21

o LastEdited :

2008-08-22 11:16:53

o Name :

Manager1

o MyProjectHolderID :

11

o RecordClassName :

Manager

* 1 =
Database record: Manager
o ID :

5

o ClassName :

Manager

o Created :

2008-08-22 11:16:38

o LastEdited :

2008-08-22 11:16:53

o Name :

Manager2

o MyProjectHolderID :

11

o RecordClassName :

Manager

Avatar
RobertM

22 August 2008 at 11:15pm Community Member, 26 Posts

I have sorted the problem with getting the dropdown populated thanks to your tip about debug, but I still have the problem that it doesn't save the dropdown selection - title is save but manager stays blank. Here is my code:

<?php

class Project extends DataObject {

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

static $has_one = array(
'MyProjectHolder' => 'ProjectHolder',
   'Manager' => 'Manager'
);

function getCMSFields_forPopup() {
   $fields = new FieldSet();
   $fields->push( new TextField( 'title' ) );
   $managers = DataObject::get("Manager");
   $map = $managers->toDropDownMap('ID', 'Name');
   $fields->push( new DropdownField(
   'ManagerID',
   'manager of project',
   $map)
   );
   
return $fields;
}

}

?>

Avatar
Willr

23 August 2008 at 12:17pm Forum Moderator, 5511 Posts

hmm strange. If you look at the source code of the drop down is there a 'value="X"' in each option field? eg is there something to save

Avatar
RobertM

24 August 2008 at 2:22am Community Member, 26 Posts

yes it appears so, here is the source for the form:

<form id="ComplexTableField_Popup_DetailForm" action="admin/?executeForm=EditForm.ReferencedField.DetailForm&fieldName=Projects" method="post" enctype="application/x-www-form-urlencoded">

   
   <p id="ComplexTableField_Popup_DetailForm_error" class="message " style="display: none"></p>
   
   <fieldset>
      
         <div id="title" class="field text "><label class="left" for="ComplexTableField_Popup_DetailForm_title">title</label><span class="middleColumn"><input class="text" type="text" id="ComplexTableField_Popup_DetailForm_title" name="title" value="" /></span></div>

      
         <div id="ManagerID" class="field dropdown "><label class="left" for="ComplexTableField_Popup_DetailForm_ManagerID">manager of project</label><span class="middleColumn"><select name="ManagerID" id="ComplexTableField_Popup_DetailForm_ManagerID"><option value="4">ManagerR</option><option value="5">Manager2</option></select></span></div>
      
         <input class="hidden" type="hidden" id="ComplexTableField_Popup_DetailForm_ctf-parentClass" name="ctf[parentClass]" value="ProjectHolder" />
      
         <input class="hidden" type="hidden" id="ComplexTableField_Popup_DetailForm_ctf-ClassName" name="ctf[ClassName]" value="Project" />
      
         <input class="hidden" type="hidden" id="SecurityID" name="SecurityID" value="1370550787" />
      
      <div class="clear"><!-- --></div>
   </fieldset>

   <div class="Actions">
         <input class="action save" id="ComplexTableField_Popup_DetailForm_action_saveComplexTableField" type="submit" name="action_saveComplexTableField" value="Save" />

   </div>

</form>

Go to Top