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

I can add objects to DOM, but not edit them


Reply

7 Posts   1089 Views

Avatar
theoldlr

11 January 2011 at 5:35am Community Member, 103 Posts

Here is my DOM:

class VideoHolder extends Page {

static $has_many = array(
'VideoObjects' => 'VideoObject'
);

public function getCMSFields()
{
$fields = parent::getCMSFields();
$datamanager = new DataObjectManager(
$this, // Controller
'VideoObjects', // Source name
'VideoObject', // Source class
array(
'Category' => 'Category',
'Description' => 'Description',
'YouTubeLink' => 'YouTubeLink',
'URLSegment' => 'URLSegment'
), // Headings
'getCMSFields_forPopup'// Detail fields (function name or FieldSet object)
// Filter clause
// Sort clause
// Join clause
);
//$datamanager->setPopupWidth('675');

$fields->addFieldToTab("Root.Content.Videos",$datamanager);
return $fields;
}

}

and my DataObject:

class VideoObject extends DataObject {

static $db = array (
'Category' => "Enum('Auto Load and Unload, Cappers, DeCappers, Fillers, Leak Detection, Robotics, Washers', 'Auto Load and Unload')",
'Description' => 'Varchar(255)',
'YouTubeLink' => 'Varchar(255)',
'ShortCode' => 'HTMLText',
'URLSegment' => 'Varchar(255)'
);

static $has_one = array(
'VideoHolder' => 'VideoHolder'
);

public function getCMSFields_forPopup()
{
return new FieldSet(
new DropdownField(
$name = "Category",
$title = "Video Category",
$source = singleton('VideoObject')->dbObject('Category')->enumValues()
),
new TextField('Description','Description (text appears in link)'),
new TextField('YouTubeLink','URL of YouTube Page')
);
}

public function onBeforeWrite()
{
if($this->Description){
$this->URLSegment = SiteTree::GenerateURLSegment($this->Description);
if($object = DataObject::get_one($this->ClassName, "URLSegment='" .$this->URLSegment
."' AND ID !=".$this->ID)){
$this->URLSegment = $this->URLSegment.'-'.$this->ID;
}
// else {
//$this->URLSegment = SiteTree::GenerateURLSegment($this->ClassName.'-'.$this->ID);
//}
}
if($this->YouTubeLink){
$this->ShortCode = '[YouTube id="'.substr($this->YouTubeLink,strpos($this->YouTubeLink,"watch?v=")+8,strlen($this->YouTubeLink)).'"]';
}

parent::onBeforeWrite();
}

function ShowActionLink(){
if($this->VideoHolder()){
return $this->VideoHolder()->Link().'show/'.$this->URLSegment;
}
}

}

If the environment type is 'dev' I get a notice in the popup:
[Notice] Undefined index: start
GET /admin/EditForm/field/VideoObjects/item/1?SecurityID=11197/edit?ctf[VideoObjects][start]=0&ctf[VideoObjects][per_page]=10&ctf[VideoObjects][showall]=0&ctf[VideoObjects][sort]=&ctf[VideoObjects][sort_dir]=&ctf[VideoObjects][search]=&ctf[VideoObjects][filter]=

Line 139 in C:\website\cs\dataobject_manager\code\DataObjectManager.php

If environment type is not 'dev' I get the pop up, but the fields are not editable.

TIA

Luke

Avatar
theoldlr

25 February 2011 at 9:08pm (Last edited: 27 February 2011 6:19am), Community Member, 103 Posts

I'm having this same problem again (can add but not edit) with a new error. This is a totally different install, different site, different everything actually. This time the Error is an SQL error:
"Couldn't run query: SELECT "StaffMember"."ClassName", "StaffMember"."Created", "StaffMember"."LastEdited", "StaffMember"."Name", "StaffMember"."Title", "StaffMember"."Bio", "StaffMember"."StaffMemberPageID", "StaffMember"."PhotoID", "StaffMember"."ID", CASE WHEN "StaffMember"."ClassName" IS NOT NULL THEN "StaffMember"."ClassName" ELSE 'StaffMember' END AS "RecordClassName" FROM "StaffMember" WHERE ("ParentID" = '2') Unknown column 'ParentID' in 'where clause'"

Anyone have ideas? I'm pretty sure the last time i fixed this by updating to a new verstion of DOM iirc. I'm now using r540, but no joy.
code below:

class StaffMemberPage extends Page{
   static $has_many=array(
      'StaffMembers'=>'StaffMember'
   );
   
   public function getCMSFields(){
      $fields=parent::getCMSFields();
      $manager = new DataObjectManager(
         $this,
         'StaffMembers',
         'StaffMember',
         array(
            'Thumbnail' => 'Photo',
            'Name'=>'Name',
            'Title'=>'Title'
         ),
         'getCMSFields_forPopup'
      );   
      $fields->addFieldToTab('Root.Content.Staff',$manager);
      return $fields;
   }


class StaffMember extends DataObject{
   static $db = array(
      'Name' => 'Text',
      'Title' => 'Text',
      'Biography' => 'HTMLText'
   );
   
   static $has_one = array(
      'StaffMemberPage' => 'StaffMember',
      'Photo' => 'Image'
   );
   
   public function getCMSFields_forPopup(){
      $imageUploadField = new ImageUploadField(
         'Photo',
         'Photo to add:',
         array(
            'buttonText' => 'Upload an image'
         )
      );
      
      $imageUploadField->setuploadFolder('Images/StaffMembers');
      $imageUploadField->allowFolderSelection = false;
      return new FieldSet(
         $imageUploadField,
         new TextField('Name', 'Name:'),
         new TextField('Title', 'Title:'),         
         new SimpleTinyMCEField('Biography','Biography')
      );
   }
   
   function Thumbnail(){
      $Photo = $this->Photo();
      if($Photo){
         return $Photo->CMSThumbnail();
      }
      else{
         return null;
      }
   }

Also (and this may be part of the problem) my SimpleTinyMCEField looks like a SimpleHTMLEditorField--no toolbar with buttons etc.
Thanks!

Avatar
UncleCheese

26 February 2011 at 3:52am 4085 Posts

Mmm... do you see something wrong here?

static $has_one = array(
'StaffMemberPage' => 'StaffMember',
'Photo' => 'Image'
);

Avatar
theoldlr

27 February 2011 at 5:43am (Last edited: 27 February 2011 6:10am), Community Member, 103 Posts

OBVIOUSLY! I guess thats what happens when you stay up way too late writing code.

My DOM is functional now, but the SimpleTinyMCEField still has no buttons. I'm getting a JS error in firebug that points to '$(function(){' in this script:

<script type="text/javascript">//<![CDATA[

$(function() {
            $('#DataObjectManager_Popup_AddForm_Biography').tinymce({
             plugins : 'safari,paste',
             theme : 'advanced',
          theme_advanced_buttons1 : 'bold,italic,underline,|,justifyleft,justifycenter,justifyright,|,styleselect,formatselect',theme_advanced_buttons2 : 'cut,copy,paste,pastetext,pasteword,|,bullist,numlist,|,link,unlink,anchor,image,|,code',theme_advanced_buttons3 : '',theme_advanced_buttons4 : '',   
          theme_advanced_toolbar_location : 'top',
       theme_advanced_toolbar_align : 'left',
       theme_advanced_statusbar_location : 'bottom',
       theme_advanced_resizing : false,
paste_auto_cleanup_on_paste : true,
paste_remove_spans: true,
paste_remove_styles: true,       
          content_css : ''
         
       });
       });

//]]></script>


Nothing jumps out at me immediately here except that it mentions 'safari' and I'm using firefox. It is on a mac though.
Any ideas? Thanks!

Avatar
edski

14 March 2011 at 11:56pm Community Member, 12 Posts

Hi,

I've got a similar issue with editing existing data objects.

I am using it for a number of things, incuding testimonials - very similar to the tutorial here: http://doc.silverstripe.org/old/modules:dataobjectmanager

Bizarrely, if I have more than one, I can use the prev/next buttons and edit the content in the popup fine. However, I can't edit the first 1 I click on. Any ideas?

class Testimonial extends DataObject
{
   static $db = array (
      'Quote' => 'Text',
      'Author' => 'Text'
   );
   
   static $has_one = array (
      'Page' => 'Page'
   );
   
   public function getCMSFields_forPopup()
   {
      return new FieldSet(
         new TextField('Quote', "Quote (no punctuation)"),
         new TextField('Author', "Author name")
      );
   }
   
}

It's probably not best pratice, but I am extending my page class as I need to be able to add testimonials in across the site:

class Page extends SiteTree {
...

   static $has_many = array (
      'Testimonials' => 'Testimonial'
   );   

...
   $TestimonialDataManager = new DataObjectManager(
      $this, // Controller
      'Testimonials', // Source name
      'Testimonial', // Source class
      array(
         "Quote" => "Quote",
         "Author" => "Author name"
      ), // Headings
      'getCMSFields_forPopup' // Detail fields function or FieldSet
      // Filter clause
      // Sort clause
      // Join clause
      );
      $fields->addFieldToTab("Root.Content.Testimonials", $TestimonialDataManager);

I can add them and get them to display fine - just the editing is not quite working as it should...

Thanks in advance.

Avatar
edski

15 March 2011 at 3:04am Community Member, 12 Posts

I think I have tracked the issue down - it looks like it might be related to the SecureFiles module. The link in the edit buttons - and this is the same in the Files & Images section - is not correct:

/admin/EditForm/field/Testimonials/item/8?SecurityID=e26aa5351da9fe08e317cd0e6c681fef66f3c2e4/edit?ctf[Testimonials][start]=0&ctf[Testimonials]

For some reason it is adding the security ID element of the querystring in the wrong place.

Not sure how to fix it still :-(

Avatar
edski

15 March 2011 at 4:11am Community Member, 12 Posts

FIXED!

It was after all an issue with the DataObjectManager. I saw this thread on Uncle Cheese's site:

http://www.leftandmain.com/silverstripe-modules/2010/09/01/uploadify-filedom-together-at-last/#comment-243

But actually saw that the latest version of DOM fixed it anyway. Installed that and all sorted...