Jump to:

7940 Posts in 1543 Topics by 946 members

DataObjectManager Module

SilverStripe Forums » DataObjectManager Module » [solved] Adding Actions to To DataObjectManager

Discuss the DataObjectManager module, and the related ImageGallery module.

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

Page: 1
Go to End
Author Topic: 1143 Views
  • zenmonkey
    Avatar
    Community Member
    528 Posts

    [solved] Adding Actions to To DataObjectManager Link to this post

    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

  • UncleCheese
    Avatar
    4085 Posts

    Re: [solved] Adding Actions to To DataObjectManager Link to this post

    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.

  • zenmonkey
    Avatar
    Community Member
    528 Posts

    Re: [solved] Adding Actions to To DataObjectManager Link to this post

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

  • UncleCheese
    Avatar
    4085 Posts

    Re: [solved] Adding Actions to To DataObjectManager Link to this post

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

  • zenmonkey
    Avatar
    Community Member
    528 Posts

    Re: [solved] Adding Actions to To DataObjectManager Link to this post

    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
    {

    }

  • UncleCheese
    Avatar
    4085 Posts

    Re: [solved] Adding Actions to To DataObjectManager Link to this post

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

    1143 Views
Page: 1
Go to Top

Want to know more about the company that brought you SilverStripe? Then check out SilverStripe.com

Comments on this website? Please give feedback.