silverstripe-userforms/code/Model/Submission/SubmittedForm.php

188 lines
4.7 KiB
PHP
Raw Normal View History

<?php
namespace SilverStripe\UserForms\Model\Submission;
use SilverStripe\Forms\GridField\GridField;
use SilverStripe\Forms\GridField\GridFieldConfig;
use SilverStripe\Forms\GridField\GridFieldDataColumns;
use SilverStripe\Forms\GridField\GridFieldExportButton;
use SilverStripe\Forms\GridField\GridFieldPrintButton;
use SilverStripe\Forms\ReadonlyField;
use SilverStripe\ORM\DataObject;
use SilverStripe\Security\Member;
use SilverStripe\UserForms\Model\UserDefinedForm;
use SilverStripe\UserForms\Model\Submission\SubmittedFormField;
/**
* Contents of an UserDefinedForm submission
*
* @package userforms
*/
2016-07-21 07:53:59 +02:00
class SubmittedForm extends DataObject
{
private static $has_one = [
'SubmittedBy' => Member::class,
'Parent' => UserDefinedForm::class,
];
2016-07-21 07:53:59 +02:00
private static $has_many = [
'Values' => SubmittedFormField::class
];
2016-07-21 07:53:59 +02:00
private static $summary_fields = [
2016-07-21 07:53:59 +02:00
'ID',
'Created'
];
private static $table_name = 'SubmittedForm';
2016-07-21 07:53:59 +02:00
/**
* Returns the value of a relation or, in the case of this form, the value
* of a given child {@link SubmittedFormField}
*
* @param string
*
* @return mixed
*/
public function relField($fieldName)
{
// default case
if ($value = parent::relField($fieldName)) {
return $value;
}
// check values for a form field with the matching name.
$formField = SubmittedFormField::get()->filter(array(
'ParentID' => $this->ID,
'Name' => $fieldName
))->first();
if ($formField) {
return $formField->getFormattedValue();
}
}
/**
* @return FieldList
*/
public function getCMSFields()
{
$this->beforeUpdateCMSFields(function ($fields) {
2016-07-21 07:53:59 +02:00
$fields->removeByName('Values');
//check to ensure there is a Member to extract an Email from else null value
2017-08-11 02:37:03 +02:00
if ($this->SubmittedBy() && $this->SubmittedBy()->exists()) {
$submitter = $this->SubmittedBy()->Email;
} else {
$submitter = null;
}
//replace scaffolded field with readonly submitter
$fields->replaceField(
'SubmittedByID',
ReadonlyField::create(
'Submitter',
'Submitter',
$submitter
)
);
2016-07-21 07:53:59 +02:00
$values = GridField::create(
2016-07-21 07:53:59 +02:00
'Values',
SubmittedFormField::class,
$this->Values()->sort('Created', 'ASC')
2016-07-21 07:53:59 +02:00
);
$exportColumns = array(
'Title' => 'Title',
'ExportValue' => 'Value'
);
2016-07-21 07:53:59 +02:00
$config = new GridFieldConfig();
$config->addComponent(new GridFieldDataColumns());
$config->addComponent(new GridFieldExportButton('after', $exportColumns));
2016-07-21 07:53:59 +02:00
$config->addComponent(new GridFieldPrintButton());
$values->setConfig($config);
$fields->addFieldToTab('Root.Main', $values);
});
$fields = parent::getCMSFields();
return $fields;
}
/**
* @param Member
*
* @return boolean
*/
public function canCreate($member = null, $context = [])
2016-07-21 07:53:59 +02:00
{
$extended = $this->extendedCan(__FUNCTION__, $member);
if ($extended !== null) {
return $extended;
}
return $this->Parent()->canCreate();
}
/**
* @param Member
*
* @return boolean
*/
public function canView($member = null)
{
$extended = $this->extendedCan(__FUNCTION__, $member);
if ($extended !== null) {
return $extended;
}
return $this->Parent()->canView();
}
/**
* @param Member
*
* @return boolean
*/
public function canEdit($member = null)
{
$extended = $this->extendedCan(__FUNCTION__, $member);
if ($extended !== null) {
return $extended;
}
return $this->Parent()->canEdit();
}
/**
* @param Member
*
* @return boolean
*/
public function canDelete($member = null)
{
$extended = $this->extendedCan(__FUNCTION__, $member);
if ($extended !== null) {
return $extended;
}
return $this->Parent()->canDelete();
}
/**
* Before we delete this form make sure we delete all the
* field values so that we don't leave old data round
*
* @return void
*/
protected function onBeforeDelete()
{
if ($this->Values()) {
foreach ($this->Values() as $value) {
$value->delete();
}
}
parent::onBeforeDelete();
}
}