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.

Data Model Questions

"$this->delete()" won't delete Dataobject on all Stages


Reply

5 Posts   3357 Views

Avatar
joern

23 August 2010 at 4:02am (Last edited: 23 August 2010 4:35am), Community Member, 28 Posts

Hi,
after update to 2.4.1 i can't delete Dataobjects on all Stages from my Frontend-Forms (it works in the admin). The entry is only deleted in the _Live-Table and keeps it in the _Versions-Table and Stage-Table.

Member Decorator:

function extraStatics() {
   return array(
      'has_many' => array( // Einladungen
         'Invitations' => 'Invitation'
      ),
      …
}

function removeInvitation($invitationID) {
      
   $invitationID = (int) $invitationID;
      
   // prevents access to invitations from other users
   if( !$this->owner->Invitations()->containsIDs(array($invitationID))) return false;
   
   if (!is_numeric($invitationID) || $invitationID < 1) return false;
   
   $invitation = $this->owner->Invitations()->find("ID", $invitationID);
   
   if (!$invitation) return false;
      
   // unset from member list
   $this->owner->Invitations()->remove($invitation);
   
   // delete
   $invitation->delete();
}

Invitation:

class Invitation extends DataObject {

   static $extensions = array(
      "Versioned('Stage', 'Live')"
   );

   …
}

Do you know something?

Best Regards ,
Jörn

Avatar
Willr

23 August 2010 at 9:14am Forum Moderator, 5511 Posts

Probably because $invitation is a single dataobject and delete() only deletes the object in question and not any of its staged components. I think the easiest way is to call the deleteFromStage() function on the object to delete from each.

http://api.silverstripe.org/2.4/sapphire/model/Versioned.html#methoddeleteFromStage

Avatar
joern

23 August 2010 at 9:49pm (Last edited: 23 August 2010 9:50pm), Community Member, 28 Posts

Hi,
thanks

   $invitation->deleteFromStage("Live");
   $invitation->deleteFromStage("Stage");
   $invitation->delete();

delete it on both stages but keeps the Versions.

i'm a little bit confused, because i looked in the docs http://api.silverstripe.org/2.4/sapphire/model/DataObject.html#methoddelete and read:

void delete( )
Delete this data object.
$this->onBeforeDelete() gets called. Note that in Versioned objects, both Stage and Live will be deleted.

i try also "DataObjcect::get("Invitation", … )->delete(); but it only removes the data from the _Live-Table.

Something is wrong. The Delete-Method or the Docs.

Jörn

Avatar
EzraNaj

10 September 2010 at 12:48am Community Member, 11 Posts

I encountered this problem too. Can somebody help?

Avatar
Willr

10 September 2010 at 4:12pm Forum Moderator, 5511 Posts

delete it on both stages but keeps the Versions.

Yes it won't delete versions as delete() may imply you want to revert to it (versions is like a history). Not sure if the ORM has any functionality for that (eg try allVersions()) but you could always use good old plain Database queries!

DB::query("DELETE FROM Table_versions WHERE RecordID = '$invitation->ID'");