Skip to content
Snippets Groups Projects
Unverified Commit 50d267d8 authored by Alex Pott's avatar Alex Pott
Browse files

Issue #2882276 by benjifisher, estoyausente, nuez, kristiaanvandeneynde,...

Issue #2882276 by benjifisher, estoyausente, nuez, kristiaanvandeneynde, alexpott, ravi.shankar, osopolar, marvil07, danflanagan8, heddn, quietone, Matroskeen, hudri, joshi.rohit100: Extended callback process plugin to call functions with multiple parameters

(cherry picked from commit a3ca88eb)
parent 1a7ce02c
No related branches found
No related tags found
20 merge requests!10011Issue #3200534 by quietone, longwave, Kristen Pol: Use dataprovider for...,!3134Issue #3222236: Lighthouse SEO: Uncrawlable Link a#main-content,!2571Issue #3000717: Missing mapping for "nodereference_url" widget,!2521Issue #3185775: Place Views preview on the side on large monitors,!1803Issue #2329253: Allow the ChangedItem to skip updating when synchronizing (f.e. when migrating),!1603Issue #3231707: mxr576's core patch playground,!1479Issue #3250298: Return empty string "" with JSON Serializer instead of FALSE,!1478Issue #3250298: Return empty string "" with JSON Serializer instead of FALSE,!1203Issue #3236191 Wrong group exposed form widgets and multiple selection error.,!1076Issue #2903336 Added node context for tokens.,!1015Issue #3226944: REST's Request handler doesn't resolve $data argument for put method,!810Issue #3219541: Remove redudante call $this->requestStack->getCurrentRequest() in FormBuilder::buildForm,!803Issue #3219167: webchick test issue of all time turbo edition super star 20000 NG,!740Issue #3216088: Update Symfony 5 components to 5.3,!657Draft: Remove alpha-stability experimental modules and themes from 9.2.x only, prior...,!577Issue #3209779: Create new database storage for the tracker module,!526Update block module to use once library,!516Issue #3207782: Figure out BC for jquery once by @drupal/once,!400Issue #3051766: Deprecate and replace jQuery Joyride (for tours),!35Issue #3164686 WebAssert::addressEquals() and AssertLegacyTrait::assertUrl() fail to check the querystring
......@@ -2,6 +2,7 @@
namespace Drupal\migrate\Plugin\migrate\process;
use Drupal\migrate\MigrateException;
use Drupal\migrate\MigrateExecutableInterface;
use Drupal\migrate\ProcessPluginBase;
use Drupal\migrate\Row;
......@@ -10,11 +11,13 @@
* Passes the source value to a callback.
*
* The callback process plugin allows simple processing of the value, such as
* strtolower(). The callable takes the source value as the single mandatory
* argument. No additional arguments can be passed to the callback.
* strtolower(). To pass more than one argument, pass an array as the source
* and set the unpack_source option.
*
* Available configuration keys:
* - callable: The name of the callable method.
* - unpack_source: (optional) Whether to interpret the source as an array of
* arguments.
*
* Examples:
*
......@@ -38,6 +41,25 @@
* source: source_field
* @endcode
*
* An example where the callback accepts more than one argument:
*
* @code
* source:
* plugin: source_plugin_goes_here
* constants:
* slash: /
* process:
* field_link_url:
* plugin: callback
* callable: rtrim
* unpack_source: true
* source:
* - url
* - constants/slash
* @endcode
*
* This will remove the trailing '/', if any, from a URL.
*
* @see \Drupal\migrate\Plugin\MigrateProcessInterface
*
* @MigrateProcessPlugin(
......@@ -63,6 +85,12 @@ public function __construct(array $configuration, $plugin_id, $plugin_definition
* {@inheritdoc}
*/
public function transform($value, MigrateExecutableInterface $migrate_executable, Row $row, $destination_property) {
if (!empty($this->configuration['unpack_source'])) {
if (!is_array($value)) {
throw new MigrateException(sprintf("When 'unpack_source' is set, the source must be an array. Instead it was of type '%s'", gettype($value)));
}
return call_user_func($this->configuration['callable'], ...$value);
}
return call_user_func($this->configuration['callable'], $value);
}
......
......@@ -2,6 +2,7 @@
namespace Drupal\Tests\migrate\Unit\process;
use Drupal\migrate\MigrateException;
use Drupal\migrate\Plugin\migrate\process\Callback;
/**
......@@ -33,15 +34,60 @@ public function providerCallback() {
];
}
/**
* Test callback with valid "callable" and multiple arguments.
*
* @dataProvider providerCallbackArray
*/
public function testCallbackArray($callable, $args, $result) {
$configuration = ['callable' => $callable, 'unpack_source' => TRUE];
$this->plugin = new Callback($configuration, 'map', []);
$value = $this->plugin->transform($args, $this->migrateExecutable, $this->row, 'destination_property');
$this->assertSame($result, $value);
}
/**
* Data provider for ::testCallbackArray().
*/
public function providerCallbackArray() {
return [
'date format' => [
'date',
['Y-m-d', 995328000],
'2001-07-17',
],
'rtrim' => [
'rtrim',
['https://www.example.com/', '/'],
'https://www.example.com',
],
'str_replace' => [
'str_replace',
[['One', 'two'], ['1', '2'], 'One, two, three!'],
'1, 2, three!',
],
];
}
/**
* Test callback exceptions.
*
* @param string $message
* The expected exception message.
* @param array $configuration
* The plugin configuration being tested.
* @param string $class
* (optional) The expected exception class.
* @param mixed $args
* (optional) Arguments to pass to the transform() method.
*
* @dataProvider providerCallbackExceptions
*/
public function testCallbackExceptions($message, $configuration) {
$this->expectException(\InvalidArgumentException::class);
public function testCallbackExceptions($message, array $configuration, $class = 'InvalidArgumentException', $args = NULL) {
$this->expectException($class);
$this->expectExceptionMessage($message);
$this->plugin = new Callback($configuration, 'map', []);
$this->plugin->transform($args, $this->migrateExecutable, $this->row, 'destination_property');
}
/**
......@@ -57,6 +103,12 @@ public function providerCallbackExceptions() {
'message' => 'The "callable" must be a valid function or method.',
'configuration' => ['callable' => 'nonexistent_callable'],
],
'array required' => [
'message' => "When 'unpack_source' is set, the source must be an array. Instead it was of type 'string'",
'configuration' => ['callable' => 'count', 'unpack_source' => TRUE],
'class' => MigrateException::class,
'args' => 'This string is not an array.',
],
];
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment