2017-09-11 02:01:41 +02:00
|
|
|
<?php
|
|
|
|
|
|
|
|
namespace SilverStripe\ContentReview\Forms;
|
|
|
|
|
2018-06-20 09:31:33 +02:00
|
|
|
use SilverStripe\ContentReview\Extensions\SiteTreeContentReview;
|
2022-06-22 02:25:59 +02:00
|
|
|
use SilverStripe\ContentReview\Traits\PermissionChecker;
|
2018-06-20 09:31:33 +02:00
|
|
|
use SilverStripe\Control\Controller;
|
2017-09-11 02:01:41 +02:00
|
|
|
use SilverStripe\Control\Director;
|
|
|
|
use SilverStripe\Control\HTTPResponse;
|
|
|
|
use SilverStripe\Core\Injector\Injectable;
|
|
|
|
use SilverStripe\Forms\FieldList;
|
|
|
|
use SilverStripe\Forms\Form;
|
2017-09-11 07:53:59 +02:00
|
|
|
use SilverStripe\Forms\FormAction;
|
2017-09-11 02:01:41 +02:00
|
|
|
use SilverStripe\Forms\HiddenField;
|
|
|
|
use SilverStripe\Forms\TextareaField;
|
|
|
|
use SilverStripe\ORM\DataObject;
|
|
|
|
use SilverStripe\ORM\ValidationException;
|
|
|
|
use SilverStripe\Security\Security;
|
|
|
|
|
|
|
|
class ReviewContentHandler
|
|
|
|
{
|
|
|
|
use Injectable;
|
2022-06-22 02:25:59 +02:00
|
|
|
use PermissionChecker;
|
2017-09-11 02:01:41 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Parent controller for this form
|
|
|
|
*
|
|
|
|
* @var Controller
|
|
|
|
*/
|
|
|
|
protected $controller;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Form name to use
|
|
|
|
*
|
|
|
|
* @var string
|
|
|
|
*/
|
|
|
|
protected $name;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @param Controller $controller
|
|
|
|
* @param string $name
|
|
|
|
*/
|
2017-09-11 07:53:59 +02:00
|
|
|
public function __construct($controller = null, $name = 'ReviewContentForm')
|
2017-09-11 02:01:41 +02:00
|
|
|
{
|
|
|
|
$this->controller = $controller;
|
|
|
|
$this->name = $name;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Bootstrap the form fields for the content review modal
|
|
|
|
*
|
|
|
|
* @param DataObject $object
|
|
|
|
* @return Form
|
|
|
|
*/
|
|
|
|
public function Form($object)
|
|
|
|
{
|
2017-09-11 07:53:59 +02:00
|
|
|
$placeholder = _t(__CLASS__ . '.Placeholder', 'Add comments (optional)');
|
|
|
|
$title = _t(__CLASS__ . '.MarkAsReviewedAction', 'Mark as reviewed');
|
2017-09-11 02:01:41 +02:00
|
|
|
|
|
|
|
$fields = FieldList::create([
|
|
|
|
HiddenField::create('ID', null, $object->ID),
|
|
|
|
HiddenField::create('ClassName', null, $object->baseClass()),
|
|
|
|
TextareaField::create('Review', '')
|
|
|
|
->setAttribute('placeholder', $placeholder)
|
|
|
|
->setSchemaData(['attributes' => ['placeholder' => $placeholder]])
|
|
|
|
]);
|
|
|
|
|
2017-09-11 07:53:59 +02:00
|
|
|
$action = FormAction::create('savereview', $title)
|
|
|
|
->setTitle($title)
|
|
|
|
->setUseButtonTag(false)
|
|
|
|
->addExtraClass('review-content__action btn btn-primary');
|
|
|
|
$actions = FieldList::create([$action]);
|
2017-09-11 02:01:41 +02:00
|
|
|
|
2017-09-11 07:53:59 +02:00
|
|
|
$form = Form::create($this->controller, $this->name, $fields, $actions)
|
|
|
|
->setHTMLID('Form_EditForm_ReviewContent')
|
|
|
|
->addExtraClass('form--no-dividers review-content__form');
|
2017-09-11 02:01:41 +02:00
|
|
|
|
|
|
|
return $form;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Validate, and save the submitted form's review
|
|
|
|
*
|
|
|
|
* @param DataObject $record
|
|
|
|
* @param array $data
|
|
|
|
* @return HTTPResponse|string
|
2017-09-11 07:53:59 +02:00
|
|
|
* @throws ValidationException If the user cannot submit the review
|
2017-09-11 02:01:41 +02:00
|
|
|
*/
|
|
|
|
public function submitReview($record, $data)
|
|
|
|
{
|
2018-06-20 09:31:33 +02:00
|
|
|
/** @var DataObject|SiteTreeContentReview $record */
|
2017-09-11 07:53:59 +02:00
|
|
|
if (!$this->canSubmitReview($record)) {
|
2017-09-11 02:01:41 +02:00
|
|
|
throw new ValidationException(_t(
|
|
|
|
__CLASS__ . '.ErrorReviewPermissionDenied',
|
|
|
|
'It seems you don\'t have the necessary permissions to submit a content review'
|
|
|
|
));
|
|
|
|
}
|
|
|
|
|
2017-09-11 07:53:59 +02:00
|
|
|
$notes = (!empty($data['Review']) ? $data['Review'] : _t(__CLASS__ . '.NoComments', '(no comments)'));
|
|
|
|
$record->addReviewNote(Security::getCurrentUser(), $notes);
|
|
|
|
$record->advanceReviewDate();
|
2017-09-11 02:01:41 +02:00
|
|
|
|
|
|
|
$request = $this->controller->getRequest();
|
|
|
|
$message = _t(__CLASS__ . '.Success', 'Review successfully added');
|
|
|
|
|
|
|
|
if ($request->getHeader('X-Formschema-Request')) {
|
|
|
|
return $message;
|
|
|
|
} elseif (Director::is_ajax()) {
|
|
|
|
$response = HTTPResponse::create($message, 200);
|
|
|
|
$response->addHeader('Content-Type', 'text/html; charset=utf-8');
|
|
|
|
return $response;
|
|
|
|
}
|
2017-09-11 07:53:59 +02:00
|
|
|
|
|
|
|
return $this->controller->redirectBack();
|
2017-09-11 02:01:41 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2017-09-11 07:53:59 +02:00
|
|
|
* Determine whether the user can submit a review
|
2017-09-11 02:01:41 +02:00
|
|
|
*
|
|
|
|
* @param DataObject $record
|
2017-09-11 07:53:59 +02:00
|
|
|
* @return bool
|
2017-09-11 02:01:41 +02:00
|
|
|
*/
|
2017-09-11 07:53:59 +02:00
|
|
|
public function canSubmitReview($record)
|
2017-09-11 02:01:41 +02:00
|
|
|
{
|
2022-06-22 02:25:59 +02:00
|
|
|
// Ensure the parameter of correct data type
|
|
|
|
if (!$record instanceof DataObject) {
|
2017-09-11 07:53:59 +02:00
|
|
|
return false;
|
|
|
|
}
|
2022-06-22 02:25:59 +02:00
|
|
|
|
|
|
|
return $this->isContentReviewable($record, Security::getCurrentUser());
|
2017-09-11 02:01:41 +02:00
|
|
|
}
|
|
|
|
}
|