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.

We've moved the forum!

Please use forum.silverstripe.org for any new questions (announcement).
The forum archive will stick around, but will be read only.

You can also use our Slack channel or StackOverflow to ask for help.
Check out our community overview for more options to contribute.

Data Model Questions /

Moderators: martimiz, Sean, Ed, biapar, Willr, Ingo, swaiba

Update multiple dataobject records


Go to End


2 Posts   2465 Views

Avatar
noisyjerm

Community Member, 1 Post

31 October 2010 at 11:58pm

Edited: 01/11/2010 12:01am

I am building a site that includes a page where visitors can upload an image. There will be a moderation page where an authenticated user (administrator) will be able to see the uploaded images and set an accepted / declined flag for each image.

What I would like to be able to do is update all the records shown on the page in one go, as opposed to iterating through the dataobjects and calling write() on each one. The code I am using follows. All seems to work fine except $mediaItems->write();. Is there a better way to achieve this or is it acceptable to call write() within the for loop?

MediaDataObject.php

class MediaDataObject extends DataObject {
   static $db = array(
      'MediaURL' => 'Text',
      'CreatorId' => 'Int',
      'IsApproved' => 'Int'
   );
}

MediaPage.ss

<form action="media/doModerate" method="POST">
<table>
<% control mediaList %>
  <tr>
    <td><img src="$MediaURL" /></td>
    <td>$Created.Nice</td>
    <td>
      <input type="radio" name="video[$ID]" value="0" <% if IsApproved==0 %>checked='checked'<% end_if %> />
      <input type="radio" name="video[$ID]" value="1" <% if IsApproved==1 %>checked='checked'<% end_if %> />
      <input type="radio" name="video[$ID]" value="2" <% if IsApproved==2 %>checked='checked'<% end_if %> />
    </td>
  </tr>
<% end_control %>
</table>

MediaPage.php

class MediaPage_Controller extends Page_Controller {
  function init(){
     parent::init();
  }

  function mediaList() {
    $allMedialDataObjects = DataObject::get('MediaDataObject');
    return $allMedialDataObjects;
  }
 
  function doModerate(SS_HTTPRequest $request) {
    $vars = $request->postVars();
    $approvals = $vars['video'];
    $mediaItems = DataObject::get('MediaDataObject');	
    foreach ($mediaItems as $mediaItem) {
      $mediaItem->IsApproved = $approvals[$mediaItem->ID] ;
      //$mediaItem->write();
    }
    $mediaItems->write();
  }	
}

Avatar
baba-papa

Community Member, 279 Posts

13 November 2010 at 8:57am

mediaItems is a DataObjectSet and the method "write()" belongs to DataObject. You have to iterate maybe with foreach and write every single one:

foreach $mediaItems as $mediaItem {
$mediaItem->write();
}