silverstripe-userforms/code/Model/Recipient/EmailRecipientCondition.php

175 lines
4.8 KiB
PHP
Raw Normal View History

2015-07-24 04:37:48 +02:00
<?php
namespace SilverStripe\UserForms\Model\Recipient;
use LogicException;
use SilverStripe\CMS\Controllers\CMSMain;
use SilverStripe\Control\Controller;
use SilverStripe\ORM\DataObject;
use SilverStripe\UserForms\Model\Recipient\EmailRecipient;
use SilverStripe\UserForms\Model\EditableFormField;
2015-07-24 04:37:48 +02:00
/**
* Declares a condition that determines whether an email can be sent to a given recipient
*
* @method EmailRecipient Parent()
*
* @property Enum ConditionOption
* @property Varchar ConditionValue
*
* @method EditableFormField ConditionField
2015-07-24 04:37:48 +02:00
*/
class EmailRecipientCondition extends DataObject
2016-07-21 07:53:59 +02:00
{
/**
* List of options
*
* @config
* @var array
*/
private static $condition_options = [
'IsBlank' => 'Is blank',
'IsNotBlank' => 'Is not blank',
'Equals' => 'Equals',
'NotEquals' => "Doesn't equal",
'ValueLessThan' => 'Less than',
'ValueLessThanEqual' => 'Less than or equal',
'ValueGreaterThan' => 'Greater than',
'ValueGreaterThanEqual' => 'Greater than or equal'
];
2015-07-24 04:37:48 +02:00
private static $db = [
'ConditionOption' => 'Enum("IsBlank,IsNotBlank,Equals,NotEquals,ValueLessThan,ValueLessThanEqual,ValueGreaterThan,ValueGreaterThanEqual")',
2016-07-21 07:53:59 +02:00
'ConditionValue' => 'Varchar'
];
2015-07-24 04:37:48 +02:00
private static $has_one = [
'Parent' => EmailRecipient::class,
'ConditionField' => EditableFormField::class
];
private static $table_name = 'UserDefinedForm_EmailRecipientCondition';
2015-07-24 04:37:48 +02:00
2016-07-21 07:53:59 +02:00
/**
*
2016-07-21 07:53:59 +02:00
* Determine if this rule matches the given condition
*
* @param $data
*
* @return bool|null
* @throws LogicException
2016-07-21 07:53:59 +02:00
*/
public function matches($data)
2016-07-21 07:53:59 +02:00
{
$fieldName = $this->ConditionField()->Name;
$fieldValue = isset($data[$fieldName]) ? $data[$fieldName] : null;
$conditionValue = $this->ConditionValue;
$result = null;
2016-07-21 07:53:59 +02:00
switch ($this->ConditionOption) {
case 'IsBlank':
$result = empty($fieldValue);
break;
2016-07-21 07:53:59 +02:00
case 'IsNotBlank':
$result = !empty($fieldValue);
break;
case 'ValueLessThan':
$result = ($fieldValue < $conditionValue);
break;
case 'ValueLessThanEqual':
$result = ($fieldValue <= $conditionValue);
break;
case 'ValueGreaterThan':
$result = ($fieldValue > $conditionValue);
break;
case 'ValueGreaterThanEqual':
$result = ($fieldValue >= $conditionValue);
break;
case 'NotEquals':
case 'Equals':
$result = is_array($fieldValue)
? in_array($conditionValue, $fieldValue)
: $fieldValue == $conditionValue;
if ($this->ConditionOption == 'NotEquals') {
$result = !($result);
}
break;
2016-07-21 07:53:59 +02:00
default:
throw new LogicException("Unhandled rule {$this->ConditionOption}");
break;
2016-07-21 07:53:59 +02:00
}
return $result;
2016-07-21 07:53:59 +02:00
}
2016-07-21 07:53:59 +02:00
/**
* Return whether a user can create an object of this type
*
* @param Member $member
* @param array $context Virtual parameter to allow context to be passed in to check
2016-07-21 07:53:59 +02:00
* @return bool
*/
public function canCreate($member = null, $context = [])
2016-07-21 07:53:59 +02:00
{
// Check parent page
$parent = $this->getCanCreateContext(func_get_args());
2016-07-21 07:53:59 +02:00
if ($parent) {
return $parent->canEdit($member);
}
// Fall back to secure admin permissions
return parent::canCreate($member);
2016-07-21 07:53:59 +02:00
}
/**
* Helper method to check the parent for this object
*
* @param array $args List of arguments passed to canCreate
* @return SiteTree Parent page instance
*/
2016-07-21 07:53:59 +02:00
protected function getCanCreateContext($args)
{
// Inspect second parameter to canCreate for a 'Parent' context
2016-07-21 07:53:59 +02:00
if (isset($args[1]['Parent'])) {
return $args[1]['Parent'];
}
// Hack in currently edited page if context is missing
2016-07-21 07:53:59 +02:00
if (Controller::has_curr() && Controller::curr() instanceof CMSMain) {
return Controller::curr()->currentPage();
}
// No page being edited
return null;
}
2016-07-21 07:53:59 +02:00
/**
* @param Member
*
* @return boolean
*/
public function canView($member = null)
{
return $this->Parent()->canView($member);
}
2016-07-21 07:53:59 +02:00
/**
* @param Member
*
* @return boolean
*/
public function canEdit($member = null)
{
return $this->Parent()->canEdit($member);
}
2016-07-21 07:53:59 +02:00
/**
* @param Member
*
* @return boolean
*/
public function canDelete($member = null)
{
return $this->canEdit($member);
}
}