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.

Archive

Our old forums are still available as a read-only archive.

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

extending PM


Reply

2 Posts   918 Views

Avatar
eoor

2 September 2008 at 10:51pm Community Member, 5 Posts

Hi, i'm trying to develop provate message module. This is my class that extends Page_Controller

<?php

class PrivateMessage extends Page_Controller {
   public $URLSegment = "PrivateMessage";
   
   function __construct() {
      return parent::__construct(null);
   }
   
   function init() {
      if(!Member::currentUserID()) Security::permissionFailure();
      parent::init();
   }
   
   
   function InboxItems() {
      $myID=Member::currentUserID();
      return DataObject::get("PrivateMessage", "ToID = $myID AND (Status = 'Unread' OR Status ='Read')", "Status, Created DESC");
   }
   
   function SentItems() {
      $myID=Member::currentUserID();
      return DataObject::get("PrivateMessage", "FromID = $myID AND Status = 'Sent'", "Created DESC");
   }
   
   function DraftItems() {
      $myID=Member::currentUserID();
      return DataObject::get("PrivateMessage", "ToID = $myID AND Status = 'Draft'", "Created DESC");
   }
   
   function GetNewMessages() {
      $myID=Member::currentUserID();
      return DataObject::get("PrivateMessage", "ToID = $myID AND Status = 'Unread'", "Created DESC");
   }
   
   
   function PostMessageForm() {
      $members = DataObject::get("Member", "", "Firstname, Surname","INNER JOIN Group_Members ON Group_Members.GroupID IN (1,2,3) AND Group_Members.MemberID = Member.ID");
      $allMembers = array();
      foreach($members as $member) {
         $allMembers[$member->ID] = "$member->Nickname";
      }
      $me = Member::currentUser();
      return new Form($this, "PostMessageForm", new FieldSet(
         new ReadonlyField("From", "Od", "$me->NickName"),
         new DropdownField("ToID", "Do", $allMembers),
         new TextField("Subject", "Temat"),
         new TextareaField("Body", "Tresc")

         ), new FieldSet(
         new FormAction("doPostMessage", "Send")
      )
      ,new RequiredFields("ToID", "Subject", "Body")
      );
   }
   
   function ReplayMessageForm() {
      $message = DataObject::get_by_id("PrivateMessage", $this->urlParams['ID']);
      
      $me = Member::currentUser();
      return new Form($this, "ReplayMessageForm", new FieldSet(
         new ReadonlyField("From", "Od", "$me->NickName"),
         new ReadonlyField("ToID", "Do", $message->FromID),
         new TextField("Subject", "Temat", "Re:".$message->Subject),
         new TextareaField("Body", "Tresc")

         ), new FieldSet(
         new FormAction("doPostMessage", "Send")
      )
      ,new RequiredFields("Subject", "Body")
      );
   }
   
   
   
   function doPostMessage($data, $form) {
      $message = new PrivateMessage();
      $message2 = new PrivateMessage();
      $form->saveInto($message);
      $message->FromID = Member::currentUserID();
      
      $touser = DataObject::get_by_id("Member", $message->ToID);
      $message->To = $touser->Nickname;
      $message->write();
      $message2 = $message->duplicate(false);
      $message2->MarkSent();
      $message2->write();
      Director::redirect($this->Link().'thanks');
   }
   
   function thanks() {
      return array(
            'Content' => "widomosc zostala wyslana"      
         );
   }
   
   function message() {
      $message = DataObject::get_by_id("PrivateMessage", $this->urlParams['ID']);
      if(($message->ToID == Member::currentUserID()) or ($message->FromID ==Member::currentUserID() and $message->Status == 'Sent')) {
         if($message->Status=="Unread")
         $message->MarkRead();
         return array(
            'CurrentMessage' => $message         
         );
      } else {
         return array();
      }
   }
   
   function draft() {
      $message = DataObject::get_by_id("PrivateMessage", $this->urlParams['ID']);
      if($message->ToID == Member::currentUserID() or ($message->FromID ==Member::currentUserID() and $message->Status == 'Sent') ) {
         $message->MarkDraft();
         return array(
            'Content' => "Wiadomosc zostala przeniesiona do kosza");
      }
   }
   
   function delete() {
      $message = DataObject::get_by_id("PrivateMessage", $this->urlParams['ID']);
      if(($message->ToID == Member::currentUserID() and $message->Status == 'Draft') or ($message->FromID ==Member::currentUserID() and $message->Status == 'Sent')) {
         DataObject::delete_by_id("PrivateMessage", $this->urlParams['ID']);
      return array(
            'Content' => "Wiadomosc zostala usunieta");
      }
         
      
   }

   function ReplayAble()
   {
      $message = DataObject::get_by_id("PrivateMessage", $this->urlParams['ID']);
      if($message->Status == 'Read')
      return true;
      
   }

   
   

}

?>

and when i try to use any of this method in my .ss file I'm getting error:

FATAL ERROR: Object::__call() Method 'instance_get' not found in class 'PrivateMessage'
At line 199 in /var/www/pm/silverstripe/sapphire/core/Object.php

What's wrong?

Avatar
ajshort

2 September 2008 at 11:57pm Community Member, 244 Posts

Hi eoor,

The problem is that your trying to use a controller as a model - as you can see, your extending Page_Controller rather than using a model class. What you should do, is rename your PrivateMessage to PrivateMessage_Controller. You could then create a model class for the actual PrivateMessage - something like:

class PrivateMessage extends DataObject {

public static $db = array(
'Message' => 'Text'
);

public static $has_one = array(
'Sender' => 'Member',
'Receiver' => 'Member'
);

// etc...

}