DataConvert.php

Namespace

Drupal\rules\Plugin\RulesAction

File

src/Plugin/RulesAction/DataConvert.php

View source
<?php

namespace Drupal\rules\Plugin\RulesAction;

use Drupal\rules\Core\RulesActionBase;
use Drupal\rules\Exception\InvalidArgumentException;

/**
 * Provides an action to convert data from one type to another.
 *
 * @todo Add rounding_behavior default value "round".
 * @todo Add options_list for target type.
 * @todo Specify the right data type for the provided result.
 *
 * @RulesAction(
 *   id = "rules_data_convert",
 *   label = @Translation("Convert data"),
 *   category = @Translation("Data"),
 *   context_definitions = {
 *     "value" = @ContextDefinition("any",
 *       label = @Translation("Value"),
 *       description = @Translation("The first input value for the calculation."),
 *       assignment_restriction = "selector"
 *     ),
 *     "target_type" = @ContextDefinition("string",
 *       label = @Translation("Target type"),
 *       description = @Translation("The data type to convert a value to."),
 *       options_provider = "\Drupal\rules\TypedData\Options\ConvertTypeOptions",
 *       assignment_restriction = "input"
 *     ),
 *     "rounding_behavior" = @ContextDefinition("string",
 *       label = @Translation("Rounding behavior"),
 *       description = @Translation("For integer target types, specify how the conversion result should be rounded."),
 *       options_provider = "\Drupal\rules\TypedData\Options\RoundingOptions",
 *       default_value = NULL,
 *       required = FALSE
 *     ),
 *   },
 *   provides = {
 *     "conversion_result" = @ContextDefinition("any",
 *       label = @Translation("Conversion result")
 *     ),
 *   }
 * )
 */
class DataConvert extends RulesActionBase {
    
    /**
     * {@inheritdoc}
     */
    public function refineContextDefinitions(array $selected_data) {
        if ($type = $this->getContextValue('target_type')) {
            $this->pluginDefinition['provides']['conversion_result']
                ->setDataType($type);
        }
    }
    
    /**
     * Executes the plugin.
     *
     * @param mixed $value
     *   The input value.
     * @param string $target_type
     *   The target type the value should be converted into.
     * @param string $rounding_behavior
     *   The behavior for rounding.
     */
    protected function doExecute($value, $target_type, $rounding_behavior = NULL) {
        // @todo Add support for objects implementing __toString().
        if (!is_scalar($value)) {
            throw new InvalidArgumentException('Only scalar values are supported.');
        }
        // Ensure valid contexts have been provided.
        // @todo check how this works. May need to use !empty to allow the selection
        // list to be used and give an empty value?
        if (isset($rounding_behavior) && $target_type != 'integer') {
            throw new InvalidArgumentException('A rounding behavior only makes sense with an integer target type.');
        }
        // First apply the rounding behavior if given.
        if (!empty($rounding_behavior)) {
            switch ($rounding_behavior) {
                case 'up':
                    $value = ceil($value);
                    break;
                case 'down':
                    $value = floor($value);
                    break;
                case 'round':
                    $value = round($value);
                    break;
                default:
                    throw new InvalidArgumentException("Unknown rounding behavior: {$rounding_behavior}");
            }
        }
        switch ($target_type) {
            case 'float':
                $result = floatval($value);
                break;
            case 'integer':
                $result = intval($value);
                break;
            case 'string':
                $result = strval($value);
                break;
            default:
                throw new InvalidArgumentException("Unknown target type: {$target_type}");
        }
        $this->setProvidedValue('conversion_result', $result);
    }

}

Classes

Title Deprecated Summary
DataConvert Provides an action to convert data from one type to another.