2013-08-14 17:46:57 +02:00
< ? php
App :: uses ( 'AppController' , 'Controller' );
/**
* Posts Controller
*
*/
class PostsController extends AppController {
public $components = array (
'Security' ,
'Session' ,
2013-08-19 17:26:06 +02:00
'RequestHandler'
2013-08-14 17:46:57 +02:00
);
2013-08-19 17:26:06 +02:00
public $helpers = array ( 'Js' => array ( 'Jquery' ));
2013-08-14 17:46:57 +02:00
public $paginate = array (
'limit' => 60 ,
);
public function beforeFilter () {
parent :: beforeFilter ();
}
// Find the thread_id and post_id in advance. If a user clicks post comment on the event view, send the event's related thread's ID
// Usage:
// /posts/add : Creates new thread with the added post as the first post. Title set by user
// /posts/add/event/id : Checks if the event already has a thread, if no it creates one. The post is added to the event's thread
// /posts/add/thread/id : Adds a post to the thread specified
// /posts/add/post/id : Adds a post as a reply to another post. The system finds the appropriate thread, adds the post to the thread and links to the post that is being replied to.
2013-08-19 17:26:06 +02:00
public function add ( $target_type = null , $target_id = null , $quick = false ) {
2013-08-14 17:46:57 +02:00
$this -> loadModel ( 'Thread' );
$this -> Thread -> recursive = - 1 ;
$distribution = 1 ;
$event_id = 0 ;
$post_id = 0 ;
2015-12-05 22:17:43 +01:00
if ( $this -> request -> is ( 'ajax' )) $this -> layout = 'ajax' ;
2013-08-14 17:46:57 +02:00
// we have a target type and a target id. The target id defines what type of object we want to attach this event to (is it a reply to another post,
// did someone add a post to a thread, does a thread for the event exist already, etc.
switch ( $target_type ) {
case 'event' :
$this -> loadModel ( 'Event' );
$this -> Event -> recursive = - 1 ;
$this -> Event -> read ( null , $target_id );
$eventDiscussionTitle = 'Discussion about Event #' . $this -> Event -> data [ 'Event' ][ 'id' ] . ' (' . $this -> Event -> data [ 'Event' ][ 'info' ] . ')' ;
if ( ! $this -> Event -> exists ()) {
throw new NotFoundException ( __ ( 'Invalid event' ));
}
if ( ! $this -> _isSiteAdmin ()) {
2015-04-18 07:53:18 +02:00
if ( $this -> Event -> data [ 'Event' ][ 'distribution' ] == 0 && $this -> Event -> data [ 'Event' ][ 'org_id' ] != $this -> Auth -> user ( 'org_id' )) {
2013-08-14 17:46:57 +02:00
throw new MethodNotAllowedException ( 'You don\'t have permission to do that.' );
}
}
$thread = $this -> Thread -> find ( 'first' , array ( 'conditions' => array ( 'event_id' => $target_id )));
$title = $eventDiscussionTitle ;
if ( isset ( $thread [ 'Thread' ][ 'id' ])) {
$target_thread_id = $thread [ 'Thread' ][ 'id' ];
} else {
$target_thread_id = null ;
}
$distribution = $this -> Event -> data [ 'Event' ][ 'distribution' ];
2015-12-09 23:01:37 +01:00
$sgid = $this -> Event -> data [ 'Event' ][ 'sharing_group_id' ];
2015-04-18 07:53:18 +02:00
$org = $this -> Event -> data [ 'Event' ][ 'org_id' ];
2015-01-28 12:45:16 +01:00
$event_id = $this -> Event -> data [ 'Event' ][ 'id' ];
2013-08-14 17:46:57 +02:00
break ;
case 'thread' :
$target_thread_id = $target_id ;
if ( $target_id != null ) {
$thread = $this -> Thread -> read ( null , $target_thread_id );
if ( $thread == null ) {
throw new NotFoundException ( __ ( 'Invalid thread' ));
}
if ( ! $this -> _isSiteAdmin ()) {
2015-04-18 07:53:18 +02:00
if ( $thread [ 'Thread' ][ 'distribution' ] == 0 && $this -> Auth -> user ( 'org_id' ) != $thread [ 'Thread' ][ 'org_id' ]) {
2013-08-14 17:46:57 +02:00
throw new MethodNotAllowedException ( 'You don\'t have permission to do that.' );
}
}
$title = $this -> Thread -> data [ 'Thread' ][ 'title' ];
2015-01-28 12:45:16 +01:00
$event_id = $this -> Thread -> data [ 'Thread' ][ 'event_id' ];
2013-08-14 17:46:57 +02:00
}
break ;
case 'post' :
$this -> Post -> read ( null , $target_id );
$target_thread_id = $this -> Post -> data [ 'Post' ][ 'thread_id' ];
$thread = $this -> Thread -> read ( null , $target_thread_id );
if ( ! $this -> _isSiteAdmin ()) {
2015-04-18 07:53:18 +02:00
if ( $thread [ 'Thread' ][ 'distribution' ] == 0 && $this -> Auth -> user ( 'org_id' ) != $thread [ 'Thread' ][ 'org_id' ]) {
2013-08-14 17:46:57 +02:00
throw new MethodNotAllowedException ( 'You don\'t have permission to do that.' );
}
}
$title = $this -> Thread -> data [ 'Thread' ][ 'title' ];
$previousPost = $this -> _grabPreviousPost ( $target_id );
$distribution = $previousPost [ 'Thread' ][ 'distribution' ];
2015-12-09 23:01:37 +01:00
$sgid = $previousPost [ 'Thread' ][ 'sharing_group_id' ];
2013-08-14 17:46:57 +02:00
$event_id = $previousPost [ 'Thread' ][ 'event_id' ];
$post_id = $target_id ;
$target_thread_id = $previousPost [ 'Thread' ][ 'id' ];
break ;
default :
$target_thread_id = null ;
break ;
}
if ( $this -> request -> is ( 'post' )) {
// Set the default values that we'll alter before actually saving data. These are the default values unless specifically modified.
// By default, all discussions will be visibile to everyone on the platform
2015-12-16 08:59:31 +01:00
2013-08-14 17:46:57 +02:00
// Set the title if it is setable in the add view.
if ( empty ( $thread_id ) && empty ( $target_type )) {
$title = $this -> request -> data [ 'Post' ][ 'title' ];
}
if ( $target_thread_id == null ) {
// We have a post that was posted in a new thread. This could also mean that someone created the first post related to an event!
$this -> Thread -> create ();
2015-01-28 12:45:16 +01:00
// Take the title from above if we are adding a post to an event.
2013-08-14 17:46:57 +02:00
if ( $target_type === 'event' ) {
$title = $eventDiscussionTitle ;
}
$newThread = array (
2013-08-19 10:03:18 +02:00
'date_created' => date ( 'Y/m/d H:i:s' ),
'date_modified' => date ( 'Y/m/d H:i:s' ),
2013-08-14 17:46:57 +02:00
'user_id' => $this -> Auth -> user ( 'id' ),
'event_id' => $event_id ,
'title' => $title ,
2015-12-16 08:59:31 +01:00
'distribution' => isset ( $distribution ) ? $distribution : 1 ,
'sharing_group_id' => isset ( $sgid ) ? $sgid : 0 ,
2013-08-14 17:46:57 +02:00
'post_count' => 1 ,
2015-12-16 08:59:31 +01:00
'org_id' => $this -> Auth -> user ( 'org_id' )
2013-08-14 17:46:57 +02:00
);
$this -> Thread -> save ( $newThread );
$target_thread_id = $this -> Thread -> getId ();
} else {
// In this case, we have a post that was posted in an already existing thread. Update the thread!
$this -> Thread -> read ( null , $target_thread_id );
2013-08-19 10:03:18 +02:00
$this -> Thread -> data [ 'Thread' ][ 'date_modified' ] = date ( 'Y/m/d H:i:s' );
2013-08-14 17:46:57 +02:00
$this -> Thread -> save ();
}
// Time to create our post!
$this -> Post -> create ();
$newPost = array (
2013-08-19 10:03:18 +02:00
'date_created' => date ( 'Y/m/d H:i:s' ),
'date_modified' => date ( 'Y/m/d H:i:s' ),
2013-08-14 17:46:57 +02:00
'user_id' => $this -> Auth -> user ( 'id' ),
'contents' => $this -> request -> data [ 'Post' ][ 'message' ],
'post_id' => $post_id ,
'thread_id' => $target_thread_id ,
);
if ( $this -> Post -> save ( $newPost )) {
$this -> Thread -> recursive = 0 ;
$this -> Thread -> contain ( 'Post' );
2015-12-05 22:17:43 +01:00
$thread = $this -> Thread -> read ( null , $target_thread_id );
2015-12-06 15:28:21 +01:00
$this -> Thread -> updateAfterPostChange ( $thread , true );
2015-12-05 22:17:43 +01:00
if ( ! $this -> request -> is ( 'ajax' )) $this -> Session -> setFlash ( __ ( 'Post added' ));
2015-12-06 00:44:57 +01:00
$post_id = $this -> Post -> getId ();
$this -> Post -> sendPostsEmailRouter ( $this -> Auth -> user ( 'id' ), $post_id , $event_id , $title , $this -> request -> data [ 'Post' ][ 'message' ]);
2015-12-06 15:28:21 +01:00
// redirect to thread view
if ( $target_type != 'event' ) $target_id = $target_thread_id ;
$pageNr = $this -> Post -> findPageNr ( $target_id , $target_type , $this -> Post -> id );
$this -> redirect ( array ( 'controller' => 'threads' , 'action' => 'view' , $target_id , $target_type == 'event' , 'page:' . $pageNr , 'post_id:' . $this -> Post -> id ));
2015-12-05 22:17:43 +01:00
return true ;
2013-08-14 17:46:57 +02:00
} else {
$this -> Session -> setFlash ( 'The post could not be added.' );
}
2015-12-05 22:17:43 +01:00
} else {
if ( $target_type === 'post' ) {
$this -> set ( 'previous' , $previousPost [ 'Post' ][ 'contents' ]);
}
$this -> set ( 'thread_id' , $target_thread_id );
$this -> set ( 'target_type' , $target_type );
$this -> set ( 'target_id' , $target_id );
if ( isset ( $title )) {
$this -> set ( 'title' , $title );
}
2013-08-14 17:46:57 +02:00
}
}
2015-12-06 15:28:21 +01:00
public function edit ( $post_id , $context = 'thread' ) {
$post = $this -> Post -> find ( 'first' , array ( 'conditions' => array ( 'Post.id' => $post_id ), 'recursive' => - 1 , 'contain' => array ( 'Thread' )));
if ( empty ( $post )) throw new NotFoundException ( __ ( 'Invalid post' ));
if ( ! $this -> _isSiteAdmin () && $this -> Auth -> user ( 'id' ) != $post [ 'Post' ][ 'user_id' ]) throw new MethodNotAllowedException ( 'This is not your event.' );
2013-08-14 17:46:57 +02:00
if ( $this -> request -> is ( 'post' ) || $this -> request -> is ( 'put' )) {
2015-12-06 15:28:21 +01:00
$post [ 'Post' ][ 'date_modified' ] = date ( 'Y/m/d H:i:s' );
2013-08-14 17:46:57 +02:00
$fieldList = array ( 'date_modified' , 'contents' );
2015-12-06 15:28:21 +01:00
$post [ 'Post' ][ 'contents' ] = $this -> request -> data [ 'Post' ][ 'contents' ];
if ( $this -> Post -> save ( $post [ 'Post' ], true , $fieldList )) {
2013-08-14 17:46:57 +02:00
$this -> Session -> setFlash ( 'Post edited' );
2015-12-06 15:28:21 +01:00
$thread = $this -> Post -> Thread -> find ( 'first' , array (
'recursive' => - 1 ,
'contain' => array (
'Post' => array (
'fields' => array ( 'Post.id' )
)
),
'conditions' => array ( 'Thread.id' => $post [ 'Post' ][ 'thread_id' ])
));
$this -> Post -> Thread -> updateAfterPostChange ( $thread );
if ( $context != 'event' ) $target_id = $post [ 'Post' ][ 'thread_id' ];
else $target_id = $thread [ 'Thread' ][ 'event_id' ];
$context = ( $context == 'event' );
$pageNr = $this -> Post -> findPageNr ( $target_id , $context , $post_id );
$this -> redirect ( array ( 'controller' => 'threads' , 'action' => 'view' , $target_id , $context , 'page:' . $pageNr , 'post_id:' . $post_id ));
return true ;
2013-08-14 17:46:57 +02:00
} else {
$this -> Session -> setFlash ( 'The Post could not be edited. Please, try again.' );
}
}
2015-12-06 15:28:21 +01:00
$this -> set ( 'title' , $post [ 'Thread' ][ 'title' ]);
$this -> set ( 'contents' , $post [ 'Post' ][ 'contents' ]);
2013-08-14 17:46:57 +02:00
$this -> set ( 'id' , $post_id );
2015-12-06 15:28:21 +01:00
$this -> set ( 'thread_id' , $post [ 'Post' ][ 'thread_id' ]);
2013-08-14 17:46:57 +02:00
}
2015-12-06 15:28:21 +01:00
public function delete ( $post_id , $context = 'thread' ) {
2013-08-14 17:46:57 +02:00
if ( ! $this -> request -> is ( 'post' )) {
throw new MethodNotAllowedException ();
}
$this -> Post -> id = $post_id ;
if ( ! $this -> Post -> exists ()) {
throw new NotFoundException ( __ ( 'Invalid post' ));
}
$this -> Post -> read ();
$temp = $this -> Post -> data ;
if ( $this -> Auth -> user ( 'id' ) != $this -> Post -> data [ 'Post' ][ 'user_id' ] && ! $this -> _isSiteAdmin ()) {
throw new MethodNotAllowedException ( 'This post doesn\'t belong to you, so you cannot delete it.' );
}
if ( $this -> Post -> delete ()) {
2015-12-06 15:28:21 +01:00
$thread = $this -> Post -> Thread -> find ( 'first' , array (
'recursive' => - 1 ,
'contain' => array (
'Post' => array (
'fields' => array ( 'Post.id' )
)
),
'conditions' => array ( 'Thread.id' => $temp [ 'Post' ][ 'thread_id' ])
));
if ( ! $this -> Post -> Thread -> updateAfterPostChange ( $thread )) {
2013-08-14 17:46:57 +02:00
$this -> Session -> setFlash ( 'Post and thread deleted' );
2015-12-06 15:28:21 +01:00
if ( $context == 'event' ) {
$this -> redirect ( array ( 'controller' => 'events' , 'action' => 'view' , $thread [ 'Thread' ][ 'event_id' ]));
return true ;
} else {
$this -> redirect ( array ( 'controller' => 'threads' , 'action' => 'index' ));
return true ;
}
2013-08-14 17:46:57 +02:00
} else {
$this -> Session -> setFlash ( 'Post deleted' );
2015-12-06 15:28:21 +01:00
if ( $context == 'event' ) {
$this -> redirect ( array ( 'controller' => 'events' , 'action' => 'view' , $thread [ 'Thread' ][ 'event_id' ]));
return true ;
}
2013-08-14 17:46:57 +02:00
}
}
2015-12-06 15:28:21 +01:00
$this -> redirect ( array ( 'controller' => 'threads' , 'action' => 'view' , $thread [ 'Thread' ][ 'id' ]));
2013-08-14 17:46:57 +02:00
}
2013-08-19 10:03:18 +02:00
2013-08-14 17:46:57 +02:00
private function _grabPreviousPost ( $post_id ) {
$this -> Post -> id = $post_id ;
$this -> Post -> read ();
return $this -> Post -> data ;
}
}
?>
2015-01-27 17:56:50 +01:00