mirror of
https://github.com/silverstripe/silverstripe-comments
synced 2024-10-22 11:05:49 +02:00
Split comment form out to its’ own class
This commit is contained in:
parent
d9333b3160
commit
9366ef603e
@ -5,7 +5,6 @@ namespace SilverStripe\Comments\Controllers;
|
|||||||
use SilverStripe\CMS\Model\SiteTree;
|
use SilverStripe\CMS\Model\SiteTree;
|
||||||
use SilverStripe\Comments\Extensions\CommentsExtension;
|
use SilverStripe\Comments\Extensions\CommentsExtension;
|
||||||
use SilverStripe\Comments\Model\Comment;
|
use SilverStripe\Comments\Model\Comment;
|
||||||
use SilverStripe\Control\Cookie;
|
|
||||||
use SilverStripe\Control\Director;
|
use SilverStripe\Control\Director;
|
||||||
use SilverStripe\Control\Controller;
|
use SilverStripe\Control\Controller;
|
||||||
use SilverStripe\Control\Email\Email;
|
use SilverStripe\Control\Email\Email;
|
||||||
@ -13,21 +12,12 @@ use SilverStripe\Control\HTTP;
|
|||||||
use SilverStripe\Control\HTTPRequest;
|
use SilverStripe\Control\HTTPRequest;
|
||||||
use SilverStripe\Control\RSS\RSSFeed;
|
use SilverStripe\Control\RSS\RSSFeed;
|
||||||
use SilverStripe\Control\Session;
|
use SilverStripe\Control\Session;
|
||||||
use SilverStripe\Core\Convert;
|
|
||||||
use SilverStripe\Forms\CompositeField;
|
|
||||||
use SilverStripe\Forms\EmailField;
|
|
||||||
use SilverStripe\Forms\FieldList;
|
|
||||||
use SilverStripe\Forms\Form;
|
|
||||||
use SilverStripe\Forms\FormAction;
|
|
||||||
use SilverStripe\Forms\HiddenField;
|
|
||||||
use SilverStripe\Forms\ReadonlyField;
|
|
||||||
use SilverStripe\Forms\RequiredFields;
|
|
||||||
use SilverStripe\Forms\TextareaField;
|
|
||||||
use SilverStripe\Forms\TextField;
|
|
||||||
use SilverStripe\ORM\DataObject;
|
use SilverStripe\ORM\DataObject;
|
||||||
use SilverStripe\ORM\PaginatedList;
|
use SilverStripe\ORM\PaginatedList;
|
||||||
use SilverStripe\Security\Member;
|
use SilverStripe\Security\Member;
|
||||||
use SilverStripe\Security\Security;
|
use SilverStripe\Security\Security;
|
||||||
|
use SilverStripe\Core\Injector\Injector;
|
||||||
|
use SilverStripe\Comments\Forms\CommentForm;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @package comments
|
* @package comments
|
||||||
@ -399,6 +389,7 @@ class CommentingController extends Controller
|
|||||||
public function getComment()
|
public function getComment()
|
||||||
{
|
{
|
||||||
$id = isset($this->urlParams['ID']) ? $this->urlParams['ID'] : false;
|
$id = isset($this->urlParams['ID']) ? $this->urlParams['ID'] : false;
|
||||||
|
|
||||||
if ($id) {
|
if ($id) {
|
||||||
$comment = Comment::get()->byId($id);
|
$comment = Comment::get()->byId($id);
|
||||||
if ($comment) {
|
if ($comment) {
|
||||||
@ -432,12 +423,14 @@ class CommentingController extends Controller
|
|||||||
$form->setFormAction($this->Link('reply', $comment->ID));
|
$form->setFormAction($this->Link('reply', $comment->ID));
|
||||||
|
|
||||||
$this->extend('updateReplyForm', $form);
|
$this->extend('updateReplyForm', $form);
|
||||||
|
|
||||||
return $form;
|
return $form;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Request handler for reply form.
|
* Request handler for reply form.
|
||||||
|
*
|
||||||
* This method will disambiguate multiple reply forms in the same method
|
* This method will disambiguate multiple reply forms in the same method
|
||||||
*
|
*
|
||||||
* @param HTTPRequest $request
|
* @param HTTPRequest $request
|
||||||
@ -462,258 +455,9 @@ class CommentingController extends Controller
|
|||||||
*/
|
*/
|
||||||
public function CommentsForm()
|
public function CommentsForm()
|
||||||
{
|
{
|
||||||
$usePreview = $this->getOption('use_preview');
|
return Injector::inst()->create(CommentForm::class, __FUNCTION__, $this->owner);
|
||||||
|
|
||||||
$nameRequired = _t('CommentInterface.YOURNAME_MESSAGE_REQUIRED', 'Please enter your name');
|
|
||||||
$emailRequired = _t('CommentInterface.EMAILADDRESS_MESSAGE_REQUIRED', 'Please enter your email address');
|
|
||||||
$emailInvalid = _t('CommentInterface.EMAILADDRESS_MESSAGE_EMAIL', 'Please enter a valid email address');
|
|
||||||
$urlInvalid = _t('CommentInterface.COMMENT_MESSAGE_URL', 'Please enter a valid URL');
|
|
||||||
$commentRequired = _t('CommentInterface.COMMENT_MESSAGE_REQUIRED', 'Please enter your comment');
|
|
||||||
|
|
||||||
$fields = new FieldList(
|
|
||||||
$dataFields = new CompositeField(
|
|
||||||
// Name
|
|
||||||
$a = TextField::create('Name', _t('CommentInterface.YOURNAME', 'Your name'))
|
|
||||||
->setCustomValidationMessage($nameRequired)
|
|
||||||
->setAttribute('data-msg-required', $nameRequired),
|
|
||||||
// Email
|
|
||||||
EmailField::create(
|
|
||||||
'Email',
|
|
||||||
_t('CommentingController.EMAILADDRESS', 'Your email address (will not be published)')
|
|
||||||
)
|
|
||||||
->setCustomValidationMessage($emailRequired)
|
|
||||||
->setAttribute('data-msg-required', $emailRequired)
|
|
||||||
->setAttribute('data-msg-email', $emailInvalid)
|
|
||||||
->setAttribute('data-rule-email', true),
|
|
||||||
// Url
|
|
||||||
TextField::create('URL', _t('CommentingController.WEBSITEURL', 'Your website URL'))
|
|
||||||
->setAttribute('data-msg-url', $urlInvalid)
|
|
||||||
->setAttribute('data-rule-url', true),
|
|
||||||
// Comment
|
|
||||||
TextareaField::create('Comment', _t('CommentingController.COMMENTS', 'Comments'))
|
|
||||||
->setCustomValidationMessage($commentRequired)
|
|
||||||
->setAttribute('data-msg-required', $commentRequired)
|
|
||||||
),
|
|
||||||
HiddenField::create('ParentID'),
|
|
||||||
HiddenField::create('ParentClassName'),
|
|
||||||
HiddenField::create('ReturnURL'),
|
|
||||||
HiddenField::create('ParentCommentID')
|
|
||||||
);
|
|
||||||
|
|
||||||
// Preview formatted comment. Makes most sense when shortcodes or
|
|
||||||
// limited HTML is allowed. Populated by JS/Ajax.
|
|
||||||
if ($usePreview) {
|
|
||||||
$fields->insertAfter(
|
|
||||||
ReadonlyField::create('PreviewComment', _t('CommentInterface.PREVIEWLABEL', 'Preview'))
|
|
||||||
->setAttribute('style', 'display: none'), // enable through JS
|
|
||||||
'Comment'
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
$dataFields->addExtraClass('data-fields');
|
|
||||||
|
|
||||||
// save actions
|
|
||||||
$actions = new FieldList(
|
|
||||||
$postAction = new FormAction('doPostComment', _t('CommentInterface.POST', 'Post'))
|
|
||||||
);
|
|
||||||
if ($usePreview) {
|
|
||||||
$actions->push(
|
|
||||||
FormAction::create('doPreviewComment', _t('CommentInterface.PREVIEW', 'Preview'))
|
|
||||||
->addExtraClass('action-minor')
|
|
||||||
->setAttribute('style', 'display: none') // enable through JS
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
// required fields for server side
|
|
||||||
$required = new RequiredFields($this->config()->required_fields);
|
|
||||||
|
|
||||||
// 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()) {
|
|
||||||
// Load member data
|
|
||||||
$member = Member::currentUser();
|
|
||||||
if (($record->CommentsRequireLogin || $record->PostingRequiredPermission) && $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()));
|
|
||||||
$fields->push(new HiddenField('Email', '', $member->Email));
|
|
||||||
}
|
|
||||||
|
|
||||||
// we do not want to read a new URL when the form has already been submitted
|
|
||||||
// which in here, it hasn't been.
|
|
||||||
$form->loadDataFrom(array(
|
|
||||||
'ParentID' => $record->ID,
|
|
||||||
'ReturnURL' => $this->request->getURL(),
|
|
||||||
'ParentClassName' => $this->getParentClass()
|
|
||||||
));
|
|
||||||
|
|
||||||
if ($holder = $record->getCommentHolderID()) {
|
|
||||||
$form->setHTMLID($holder);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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 = Convert::json2array($data);
|
|
||||||
|
|
||||||
$form->loadDataFrom(array(
|
|
||||||
'Name' => isset($data['Name']) ? $data['Name'] : '',
|
|
||||||
'URL' => isset($data['URL']) ? $data['URL'] : '',
|
|
||||||
'Email' => isset($data['Email']) ? $data['Email'] : ''
|
|
||||||
));
|
|
||||||
// allow previous value to fill if comment not stored in cookie (i.e. validation error)
|
|
||||||
$prevComment = Cookie::get('CommentsForm_Comment');
|
|
||||||
if ($prevComment && $prevComment != '') {
|
|
||||||
$form->loadDataFrom(array('Comment' => $prevComment));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!empty($member)) {
|
|
||||||
$form->loadDataFrom($member);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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
|
|
||||||
* @return HTTPResponse
|
|
||||||
*/
|
|
||||||
public function doPostComment($data, $form)
|
|
||||||
{
|
|
||||||
// Load class and parent from data
|
|
||||||
if (isset($data['ParentClassName'])) {
|
|
||||||
$this->setParentClass($data['ParentClassName']);
|
|
||||||
}
|
|
||||||
if (isset($data['ParentID']) && ($class = $this->getParentClass())) {
|
|
||||||
$this->setOwnerRecord($class::get()->byID($data['ParentID']));
|
|
||||||
}
|
|
||||||
if (!$this->getOwnerRecord()) {
|
|
||||||
return $this->httpError(404);
|
|
||||||
}
|
|
||||||
|
|
||||||
// cache users data
|
|
||||||
Cookie::set('CommentsForm_UserData', Convert::raw2json($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
|
|
||||||
if (!$this->getOwnerRecord()->canPostComment()) {
|
|
||||||
return Security::permissionFailure(
|
|
||||||
$this,
|
|
||||||
_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.'
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($member = Member::currentUser()) {
|
|
||||||
$form->Fields()->push(new HiddenField('AuthorID', 'Author ID', $member->ID));
|
|
||||||
}
|
|
||||||
|
|
||||||
// What kind of moderation is required?
|
|
||||||
switch ($this->getOwnerRecord()->ModerationRequired) {
|
|
||||||
case 'Required':
|
|
||||||
$requireModeration = true;
|
|
||||||
break;
|
|
||||||
case 'NonMembersOnly':
|
|
||||||
$requireModeration = empty($member);
|
|
||||||
break;
|
|
||||||
case 'None':
|
|
||||||
default:
|
|
||||||
$requireModeration = false;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
$comment = new Comment();
|
|
||||||
$form->saveInto($comment);
|
|
||||||
|
|
||||||
$comment->ParentID = $data['ParentID'];
|
|
||||||
$comment->ParentClass = $data['ParentClassName'];
|
|
||||||
|
|
||||||
$comment->AllowHtml = $this->getOption('html_allowed');
|
|
||||||
$comment->Moderated = !$requireModeration;
|
|
||||||
|
|
||||||
// Save into DB, or call pre-save hooks to give accurate preview
|
|
||||||
$usePreview = $this->getOption('use_preview');
|
|
||||||
$isPreview = $usePreview && !empty($data['IsPreview']);
|
|
||||||
if ($isPreview) {
|
|
||||||
$comment->extend('onBeforeWrite');
|
|
||||||
} else {
|
|
||||||
$comment->write();
|
|
||||||
|
|
||||||
// extend hook to allow extensions. Also see onBeforePostComment
|
|
||||||
$this->extend('onAfterPostComment', $comment);
|
|
||||||
}
|
|
||||||
|
|
||||||
// we want to show a notification if comments are moderated
|
|
||||||
if ($requireModeration && !$comment->IsSpam) {
|
|
||||||
Session::set('CommentsModerated', 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
// clear the users comment since it passed validation
|
|
||||||
Cookie::set('CommentsForm_Comment', false);
|
|
||||||
|
|
||||||
// Find parent link
|
|
||||||
if (!empty($data['ReturnURL'])) {
|
|
||||||
$url = $data['ReturnURL'];
|
|
||||||
} elseif ($parent = $comment->Parent()) {
|
|
||||||
$url = $parent->Link();
|
|
||||||
} else {
|
|
||||||
return $this->redirectBack();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Given a redirect page exists, attempt to link to the correct anchor
|
|
||||||
if ($comment->IsSpam) {
|
|
||||||
// Link to the form with the error message contained
|
|
||||||
$hash = $form->FormName();
|
|
||||||
} elseif (!$comment->Moderated) {
|
|
||||||
// Display the "awaiting moderation" text
|
|
||||||
$hash = 'moderated';
|
|
||||||
} else {
|
|
||||||
// Link to the moderated, non-spam comment
|
|
||||||
$hash = $comment->Permalink();
|
|
||||||
}
|
|
||||||
|
|
||||||
return $this->redirect(Controller::join_links($url, "#{$hash}"));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param array $data
|
|
||||||
* @param Form $form
|
|
||||||
* @return HTTPResponse
|
|
||||||
*/
|
|
||||||
public function doPreviewComment($data, $form)
|
|
||||||
{
|
|
||||||
$data['IsPreview'] = 1;
|
|
||||||
|
|
||||||
return $this->doPostComment($data, $form);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return HTTPResponse|false
|
* @return HTTPResponse|false
|
||||||
|
273
src/Forms/CommentForm.php
Normal file
273
src/Forms/CommentForm.php
Normal file
@ -0,0 +1,273 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace SilverStripe\Comments\Forms;
|
||||||
|
|
||||||
|
use SilverStripe\Forms\CompositeField;
|
||||||
|
use SilverStripe\Forms\EmailField;
|
||||||
|
use SilverStripe\Forms\FieldList;
|
||||||
|
use SilverStripe\Forms\Form;
|
||||||
|
use SilverStripe\Forms\FormAction;
|
||||||
|
use SilverStripe\Forms\HiddenField;
|
||||||
|
use SilverStripe\Forms\ReadonlyField;
|
||||||
|
use SilverStripe\Forms\RequiredFields;
|
||||||
|
use SilverStripe\Forms\TextareaField;
|
||||||
|
use SilverStripe\Forms\TextField;
|
||||||
|
use SilverStripe\Security\Member;
|
||||||
|
use SilverStripe\Control\Cookie;
|
||||||
|
use SilverStripe\Core\Convert;
|
||||||
|
use SilverStripe\Security\Security;
|
||||||
|
use SilverStripe\Comments\Model\Comment;
|
||||||
|
use SilverStripe\Control\Controller;
|
||||||
|
|
||||||
|
class CommentForm extends Form
|
||||||
|
{
|
||||||
|
public function __construct($name, $controller)
|
||||||
|
{
|
||||||
|
$usePreview = $controller->getOption('use_preview');
|
||||||
|
|
||||||
|
$nameRequired = _t('CommentInterface.YOURNAME_MESSAGE_REQUIRED', 'Please enter your name');
|
||||||
|
$emailRequired = _t('CommentInterface.EMAILADDRESS_MESSAGE_REQUIRED', 'Please enter your email address');
|
||||||
|
$emailInvalid = _t('CommentInterface.EMAILADDRESS_MESSAGE_EMAIL', 'Please enter a valid email address');
|
||||||
|
$urlInvalid = _t('CommentInterface.COMMENT_MESSAGE_URL', 'Please enter a valid URL');
|
||||||
|
$commentRequired = _t('CommentInterface.COMMENT_MESSAGE_REQUIRED', 'Please enter your comment');
|
||||||
|
|
||||||
|
$fields = FieldList::create(
|
||||||
|
$dataFields = CompositeField::create(
|
||||||
|
// Name
|
||||||
|
$a = TextField::create('Name', _t('CommentInterface.YOURNAME', 'Your name'))
|
||||||
|
->setCustomValidationMessage($nameRequired)
|
||||||
|
->setAttribute('data-msg-required', $nameRequired),
|
||||||
|
// Email
|
||||||
|
EmailField::create(
|
||||||
|
'Email',
|
||||||
|
_t('CommentingController.EMAILADDRESS', 'Your email address (will not be published)')
|
||||||
|
)
|
||||||
|
->setCustomValidationMessage($emailRequired)
|
||||||
|
->setAttribute('data-msg-required', $emailRequired)
|
||||||
|
->setAttribute('data-msg-email', $emailInvalid)
|
||||||
|
->setAttribute('data-rule-email', true),
|
||||||
|
// Url
|
||||||
|
TextField::create('URL', _t('CommentingController.WEBSITEURL', 'Your website URL'))
|
||||||
|
->setAttribute('data-msg-url', $urlInvalid)
|
||||||
|
->setAttribute('data-rule-url', true),
|
||||||
|
// Comment
|
||||||
|
TextareaField::create('Comment', _t('CommentingController.COMMENTS', 'Comments'))
|
||||||
|
->setCustomValidationMessage($commentRequired)
|
||||||
|
->setAttribute('data-msg-required', $commentRequired)
|
||||||
|
),
|
||||||
|
HiddenField::create('ParentID'),
|
||||||
|
HiddenField::create('ParentClassName'),
|
||||||
|
HiddenField::create('ReturnURL'),
|
||||||
|
HiddenField::create('ParentCommentID')
|
||||||
|
);
|
||||||
|
|
||||||
|
// Preview formatted comment. Makes most sense when shortcodes or
|
||||||
|
// limited HTML is allowed. Populated by JS/Ajax.
|
||||||
|
if ($usePreview) {
|
||||||
|
$fields->insertAfter(
|
||||||
|
ReadonlyField::create('PreviewComment', _t('CommentInterface.PREVIEWLABEL', 'Preview'))
|
||||||
|
->setAttribute('style', 'display: none'), // enable through JS
|
||||||
|
'Comment'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
$dataFields->addExtraClass('data-fields');
|
||||||
|
|
||||||
|
// save actions
|
||||||
|
$actions = FieldList::create(
|
||||||
|
$postAction = new FormAction('doPostComment', _t('CommentInterface.POST', 'Post'))
|
||||||
|
);
|
||||||
|
|
||||||
|
if ($usePreview) {
|
||||||
|
$actions->push(
|
||||||
|
FormAction::create('doPreviewComment', _t('CommentInterface.PREVIEW', 'Preview'))
|
||||||
|
->addExtraClass('action-minor')
|
||||||
|
->setAttribute('style', 'display: none') // enable through JS
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
$required = new RequiredFields(
|
||||||
|
$controller->config()->required_fields
|
||||||
|
);
|
||||||
|
|
||||||
|
parent::__construct($controller, $name, $fields, $actions, $required);
|
||||||
|
|
||||||
|
|
||||||
|
// if the record exists load the extra required data
|
||||||
|
if ($record = $controller->getOwnerRecord()) {
|
||||||
|
// Load member data
|
||||||
|
$member = Member::currentUser();
|
||||||
|
if (($record->CommentsRequireLogin || $record->PostingRequiredPermission) && $member) {
|
||||||
|
$fields = $this->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()));
|
||||||
|
$fields->push(new HiddenField('Email', '', $member->Email));
|
||||||
|
}
|
||||||
|
|
||||||
|
// we do not want to read a new URL when the form has already been submitted
|
||||||
|
// which in here, it hasn't been.
|
||||||
|
$this->loadDataFrom(array(
|
||||||
|
'ParentID' => $record->ID,
|
||||||
|
'ReturnURL' => $controller->getRequest()->getURL(),
|
||||||
|
'ParentClassName' => $controller->getParentClass()
|
||||||
|
));
|
||||||
|
|
||||||
|
if ($holder = $record->getCommentHolderID()) {
|
||||||
|
$this->setHTMLID($holder);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set it so the user gets redirected back down to the form upon form fail
|
||||||
|
$this->setRedirectToFormOnValidationError(true);
|
||||||
|
|
||||||
|
// load any data from the cookies
|
||||||
|
if ($data = Cookie::get('CommentsForm_UserData')) {
|
||||||
|
$data = Convert::json2array($data);
|
||||||
|
|
||||||
|
$this->loadDataFrom(array(
|
||||||
|
'Name' => isset($data['Name']) ? $data['Name'] : '',
|
||||||
|
'URL' => isset($data['URL']) ? $data['URL'] : '',
|
||||||
|
'Email' => isset($data['Email']) ? $data['Email'] : ''
|
||||||
|
));
|
||||||
|
// allow previous value to fill if comment not stored in cookie (i.e. validation error)
|
||||||
|
$prevComment = Cookie::get('CommentsForm_Comment');
|
||||||
|
if ($prevComment && $prevComment != '') {
|
||||||
|
$this->loadDataFrom(array('Comment' => $prevComment));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param array $data
|
||||||
|
* @param Form $form
|
||||||
|
* @return HTTPResponse
|
||||||
|
*/
|
||||||
|
public function doPreviewComment($data, $form)
|
||||||
|
{
|
||||||
|
$data['IsPreview'] = 1;
|
||||||
|
|
||||||
|
return $this->doPostComment($data, $form);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Process which creates a {@link Comment} once a user submits a comment from this form.
|
||||||
|
*
|
||||||
|
* @param array $data
|
||||||
|
* @param Form $form
|
||||||
|
* @return HTTPResponse
|
||||||
|
*/
|
||||||
|
public function doPostComment($data, $form)
|
||||||
|
{
|
||||||
|
// Load class and parent from data
|
||||||
|
if (isset($data['ParentClassName'])) {
|
||||||
|
$this->controller->setParentClass($data['ParentClassName']);
|
||||||
|
}
|
||||||
|
if (isset($data['ParentID']) && ($class = $this->controller->getParentClass())) {
|
||||||
|
$this->controller->setOwnerRecord($class::get()->byID($data['ParentID']));
|
||||||
|
}
|
||||||
|
if (!$this->controller->getOwnerRecord()) {
|
||||||
|
return $this->httpError(404);
|
||||||
|
}
|
||||||
|
|
||||||
|
// cache users data
|
||||||
|
Cookie::set('CommentsForm_UserData', Convert::raw2json($data));
|
||||||
|
Cookie::set('CommentsForm_Comment', $data['Comment']);
|
||||||
|
|
||||||
|
// extend hook to allow extensions. Also see onAfterPostComment
|
||||||
|
$this->controller->extend('onBeforePostComment', $form);
|
||||||
|
|
||||||
|
// If commenting can only be done by logged in users, make sure the user is logged in
|
||||||
|
if (!$this->controller->getOwnerRecord()->canPostComment()) {
|
||||||
|
return Security::permissionFailure(
|
||||||
|
$this,
|
||||||
|
_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.'
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($member = Security::getCurrentUser()) {
|
||||||
|
$form->Fields()->push(new HiddenField('AuthorID', 'Author ID', $member->ID));
|
||||||
|
}
|
||||||
|
|
||||||
|
// What kind of moderation is required?
|
||||||
|
switch ($this->controller->getOwnerRecord()->ModerationRequired) {
|
||||||
|
case 'Required':
|
||||||
|
$requireModeration = true;
|
||||||
|
break;
|
||||||
|
case 'NonMembersOnly':
|
||||||
|
$requireModeration = empty($member);
|
||||||
|
break;
|
||||||
|
case 'None':
|
||||||
|
default:
|
||||||
|
$requireModeration = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
$comment = Comment::create();
|
||||||
|
$form->saveInto($comment);
|
||||||
|
|
||||||
|
$comment->ParentID = $data['ParentID'];
|
||||||
|
$comment->ParentClass = $data['ParentClassName'];
|
||||||
|
|
||||||
|
$comment->AllowHtml = $this->controller->getOption('html_allowed');
|
||||||
|
$comment->Moderated = !$requireModeration;
|
||||||
|
|
||||||
|
// Save into DB, or call pre-save hooks to give accurate preview
|
||||||
|
$usePreview = $this->controller->getOption('use_preview');
|
||||||
|
$isPreview = $usePreview && !empty($data['IsPreview']);
|
||||||
|
if ($isPreview) {
|
||||||
|
$comment->extend('onBeforeWrite');
|
||||||
|
} else {
|
||||||
|
$comment->write();
|
||||||
|
|
||||||
|
// extend hook to allow extensions. Also see onBeforePostComment
|
||||||
|
$this->controller->extend('onAfterPostComment', $comment);
|
||||||
|
}
|
||||||
|
|
||||||
|
// we want to show a notification if comments are moderated
|
||||||
|
if ($requireModeration && !$comment->IsSpam) {
|
||||||
|
Session::set('CommentsModerated', 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// clear the users comment since it passed validation
|
||||||
|
Cookie::set('CommentsForm_Comment', false);
|
||||||
|
|
||||||
|
// Find parent link
|
||||||
|
if (!empty($data['ReturnURL'])) {
|
||||||
|
$url = $data['ReturnURL'];
|
||||||
|
} elseif ($parent = $comment->Parent()) {
|
||||||
|
$url = $parent->Link();
|
||||||
|
} else {
|
||||||
|
return $this->controller->redirectBack();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Given a redirect page exists, attempt to link to the correct anchor
|
||||||
|
if ($comment->IsSpam) {
|
||||||
|
// Link to the form with the error message contained
|
||||||
|
$hash = $form->FormName();
|
||||||
|
} elseif (!$comment->Moderated) {
|
||||||
|
// Display the "awaiting moderation" text
|
||||||
|
$hash = 'moderated';
|
||||||
|
} else {
|
||||||
|
// Link to the moderated, non-spam comment
|
||||||
|
$hash = $comment->Permalink();
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->controller->redirect(Controller::join_links($url, "#{$hash}"));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user