diff --git a/code/controllers/CommentingController.php b/code/controllers/CommentingController.php new file mode 100644 index 0000000..d8c3cbc --- /dev/null +++ b/code/controllers/CommentingController.php @@ -0,0 +1,190 @@ +baseClass = $class; + } + + public function getBaseClass() { + return $this->baseClass; + } + + public function setOwnerRecord($record) { + $this->ownerRecord = $record; + } + + public function getOwnerRecord() { + return $this->ownerRecord; + } + + public function setOwnerController($controller) { + $this->ownerController = $controller; + } + + public function getOwnerController() { + return $this->ownerController; + } + + /** + * Workaround for generating the link to this controller + */ + public function Link($action = "") { + return __CLASS__ .'/'. $action; + } + + /** + * @return Form + */ + function CommentsForm() { + + $member = Member::currentUser(); + $fields = new FieldSet( + new TextField("Name", _t('CommentInterface.YOURNAME', 'Your name')), + new EmailField("Email", _t('CommentingController.EMAILADDRESS', "Your email address (will not be published)")), + new TextField("URL", _t('CommentingController.WEBSITEURL', "Your website URL")), + new TextareaField("Comment", _t('CommentingController.COMMENTS', "Comments")), + new HiddenField("ParentID"), + new HiddenField("ReturnURL"), + new HiddenField("BaseClass") + ); + + // save actions + $actions = new FieldSet( + new FormAction("doPostComment", _t('CommentInterface.POST', 'Post')) + ); + + // required fields for server side + $required = new RequiredFields(array( + 'Name', + 'Email', + 'Comment' + )); + + // create the comment form + $form = new Form($this, 'CommentsForm', $fields, $actions, $required); + + // if the record exists load the extra required data + if($record = $this->getOwnerRecord()) { + $require_login = Commenting::get_config_value($this->getBaseClass(), 'require_login'); + $permission = Commenting::get_config_value($this->getBaseClass(), 'required_permission'); + + if(($require_login || $permission) && $member) { + $fields = $form->Fields(); + + $fields->removeByName('Name'); + $fields->removeByName('Email'); + $fields->insertBefore(new ReadonlyField("NameView", _t('CommentInterface.YOURNAME', 'Your name'), $member->getName()), 'URL'); + $fields->push(new HiddenField("Name", "", $member->getName())); + + $form->setFields($fields); + } + + // we do not want to read a new URL when the form has already been submitted + // which in here, it hasn't been. + $url = (isset($_SERVER['REQUEST_URI'])) ? Director::protocolAndHost() . '' . $_SERVER['REQUEST_URI'] : false; + + $form->loadDataFrom(array( + 'ParentID' => $record->ID, + 'ReturnURL' => $url, + 'BaseClass' => $this->getBaseClass() + )); + } + + + // Set it so the user gets redirected back down to the form upon form fail + $form->setRedirectToFormOnValidationError(true); + + // load any data from the cookies + if($data = Cookie::get('CommentsForm_UserData')) { + $data = unserialize($data); + + $form->loadDataFrom(array( + "Name" => isset($data['Name']) ? $data['Name'] : '', + "URL" => isset($data['URL']) ? $data['URL'] : '', + "Email" => isset($data['Email']) ? $data['Email'] : '', + "Comment" => Cookie::get('CommentsForm_Comment') + )); + } + + // hook to allow further extensions to alter the comments form + $this->extend('alterCommentForm', $form); + + return $form; + } + + /** + * Process which creates a {@link Comment} once a user submits a comment from this form. + * + * @param array $data + * @param Form $form + */ + function doPostComment($data, $form) { + $class = (isset($data['BaseClass'])) ? $data['BaseClass'] : $this->getBaseClass(); + + // if no class then we cannot work out what controller or model they + // are on so throw an error + if(!$class) user_error("No OwnerClass set on CommentingController.", E_USER_ERROR); + + // cache users data + Cookie::set("CommentsForm_UserData", serialize($data)); + Cookie::set("CommentsForm_Comment", $data['Comment']); + + // extend hook to allow extensions. Also see onAfterPostComment + $this->extend('onBeforePostComment', $form); + + // If commenting can only be done by logged in users, make sure the user is logged in + $member = Member::currentUser(); + + if(Commenting::can_member_post($class) && $member) { + $form->Fields()->push(new HiddenField("AuthorID", "Author ID", $member->ID)); + } + + if(!Commenting::can_member_post($class)) { + echo _t('CommentingController.PERMISSIONFAILURE', "You're not able to post comments to this page. Please ensure you are logged in and have an appropriate permission level."); + + return; + } + + // is moderation turned on + $moderated = Commenting::get_config_value($class, 'require_moderation'); + + $comment = new Comment(); + $form->saveInto($comment); + + $comment->Moderated = ($moderated) ? false : true; + $comment->write(); + + $moderationMsg = _t('CommentInterface_Form.AWAITINGMODERATION', "Your comment has been submitted and is now awaiting moderation."); + + // clear the users comment since it passed validation + Cookie::set('CommentsForm_Comment', false); + + if(Director::is_ajax()) { + if($comment->NeedsModeration){ + echo $moderationMsg; + } else{ + echo $comment->renderWith('CommentInterface_singlecomment'); + } + + return false; + } + + if($comment->NeedsModeration){ + $this->sessionMessage($moderationMsg, 'good'); + } + + $hash = ($comment->NeedsModeration) ? '#Comments_holder' : '#Comment_' . $comment->ID; + $url = (isset($data['ReturnURL'])) ? $data['ReturnURL'] : false; + + return ($url) ? $this->redirect($url . $hash) : $this->redirectBack(); + } +} \ No newline at end of file