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

[solved] Adding Actions to To DataObjectManager


Reply

6 Posts   1160 Views

Avatar
zenmonkey

27 August 2009 at 9:23am (Last edited: 2 September 2009 6:43am), Community Member, 528 Posts

I posted this question in other Customizing CMS forum, with no response since I'm actually using the DataObjectManager I thought I'd post here.

I'm using the DataObjectManager to Create a User Application Form. I want to Add a Buttons to the Pop-Up that Either Delete the Application or Approve it, thus copying the Data to a member group.

Here is my UserApplication DataObject

class UserApplication extends DataObject {
   static $db = array(
         'FirstName' => 'Text',
         'LastName' => 'Text',
         'Email' => 'Text',
         'CompanyName' => 'Text',
         'CompanyType' => "Text",
         'CompanyURL' => 'Text',
         'CompanyPhone' => 'Text',
         'Address' => 'Text',
         'Address2' => 'Text',
         'City' => 'Text',
         'Country' => 'Text',
         'TaxIDNumber' => 'Text',
         'Distributor' => 'Text',
         'SalesRep' => 'Text',
         'Description' => 'Text',
         'ApprovedMember' => 'Boolean',
         'Password' => 'Text'
   );
   
   static $has_one = array(
      'RegistrationPage' => 'RegistrationPage',      
   );
   
   public function getCMSFields_forPopup()
   {
      $companyTypeList = array(
         'Retail' => 'Retail',
         'Online' => 'Online',
         'Distributor' => 'Distributor',
         'Press' => 'Press'
      );
      
      return new FieldSet (
         new CheckBoxField('ApprovedMember', 'Approved Member'),
         new TextField('FirstName', 'First Name'),
         new TextField('LastName','Last Name'),
         new EmailField('Email'),
         new TextField('CompanyName','Company Name'),
         new DropdownField('CompanyType','Company Type',$companyTypeList),
         new TextField('CompanyURL','Company Website'),
         new TextField('CompanyPhone','CompanyPhone'),
         new TextField('Address','Address'),
         new TextField('Address2','Address Line 2'),
         new TextField('City','City'),
         new TextField('Country','Country'),
         new TextField('TaxIDNumber','TaxIDNumber'),
         new TextField('Distributor','Distributor'),
         new TextField('SalesRep','Sales Rep'),
         new TextareaField('Description','Description'),
         new ConfirmedPasswordField('Password')
      );
      
   }

}

And This is my Registration Page, I still need to create a a front end Form Element for End Users to Fill in.

class RegistrationPage extends Page
{
   static $has_many = array (
      'UserApplications' => 'UserApplication'
   );
   
   public function getCMSFields()
   {
      $f = parent::getCMSFields();
      $applicationManager = new DataObjectManager(
         $this,
         'UserApplications',
         'UserApplication',
         array('FirstName' => 'FirstName','LastName' => 'LastName','Email' => 'Email','CompanyName' => 'CompanyName','CompanyType' => "CompanyType",'CompanyURL' => 'CompanyURL','CompanyPhone' => 'CompanyPhone','Address' => 'Address','Address2' => 'Address2','City' => 'City','Country' => 'Country','TaxIDNumber' => 'TaxIDNumber','Distributor' => 'Distributor','SalesRep' => 'SalesRep','Description' => 'Description','ApprovedMember' => 'ApprovedMember','Password' => 'Password'),
         'getCMSFields_forPopup'
      );
      
      $f->addFieldToTab("Root.Content.Applications", $applicationManager);
      
      $f->removeFieldFromTab('Root.Content.Main', 'Content');
      $f->removeFieldFromTab('Root.Content.Main', 'LifestyleText');
      
      return $f;
   }
   
}

class RegistrationPage_Controller extends Page_Controller
{
   
}

Would I use a standard form $actions in the DataObject FieldSet.

Incidentally, does the DataObjectManager not have a Delete like the FileDataObjectManager?

I really can't wait until the SilverStripe Book comes out LOL

Avatar
UncleCheese

27 August 2009 at 11:44am 4085 Posts

The DOM should have delete buttons. ??? Not sure why you wouldn't see them.

Adding actions to the popup form is a tall order.

First, I would create a DataObjectManager subclass.

MyDataObjectManager.php

class MyDataObjectManager extends DataObjectManager
{
   public $popupClass = "MyDataObjectManager_Popup";
   public $itemClass = "MyDataObjectManager_Item";

}


Then, in the same file, you can create your popup and item subclasses.

class MyDataObjectManager_Popup extends DataObjectManager_Popup
{
function __construct($controller, $name, $fields, $validator, $readonly, $dataObject) {
parent::__construct($controller, $name, $fields, $validator, $readonly, $dataObject);
$this->Actions()->push(
new FormAction('someaction','Some Label')
);
}

}

class MyDataObjectManager_Item extends DataObjectManager_Item
{
   function someaction($data, $form, $request) {
// do stuff
      Director::redirectBack();
   }

}

That's the basic idea.

Avatar
zenmonkey

28 August 2009 at 2:26am Community Member, 528 Posts

Okay, would I then add new MyDataObjectManager_Popup to the UserApplication fieldset?

Avatar
UncleCheese

28 August 2009 at 5:57am 4085 Posts

No, just use MyDataObjectMangaer to manage those objects instead of DataObjectManager.

Avatar
zenmonkey

28 August 2009 at 10:27am Community Member, 528 Posts

When I added my action function to MyDataObjectManager_Item, I got:

[User Error] Uncaught Exception: Object->__call(): the method 'approveuser' does not exist on 'ApplicationDataObjectManager_Popup'

so I added the function to MyDataObjectManager_Popup

I'm still having problems with it but I think it has to go with the keys in the object and not the DataObjectManager so I've posted in another forum for help.

c<?php
class ApplicationDataObjectManager extends DataObjectManager
{
public $popupClass = "ApplicationDataObjectManager_Popup";
public $itemClass = "ApplicationDataObjectManager_Item";

}

class ApplicationDataObjectManager_Popup extends DataObjectManager_Popup
{
function __construct($controller, $name, $fields, $validator, $readonly, $dataObject) {
parent::__construct($controller, $name, $fields, $validator, $readonly, $dataObject);
$this->Actions()->push(
new FormAction('ApproveUser','Approve User')
);
}

function ApproveUser($data, $form, $request) {
// do stuff
       $member = new Member();
      $form->saveInto($member);
      
      $groupID = 2;
      
      switch ($member->CompanyType) {
         case ("Retail"): $groupID = 3;
            break;
         case ("Distributor"): $groupID = 4;
            break;
         case ("Press"): $groupID = 5;
            break;
         case ("Online"): $groupID = 6;
            break;
      }
      
      /*$member->write();*/
   
      if($group = DataObject::get_one('Group', "ID = 2")) {
         $member->Groups()->add($group);
         return print_r($member);   
         //Director::redirectBack();
      }
      else{
         return print_r($member->ID);   
      }

}

}

class ApplicationDataObjectManager_Item extends DataObjectManager_Item
{

}

Avatar
UncleCheese

28 August 2009 at 10:58am 4085 Posts

It has to go in both places. Item class for edits and Popup class for adds.