mirror of
https://github.com/silverstripe/silverstripe-comments
synced 2024-10-22 11:05:49 +02:00
ENHANCEMENT: allow comment area ids to be set in the configuration class allowing multiple forms on a single page. APICHANGE: migrated Comment::moderation() to the per type setting in the Commenting class
This commit is contained in:
parent
a5cc90e33f
commit
d06a9a12bc
190
code/controllers/CommentingController.php
Normal file
190
code/controllers/CommentingController.php
Normal file
@ -0,0 +1,190 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @package comments
|
||||
*/
|
||||
|
||||
class CommentingController extends Controller {
|
||||
|
||||
private $baseClass = "";
|
||||
private $ownerRecord = "";
|
||||
private $ownerController = "";
|
||||
|
||||
public function setBaseClass($class) {
|
||||
$this->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();
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user